// File: schneebergerlab[P]DrLink/detect_recombsite.cpp
// Function: check_co_read_density(unsigned long, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, int*, bool*, int*, int*, int*, int*, int*)
bool check_co_read_density(unsigned long       co_start,
                           unsigned long       co_end,
                           string              read_align_info,
                           string              read_order_info,
                           string              read_id_info,
                           int*                bp_per_read_in_co,
                           bool*               bp_boundary_same_fragment,
                           int*                min_RR_dist,
                           int*                max_RR_dist,
                           int*                n_readLeft,
                           int*                n_readRight,
                           int*                max_CORR_dist)
{
    /* this function checks read density in a potential CO interval
       how many bp per read within this interval
       -The larger/"smaller" the value, the higher chance that 
        this molecule is falsely merged from different molecules.
       
       Example molecule with info:
       
	1#ACGCGTGGTCCAGTAT  8229787 8277108 47422   0.08    30  R   8277208
 
 	# span of reads: read_align_info
	8229787,8229914;8229933,8230022;8234823,8234973;8235084,8235141;
	8235256,8235406;8235546,8235673;8237785,8237913;8238134,8238284;
	8245266,8245416;8245555,8245682;8250091,8250218;8250471,8250611;
	8252479,8252629;8252479,8252629;8252711,8252807;8252714,8252807;
	8256708,8256858;8257166,8257293;8262644,8262803;8262929,8263056;
	8264841,8264991;8265091,8265218;8266796,8266946;8266809,8266864;
	8267521,8267644;8267724,8267873;8272690,8272817;8273056,8273206;
	8276756,8276883;8277108,8277208 

	# order in read pairs: read_order_info
	1,2,2,1,2,1,1,2,2,1,1,2,2,2,1,1,2,1,2,1,2,1,2,1,1,2,1,2,1,2 

	# id of reads: read_id_info
	J00137:105:HNFWJBBXX:3:1213:4685:18616,J00137:105:HNFWJBBXX:3:1213:4685:18616,
	J00137:102:HMYVWBBXX:7:2102:6482:8400,J00137:102:HMYVWBBXX:7:2102:6482:8400,
	J00137:105:HNFWJBBXX:3:2225:2950:3266,J00137:105:HNFWJBBXX:3:2225:2950:3266,
	J00137:108:HNGC7BBXX:3:1211:16072:22133,J00137:108:HNGC7BBXX:3:1211:16072:22133,
	J00137:105:HNFWJBBXX:3:1109:7314:28973,J00137:105:HNFWJBBXX:3:1109:7314:28973,
	J00137:108:HNGC7BBXX:3:2103:14874:10247,J00137:108:HNGC7BBXX:3:2103:14874:10247,
	J00137:102:HMYVWBBXX:7:2127:1692:16559,J00137:102:HMYVWBBXX:7:2127:1895:16665,
	J00137:102:HMYVWBBXX:7:2127:1692:16559,J00137:102:HMYVWBBXX:7:2127:1895:16665,
	J00137:105:HNFWJBBXX:3:1114:28107:1525,J00137:105:HNFWJBBXX:3:1114:28107:1525,
	J00137:102:HMYVWBBXX:8:2124:19471:30274,J00137:102:HMYVWBBXX:8:2124:19471:30274,
	J00137:108:HNGC7BBXX:3:1210:19705:2897,J00137:108:HNGC7BBXX:3:1210:19705:2897,
	J00137:102:HMYVWBBXX:7:2106:30655:43251,J00137:102:HMYVWBBXX:7:2106:30655:43251,
	J00137:108:HNGC7BBXX:3:1212:11363:38029,J00137:108:HNGC7BBXX:3:1212:11363:38029,
	J00137:105:HNFWJBBXX:3:2204:5284:22854,J00137:105:HNFWJBBXX:3:2204:5284:22854,
	J00137:105:HNFWJBBXX:3:1104:14143:15451,J00137:105:HNFWJBBXX:3:1104:14143:15451
	
	bp predicted as: 8252716 -> 8262697, where CO start/end in reads at 8252714, 8262644
    */
    //
    if(co_end < co_start)
    {
        return false;
    }
    // return values
    *bp_per_read_in_co         = -1;     // read density within CO interval
    *bp_boundary_same_fragment = false;  // whether the read covering co start/end from the same fragment
    *min_RR_dist               = 999999; // minimum R1-R1 or R2-R2 distance within the molecule
    *max_RR_dist               = 0;      // maximum ...
    // task 1. check read density within the potential CO interval
    vector<string> respan  = split_string(read_align_info, ';'); // ; with ,    
    vector<string> reorder = split_string(read_order_info, ','); // ,
    vector<string> reid    = split_string(read_id_info,    ','); // ,
    assert( respan.size() == reorder.size() );
    assert( respan.size() == reid.size() ); 
    vector<string>::iterator ritr;
    vector<string>::iterator ritr_end;
    ritr     = respan.begin();
    ritr_end = respan.end();
    int n_read = 0;                    // number of reads in interval
    int i_read = -1;                   // to satisfy index start from 0 in vector
    unsigned long sta_aligned_pos = 0; // last  read covering start of interval
    unsigned long end_aligned_pos = 0; // first read covering end   of interval
    string        sta_read_name("");
    string        end_read_name("");
    string        sta_read_order("");
    string        end_read_order("");
    //
    map<string, int> readLeft;
    map<string, int> readRight;
    //
    unsigned long lastReadStaInCO     = 0; // <read_align_sta, read_align_end>
    unsigned long maxIntervalSizeInCo = 0;
    //
    while(ritr != ritr_end)
    {
        vector<string> ralign = split_string(*ritr, ',');
        
        unsigned long rsta = strtoul(ralign[0].c_str(), NULL, 0);
        unsigned long rend = strtoul(ralign[1].c_str(), NULL, 0);
        
        i_read ++; // first valid: i_read = 0
        
        // skip checking reads in front of the interval
        if(rend < co_start)
        {
            if(readLeft.find(reid[i_read]) == readLeft.end())
            {
                readLeft.insert(std::pair<string, int>(reid[i_read], 1));
            }
            ritr ++;
            continue;
        }
        //
        if(rsta<=co_start && co_start<=rend)
        {
            sta_aligned_pos = rsta; // take the last  read statisfying this
            sta_read_order  = reorder[i_read];            
            sta_read_name   = reid[i_read];
        }
        //
        if(end_aligned_pos==0 && rsta<=co_end && co_end<=rend)
        {
            end_aligned_pos = rsta; // take the first read satsifying this
            end_read_order  = reorder[i_read];            
            end_read_name   = reid[i_read];        
        }
        // number of reads within interval
        if(co_start<rsta && rend<co_end)
        {
            n_read ++;
        }
        // reads on/in CO interval
        if( (co_start<=rsta && rsta<=co_end) || (co_start<=rend && rend<=co_end) )
        {
            if(lastReadStaInCO != 0)
            {
                assert(rsta>=lastReadStaInCO);
                unsigned long this_dist = rsta - lastReadStaInCO;
                if(this_dist > maxIntervalSizeInCo) 
                {
                    maxIntervalSizeInCo = this_dist;
                }
            }
            lastReadStaInCO     = rsta;
        }        
        // reads after the interval
        if(rsta > co_end)
        {
            if(readRight.find(reid[i_read]) == readRight.end())
            {
                readRight.insert(std::pair<string, int>(reid[i_read], 1));
            }
        }
        ritr ++;
    }
    //
    *max_CORR_dist = maxIntervalSizeInCo;
    // exclude read ids at start and end of CO
    if(readLeft.find(sta_read_name) != readLeft.end())
    {
        readLeft.erase(sta_read_name);
    }
    *n_readLeft = readLeft.size();
    if(readRight.find(end_read_name) != readRight.end())
    {
        readRight.erase(end_read_name);
    }
    *n_readRight = readRight.size();
    // e.g., one read r2 within interval: co_sta_in_r1----r2------co_end_in_r3, that is, n_read = 1,
    //      => density = (co_end - co_sta) / (n_read+1)
    n_read += 1; 
    *bp_per_read_in_co = (co_end - co_start)/n_read; // check::TODO: use end_last_read - sta_first_read :: full span
    //
    string frag(" different ");
    if(end_read_name.compare(sta_read_name) == 0)
    {
        *bp_boundary_same_fragment = true;
        frag                       = (string)" same ";
    }
    //
    if(sta_read_name.size() != 0 && end_read_name.size() != 0)
    {
        cout << "         CO starts/ends in reads at " 
             << sta_aligned_pos   << ", " << end_aligned_pos << "\n"
             << "          with " << frag << " read ids: " 
             << sta_read_name     << ", " << end_read_name
             << endl;
    }
    else // reads in molecule missing compared to vcf, possibly due to secondary alignment etc.
    if(sta_read_name.size() != 0 && end_read_name.size() == 0)
    {
        cout << "         CO starts in read at " 
             << sta_aligned_pos   << ", CO-end read discarded during bam conversion. " << "\n"
             << "          with " << frag << " read id: " 
             << sta_read_name     << ","
             << endl;    
    }
    else
    if(sta_read_name.size() == 0 && end_read_name.size() != 0)
    {
        cout << "         CO ends in read at " 
             << "CO-start read discarded during bam conversion" << ", " << end_aligned_pos << "\n"
             << "          with " << frag << " read id: " 
             << ", "              << end_read_name
             << endl;    
    }
    else
    {
        cout << "         CO starts/ends in reads -- both discarded during bam conversion. " 
             << endl;
    }

    // task 2. check read density within the potential-CO related molecule
    unsigned long RR_dist_total  = 0;
    int           RR_dist_num    = 0;
    unsigned long lastR1AlignSta = 0; // for calculating R1 distance
    unsigned long lastR1AlignEnd = 0; // ..
    unsigned long lastR2AlignSta = 0; // for calculating R2 distance
    unsigned long lastR2AlignEnd = 0; // ..  
    ritr        = respan.begin();
    ritr_end    = respan.end();
    i_read      = -1;
    while(ritr != ritr_end)
    {
        vector<string> ralign = split_string(*ritr, ',');
        unsigned long rsta = strtoul(ralign[0].c_str(), NULL, 0);
        unsigned long rend = strtoul(ralign[1].c_str(), NULL, 0);
        // the i_read-th read: 0,1,...,n-1
        i_read ++;
        string iorder = reorder[i_read];
        
        if(i_read == 0)
        {
            if(iorder.compare("1") == 0)
            {
                lastR1AlignSta = rsta;
                lastR1AlignEnd = rend;
            }
            else
            {
                lastR2AlignSta = rsta;
                lastR2AlignEnd = rend;                
            }
        }
        else
        {
            if(iorder.compare("1") == 0) // current is R1
            {
                if(lastR1AlignSta > 0)   // there is last R1
                {
                    // the dist where a read takes within a molecule: always >= 0
                    int i_dist   = (rsta>lastR1AlignSta)?(rsta-lastR1AlignSta):((lastR1AlignSta-rsta)*(-1));
                    *min_RR_dist = (*min_RR_dist>i_dist)?i_dist:*min_RR_dist;
                    *max_RR_dist = (*max_RR_dist<i_dist)?i_dist:*max_RR_dist;
                    RR_dist_total+= i_dist>0?i_dist:(-1)*i_dist; // absolute dist total
                    RR_dist_num ++;
                }
                lastR1AlignSta  = rsta;
                lastR1AlignEnd  = rend;
            }
            else                         // current is R2
            {
                if(lastR2AlignSta > 0)   // there is last R2
                {
                    // minus exists: meaning overlapped RR reads
                    int i_dist  = (rsta>lastR2AlignSta)?(rsta-lastR2AlignSta):((lastR2AlignSta-rsta)*(-1));
                    *min_RR_dist = (*min_RR_dist>i_dist)?i_dist:*min_RR_dist;
                    *max_RR_dist = (*max_RR_dist<i_dist)?i_dist:*max_RR_dist;
                    RR_dist_total+= i_dist>0?i_dist:(-1)*i_dist; // absolute dist total
                    RR_dist_num ++;              
                }                
                lastR2AlignSta  = rsta;
                lastR2AlignEnd  = rend;                
            }          
        }
        
        ritr ++;
    }

    return true;
}

