// File: chhylp123[P]hifiasm/inter.cpp
// Function: gen_contain_consensus_chain(ul_vec_t*, unsigned int, kv_ul_ov_t*, kv_ul_ov_t*, ug_opt_t const*, asg_t const*, R_to_U*, long, double, long, Chain_Data*)
void gen_contain_consensus_chain(ul_vec_t *rch, uint32_t rch_i, kv_ul_ov_t *idx, kv_ul_ov_t *dump,
const ug_opt_t *uopt, const asg_t *rg, R_to_U *ri, int64_t bw, double diff_ec_ul, int64_t ulid, Chain_Data* dp)
{
	uint64_t dn = dump->n, i, mqs, mqe; int64_t iqs, iqe, its, ite; idx->n = 0;
	collect_nc_ovlps(rch, rch_i, idx, uopt, rg, ri, ulid, &mqs, &mqe);
	// assert(idx->n > 1); assert((mqs != ((uint64_t)-1)) && (mqe != ((uint64_t)-1)) && (mqe > mqs));
	if((idx->n <= 1) || (mqs == ((uint64_t)-1)) || (mqe == ((uint64_t)-1)) || (mqe <= mqs)) return;
	
	gen_linear_rchains(idx, dump, rg, uopt, bw, diff_ec_ul, rch->rlen, dp, ulid);
	assert(idx->n);
	idx->n = gen_cns_chain_linear(idx->a, idx->n, /**dump->a+dn,**/ rg, ri, rch->rlen, bw, diff_ec_ul, dp, UG_SKIP_N, UG_ITER_N, UG_DIS_N, mqs, mqe, ulid);
	// fprintf(stderr, "[M::%s::] idx->n::%u, mqs::%lu, mqe::%lu\n", __func__, (uint32_t)idx->n, mqs, mqe);
	if(idx->n) {
		kv_resize(ul_ov_t, *dump, dn + idx->n);
		///mask existing overlaps
		for (i = rch_i; (i != (uint32_t)-1) && (!rg->seq[rch->bb.a[i].hid].del); i = rch->bb.a[i].pidx) {
			dump->a[i].tn = dump->a[i].qn = (uint32_t)-1;
		}
		for (i = 0; i < idx->n; i++) {
			dump->a[dn] = idx->a[i];
			extend_end_coord(NULL, &(dump->a[dn]), rch->rlen, rg->seq[dump->a[dn].tn].len, &iqs, &iqe, &its, &ite);
			dump->a[dn].qs = iqs; dump->a[dn].qe = iqe; dump->a[dn].ts = its; dump->a[dn].te = ite;
			dump->a[dn].qn = ((i>0)?(dn-1):((uint32_t)-1)); dn++;
		}
		dump->n = dn;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
subq $0xc8, %rsp
movq 0x28(%rbp), %rax
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq %r9, -0x38(%rbp)
movsd %xmm0, -0x40(%rbp)
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x20(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x10(%rbp), %rdi
movl -0x14(%rbp), %esi
movq -0x20(%rbp), %rdx
movq -0x30(%rbp), %rcx
movq -0x38(%rbp), %r8
movq 0x10(%rbp), %r9
movq 0x20(%rbp), %r11
leaq -0x58(%rbp), %r10
leaq -0x60(%rbp), %rax
movq %r11, (%rsp)
movq %r10, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x2e59a0
movq -0x20(%rbp), %rax
cmpq $0x1, 0x8(%rax)
jbe 0x2e7d89
cmpq $-0x1, -0x58(%rbp)
je 0x2e7d89
cmpq $-0x1, -0x60(%rbp)
je 0x2e7d89
movq -0x60(%rbp), %rax
cmpq -0x58(%rbp), %rax
ja 0x2e7d8e
jmp 0x2e817d
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq -0x30(%rbp), %rcx
movq 0x18(%rbp), %r8
movsd -0x40(%rbp), %xmm0
movq -0x10(%rbp), %rax
movl 0x18(%rax), %eax
movl %eax, %r9d
movq 0x28(%rbp), %r10
movq 0x20(%rbp), %rax
movq %r10, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x2e6b20
movq -0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x2e7dd4
jmp 0x2e7df3
leaq 0xac170(%rip), %rdi     # 0x393f4b
leaq 0xa8a4d(%rip), %rsi     # 0x39082f
movl $0x470f, %edx           # imm = 0x470F
leaq 0xac5b6(%rip), %rcx     # 0x3943a4
callq 0x2130
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rsi
movq -0x38(%rbp), %rdx
movq 0x10(%rbp), %rcx
movq -0x10(%rbp), %rax
movl 0x18(%rax), %eax
movl %eax, %r8d
movq 0x18(%rbp), %r9
movsd -0x40(%rbp), %xmm0
movq 0x28(%rbp), %rbx
movq -0x58(%rbp), %r11
movq -0x60(%rbp), %r10
movq 0x20(%rbp), %rax
movq %rbx, (%rsp)
movq $0x64, 0x8(%rsp)
movq $0x1388, 0x10(%rsp)     # imm = 0x1388
movq $0xc350, 0x18(%rsp)     # imm = 0xC350
movq %r11, 0x20(%rsp)
movq %r10, 0x28(%rsp)
movq %rax, 0x30(%rsp)
callq 0x2e6fa0
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x2e817d
jmp 0x2e7e7c
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x48(%rbp), %rcx
movq -0x20(%rbp), %rdx
addq 0x8(%rdx), %rcx
cmpq %rcx, %rax
jae 0x2e7f63
movq -0x48(%rbp), %rcx
movq -0x20(%rbp), %rax
addq 0x8(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rcx
shrq %rcx
movq -0x28(%rbp), %rax
orq 0x10(%rax), %rcx
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rcx
shrq $0x2, %rcx
movq -0x28(%rbp), %rax
orq 0x10(%rax), %rcx
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rcx
shrq $0x4, %rcx
movq -0x28(%rbp), %rax
orq 0x10(%rax), %rcx
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rcx
shrq $0x8, %rcx
movq -0x28(%rbp), %rax
orq 0x10(%rax), %rcx
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rcx
shrq $0x10, %rcx
movq -0x28(%rbp), %rax
orq 0x10(%rax), %rcx
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x10(%rax)
movq -0x28(%rbp), %rax
movq (%rax), %rdi
movq -0x28(%rbp), %rax
imulq $0x1c, 0x10(%rax), %rsi
callq 0x2360
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
jmp 0x2e7f65
movl -0x14(%rbp), %eax
movq %rax, -0x50(%rbp)
xorl %eax, %eax
movl $0xffffffff, %ecx       # imm = 0xFFFFFFFF
cmpq %rcx, -0x50(%rbp)
movb %al, -0x81(%rbp)
je 0x2e7fad
movq -0x38(%rbp), %rax
movq 0x20(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x30(%rcx), %rcx
imulq $0x24, -0x50(%rbp), %rdx
addq %rdx, %rcx
movl (%rcx), %ecx
movl (%rax,%rcx,8), %eax
shrl $0x1f, %eax
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
movb %al, -0x81(%rbp)
movb -0x81(%rbp), %al
testb $0x1, %al
jne 0x2e7fb9
jmp 0x2e8000
movq -0x28(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x50(%rbp), %rcx
addq %rcx, %rax
movl $0xffffffff, (%rax)     # imm = 0xFFFFFFFF
movq -0x28(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x50(%rbp), %rcx
addq %rcx, %rax
movl $0xffffffff, 0xc(%rax)  # imm = 0xFFFFFFFF
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x24, -0x50(%rbp), %rcx
addq %rcx, %rax
movl 0x14(%rax), %eax
movq %rax, -0x50(%rbp)
jmp 0x2e7f6c
movq $0x0, -0x50(%rbp)
movq -0x50(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq 0x8(%rcx), %rax
jae 0x2e8171
movq -0x20(%rbp), %rax
movq (%rax), %rcx
imulq $0x1c, -0x50(%rbp), %rax
addq %rax, %rcx
movq -0x28(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x48(%rbp), %rdx
addq %rdx, %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq 0x10(%rcx), %rdx
movq %rdx, 0x10(%rax)
movl 0x18(%rcx), %ecx
movl %ecx, 0x18(%rax)
movq -0x28(%rbp), %rax
movq (%rax), %rsi
imulq $0x1c, -0x48(%rbp), %rax
addq %rax, %rsi
movq -0x10(%rbp), %rax
movl 0x18(%rax), %eax
movl %eax, %edx
movq -0x38(%rbp), %rax
movq 0x20(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rcx
imulq $0x1c, -0x48(%rbp), %rdi
addq %rdi, %rcx
movl 0xc(%rcx), %ecx
movl (%rax,%rcx,8), %eax
andl $0x7fffffff, %eax       # imm = 0x7FFFFFFF
movl %eax, %eax
movl %eax, %ecx
xorl %eax, %eax
movl %eax, %edi
leaq -0x68(%rbp), %r8
leaq -0x70(%rbp), %r9
leaq -0x78(%rbp), %r10
leaq -0x80(%rbp), %rax
movq %r10, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x2d2ba0
movq -0x68(%rbp), %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x48(%rbp), %rdx
addq %rdx, %rax
movl %ecx, 0x4(%rax)
movq -0x70(%rbp), %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x48(%rbp), %rdx
addq %rdx, %rax
movl %ecx, 0x8(%rax)
movq -0x78(%rbp), %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x48(%rbp), %rdx
addq %rdx, %rax
movl %ecx, 0x10(%rax)
movq -0x80(%rbp), %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x48(%rbp), %rdx
addq %rdx, %rax
movl %ecx, 0x14(%rax)
cmpq $0x0, -0x50(%rbp)
jbe 0x2e812c
movq -0x48(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x90(%rbp)
jmp 0x2e813a
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movq %rax, -0x90(%rbp)
jmp 0x2e813a
movq -0x90(%rbp), %rax
movl %eax, %ecx
movq -0x28(%rbp), %rax
movq (%rax), %rax
imulq $0x1c, -0x48(%rbp), %rdx
addq %rdx, %rax
movl %ecx, (%rax)
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
movq -0x50(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x50(%rbp)
jmp 0x2e8008
movq -0x48(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x8(%rax)
addq $0xc8, %rsp
popq %rbx
popq %rbp
retq
nopw (%rax,%rax)