// File: /workspace/github_cpp_makefile_star2_O3/schneebergerlab[P]DrLink/analyze_molecule.cpp
// Function: analyze_molecule(int, char**)
bool analyze_molecule(int argc, char* argv[])
{
    if(argc != 6)
    {
        cout << "\n   Usage: DrLink molecule preprocessed_bamInfo.gz max_inter_read_dist min_molecule_size out_prefix_str "               << endl;
        cout << "     max_inter_read_dist\tINT\tbp: reads with same barcode but distance >= value will be separated into sub-molecules. " << endl;
        cout << "                             \tThis depends on sequencing library design: if expected mean size of molecules is EXP kp, we can use 1.5*EXP bp." << endl;   
        cout << "     min_molecule_size\tINT\tbp: size of molecules <= value will not contribute to final statistics, e.g., 1000 bp. "    << endl;
        return false;
    }
    clock_t tbeg;
    tbeg = clock();
    bool verbose = true;            // TODO: add option
    unsigned long winsize = 100000; // same barcode in chr with distance>100kb => two molecules; note this depends on sequencing library design
    // input file
    string procbamfile("");    
    int minMoleSize = 1000;
    std::stringstream minMsize;
    minMsize.str("");
    minMsize << minMoleSize;    
    string out_prefix("");
    if(argc == 6)
    {
        procbamfile = (string)argv[2];
        winsize     = strtoul(argv[3], NULL, 0); 
        minMoleSize = atoi(argv[4]);
        out_prefix  = (string)argv[5]; 
        minMsize.str("");
        minMsize << minMoleSize;       
    }
    // step 1. read chr size info
    /*
    map<string, string> chrSizes;
    if(!read_chrsize(chrsizefile.c_str(), &chrSizes))
    {
        cout << "   Error: reading chr size failed (analyze_molecule.cpp). " << endl;
        return false;
    }
    */
    // step 2.
    cout << "   Info: analyzing molecules started..." << endl;
    // open converted file.gz.
    if(procbamfile.find(".gz")==std::string::npos)
    {
        cout << "   Error: current version only supported gzipped file. " << endl;
        return false;
    }
    igzstream alifp;
    alifp.open(procbamfile.c_str());
    if(!alifp.good())
    {
        cout << "   Error: cannot open " << procbamfile << endl;
        return false;
    }
    // 2.1 prepare variable for analyzing/outputing alignments/clusters
    string ofilename = out_prefix + "_min" + minMsize.str() + "bp_molecule_table_trashme.txt.gz";
    ogzstream moutfp;
    moutfp.open(ofilename.c_str(), ios::out);
    if(!moutfp)
    {
        cout << "    Error: cannot open file " << ofilename << " for writing. " << endl;
        return false;
    }
    moutfp << "#chr#barcode\tfirst_aligned\tlast_aligned\tmolecule_len\tmolecule_cov\tread_num\tUni_flag\tlast_aligned_end\treads_region\tR1R2\treads_id" << endl;
    map<string,  unsigned long> molecule_cov;          // key: 0.01x, 0.02x,0.03x, ...,    val: number of molecules
    map<int,     unsigned long> molecule_len;          // key: 0kb, 1kb, 2kb,...           val: number of molecules.
    map<int,     unsigned long> molecule_len_sum;      // key: 0kb, 1kb, 2kb,...           val: total length of molecules in bin 
    map<int,     unsigned long> molecule_read_num;     // key: 1,2,3...                    val: number of molecules
    map<int,     unsigned long> molecule_read_num_sum; // key: 1,2,3...                    val: total length of reads in bin
    // note that below is a statistic of the read-distances within the same chr#barcode (but possibly several molecules).
    map<int,     unsigned long> molecule_read_interval;// key: 200,201,...                 val: total number of cases with that inter-read-distance-given-by-key
    map<string,            int> barcode_molecule_cnt;  // key: barcode1, barcode2,...      val: number of molecules
    multimap<string, ALIGNINFO> bcPosQueue; // from barcode find read-aligning (sta, end)-positions
    // 2.2 cluster existing alignments in queue and output molecule info -- caution in RAM
    string lastChr("");
    string currentChr("");
    unsigned long lineNum = 0;
    while(alifp.good())
    {
        string line("");
        getline(alifp, line);
        if(line.size()==0 || line[0]=='#' || line[0]=='*') continue;
        
        lineNum ++;
        if(lineNum%10000000 == 0) cout << "    " << lineNum << "th aligm..." << endl;
        
        // chr pos inbamCIGAR barcode MI read-ordering:inbamFLAG reversed-align read-id
        // 1	125	128M	TTTCCTCAGGGTTTCT	0	R1:99 rc        idddddd
        vector<string> lineinfo = split_string(line, '\t');
        if(lineinfo.size() < 6) continue;        
        if(lastChr.size() == 0)
        {
            lastChr    = lineinfo[0];
        }
        currentChr = lineinfo[0];        
        
        if(currentChr.compare(lastChr)!=0 && bcPosQueue.size()>0)
        {
            // output alignments for last chr and record statistics
            write_chr_alignment(moutfp,
                                &bcPosQueue, 
                                &molecule_cov,
                                &molecule_len,
                                &molecule_len_sum,
                                &molecule_read_num,
                                &molecule_read_num_sum,
                                &molecule_read_interval,
                                &barcode_molecule_cnt,
                                lastChr,
                                winsize,
                                minMoleSize);
            // clean info for last Chr
            bcPosQueue.clear();
            lastChr = currentChr;
        }
        unsigned long stapos = strtoul(lineinfo[1].c_str(), NULL, 0); // alignment start position
        int covlen = 0;
        covlen = decipher_cigar(lineinfo[2]);                         // covered len by alignment
        string key("");
        key    = lineinfo[0] + "#" + lineinfo[3];                     // chr+"#"+barcode            
        ALIGNINFO span;
        span.first  = stapos;
        span.second = stapos+covlen-1;                                //
        if(lineinfo[5].find("R1") != std::string::npos)
        {
            span.rorder = "1";
        }
        else
        if(lineinfo[5].find("R2") != std::string::npos)
        {
            span.rorder = "2";
        }  
        else
        {
            span.rorder = "x";
        }      
        span.readid = lineinfo[7];
        span.rcigar = lineinfo[2];
        // chr+"#"+barcode => (sta, end) : allow multi-aligns with the same barcode.
        bcPosQueue.insert(std::pair<string, ALIGNINFO>(key, span));
    }
    // output alignments for last chr record statistics
    if(bcPosQueue.size()>0)
    {
        // output alignments for last chr and record statistics
        write_chr_alignment(moutfp,
                            &bcPosQueue, 
                            &molecule_cov,
                            &molecule_len,
                            &molecule_len_sum,
                            &molecule_read_num,       
                            &molecule_read_num_sum, 
                            &molecule_read_interval,                    
                            &barcode_molecule_cnt,
                            lastChr,
                            winsize,
                            minMoleSize);
        // clean info for last Chr
        bcPosQueue.clear();
    }
    //
    alifp.close();
    moutfp.close();    
    // output statistics
    if(!write_molecule_stat(molecule_cov, 
                            molecule_len, 
                            molecule_len_sum,
                            molecule_read_num,
                            molecule_read_num_sum,
                            molecule_read_interval,
                            barcode_molecule_cnt, 
                            out_prefix, 
                            minMoleSize))
    {
        return false;
    }
    //
    cout << "   Info: molecule raw info    collected in " << ofilename << endl;
    cout << "   Info: molecule coverage    collected in"  << out_prefix + "_min" + minMsize.str() + "bp_moleCov_stat.txt" << endl;
    cout << "   Info: molecule length      collected in"  << out_prefix + "_min" + minMsize.str() + "bp_moleLen_stat.txt" << endl;  
    cout << "   Info: molecule read number collected in"  << out_prefix + "_min" + minMsize.str() + "bp_readNum_stat.txt" << endl;  
    cout << "   Info: reads' distances     collected in " << out_prefix + "_min" + minMsize.str() + "bp_readDist_stat.txt" << endl;
    cout << "   Info: time on analyzing molecules: "      << (float)(clock()-tbeg)/CLOCKS_PER_SEC << " seconds.\n" << endl;        
    return true;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xc28, %rsp            # imm = 0xC28
cmpl $0x6, %edi
jne 0x7026
movq %rsi, %r14
callq 0x4200
movq %rax, %rbp
leaq 0x1d8(%rsp), %r13
movq %r13, -0x10(%r13)
leaq 0x37daa(%rip), %rdx     # 0x3eb0a
leaq 0x1c8(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
leaq 0xaa0(%rsp), %rdi
callq 0x4240
leaq 0x578(%rsp), %r12
movq %r12, -0x10(%r12)
leaq 0x37d79(%rip), %rdx     # 0x3eb0a
leaq 0x568(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
leaq 0xab8(%rsp), %rdi
leaq 0x568(%rsp), %rsi
callq 0x4490
movq 0x568(%rsp), %rdi
cmpq %r12, %rdi
je 0x6dd3
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0xab0(%rsp), %rbx
movq %rbx, %rdi
movl $0x3e8, %esi            # imm = 0x3E8
callq 0x4580
leaq 0xc8(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0x37d0f(%rip), %rdx     # 0x3eb0a
leaq 0xb8(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
movq 0x10(%r14), %rsi
leaq 0x568(%rsp), %rdi
leaq 0x808(%rsp), %rdx
callq 0x5346
leaq 0x1c8(%rsp), %rdi
leaq 0x568(%rsp), %r15
movq %r15, %rsi
callq 0x43e0
movq (%r15), %rdi
cmpq %r12, %rdi
je 0x6e54
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x18(%r14), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4130
movq %rax, 0x1e8(%rsp)
movq 0x20(%r14), %rdi
callq 0x44d0
movl %eax, %r15d
movq 0x28(%r14), %rsi
leaq 0x568(%rsp), %rdi
leaq 0x808(%rsp), %rdx
callq 0x5346
leaq 0xb8(%rsp), %rdi
leaq 0x568(%rsp), %r14
movq %r14, %rsi
callq 0x43e0
movq (%r14), %rdi
cmpq %r12, %rdi
je 0x6ebe
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x568(%rsp), %rdi
movq %r12, (%rdi)
leaq 0x37c3a(%rip), %rdx     # 0x3eb0a
movq %rdx, %rsi
callq 0x5384
leaq 0x568(%rsp), %rsi
leaq 0xab8(%rsp), %rdi
callq 0x4490
movq 0x568(%rsp), %rdi
cmpq %r12, %rdi
je 0x6f0a
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
movq %rbx, %rdi
movl %r15d, %esi
callq 0x4580
movq 0x450ac(%rip), %rbx     # 0x4bfc8
leaq 0x33bad(%rip), %rsi     # 0x3aad0
movl $0x27, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
addq -0x18(%rax), %rbx
movq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq 0x4507a(%rip), %rdi     # 0x4bfc8
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x334d5(%rip), %rsi     # 0x3a437
leaq 0x1c8(%rsp), %rdi
movl $0x3, %ecx
xorl %edx, %edx
callq 0x4590
cmpq $-0x1, %rax
je 0x7120
leaq 0x568(%rsp), %rdi
callq 0xcb3a
movq 0x1c8(%rsp), %rsi
leaq 0x568(%rsp), %rdi
movl $0x8, %edx
callq 0x39022
movq 0x568(%rsp), %rax
movq -0x18(%rax), %rax
cmpl $0x0, 0x588(%rsp,%rax)
je 0x716d
movq 0x45000(%rip), %rdi     # 0x4bfc8
leaq 0x33b61(%rip), %rsi     # 0x3ab30
movl $0x16, %edx
callq 0x43a0
movq 0x1c8(%rsp), %rsi
movq 0x1d0(%rsp), %rdx
movq 0x44fd8(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
xorl %ebp, %ebp
jmp 0x894f
movq 0x44f9b(%rip), %rbx     # 0x4bfc8
leaq 0x338bc(%rip), %rsi     # 0x3a8f0
movl $0x68, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x338ea(%rip), %rsi     # 0x3a959
movl $0x75, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x33925(%rip), %rsi     # 0x3a9cf
movl $0x8d, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x33978(%rip), %rsi     # 0x3aa5d
movl $0x72, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
xorl %ebp, %ebp
jmp 0x89f3
movq 0x44ea1(%rip), %rbx     # 0x4bfc8
leaq 0x339ca(%rip), %rsi     # 0x3aaf8
movl $0x37, %edx
movq %rbx, %rdi
callq 0x43a0
movq (%rbx), %rax
addq -0x18(%rax), %rbx
movq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq 0x44e6f(%rip), %rdi     # 0x4bfc8
callq 0x4030
movq %rax, %rdi
callq 0x4220
xorl %ebp, %ebp
jmp 0x8990
leaq 0xe8(%rsp), %rax
movq %rax, -0x10(%rax)
movq 0xb8(%rsp), %rsi
movq 0xc0(%rsp), %rdx
addq %rsi, %rdx
leaq 0xd8(%rsp), %rdi
callq 0xd940
leaq 0x339a7(%rip), %rsi     # 0x3ab47
leaq 0xd8(%rsp), %rdi
callq 0x45e0
leaq 0x48(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq 0xd8(%rsp), %rcx
movq 0xe0(%rsp), %r8
movq 0x50(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %edi
leaq 0xe8(%rsp), %rsi
cmpq %rsi, %rcx
je 0x71f2
movq 0xe8(%rsp), %rdi
movq 0x48(%rsp), %rsi
cmpq %rdi, %rax
jbe 0x7215
leaq 0x58(%rsp), %r9
movl $0xf, %edi
cmpq %r9, %rsi
je 0x7210
movq 0x58(%rsp), %rdi
cmpq %rdi, %rax
jbe 0x7224
leaq 0xd8(%rsp), %rdi
callq 0x4120
jmp 0x7232
leaq 0x48(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x818(%rsp), %rdx
movq %rdx, -0x10(%rdx)
movq (%rax), %rsi
leaq 0x10(%rax), %rcx
cmpq %rcx, %rsi
je 0x725f
movq %rsi, 0x808(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x818(%rsp)
jmp 0x7265
movups (%rcx), %xmm0
movups %xmm0, (%rdx)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x810(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x338c0(%rip), %rsi     # 0x3ab4c
leaq 0x808(%rsp), %rdi
callq 0x45e0
leaq 0x1b8(%rsp), %r12
movq %r12, -0x10(%r12)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x72ca
movq %rdx, 0x1a8(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x1b8(%rsp)
jmp 0x72d2
movups (%rcx), %xmm0
movups %xmm0, (%r12)
movq 0x8(%rax), %rdx
movq %rdx, 0x1b0(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
leaq 0x818(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x730e
movq 0x818(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x58(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x7329
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0xd8(%rsp), %rdi
leaq 0xe8(%rsp), %rax
cmpq %rax, %rdi
je 0x734e
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x808(%rsp), %rdi
callq 0x69ce
movq 0x1a8(%rsp), %rsi
leaq 0x808(%rsp), %rdi
movl $0x10, %edx
callq 0x39022
movq 0x808(%rsp), %rax
movq -0x18(%rax), %rax
testb $0x5, 0x828(%rsp,%rax)
je 0x7404
movq 0x44c36(%rip), %rdi     # 0x4bfc8
leaq 0x337d4(%rip), %rsi     # 0x3ab6d
movl $0x1c, %edx
callq 0x43a0
movq 0x1a8(%rsp), %rsi
movq 0x1b0(%rsp), %rdx
movq 0x44c0e(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
leaq 0x337c1(%rip), %rsi     # 0x3ab8a
movl $0xe, %edx
movq %rax, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
xorl %ebp, %ebp
jmp 0x8911
leaq 0x990(%rsp), %rbx
leaq 0x33786(%rip), %rsi     # 0x3ab99
movl $0x7f, %edx
movq %rbx, %rdi
callq 0x43a0
movq 0x990(%rsp), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
leaq 0x3f0(%rsp), %rcx
xorl %eax, %eax
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x3c0(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x390(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x360(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x330(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x300(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x2d0(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x260(%rsp), %rcx
movl %eax, (%rcx)
movq %rax, 0x8(%rcx)
movq %rcx, 0x10(%rcx)
movq %rcx, 0x18(%rcx)
movq %rax, 0x20(%rcx)
leaq 0x198(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0x375d9(%rip), %rdx     # 0x3eb0a
leaq 0x188(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
movq %rbp, 0x250(%rsp)
leaq 0x200(%rsp), %rax
movq %rax, -0x10(%rax)
leaq 0x375ae(%rip), %rdx     # 0x3eb0a
leaq 0x1f0(%rsp), %rdi
movq %rdx, %rsi
callq 0x5384
movq 0x568(%rsp), %rax
movq -0x18(%rax), %rax
cmpl $0x0, 0x588(%rsp,%rax)
jne 0x7c9a
leaq 0x18(%rsp), %r12
leaq 0x48(%rsp), %rbp
movq $0x0, 0x180(%rsp)
movq %r12, 0x8(%rsp)
leaq 0x8(%rsp), %rdi
leaq 0x3755d(%rip), %rdx     # 0x3eb0a
movq %rdx, %rsi
callq 0x5384
movq 0x6f0(%rsp), %rax
movq -0x18(%rax), %rdi
leaq 0x6f0(%rsp), %rax
addq %rax, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %edx
leaq 0x6f0(%rsp), %rdi
leaq 0x8(%rsp), %rsi
callq 0x45c0
cmpq $0x0, 0x10(%rsp)
movq 0x8(%rsp), %rdi
je 0x7c6e
movzbl (%rdi), %eax
cmpl $0x23, %eax
je 0x7c6e
cmpl $0x2a, %eax
je 0x7c6e
movq 0x180(%rsp), %rcx
incq %rcx
movq %rcx, %rax
movq %rcx, 0x180(%rsp)
movabsq $-0x1afcdb885172b95b, %rcx # imm = 0xE5032477AE8D46A5
imulq %rcx, %rax
rorq $0x7, %rax
movabsq $0x1ad7f29abca, %rcx    # imm = 0x1AD7F29ABCA
cmpq %rcx, %rax
ja 0x76b2
movl $0x4, %edx
movq 0x44974(%rip), %rdi     # 0x4bfc8
leaq 0x34d2e(%rip), %rsi     # 0x3c389
callq 0x43a0
movq 0x44961(%rip), %rdi     # 0x4bfc8
movq 0x180(%rsp), %rsi
callq 0x4210
movq %rax, %r14
movl $0xb, %edx
movq %rax, %rdi
leaq 0x32e3b(%rip), %rsi     # 0x3a4c1
callq 0x43a0
movq (%r14), %rax
movq -0x18(%rax), %rdi
addq %r14, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %r14, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movb $0x9, 0xd8(%rsp)
leaq 0x168(%rsp), %rdi
leaq 0x8(%rsp), %rsi
leaq 0xd8(%rsp), %rdx
callq 0x367c0
movq 0x168(%rsp), %rsi
movq 0x170(%rsp), %rax
subq %rsi, %rax
cmpq $0xc0, %rax
jb 0x7c5c
cmpq $0x0, 0x190(%rsp)
jne 0x7713
leaq 0x188(%rsp), %rdi
callq 0x41c0
movq 0x168(%rsp), %rsi
leaq 0x1f0(%rsp), %rdi
callq 0x41c0
movq 0x1f8(%rsp), %r13
movq 0x190(%rsp), %r14
cmpq %r13, %r14
movq %r13, %rdx
cmovbq %r14, %rdx
testq %rdx, %rdx
je 0x7773
movq 0x188(%rsp), %r12
movq 0x1f0(%rsp), %rdi
movq %r12, %rsi
callq 0x4350
testl %eax, %eax
je 0x7773
cmpq $0x0, 0x280(%rsp)
leaq 0x1d8(%rsp), %r13
jne 0x779b
jmp 0x786e
cmpq %r14, %r13
leaq 0x1d8(%rsp), %r13
je 0x786e
cmpq $0x0, 0x280(%rsp)
je 0x786e
movq 0x188(%rsp), %r12
leaq 0x220(%rsp), %rax
movq %rax, 0x210(%rsp)
addq %r12, %r14
leaq 0x210(%rsp), %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0xd940
leaq 0x808(%rsp), %rdi
leaq 0x258(%rsp), %rsi
leaq 0x3e8(%rsp), %rdx
leaq 0x3b8(%rsp), %rcx
leaq 0x388(%rsp), %r8
leaq 0x358(%rsp), %r9
pushq %r15
pushq 0x1f0(%rsp)
leaq 0x220(%rsp), %rax
pushq %rax
leaq 0x2e0(%rsp), %rax
pushq %rax
leaq 0x318(%rsp), %rax
pushq %rax
leaq 0x350(%rsp), %rax
pushq %rax
callq 0x8f83
addq $0x30, %rsp
movq 0x210(%rsp), %rdi
leaq 0x220(%rsp), %rax
cmpq %rax, %rdi
je 0x784c
movq 0x220(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x258(%rsp), %rdi
callq 0xd9d6
leaq 0x188(%rsp), %rdi
leaq 0x1f0(%rsp), %rsi
callq 0x41c0
movq 0x168(%rsp), %rax
movq 0x20(%rax), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4130
movq %rax, %r12
movq 0x168(%rsp), %rax
leaq 0x240(%rsp), %rcx
movq %rcx, 0x230(%rsp)
movq 0x40(%rax), %rsi
movq 0x48(%rax), %rdx
addq %rsi, %rdx
leaq 0x230(%rsp), %r14
movq %r14, %rdi
callq 0xd940
movq %r14, %rdi
callq 0xb0de
movl %eax, %ebx
movq 0x230(%rsp), %rdi
leaq 0x240(%rsp), %rax
cmpq %rax, %rdi
je 0x78e8
movq 0x240(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x38(%rsp), %rax
movq %rax, 0x28(%rsp)
leaq 0x28(%rsp), %rdi
leaq 0x3720c(%rip), %rdx     # 0x3eb0a
movq %rdx, %rsi
callq 0x5384
movq 0x168(%rsp), %rax
leaq 0x58(%rsp), %rcx
movq %rcx, 0x48(%rsp)
movq (%rax), %rsi
movq 0x8(%rax), %rdx
addq %rsi, %rdx
movq %rbp, %rdi
callq 0xd940
movq %r15, %r14
movq %rbp, %rdi
leaq 0x3769b(%rip), %rsi     # 0x3efd2
callq 0x45e0
movq %r13, %r15
movq 0x168(%rsp), %rax
movq 0x60(%rax), %rsi
movq 0x68(%rax), %rdx
movq %rbp, %rdi
callq 0x4120
leaq 0xe8(%rsp), %r13
movq %r13, 0xd8(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x798b
movq %rdx, 0xd8(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe8(%rsp)
jmp 0x7993
movups (%rcx), %xmm0
movups %xmm0, (%r13)
movq 0x8(%rax), %rdx
movq %rdx, 0xe0(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
leaq 0x28(%rsp), %rdi
leaq 0xd8(%rsp), %rsi
callq 0x43e0
movq 0xd8(%rsp), %rdi
cmpq %r13, %rdi
je 0x79dd
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x48(%rsp), %rdi
leaq 0x58(%rsp), %rax
cmpq %rax, %rdi
movq %r15, %r13
je 0x79fc
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x68(%rsp), %rax
movq %rax, 0x58(%rsp)
xorl %ecx, %ecx
movq %rcx, 0x60(%rsp)
movb %cl, 0x68(%rsp)
leaq 0x88(%rsp), %rax
movq %rax, 0x78(%rsp)
movq %rcx, 0x80(%rsp)
movb %cl, 0x88(%rsp)
leaq 0xa8(%rsp), %rax
movq %rax, 0x98(%rsp)
movq %rcx, 0xa0(%rsp)
movb %cl, 0xa8(%rsp)
movq %r12, 0x48(%rsp)
movslq %ebx, %rax
leaq -0x1(%r12,%rax), %rax
movq %rax, 0x50(%rsp)
movq 0x168(%rsp), %rdi
movl $0xa0, %r12d
addq %r12, %rdi
movl $0x2, %ecx
leaq 0x32c31(%rip), %rsi     # 0x3a6ac
xorl %edx, %edx
callq 0x4590
cmpq $-0x1, %rax
movq %r14, %r15
je 0x7a99
movq 0x60(%rsp), %rdx
leaq 0x32baa(%rip), %rcx     # 0x3a641
jmp 0x7ad2
movq 0x168(%rsp), %rdi
addq %r12, %rdi
movl $0x2, %ecx
leaq 0x32bff(%rip), %rsi     # 0x3a6af
xorl %edx, %edx
callq 0x4590
cmpq $-0x1, %rax
movq 0x60(%rsp), %rdx
leaq 0x37436(%rip), %rcx     # 0x3eefd
leaq 0x371b4(%rip), %rax     # 0x3ec82
cmoveq %rax, %rcx
leaq 0x18(%rsp), %r12
leaq 0x48(%rsp), %rbp
movl $0x1, %r8d
leaq 0x58(%rsp), %rdi
xorl %esi, %esi
callq 0x44c0
movq 0x168(%rsp), %rsi
movl $0xe0, %eax
addq %rax, %rsi
leaq 0x78(%rsp), %rdi
callq 0x41c0
movq 0x168(%rsp), %rsi
addq $0x40, %rsi
leaq 0x98(%rsp), %rdi
callq 0x41c0
leaq 0xd8(%rsp), %r14
movq %r14, %rdi
leaq 0x28(%rsp), %rsi
movq %rbp, %rdx
callq 0xcc24
leaq 0x258(%rsp), %rdi
movq %r14, %rsi
callq 0xda04
movq 0x148(%rsp), %rdi
leaq 0x158(%rsp), %rax
cmpq %rax, %rdi
je 0x7b6e
movq 0x158(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x128(%rsp), %rdi
leaq 0x138(%rsp), %rax
cmpq %rax, %rdi
je 0x7b93
movq 0x138(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x108(%rsp), %rdi
leaq 0x118(%rsp), %rax
cmpq %rax, %rdi
je 0x7bb8
movq 0x118(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0xd8(%rsp), %rdi
leaq 0xe8(%rsp), %rax
cmpq %rax, %rdi
je 0x7bdd
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x98(%rsp), %rdi
leaq 0xa8(%rsp), %rax
cmpq %rax, %rdi
je 0x7c02
movq 0xa8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x78(%rsp), %rdi
leaq 0x88(%rsp), %rax
cmpq %rax, %rdi
je 0x7c24
movq 0x88(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x58(%rsp), %rdi
leaq 0x68(%rsp), %rax
cmpq %rax, %rdi
je 0x7c40
movq 0x68(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x28(%rsp), %rdi
leaq 0x38(%rsp), %rax
cmpq %rax, %rdi
je 0x7c5c
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x168(%rsp), %rdi
callq 0x6aac
movq 0x8(%rsp), %rdi
cmpq %r12, %rdi
je 0x7c80
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x568(%rsp), %rax
movq -0x18(%rax), %rax
cmpl $0x0, 0x588(%rsp,%rax)
je 0x759c
cmpq $0x0, 0x280(%rsp)
je 0x7d62
leaq 0x2b8(%rsp), %r14
movq %r14, -0x10(%r14)
movq 0x188(%rsp), %rsi
movq 0x190(%rsp), %rdx
addq %rsi, %rdx
leaq 0x2a8(%rsp), %rbx
movq %rbx, %rdi
callq 0xd940
leaq 0x2c8(%rsp), %rax
leaq 0x2f8(%rsp), %r10
leaq 0x328(%rsp), %r11
leaq 0x808(%rsp), %rdi
leaq 0x258(%rsp), %rsi
leaq 0x3e8(%rsp), %rdx
leaq 0x3b8(%rsp), %rcx
leaq 0x388(%rsp), %r8
leaq 0x358(%rsp), %r9
pushq %r15
pushq 0x1f0(%rsp)
pushq %rbx
pushq %rax
pushq %r10
pushq %r11
callq 0x8f83
addq $0x30, %rsp
movq 0x2a8(%rsp), %rdi
cmpq %r14, %rdi
je 0x7d55
movq 0x2b8(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x258(%rsp), %rdi
callq 0xd9d6
leaq 0x568(%rsp), %rdi
callq 0x392ca
leaq 0x808(%rsp), %rdi
callq 0x392ca
leaq 0x508(%rsp), %rdi
leaq 0x3e8(%rsp), %rsi
callq 0xd104
leaq 0x4d8(%rsp), %rdi
leaq 0x3b8(%rsp), %rsi
callq 0xd390
leaq 0x4a8(%rsp), %rdi
leaq 0x388(%rsp), %rsi
callq 0xd390
leaq 0x478(%rsp), %rdi
leaq 0x358(%rsp), %rsi
callq 0xd390
leaq 0x448(%rsp), %rdi
leaq 0x328(%rsp), %rsi
callq 0xd390
leaq 0x418(%rsp), %rdi
leaq 0x2f8(%rsp), %rsi
callq 0xd390
leaq 0x538(%rsp), %rbx
leaq 0x2c8(%rsp), %rsi
movq %rbx, %rdi
callq 0xd564
leaq 0x298(%rsp), %r12
movq %r12, -0x10(%r12)
movq 0xb8(%rsp), %rsi
movq 0xc0(%rsp), %rdx
addq %rsi, %rdx
leaq 0x288(%rsp), %r14
movq %r14, %rdi
callq 0xd940
subq $0x8, %rsp
leaq 0x510(%rsp), %rdi
leaq 0x4e0(%rsp), %rsi
leaq 0x4b0(%rsp), %rdx
leaq 0x480(%rsp), %rcx
leaq 0x450(%rsp), %r8
leaq 0x420(%rsp), %r9
pushq %r15
pushq %r14
pushq %rbx
callq 0xb1d6
addq $0x20, %rsp
movl %eax, %ebp
movq 0x288(%rsp), %rdi
cmpq %r12, %rdi
je 0x7ea3
movq 0x298(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x538(%rsp), %rdi
callq 0xd7ee
leaq 0x418(%rsp), %rdi
callq 0xd802
leaq 0x448(%rsp), %rdi
callq 0xd802
leaq 0x478(%rsp), %rdi
callq 0xd802
leaq 0x4a8(%rsp), %rdi
callq 0xd802
leaq 0x4d8(%rsp), %rdi
callq 0xd802
leaq 0x508(%rsp), %rdi
callq 0xd816
testb %bpl, %bpl
leaq 0x1b8(%rsp), %r12
je 0x885f
movq 0x440b2(%rip), %rdi     # 0x4bfc8
leaq 0x32cfc(%rip), %rsi     # 0x3ac19
movl $0x2b, %edx
callq 0x43a0
movq 0x1a8(%rsp), %rsi
movq 0x1b0(%rsp), %rdx
movq 0x4408a(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0x44054(%rip), %rdi     # 0x4bfc8
leaq 0x32cca(%rip), %rsi     # 0x3ac45
movl $0x2a, %edx
callq 0x43a0
leaq 0x18(%rsp), %r14
movq %r14, -0x10(%r14)
movq 0xb8(%rsp), %rsi
movq 0xc0(%rsp), %rdx
addq %rsi, %rdx
leaq 0x8(%rsp), %rdi
callq 0xd940
leaq 0x32b95(%rip), %rsi     # 0x3ab47
leaq 0x8(%rsp), %rdi
callq 0x45e0
leaq 0x28(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq 0x8(%rsp), %rcx
movq 0x10(%rsp), %r8
movq 0x30(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %edi
cmpq %r14, %rcx
je 0x7ff0
movq 0x18(%rsp), %rdi
movq 0x28(%rsp), %rsi
cmpq %rdi, %rax
jbe 0x8013
leaq 0x38(%rsp), %r9
movl $0xf, %edi
cmpq %r9, %rsi
je 0x800e
movq 0x38(%rsp), %rdi
cmpq %rdi, %rax
jbe 0x801f
leaq 0x8(%rsp), %rdi
callq 0x4120
jmp 0x802d
leaq 0x28(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x58(%rsp), %rsi
movq %rsi, 0x48(%rsp)
movq (%rax), %rdx
leaq 0x10(%rax), %rcx
cmpq %rcx, %rdx
je 0x8052
movq %rdx, 0x48(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x58(%rsp)
jmp 0x8058
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x50(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x32bf4(%rip), %rsi     # 0x3ac70
leaq 0x48(%rsp), %rdi
callq 0x45e0
leaq 0xe8(%rsp), %rsi
movq %rsi, 0xd8(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x80ba
movq %rdx, 0xd8(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe8(%rsp)
jmp 0x80c0
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq 0x8(%rax), %rdx
movq %rdx, 0xe0(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
movq 0xd8(%rsp), %rsi
movq 0xe0(%rsp), %rdx
movq 0x43ed6(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0xd8(%rsp), %rdi
leaq 0xe8(%rsp), %rax
cmpq %rax, %rdi
je 0x8146
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x48(%rsp), %rdi
leaq 0x58(%rsp), %rax
cmpq %rax, %rdi
je 0x8162
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x38(%rsp), %r15
movq -0x10(%r15), %rdi
cmpq %r15, %rdi
je 0x817d
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x8(%rsp), %rdi
cmpq %r14, %rdi
je 0x8194
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x43e2d(%rip), %rdi     # 0x4bfc8
leaq 0x32ae2(%rip), %rsi     # 0x3ac84
movl $0x2a, %edx
callq 0x43a0
leaq 0x8(%rsp), %rdi
movq %r14, (%rdi)
movq 0xb8(%rsp), %rsi
movq 0xc0(%rsp), %rdx
addq %rsi, %rdx
callq 0xd940
leaq 0x32974(%rip), %rsi     # 0x3ab47
leaq 0x8(%rsp), %rdi
callq 0x45e0
leaq 0x28(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq 0x8(%rsp), %rcx
movq 0x10(%rsp), %r8
movq 0x30(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %edi
cmpq %r14, %rcx
je 0x8211
movq 0x18(%rsp), %rdi
movq 0x28(%rsp), %rsi
cmpq %rdi, %rax
jbe 0x822f
movl $0xf, %edi
cmpq %r15, %rsi
je 0x822a
movq 0x38(%rsp), %rdi
cmpq %rdi, %rax
jbe 0x823b
leaq 0x8(%rsp), %rdi
callq 0x4120
jmp 0x8249
leaq 0x28(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x58(%rsp), %rsi
movq %rsi, 0x48(%rsp)
movq (%rax), %rdx
leaq 0x10(%rax), %rcx
cmpq %rcx, %rdx
je 0x826e
movq %rdx, 0x48(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x58(%rsp)
jmp 0x8274
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x50(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x32a17(%rip), %rsi     # 0x3acaf
leaq 0x48(%rsp), %rdi
callq 0x45e0
leaq 0xe8(%rsp), %rsi
movq %rsi, 0xd8(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x82d6
movq %rdx, 0xd8(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe8(%rsp)
jmp 0x82dc
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq 0x8(%rax), %rdx
movq %rdx, 0xe0(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
movq 0xd8(%rsp), %rsi
movq 0xe0(%rsp), %rdx
movq 0x43cba(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0xd8(%rsp), %rdi
leaq 0xe8(%rsp), %rax
cmpq %rax, %rdi
je 0x8362
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x48(%rsp), %rdi
leaq 0x58(%rsp), %rax
cmpq %rax, %rdi
je 0x837e
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x28(%rsp), %rdi
cmpq %r15, %rdi
je 0x8395
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x8(%rsp), %rdi
cmpq %r14, %rdi
je 0x83ac
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x43c15(%rip), %rdi     # 0x4bfc8
leaq 0x32909(%rip), %rsi     # 0x3acc3
movl $0x2a, %edx
callq 0x43a0
leaq 0x8(%rsp), %rdi
movq %r14, (%rdi)
movq 0xb8(%rsp), %rsi
movq 0xc0(%rsp), %rdx
addq %rsi, %rdx
callq 0xd940
leaq 0x3275c(%rip), %rsi     # 0x3ab47
leaq 0x8(%rsp), %rdi
callq 0x45e0
leaq 0x28(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq 0x8(%rsp), %rcx
movq 0x10(%rsp), %r8
movq 0x30(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %edi
cmpq %r14, %rcx
je 0x8429
movq 0x18(%rsp), %rdi
movq 0x28(%rsp), %rsi
cmpq %rdi, %rax
jbe 0x8447
movl $0xf, %edi
cmpq %r15, %rsi
je 0x8442
movq 0x38(%rsp), %rdi
cmpq %rdi, %rax
jbe 0x8453
leaq 0x8(%rsp), %rdi
callq 0x4120
jmp 0x8461
leaq 0x28(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x58(%rsp), %rsi
movq %rsi, 0x48(%rsp)
movq (%rax), %rdx
leaq 0x10(%rax), %rcx
cmpq %rcx, %rdx
je 0x8486
movq %rdx, 0x48(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x58(%rsp)
jmp 0x848c
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x50(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x3283e(%rip), %rsi     # 0x3acee
leaq 0x48(%rsp), %rdi
callq 0x45e0
leaq 0xe8(%rsp), %rsi
movq %rsi, 0xd8(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x84ee
movq %rdx, 0xd8(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe8(%rsp)
jmp 0x84f4
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq 0x8(%rax), %rdx
movq %rdx, 0xe0(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
movq 0xd8(%rsp), %rsi
movq 0xe0(%rsp), %rdx
movq 0x43aa2(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0xd8(%rsp), %rdi
leaq 0xe8(%rsp), %rax
cmpq %rax, %rdi
je 0x857a
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x48(%rsp), %rdi
leaq 0x58(%rsp), %rax
cmpq %rax, %rdi
je 0x8596
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x28(%rsp), %rdi
cmpq %r15, %rdi
je 0x85ad
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x8(%rsp), %rdi
cmpq %r14, %rdi
je 0x85c4
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x439fd(%rip), %rdi     # 0x4bfc8
leaq 0x32730(%rip), %rsi     # 0x3ad02
movl $0x2b, %edx
callq 0x43a0
leaq 0x8(%rsp), %rdi
movq %r14, (%rdi)
movq 0xb8(%rsp), %rsi
movq 0xc0(%rsp), %rdx
addq %rsi, %rdx
callq 0xd940
leaq 0x32544(%rip), %rsi     # 0x3ab47
leaq 0x8(%rsp), %rdi
callq 0x45e0
leaq 0x28(%rsp), %rdi
leaq 0xab8(%rsp), %rsi
callq 0x44f0
movq 0x8(%rsp), %rcx
movq 0x10(%rsp), %r8
movq 0x30(%rsp), %rdx
leaq (%rdx,%r8), %rax
movl $0xf, %edi
cmpq %r14, %rcx
je 0x8641
movq 0x18(%rsp), %rdi
movq 0x28(%rsp), %rsi
cmpq %rdi, %rax
jbe 0x865f
movl $0xf, %edi
cmpq %r15, %rsi
je 0x865a
movq 0x38(%rsp), %rdi
cmpq %rdi, %rax
jbe 0x866b
leaq 0x8(%rsp), %rdi
callq 0x4120
jmp 0x8679
leaq 0x28(%rsp), %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x4380
leaq 0x58(%rsp), %rsi
movq %rsi, 0x48(%rsp)
movq (%rax), %rdx
leaq 0x10(%rax), %rcx
cmpq %rcx, %rdx
je 0x869e
movq %rdx, 0x48(%rsp)
movq (%rcx), %rdx
movq %rdx, 0x58(%rsp)
jmp 0x86a4
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq %rax, %rdx
addq $0x8, %rdx
movq 0x8(%rax), %rsi
movq %rsi, 0x50(%rsp)
movq %rcx, (%rax)
movq $0x0, (%rdx)
movb $0x0, (%rcx)
leaq 0x32666(%rip), %rsi     # 0x3ad2e
leaq 0x48(%rsp), %rdi
callq 0x45e0
leaq 0xe8(%rsp), %rsi
movq %rsi, 0xd8(%rsp)
movq (%rax), %rdx
movq %rax, %rcx
addq $0x10, %rcx
cmpq %rcx, %rdx
je 0x8706
movq %rdx, 0xd8(%rsp)
movq (%rcx), %rdx
movq %rdx, 0xe8(%rsp)
jmp 0x870c
movups (%rcx), %xmm0
movups %xmm0, (%rsi)
movq 0x8(%rax), %rdx
movq %rdx, 0xe0(%rsp)
movq %rcx, (%rax)
movq $0x0, 0x8(%rax)
movb $0x0, 0x10(%rax)
movq 0xd8(%rsp), %rsi
movq 0xe0(%rsp), %rdx
movq 0x4388a(%rip), %rdi     # 0x4bfc8
callq 0x43a0
movq %rax, %rbx
movq (%rax), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0xd8(%rsp), %rdi
leaq 0xe8(%rsp), %rax
cmpq %rax, %rdi
je 0x8792
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x48(%rsp), %rdi
leaq 0x58(%rsp), %rax
cmpq %rax, %rdi
je 0x87ae
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x28(%rsp), %rdi
cmpq %r15, %rdi
je 0x87c5
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x8(%rsp), %rdi
cmpq %r14, %rdi
je 0x87dc
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x437e5(%rip), %rdi     # 0x4bfc8
leaq 0x32559(%rip), %rsi     # 0x3ad43
movl $0x26, %edx
callq 0x43a0
callq 0x4200
subq 0x250(%rsp), %rax
xorps %xmm0, %xmm0
cvtsi2ss %rax, %xmm0
divss 0x31b7b(%rip), %xmm0    # 0x3a38c
cvtss2sd %xmm0, %xmm0
movq 0x437ac(%rip), %rdi     # 0x4bfc8
callq 0x4510
movq %rax, %rbx
leaq 0x3208c(%rip), %rsi     # 0x3a8b7
movl $0xa, %edx
movq %rax, %rdi
callq 0x43a0
movq (%rbx), %rax
movq -0x18(%rax), %rdi
addq %rbx, %rdi
movl $0xa, %esi
callq 0x4310
movsbl %al, %esi
movq %rbx, %rdi
callq 0x4030
movq %rax, %rdi
callq 0x4220
movq 0x1f0(%rsp), %rdi
leaq 0x200(%rsp), %rax
cmpq %rax, %rdi
je 0x8884
movq 0x200(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x188(%rsp), %rdi
leaq 0x198(%rsp), %rax
cmpq %rax, %rdi
je 0x88a9
movq 0x198(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x258(%rsp), %rdi
callq 0xd82a
leaq 0x2c8(%rsp), %rdi
callq 0xd7ee
leaq 0x2f8(%rsp), %rdi
callq 0xd802
leaq 0x328(%rsp), %rdi
callq 0xd802
leaq 0x358(%rsp), %rdi
callq 0xd802
leaq 0x388(%rsp), %rdi
callq 0xd802
leaq 0x3b8(%rsp), %rdi
callq 0xd802
leaq 0x3e8(%rsp), %rdi
callq 0xd816
leaq 0x43108(%rip), %rsi     # 0x4ba20
leaq 0x808(%rsp), %rdi
callq 0x38fcc
leaq 0x998(%rsp), %rdi
callq 0x4140
movq 0x1a8(%rsp), %rdi
cmpq %r12, %rdi
je 0x894f
movq 0x1b8(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x432ea(%rip), %rax     # 0x4bc40
leaq 0x700(%rsp), %rbx
movq %rax, -0x10(%rbx)
leaq 0x432ff(%rip), %rax     # 0x4bc68
movq %rax, (%rbx)
movq $0x0, -0x8(%rbx)
leaq 0x4322d(%rip), %rsi     # 0x4bba8
leaq 0x568(%rsp), %rdi
callq 0x38fcc
movq %rbx, %rdi
callq 0x4140
movq 0xb8(%rsp), %rdi
leaq 0xc8(%rsp), %rax
cmpq %rax, %rdi
je 0x89b5
movq 0xc8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x435dc(%rip), %rsi     # 0x4bf98
leaq 0xaa0(%rsp), %rdi
callq 0x4260
leaq 0xb20(%rsp), %rdi
callq 0x4140
movq 0x1c8(%rsp), %rdi
cmpq %r13, %rdi
je 0x89f3
movq 0x1d8(%rsp), %rsi
incq %rsi
callq 0x4340
movl %ebp, %eax
addq $0xc28, %rsp            # imm = 0xC28
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x8a21
jmp 0x8a29
jmp 0x8a4c
jmp 0x8a4c
jmp 0x8dd2
jmp 0x8a21
jmp 0x8a29
jmp 0x8a4c
jmp 0x8a4c
jmp 0x8dd2
movq %rax, %rbx
jmp 0x8c01
movq %rax, %rbx
jmp 0x8c1d
jmp 0x8a4c
jmp 0x8a4c
jmp 0x8dd2
movq %rax, %rbx
jmp 0x8c6f
movq %rax, %rbx
jmp 0x8c8b
jmp 0x8a4c
movq %rax, %rbx
jmp 0x8c34
jmp 0x8dd2
movq %rax, %rbx
movq 0x2a8(%rsp), %rdi
cmpq %r14, %rdi
je 0x8e06
movq 0x2b8(%rsp), %rsi
jmp 0x8dfe
movq %rax, %rbx
movq 0x210(%rsp), %rdi
leaq 0x220(%rsp), %rax
cmpq %rax, %rdi
je 0x8d4c
movq 0x220(%rsp), %rsi
jmp 0x8d44
movq %rax, %rbx
movq 0x288(%rsp), %rdi
cmpq %r12, %rdi
je 0x8ac8
movq 0x298(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8ac8
movq %rax, %rbx
leaq 0x538(%rsp), %rdi
callq 0xd7ee
jmp 0x8ada
movq %rax, %rbx
leaq 0x418(%rsp), %rdi
callq 0xd802
jmp 0x8aec
movq %rax, %rbx
leaq 0x448(%rsp), %rdi
callq 0xd802
jmp 0x8afe
movq %rax, %rbx
leaq 0x478(%rsp), %rdi
callq 0xd802
leaq 0x4a8(%rsp), %rdi
callq 0xd802
leaq 0x4d8(%rsp), %rdi
callq 0xd802
leaq 0x508(%rsp), %rdi
callq 0xd816
jmp 0x8e06
movq %rax, %rbx
jmp 0x8b0b
movq %rax, %rbx
jmp 0x8b18
movq %rax, %rbx
jmp 0x8b25
movq %rax, %rbx
jmp 0x8e2b
movq %rax, %rbx
jmp 0x8e50
movq %rax, %rbx
leaq 0xd8(%rsp), %rdi
callq 0xcd1c
jmp 0x8d26
jmp 0x8d23
jmp 0x8b72
movq %rax, %rbx
movq 0x48(%rsp), %rdi
leaq 0x58(%rsp), %rax
cmpq %rax, %rdi
je 0x8d30
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8d30
movq %rax, %rbx
jmp 0x8d30
jmp 0x8d1e
movq %rax, %rbx
movq 0x230(%rsp), %rdi
leaq 0x240(%rsp), %rax
cmpq %rax, %rdi
je 0x8d4c
movq 0x240(%rsp), %rsi
jmp 0x8d44
jmp 0x8d1e
jmp 0x8bd9
jmp 0x8bd9
movq %rax, %rbx
movq 0xd8(%rsp), %rdi
leaq 0xe8(%rsp), %rax
cmpq %rax, %rdi
je 0x8c01
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x48(%rsp), %rdi
leaq 0x58(%rsp), %rax
cmpq %rax, %rdi
je 0x8c1d
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x28(%rsp), %rdi
cmpq %r15, %rdi
je 0x8c34
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x8(%rsp), %rdi
cmpq %r14, %rdi
jne 0x8df9
jmp 0x8e06
movq %rax, %rbx
movq 0xd8(%rsp), %rdi
leaq 0xe8(%rsp), %rax
cmpq %rax, %rdi
je 0x8c6f
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x48(%rsp), %rdi
leaq 0x58(%rsp), %rax
cmpq %rax, %rdi
je 0x8c8b
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x38(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
jne 0x8c27
jmp 0x8c34
jmp 0x8de7
movq %rax, %rbx
jmp 0x8ed9
movq %rax, %rbx
leaq 0x818(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x8cd1
movq 0x818(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8cd1
movq %rax, %rbx
leaq 0x58(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x8cf3
movq 0x58(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8cf3
jmp 0x8cf0
movq %rax, %rbx
movq 0xd8(%rsp), %rdi
leaq 0xe8(%rsp), %rax
cmpq %rax, %rdi
je 0x8efe
movq 0xe8(%rsp), %rsi
jmp 0x8ef6
jmp 0x8ddf
movq %rax, %rbx
jmp 0x8d4c
movq %rax, %rbx
leaq 0x48(%rsp), %rdi
callq 0xcd86
movq 0x28(%rsp), %rdi
leaq 0x38(%rsp), %rax
cmpq %rax, %rdi
je 0x8d4c
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x168(%rsp), %rdi
callq 0x6aac
jmp 0x8dea
jmp 0x8f0d
jmp 0x8dd2
movq %rax, %rbx
movq 0x568(%rsp), %rdi
cmpq %r12, %rdi
je 0x8f10
movq 0x578(%rsp), %rsi
incq %rsi
callq 0x4340
jmp 0x8f10
jmp 0x8f0d
jmp 0x8f0d
jmp 0x8f0d
jmp 0x8dc2
jmp 0x8dc2
movq %rax, %rbx
movq 0x568(%rsp), %rdi
cmpq %r12, %rdi
je 0x8f35
movq 0x578(%rsp), %rsi
jmp 0x8f2d
movq %rax, %rbx
jmp 0x8f35
movq %rax, %rbx
jmp 0x8f56
movq %rax, %rbx
jmp 0x8e06
movq %rax, %rbx
jmp 0x8eb8
movq %rax, %rbx
jmp 0x8efe
movq %rax, %rbx
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x8e06
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x1f0(%rsp), %rdi
leaq 0x200(%rsp), %rax
cmpq %rax, %rdi
je 0x8e2b
movq 0x200(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x188(%rsp), %rdi
leaq 0x198(%rsp), %rax
cmpq %rax, %rdi
je 0x8e50
movq 0x198(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x258(%rsp), %rdi
callq 0xd82a
leaq 0x2c8(%rsp), %rdi
callq 0xd7ee
leaq 0x2f8(%rsp), %rdi
callq 0xd802
leaq 0x328(%rsp), %rdi
callq 0xd802
leaq 0x358(%rsp), %rdi
callq 0xd802
leaq 0x388(%rsp), %rdi
callq 0xd802
leaq 0x3b8(%rsp), %rdi
callq 0xd802
leaq 0x3e8(%rsp), %rdi
callq 0xd816
leaq 0x42b61(%rip), %rsi     # 0x4ba20
leaq 0x808(%rsp), %rdi
callq 0x38fcc
leaq 0x998(%rsp), %rdi
callq 0x4140
movq 0x1a8(%rsp), %rdi
leaq 0x1b8(%rsp), %rax
cmpq %rax, %rdi
je 0x8efe
movq 0x1b8(%rsp), %rsi
incq %rsi
callq 0x4340
leaq 0x568(%rsp), %rdi
callq 0xcdd6
jmp 0x8f10
movq %rax, %rbx
movq 0xb8(%rsp), %rdi
leaq 0xc8(%rsp), %rax
cmpq %rax, %rdi
je 0x8f35
movq 0xc8(%rsp), %rsi
incq %rsi
callq 0x4340
movq 0x4305c(%rip), %rsi     # 0x4bf98
leaq 0xaa0(%rsp), %rdi
callq 0x4260
leaq 0xb20(%rsp), %rdi
callq 0x4140
movq 0x1c8(%rsp), %rdi
leaq 0x1d8(%rsp), %rax
cmpq %rax, %rdi
je 0x8f7b
movq 0x1d8(%rsp), %rsi
incq %rsi
callq 0x4340
movq %rbx, %rdi
callq 0x45a0