// Assembly:
subq $0x5d8, %rsp            # imm = 0x5D8
movq %r8, 0x1d0(%rsp)
movq %rcx, 0x1d8(%rsp)
movq %rdx, 0x1e0(%rsp)
movq 0x608(%rsp), %rax
movq 0x600(%rsp), %rax
movq 0x5f8(%rsp), %rax
movq 0x5f0(%rsp), %rax
movq 0x5e8(%rsp), %rax
movq 0x5e0(%rsp), %rax
movq %rdi, 0x5c8(%rsp)
movq %rsi, 0x5c0(%rsp)
movq %rdx, 0x5b8(%rsp)
movq %rcx, 0x5b0(%rsp)
movq %r8, 0x5a8(%rsp)
movq %r9, 0x5a0(%rsp)
movq 0x5c0(%rsp), %rax
cmpq 0x5c8(%rsp), %rax
jae 0x29b0e
movb $0x0, 0x5d7(%rsp)
jmp 0x2b242
movq 0x1e0(%rsp), %rsi
movq 0x5a0(%rsp), %rax
movl $0xffffffff, (%rax)     # imm = 0xFFFFFFFF
movq 0x5e0(%rsp), %rax
movb $0x0, (%rax)
movq 0x5e8(%rsp), %rax
movl $0xf423f, (%rax)        # imm = 0xF423F
movq 0x5f0(%rsp), %rax
movl $0x0, (%rax)
movb $0x3b, 0x587(%rsp)
leaq 0x588(%rsp), %rdi
leaq 0x587(%rsp), %rdx
callq 0x60790
movq 0x1d8(%rsp), %rsi
movb $0x2c, 0x567(%rsp)
leaq 0x568(%rsp), %rdi
leaq 0x567(%rsp), %rdx
callq 0x60790
jmp 0x29b8f
movq 0x1d0(%rsp), %rsi
movb $0x2c, 0x537(%rsp)
leaq 0x538(%rsp), %rdi
leaq 0x537(%rsp), %rdx
callq 0x60790
jmp 0x29bb6
leaq 0x588(%rsp), %rdi
callq 0xfbb0
movq %rax, 0x1c8(%rsp)
leaq 0x568(%rsp), %rdi
callq 0xfbb0
movq %rax, %rcx
movq 0x1c8(%rsp), %rax
cmpq %rcx, %rax
jne 0x29bea
jmp 0x29c3b
leaq 0x3ea70(%rip), %rdi     # 0x68661
leaq 0x3e345(%rip), %rsi     # 0x67f3d
movl $0x4cb, %edx            # imm = 0x4CB
leaq 0x3ea7d(%rip), %rcx     # 0x68681
callq 0x52d0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
jmp 0x2b233
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
jmp 0x2b226
leaq 0x588(%rsp), %rdi
callq 0xfbb0
movq %rax, 0x1c0(%rsp)
leaq 0x538(%rsp), %rdi
callq 0xfbb0
movq %rax, %rcx
movq 0x1c0(%rsp), %rax
cmpq %rcx, %rax
jne 0x29c6f
jmp 0x29c8e
leaq 0x3ea8e(%rip), %rdi     # 0x68704
leaq 0x3e2c0(%rip), %rsi     # 0x67f3d
movl $0x4cc, %edx            # imm = 0x4CC
leaq 0x3e9f8(%rip), %rcx     # 0x68681
callq 0x52d0
leaq 0x528(%rsp), %rdi
callq 0x2de30
leaq 0x520(%rsp), %rdi
callq 0x2de30
leaq 0x588(%rsp), %rdi
movq %rdi, 0x1b0(%rsp)
callq 0x2d110
movq 0x1b0(%rsp), %rdi
movq %rax, 0x518(%rsp)
movq 0x518(%rsp), %rax
movq %rax, 0x528(%rsp)
callq 0x2d140
movq %rax, 0x510(%rsp)
movq 0x510(%rsp), %rax
movq %rax, 0x520(%rsp)
movl $0x0, 0x50c(%rsp)
movl $0xffffffff, 0x508(%rsp) # imm = 0xFFFFFFFF
movq $0x0, 0x500(%rsp)
movq $0x0, 0x4f8(%rsp)
leaq 0x4d7(%rsp), %rdi
movq %rdi, 0x1b8(%rsp)
callq 0x57c0
movq 0x1b8(%rsp), %rdx
leaq 0x40e48(%rip), %rsi     # 0x6ab94
leaq 0x4d8(%rsp), %rdi
callq 0x6880
jmp 0x29d5b
leaq 0x4d7(%rsp), %rdi
callq 0x54d0
leaq 0x4af(%rsp), %rdi
movq %rdi, 0x1a8(%rsp)
callq 0x57c0
movq 0x1a8(%rsp), %rdx
leaq 0x40e08(%rip), %rsi     # 0x6ab94
leaq 0x4b0(%rsp), %rdi
callq 0x6880
jmp 0x29d9b
leaq 0x4af(%rsp), %rdi
callq 0x54d0
leaq 0x487(%rsp), %rdi
movq %rdi, 0x1a0(%rsp)
callq 0x57c0
movq 0x1a0(%rsp), %rdx
leaq 0x40dc8(%rip), %rsi     # 0x6ab94
leaq 0x488(%rsp), %rdi
callq 0x6880
jmp 0x29ddb
leaq 0x487(%rsp), %rdi
callq 0x54d0
leaq 0x45f(%rsp), %rdi
movq %rdi, 0x198(%rsp)
callq 0x57c0
movq 0x198(%rsp), %rdx
leaq 0x40d88(%rip), %rsi     # 0x6ab94
leaq 0x460(%rsp), %rdi
callq 0x6880
jmp 0x29e1b
leaq 0x45f(%rsp), %rdi
callq 0x54d0
leaq 0x428(%rsp), %rdi
callq 0xfb90
leaq 0x3f8(%rsp), %rdi
callq 0xfb90
movq $0x0, 0x3f0(%rsp)
movq $0x0, 0x3e8(%rsp)
leaq 0x528(%rsp), %rdi
leaq 0x520(%rsp), %rsi
callq 0x2d170
testb $0x1, %al
jne 0x29e78
jmp 0x2a4fe
leaq 0x528(%rsp), %rdi
callq 0x2d1b0
movq %rax, %rsi
movb $0x2c, 0x3cf(%rsp)
leaq 0x3d0(%rsp), %rdi
leaq 0x3cf(%rsp), %rdx
callq 0x60790
jmp 0x29ea7
leaq 0x3d0(%rsp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x88f0
movq %rax, %rdi
callq 0x51d0
movq %rax, %rdi
xorl %eax, %eax
movl %eax, %esi
xorl %edx, %edx
callq 0x5160
movq %rax, 0x3c0(%rsp)
leaq 0x3d0(%rsp), %rdi
movl $0x1, %esi
callq 0x88f0
movq %rax, %rdi
callq 0x51d0
movq %rax, %rdi
xorl %eax, %eax
movl %eax, %esi
xorl %edx, %edx
callq 0x5160
movq %rax, 0x3b8(%rsp)
movl 0x508(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x508(%rsp)
movq 0x3b8(%rsp), %rax
cmpq 0x5c8(%rsp), %rax
jae 0x2a146
movslq 0x508(%rsp), %rsi
leaq 0x538(%rsp), %rdi
callq 0x88f0
movq %rax, %rsi
leaq 0x428(%rsp), %rdi
callq 0x104b0
movq %rax, 0x190(%rsp)
jmp 0x29f5c
movq 0x190(%rsp), %rax
movq %rax, 0x3b0(%rsp)
leaq 0x428(%rsp), %rdi
callq 0x10500
movq %rax, 0x3a8(%rsp)
leaq 0x3b0(%rsp), %rdi
leaq 0x3a8(%rsp), %rsi
callq 0x104e0
testb $0x1, %al
jne 0x29f9f
jmp 0x2a11f
movslq 0x508(%rsp), %rsi
leaq 0x538(%rsp), %rdi
callq 0x88f0
movq %rax, %rsi
movl $0x1, 0x37c(%rsp)
leaq 0x380(%rsp), %rdi
leaq 0x37c(%rsp), %rdx
callq 0x10580
jmp 0x29fd9
leaq 0x428(%rsp), %rdi
leaq 0x380(%rsp), %rsi
callq 0x10530
movb %dl, 0x187(%rsp)
movq %rax, 0x188(%rsp)
jmp 0x29fff
movb 0x187(%rsp), %al
movq 0x188(%rsp), %rcx
movq %rcx, 0x368(%rsp)
movb %al, 0x370(%rsp)
leaq 0x380(%rsp), %rdi
callq 0x105c0
jmp 0x2a11f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
leaq 0x4d7(%rsp), %rdi
callq 0x54d0
jmp 0x2b219
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
leaq 0x4af(%rsp), %rdi
callq 0x54d0
jmp 0x2b20c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
leaq 0x487(%rsp), %rdi
callq 0x54d0
jmp 0x2b1ff
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
leaq 0x45f(%rsp), %rdi
callq 0x54d0
jmp 0x2b1f2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
jmp 0x2b1cb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
jmp 0x2a4ec
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
leaq 0x380(%rsp), %rdi
callq 0x105c0
jmp 0x2a4ec
leaq 0x528(%rsp), %rdi
xorl %esi, %esi
callq 0x2d340
movq %rax, 0x360(%rsp)
movl $0x2, 0x35c(%rsp)
jmp 0x2a4c8
movq 0x3c0(%rsp), %rax
cmpq 0x5c8(%rsp), %rax
ja 0x2a1ca
movq 0x5c8(%rsp), %rax
cmpq 0x3b8(%rsp), %rax
ja 0x2a1ca
movq 0x3c0(%rsp), %rax
movq %rax, 0x500(%rsp)
movslq 0x508(%rsp), %rsi
leaq 0x568(%rsp), %rdi
callq 0x88f0
movq %rax, %rsi
leaq 0x488(%rsp), %rdi
callq 0x5050
jmp 0x2a1a1
movslq 0x508(%rsp), %rsi
leaq 0x538(%rsp), %rdi
callq 0x88f0
movq %rax, %rsi
leaq 0x4d8(%rsp), %rdi
callq 0x5050
jmp 0x2a1c8
jmp 0x2a1ca
cmpq $0x0, 0x4f8(%rsp)
jne 0x2a25d
movq 0x3c0(%rsp), %rax
cmpq 0x5c0(%rsp), %rax
ja 0x2a25d
movq 0x5c0(%rsp), %rax
cmpq 0x3b8(%rsp), %rax
ja 0x2a25d
movq 0x3c0(%rsp), %rax
movq %rax, 0x4f8(%rsp)
movslq 0x508(%rsp), %rsi
leaq 0x568(%rsp), %rdi
callq 0x88f0
movq %rax, %rsi
leaq 0x460(%rsp), %rdi
callq 0x5050
jmp 0x2a234
movslq 0x508(%rsp), %rsi
leaq 0x538(%rsp), %rdi
callq 0x88f0
movq %rax, %rsi
leaq 0x4b0(%rsp), %rdi
callq 0x5050
jmp 0x2a25b
jmp 0x2a25d
movq 0x5c8(%rsp), %rax
cmpq 0x3c0(%rsp), %rax
jae 0x2a292
movq 0x3b8(%rsp), %rax
cmpq 0x5c0(%rsp), %rax
jae 0x2a292
movl 0x50c(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x50c(%rsp)
movq 0x5c8(%rsp), %rax
cmpq 0x3c0(%rsp), %rax
ja 0x2a2b6
movq 0x3c0(%rsp), %rax
cmpq 0x5c0(%rsp), %rax
jbe 0x2a2e2
movq 0x5c8(%rsp), %rax
cmpq 0x3b8(%rsp), %rax
ja 0x2a36c
movq 0x3b8(%rsp), %rax
cmpq 0x5c0(%rsp), %rax
ja 0x2a36c
cmpq $0x0, 0x3f0(%rsp)
je 0x2a35c
movq 0x3c0(%rsp), %rax
cmpq 0x3f0(%rsp), %rax
jb 0x2a301
jmp 0x2a320
leaq 0x3e419(%rip), %rdi     # 0x68721
leaq 0x3dc2e(%rip), %rsi     # 0x67f3d
movl $0x50b, %edx            # imm = 0x50B
leaq 0x3e366(%rip), %rcx     # 0x68681
callq 0x52d0
movq 0x3c0(%rsp), %rax
subq 0x3f0(%rsp), %rax
movq %rax, 0x350(%rsp)
movq 0x350(%rsp), %rax
cmpq 0x3e8(%rsp), %rax
jbe 0x2a35a
movq 0x350(%rsp), %rax
movq %rax, 0x3e8(%rsp)
jmp 0x2a35c
movq 0x3c0(%rsp), %rax
movq %rax, 0x3f0(%rsp)
movq 0x3c0(%rsp), %rax
cmpq 0x5c0(%rsp), %rax
jbe 0x2a4a6
movslq 0x508(%rsp), %rsi
leaq 0x538(%rsp), %rdi
callq 0x88f0
movq %rax, %rsi
leaq 0x3f8(%rsp), %rdi
callq 0x104b0
movq %rax, 0x178(%rsp)
jmp 0x2a3b1
movq 0x178(%rsp), %rax
movq %rax, 0x348(%rsp)
leaq 0x3f8(%rsp), %rdi
callq 0x10500
movq %rax, 0x340(%rsp)
leaq 0x348(%rsp), %rdi
leaq 0x340(%rsp), %rsi
callq 0x104e0
testb $0x1, %al
jne 0x2a3f4
jmp 0x2a4a4
movslq 0x508(%rsp), %rsi
leaq 0x538(%rsp), %rdi
callq 0x88f0
movq %rax, %rsi
movl $0x1, 0x314(%rsp)
leaq 0x318(%rsp), %rdi
leaq 0x314(%rsp), %rdx
callq 0x10580
jmp 0x2a42e
leaq 0x3f8(%rsp), %rdi
leaq 0x318(%rsp), %rsi
callq 0x10530
movb %dl, 0x16f(%rsp)
movq %rax, 0x170(%rsp)
jmp 0x2a454
movb 0x16f(%rsp), %al
movq 0x170(%rsp), %rcx
movq %rcx, 0x300(%rsp)
movb %al, 0x308(%rsp)
leaq 0x318(%rsp), %rdi
callq 0x105c0
jmp 0x2a4a4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
leaq 0x318(%rsp), %rdi
callq 0x105c0
jmp 0x2a4ec
jmp 0x2a4a6
leaq 0x528(%rsp), %rdi
xorl %esi, %esi
callq 0x2d340
movq %rax, 0x2f8(%rsp)
movl $0x0, 0x35c(%rsp)
leaq 0x3d0(%rsp), %rdi
callq 0x8910
movl 0x35c(%rsp), %eax
testl %eax, %eax
je 0x2a4e7
jmp 0x2a4e2
jmp 0x29e5a
jmp 0x29e5a
leaq 0x3d0(%rsp), %rdi
callq 0x8910
jmp 0x2b1cb
movl 0x3e8(%rsp), %ecx
movq 0x608(%rsp), %rax
movl %ecx, (%rax)
leaq 0x428(%rsp), %rdi
leaq 0x4d8(%rsp), %rsi
callq 0x104b0
movq %rax, 0x160(%rsp)
jmp 0x2a52e
movq 0x160(%rsp), %rax
movq %rax, 0x2f0(%rsp)
leaq 0x428(%rsp), %rdi
callq 0x10500
movq %rax, 0x2e8(%rsp)
leaq 0x2f0(%rsp), %rdi
leaq 0x2e8(%rsp), %rsi
callq 0x10920
testb $0x1, %al
jne 0x2a56e
jmp 0x2a587
leaq 0x428(%rsp), %rdi
leaq 0x4d8(%rsp), %rsi
callq 0x2de50
jmp 0x2a585
jmp 0x2a587
leaq 0x428(%rsp), %rdi
callq 0x2de80
movl %eax, %ecx
movq 0x5f8(%rsp), %rax
movl %ecx, (%rax)
leaq 0x3f8(%rsp), %rdi
leaq 0x4b0(%rsp), %rsi
callq 0x104b0
movq %rax, 0x158(%rsp)
jmp 0x2a5bf
movq 0x158(%rsp), %rax
movq %rax, 0x2e0(%rsp)
leaq 0x3f8(%rsp), %rdi
callq 0x10500
movq %rax, 0x2d8(%rsp)
leaq 0x2e0(%rsp), %rdi
leaq 0x2d8(%rsp), %rsi
callq 0x10920
testb $0x1, %al
jne 0x2a5ff
jmp 0x2a618
leaq 0x3f8(%rsp), %rdi
leaq 0x4b0(%rsp), %rsi
callq 0x2de50
jmp 0x2a616
jmp 0x2a618
leaq 0x3f8(%rsp), %rdi
callq 0x2de80
movl %eax, %ecx
movq 0x600(%rsp), %rax
movl %ecx, (%rax)
movl 0x50c(%rsp), %eax
incl %eax
movl %eax, 0x50c(%rsp)
movq 0x5c0(%rsp), %rax
movq 0x5c8(%rsp), %rcx
subq %rcx, %rax
movslq 0x50c(%rsp), %rcx
xorl %edx, %edx
divq %rcx
movl %eax, %ecx
movq 0x5a0(%rsp), %rax
movl %ecx, (%rax)
leaq 0x2b7(%rsp), %rdi
movq %rdi, 0x150(%rsp)
callq 0x57c0
movq 0x150(%rsp), %rdx
leaq 0x3e0a6(%rip), %rsi     # 0x68737
leaq 0x2b8(%rsp), %rdi
callq 0x6880
jmp 0x2a6a0
leaq 0x2b7(%rsp), %rdi
callq 0x54d0
leaq 0x4b0(%rsp), %rdi
leaq 0x4d8(%rsp), %rsi
callq 0x5040
movl %eax, 0x14c(%rsp)
jmp 0x2a6cb
movl 0x14c(%rsp), %eax
cmpl $0x0, %eax
jne 0x2a7af
movq 0x5e0(%rsp), %rax
movb $0x1, (%rax)
leaq 0x28f(%rsp), %rdi
movq %rdi, 0x140(%rsp)
callq 0x57c0
movq 0x140(%rsp), %rdx
leaq 0x3e039(%rip), %rsi     # 0x68743
leaq 0x290(%rsp), %rdi
callq 0x6880
jmp 0x2a719
leaq 0x2b8(%rsp), %rdi
leaq 0x290(%rsp), %rsi
callq 0x5550
leaq 0x290(%rsp), %rdi
callq 0x58b8
leaq 0x28f(%rsp), %rdi
callq 0x54d0
jmp 0x2a7af
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
leaq 0x2b7(%rsp), %rdi
callq 0x54d0
jmp 0x2b1cb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
jmp 0x2b1be
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
leaq 0x28f(%rsp), %rdi
callq 0x54d0
jmp 0x2b1be
leaq 0x4d8(%rsp), %rdi
callq 0x5310
cmpq $0x0, %rax
je 0x2a946
leaq 0x4b0(%rsp), %rdi
callq 0x5310
cmpq $0x0, %rax
je 0x2a946
movq 0x5a7e4(%rip), %rdi     # 0x84fc8
leaq 0x3df5f(%rip), %rsi     # 0x6874a
callq 0x5460
movq %rax, 0x138(%rsp)
jmp 0x2a7fa
movq 0x138(%rsp), %rdi
movq 0x500(%rsp), %rsi
callq 0x50f0
movq %rax, 0x130(%rsp)
jmp 0x2a819
movq 0x130(%rsp), %rdi
leaq 0x3febe(%rip), %rsi     # 0x6a6e6
callq 0x5460
movq %rax, 0x128(%rsp)
jmp 0x2a837
movq 0x128(%rsp), %rdi
movq 0x4f8(%rsp), %rsi
callq 0x50f0
movq %rax, 0x120(%rsp)
jmp 0x2a856
movq 0x120(%rsp), %rdi
leaq 0x3f6cd(%rip), %rsi     # 0x69f32
callq 0x5460
movq %rax, 0x118(%rsp)
jmp 0x2a874
movq 0x118(%rsp), %rdi
leaq 0x3deec(%rip), %rsi     # 0x6876f
callq 0x5460
movq %rax, 0x110(%rsp)
jmp 0x2a892
movq 0x110(%rsp), %rdi
leaq 0x2b8(%rsp), %rsi
callq 0x53e0
movq %rax, 0x108(%rsp)
jmp 0x2a8b1
movq 0x108(%rsp), %rdi
leaq 0x3debf(%rip), %rsi     # 0x6877f
callq 0x5460
movq %rax, 0x100(%rsp)
jmp 0x2a8cf
movq 0x100(%rsp), %rdi
leaq 0x4d8(%rsp), %rsi
callq 0x53e0
movq %rax, 0xf8(%rsp)
jmp 0x2a8ee
movq 0xf8(%rsp), %rdi
leaq 0x3fde9(%rip), %rsi     # 0x6a6e6
callq 0x5460
movq %rax, 0xf0(%rsp)
jmp 0x2a90c
movq 0xf0(%rsp), %rdi
leaq 0x4b0(%rsp), %rsi
callq 0x53e0
movq %rax, 0xe8(%rsp)
jmp 0x2a92b
movq 0xe8(%rsp), %rdi
movq 0x5a676(%rip), %rsi     # 0x84fb0
callq 0x54b0
jmp 0x2a941
jmp 0x2ac22
leaq 0x4d8(%rsp), %rdi
callq 0x5310
cmpq $0x0, %rax
je 0x2aa9f
leaq 0x4b0(%rsp), %rdi
callq 0x5310
cmpq $0x0, %rax
jne 0x2aa9f
movq 0x5a64d(%rip), %rdi     # 0x84fc8
leaq 0x3de09(%rip), %rsi     # 0x6878b
callq 0x5460
movq %rax, 0xe0(%rsp)
jmp 0x2a991
movq 0xe0(%rsp), %rdi
movq 0x500(%rsp), %rsi
callq 0x50f0
movq %rax, 0xd8(%rsp)
jmp 0x2a9b0
movq 0xd8(%rsp), %rdi
leaq 0x3ddeb(%rip), %rsi     # 0x687aa
callq 0x5460
movq %rax, 0xd0(%rsp)
jmp 0x2a9ce
movq 0xd0(%rsp), %rdi
leaq 0x3f555(%rip), %rsi     # 0x69f32
callq 0x5460
movq %rax, 0xc8(%rsp)
jmp 0x2a9ec
movq 0xc8(%rsp), %rdi
leaq 0x3dd74(%rip), %rsi     # 0x6876f
callq 0x5460
movq %rax, 0xc0(%rsp)
jmp 0x2aa0a
movq 0xc0(%rsp), %rdi
leaq 0x2b8(%rsp), %rsi
callq 0x53e0
movq %rax, 0xb8(%rsp)
jmp 0x2aa29
movq 0xb8(%rsp), %rdi
leaq 0x3dda2(%rip), %rsi     # 0x687da
callq 0x5460
movq %rax, 0xb0(%rsp)
jmp 0x2aa47
movq 0xb0(%rsp), %rdi
leaq 0x4d8(%rsp), %rsi
callq 0x53e0
movq %rax, 0xa8(%rsp)
jmp 0x2aa66
movq 0xa8(%rsp), %rdi
leaq 0x3c42b(%rip), %rsi     # 0x66ea0
callq 0x5460
movq %rax, 0xa0(%rsp)
jmp 0x2aa84
movq 0xa0(%rsp), %rdi
movq 0x5a51d(%rip), %rsi     # 0x84fb0
callq 0x54b0
jmp 0x2aa9a
jmp 0x2ac20
leaq 0x4d8(%rsp), %rdi
callq 0x5310
cmpq $0x0, %rax
jne 0x2abef
leaq 0x4b0(%rsp), %rdi
callq 0x5310
cmpq $0x0, %rax
je 0x2abef
movq 0x5a4f4(%rip), %rdi     # 0x84fc8
leaq 0x3dd0a(%rip), %rsi     # 0x687e5
callq 0x5460
movq %rax, 0x98(%rsp)
jmp 0x2aaea
movq 0x98(%rsp), %rdi
leaq 0x3dd09(%rip), %rsi     # 0x68802
callq 0x5460
movq %rax, 0x90(%rsp)
jmp 0x2ab08
movq 0x90(%rsp), %rdi
leaq 0x3fbcf(%rip), %rsi     # 0x6a6e6
callq 0x5460
movq %rax, 0x88(%rsp)
jmp 0x2ab26
movq 0x88(%rsp), %rdi
movq 0x4f8(%rsp), %rsi
callq 0x50f0
movq %rax, 0x80(%rsp)
jmp 0x2ab45
movq 0x80(%rsp), %rdi
leaq 0x3f3de(%rip), %rsi     # 0x69f32
callq 0x5460
movq %rax, 0x78(%rsp)
jmp 0x2ab60
movq 0x78(%rsp), %rdi
leaq 0x3dc03(%rip), %rsi     # 0x6876f
callq 0x5460
movq %rax, 0x70(%rsp)
jmp 0x2ab78
movq 0x70(%rsp), %rdi
leaq 0x2b8(%rsp), %rsi
callq 0x53e0
movq %rax, 0x68(%rsp)
jmp 0x2ab91
movq 0x68(%rsp), %rdi
leaq 0x3dc3d(%rip), %rsi     # 0x687da
callq 0x5460
movq %rax, 0x60(%rsp)
jmp 0x2aba9
movq 0x60(%rsp), %rdi
leaq 0x3fb31(%rip), %rsi     # 0x6a6e6
callq 0x5460
movq %rax, 0x58(%rsp)
jmp 0x2abc1
movq 0x58(%rsp), %rdi
leaq 0x4b0(%rsp), %rsi
callq 0x53e0
movq %rax, 0x50(%rsp)
jmp 0x2abda
movq 0x50(%rsp), %rdi
movq 0x5a3ca(%rip), %rsi     # 0x84fb0
callq 0x54b0
jmp 0x2abed
jmp 0x2ac1e
movq 0x5a3d2(%rip), %rdi     # 0x84fc8
leaq 0x3dc33(%rip), %rsi     # 0x68830
callq 0x5460
movq %rax, 0x48(%rsp)
jmp 0x2ac09
movq 0x48(%rsp), %rdi
movq 0x5a39b(%rip), %rsi     # 0x84fb0
callq 0x54b0
jmp 0x2ac1c
jmp 0x2ac1e
jmp 0x2ac20
jmp 0x2ac22
movq $0x0, 0x280(%rsp)
movl $0x0, 0x27c(%rsp)
movq $0x0, 0x270(%rsp)
movq $0x0, 0x268(%rsp)
movq $0x0, 0x260(%rsp)
movq $0x0, 0x258(%rsp)
leaq 0x588(%rsp), %rdi
callq 0x2d110
movq %rax, 0x250(%rsp)
movq 0x250(%rsp), %rax
movq %rax, 0x528(%rsp)
leaq 0x588(%rsp), %rdi
callq 0x2d140
movq %rax, 0x248(%rsp)
movq 0x248(%rsp), %rax
movq %rax, 0x520(%rsp)
movl $0xffffffff, 0x508(%rsp) # imm = 0xFFFFFFFF
leaq 0x528(%rsp), %rdi
leaq 0x520(%rsp), %rsi
callq 0x2d170
testb $0x1, %al
jne 0x2acdc
jmp 0x2b124
leaq 0x528(%rsp), %rdi
callq 0x2d1b0
movq %rax, %rsi
movb $0x2c, 0x22f(%rsp)
leaq 0x230(%rsp), %rdi
leaq 0x22f(%rsp), %rdx
callq 0x60790
jmp 0x2ad0b
xorl %eax, %eax
movl %eax, 0x44(%rsp)
movl %eax, %esi
movq %rsi, 0x38(%rsp)
leaq 0x230(%rsp), %rdi
movq %rdi, 0x30(%rsp)
callq 0x88f0
movq %rax, %rdi
callq 0x51d0
movq 0x38(%rsp), %rsi
movl 0x44(%rsp), %edx
movq %rax, %rdi
callq 0x5160
movq 0x30(%rsp), %rdi
movq %rax, 0x220(%rsp)
movl $0x1, %esi
callq 0x88f0
movq %rax, %rdi
callq 0x51d0
movq 0x38(%rsp), %rsi
movl 0x44(%rsp), %edx
movq %rax, %rdi
callq 0x5160
movq %rax, 0x218(%rsp)
movl 0x508(%rsp), %eax
incl %eax
movl %eax, 0x508(%rsp)
movslq 0x508(%rsp), %rsi
leaq 0x568(%rsp), %rdi
callq 0x88f0
movq %rax, %rsi
leaq 0x1f8(%rsp), %rdi
callq 0x51f0
jmp 0x2adb2
cmpl $0x0, 0x508(%rsp)
jne 0x2ae46
leaq 0x1f8(%rsp), %rdi
leaq 0x3b872(%rip), %rsi     # 0x66641
callq 0x5140
cmpl $0x0, %eax
jne 0x2ae21
movq 0x220(%rsp), %rax
movq %rax, 0x270(%rsp)
movq 0x218(%rsp), %rax
movq %rax, 0x268(%rsp)
jmp 0x2ae41
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x558(%rsp)
movl %eax, 0x554(%rsp)
leaq 0x230(%rsp), %rdi
callq 0x8910
jmp 0x2b1be
movq 0x220(%rsp), %rax
movq %rax, 0x260(%rsp)
movq 0x218(%rsp), %rax
movq %rax, 0x258(%rsp)
jmp 0x2b0ee
leaq 0x1f8(%rsp), %rdi
leaq 0x3b7ec(%rip), %rsi     # 0x66641
callq 0x5140
cmpl $0x0, %eax
jne 0x2afaa
cmpq $0x0, 0x270(%rsp)
jbe 0x2af85
movq 0x220(%rsp), %rax
cmpq 0x270(%rsp), %rax
jbe 0x2ae9b
movq 0x220(%rsp), %rax
subq 0x270(%rsp), %rax
movq %rax, 0x28(%rsp)
jmp 0x2aeb4
movq 0x270(%rsp), %rax
subq 0x220(%rsp), %rax
imulq $-0x1, %rax, %rax
movq %rax, 0x28(%rsp)
movq 0x28(%rsp), %rax
movl %eax, 0x1f4(%rsp)
movq 0x5e8(%rsp), %rax
movl (%rax), %eax
cmpl 0x1f4(%rsp), %eax
jle 0x2aee0
movl 0x1f4(%rsp), %eax
movl %eax, 0x24(%rsp)
jmp 0x2aeee
movq 0x5e8(%rsp), %rax
movl (%rax), %eax
movl %eax, 0x24(%rsp)
movl 0x24(%rsp), %ecx
movq 0x5e8(%rsp), %rax
movl %ecx, (%rax)
movq 0x5f0(%rsp), %rax
movl (%rax), %eax
cmpl 0x1f4(%rsp), %eax
jge 0x2af1c
movl 0x1f4(%rsp), %eax
movl %eax, 0x20(%rsp)
jmp 0x2af2a
movq 0x5f0(%rsp), %rax
movl (%rax), %eax
movl %eax, 0x20(%rsp)
movl 0x20(%rsp), %ecx
movq 0x5f0(%rsp), %rax
movl %ecx, (%rax)
cmpl $0x0, 0x1f4(%rsp)
jle 0x2af4f
movl 0x1f4(%rsp), %eax
movl %eax, 0x1c(%rsp)
jmp 0x2af5e
imull $0xffffffff, 0x1f4(%rsp), %eax # imm = 0xFFFFFFFF
movl %eax, 0x1c(%rsp)
movl 0x1c(%rsp), %eax
cltq
addq 0x280(%rsp), %rax
movq %rax, 0x280(%rsp)
movl 0x27c(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x27c(%rsp)
movq 0x220(%rsp), %rax
movq %rax, 0x270(%rsp)
movq 0x218(%rsp), %rax
movq %rax, 0x268(%rsp)
jmp 0x2b0ec
cmpq $0x0, 0x260(%rsp)
jbe 0x2b0cc
movq 0x220(%rsp), %rax
cmpq 0x260(%rsp), %rax
jbe 0x2afe2
movq 0x220(%rsp), %rax
subq 0x260(%rsp), %rax
movq %rax, 0x10(%rsp)
jmp 0x2affb
movq 0x260(%rsp), %rax
subq 0x220(%rsp), %rax
imulq $-0x1, %rax, %rax
movq %rax, 0x10(%rsp)
movq 0x10(%rsp), %rax
movl %eax, 0x1f0(%rsp)
movq 0x5e8(%rsp), %rax
movl (%rax), %eax
cmpl 0x1f0(%rsp), %eax
jle 0x2b027
movl 0x1f0(%rsp), %eax
movl %eax, 0xc(%rsp)
jmp 0x2b035
movq 0x5e8(%rsp), %rax
movl (%rax), %eax
movl %eax, 0xc(%rsp)
movl 0xc(%rsp), %ecx
movq 0x5e8(%rsp), %rax
movl %ecx, (%rax)
movq 0x5f0(%rsp), %rax
movl (%rax), %eax
cmpl 0x1f0(%rsp), %eax
jge 0x2b063
movl 0x1f0(%rsp), %eax
movl %eax, 0x8(%rsp)
jmp 0x2b071
movq 0x5f0(%rsp), %rax
movl (%rax), %eax
movl %eax, 0x8(%rsp)
movl 0x8(%rsp), %ecx
movq 0x5f0(%rsp), %rax
movl %ecx, (%rax)
cmpl $0x0, 0x1f0(%rsp)
jle 0x2b096
movl 0x1f0(%rsp), %eax
movl %eax, 0x4(%rsp)
jmp 0x2b0a5
imull $0xffffffff, 0x1f0(%rsp), %eax # imm = 0xFFFFFFFF
movl %eax, 0x4(%rsp)
movl 0x4(%rsp), %eax
cltq
addq 0x280(%rsp), %rax
movq %rax, 0x280(%rsp)
movl 0x27c(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x27c(%rsp)
movq 0x220(%rsp), %rax
movq %rax, 0x260(%rsp)
movq 0x218(%rsp), %rax
movq %rax, 0x258(%rsp)
jmp 0x2b0ee
leaq 0x528(%rsp), %rdi
xorl %esi, %esi
callq 0x2d340
movq %rax, 0x1e8(%rsp)
leaq 0x1f8(%rsp), %rdi
callq 0x58b8
leaq 0x230(%rsp), %rdi
callq 0x8910
jmp 0x2acbe
movb $0x1, 0x5d7(%rsp)
movl $0x1, 0x35c(%rsp)
leaq 0x2b8(%rsp), %rdi
callq 0x58b8
leaq 0x3f8(%rsp), %rdi
callq 0xfe20
leaq 0x428(%rsp), %rdi
callq 0xfe20
leaq 0x460(%rsp), %rdi
callq 0x58b8
leaq 0x488(%rsp), %rdi
callq 0x58b8
leaq 0x4b0(%rsp), %rdi
callq 0x58b8
leaq 0x4d8(%rsp), %rdi
callq 0x58b8
leaq 0x538(%rsp), %rdi
callq 0x8910
leaq 0x568(%rsp), %rdi
callq 0x8910
leaq 0x588(%rsp), %rdi
callq 0x8910
jmp 0x2b242
leaq 0x2b8(%rsp), %rdi
callq 0x58b8
leaq 0x3f8(%rsp), %rdi
callq 0xfe20
leaq 0x428(%rsp), %rdi
callq 0xfe20
leaq 0x460(%rsp), %rdi
callq 0x58b8
leaq 0x488(%rsp), %rdi
callq 0x58b8
leaq 0x4b0(%rsp), %rdi
callq 0x58b8
leaq 0x4d8(%rsp), %rdi
callq 0x58b8
leaq 0x538(%rsp), %rdi
callq 0x8910
leaq 0x568(%rsp), %rdi
callq 0x8910
leaq 0x588(%rsp), %rdi
callq 0x8910
jmp 0x2b253
movb 0x5d7(%rsp), %al
andb $0x1, %al
addq $0x5d8, %rsp            # imm = 0x5D8
retq
movq 0x558(%rsp), %rdi
callq 0x57b0