// File: /workspace/github_cpp_makefile_star2_O2/atfrank[P]PCASA/lib/Select.cpp
// Function: Select::recursiveDescentParser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::vector<Atom*, std::allocator<Atom*>> const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
std::vector<Atom *> Select::recursiveDescentParser (const std::string &str, const std::vector<Atom *> &ref, const std::string &group){
  std::vector<Atom *> cmpCurr, cmpNext;
  std::vector<Atom *> out;
  std::vector<Atom *>::iterator it;
  std::vector<Atom *>::const_iterator iter;
  std::string curr, next, start, end;
  size_t pos;
  double angstrom;

  //For memory efficiency, always parse "next" first!
  if (str.length() == 0){
    return ref;
  }
  else if ((pos=str.find("&")) != std::string::npos){
    //Logical AND between expressions: A:1-10.CA&A:5-15.CA = A:5-10.CA
    out.clear();
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    if (cmpNext.size() == 0){
//      std::cerr << std::endl << "Warning: Selection \"";
//      std::cerr << next << "\" did not match any atoms";
//      std::cerr << std::endl << std::endl;
      return out;
    }
    std::sort(cmpNext.begin(), cmpNext.end());    

    curr=str.substr(0, pos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    if (cmpCurr.size() == 0){
      return out;
    }
    std::sort(cmpCurr.begin(), cmpCurr.end());

    std::set_intersection(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), back_inserter(out));
  }
  else if ((pos=str.find("_")) != std::string::npos){
    //Logical OR between expressions: A:1-5.CA_B:10-15.CA
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    if (cmpNext.size() == 0){
//      std::cerr << std::endl << "Warning: Selection \"";
//      std::cerr << next << "\" did not match any atoms";
//      std::cerr << std::endl << std::endl;
    }
    std::sort(cmpNext.begin(), cmpNext.end());

    curr=str.substr(0, pos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.resize(cmpCurr.size()+cmpNext.size());
    it=std::set_union(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), out.begin());
    out.resize(it-out.begin());

    it=std::unique(out.begin(), out.end());
    out.resize(std::distance(out.begin(),it));
  }
  else if ((pos=str.find("!")) == 0){
    //Expression negation: !A:1-5.CA
    curr=str.substr(pos+1, std::string::npos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.clear();
    std::set_difference(ref.begin(), ref.end(), cmpCurr.begin(), cmpCurr.end(), back_inserter(out));
  }
  else if ((pos=str.find_last_of("~#$")) != std::string::npos){
    //Around (~), Expand (#), By Residue ($)

    //N Angstroms around selection X. The final selection does NOT include X
    //A:10+20.CA~1.5

    //Expand selection X by N Angstroms. The final selection includes X
    //A:10+20.CA#2

    //By residue
    //A:10+20.CA$

    //Around, Expand, and By Residue can be chained together
    //A:10+20.CA~1.5#2$

    out.clear();

    next=str.substr(pos+1, std::string::npos);
    std::stringstream(next) >> angstrom;

    if (pos > 0){
      curr=str.substr(0, pos);
      cmpCurr=Select::recursiveDescentParser(curr, ref, group);
      if (cmpCurr.size() == 0){
        return out;
      }
      else if (angstrom <= 0.0){
        return out;
      }
      else{
        //Compute pairwise distances
        if (str.substr(pos, 1).compare("~") == 0){
          for (it=cmpCurr.begin(); it != cmpCurr.end(); ++it){
            for (iter=ref.begin(); iter != ref.end(); ++iter){
              //Distance calculation
              if ((*it) != (*iter) && Analyze::distance((*it)->getCoor() , (*iter)->getCoor()) <= angstrom){
                //out.push_back((*iter));
                cmpNext.push_back((*iter));
              } 
            }
          }
          //Sort, remove duplicates, and find difference
          std::sort(cmpNext.begin(), cmpNext.end());
          cmpNext.erase(unique(cmpNext.begin(), cmpNext.end()), cmpNext.end());
          std::set_difference(cmpNext.begin(), cmpNext.end(), cmpCurr.begin(), cmpCurr.end(), back_inserter(out));
        }
        else if (str.substr(pos, 1).compare("#") == 0){
          for (it=cmpCurr.begin(); it != cmpCurr.end(); ++it){
            for (iter=ref.begin(); iter != ref.end(); ++iter){
              //Distance calculation
              if (Analyze::distance((*it)->getCoor() , (*iter)->getCoor()) <= angstrom){
                out.push_back((*iter));
              }
            }
          }
          //Sort and remove duplicates
          std::sort(out.begin(), out.end());
          out.erase(unique(out.begin(), out.end()), out.end());
        }
        else if (str.substr(pos, 1).compare("$") == 0){
          for (it=cmpCurr.begin(); it != cmpCurr.end(); ++it){
            out.insert(out.end(), (*it)->getResidue()->getAtmVec().begin(), (*it)->getResidue()->getAtmVec().end());
          }
          //Sort and remove duplicates
          std::sort(out.begin(), out.end());
          out.erase(unique(out.begin(), out.end()), out.end());
        }
        else{
          //Do Nothing
        }
        std::sort(out.begin(), out.end());
        return out;
      }
    }
    else{
      return out;
    }
  }
  else if ((pos=str.find(":")) != std::string::npos){
    //Logical AND between Chains and Residues: A:GLY.
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    std::sort(cmpNext.begin(), cmpNext.end());

    if (pos > 0){
      curr=str.substr(0, pos);
      cmpCurr=Select::recursiveDescentParser(curr, ref, "chain");
    }
    else{
      cmpCurr=ref;
    }
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.clear();
    std::set_intersection(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), back_inserter(out));
  }
  else if ((pos=str.find(".")) != std::string::npos && group.compare("atom") != 0){
    //Logical AND between Residues and Atoms: :GLY.CA
    out.clear();
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, "atom");
    if (cmpNext.size() == 0){
      return out;
    }
    std::sort(cmpNext.begin(), cmpNext.end());

    if (pos > 0){
      curr=str.substr(0, pos);
      cmpCurr=Select::recursiveDescentParser(curr, ref, "residue");
      if (cmpCurr.size() == 0){
        return out;
      }
    }
    else{
      cmpCurr=ref;
    }
    std::sort(cmpCurr.begin(), cmpCurr.end());

    std::set_intersection(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), back_inserter(out));
  }
  else if ((pos=str.find("+")) != std::string::npos){
    //Logical OR between Chains, or between Residues, or between Atoms: 
    //A+B:., :GLY+ALA., :1+2+3., :.CA+CB+C+N
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    std::sort(cmpNext.begin(), cmpNext.end());

    curr=str.substr(0, pos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.resize(cmpCurr.size()+cmpNext.size());
    it=std::set_union(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), out.begin());
    out.resize(it-out.begin());

    it=std::unique(out.begin(), out.end());
    out.resize(std::distance(out.begin(),it));
  }
  else if ((pos=str.find("/")) != std::string::npos){
    //Logical AND between Chains, or between Residues, or between Atoms:
    //A/B:., :GLY/ALA., :1/2/3., :.CA/CB/C/N
    out.clear();
    next=str.substr(pos+1, std::string::npos);
    cmpNext=Select::recursiveDescentParser(next, ref, group);
    if (cmpNext.size() == 0){
      return out;
    }
    std::sort(cmpNext.begin(), cmpNext.end());

    curr=str.substr(0, pos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    if (cmpCurr.size() == 0){
      return out;
    }
    std::sort(cmpCurr.begin(), cmpCurr.end());

    std::set_intersection(cmpCurr.begin(), cmpCurr.end(), cmpNext.begin(), cmpNext.end(), back_inserter(out));
  }
  else if ((pos=str.find("-")) != std::string::npos){
    //Residue identifier range: :1-10.
    start=str.substr(0, pos);
    end=str.substr(pos+1, std::string::npos);
    if (Misc::isdigit(start) && Misc::isdigit(end)){
      out=Select::recursiveDescentParser(Misc::processRange(start, end), ref, group);
    }
    else{
      return ref;
    }
  }
  else if ((pos=str.find("^")) == 0){
    //Chain, Residue, or Atom negation: ^A:., :^GLY., :^2., :.^CA
    curr=str.substr(pos+1, std::string::npos);
    cmpCurr=Select::recursiveDescentParser(curr, ref, group);
    std::sort(cmpCurr.begin(), cmpCurr.end());

    out.clear();
    std::set_difference(ref.begin(), ref.end(), cmpCurr.begin(), cmpCurr.end(), back_inserter(out));
  }
  else if (selKeysRes.find(str) != selKeysRes.end() && group.compare("residue") == 0){
    out.clear();
    if (selKeysRes[str].length() > 0){
      out=Select::recursiveDescentParser(selKeysRes[str], ref, group);
    }
  }
  else if (selKeysAtm.find(str) != selKeysAtm.end() && group.compare("atom") == 0){
    out.clear();
    if (selKeysAtm[str].length() > 0){
      out=Select::recursiveDescentParser(selKeysAtm[str], ref, group);
    }
  }
  else{
    out.clear();
    if (group.compare("chain") == 0){
      for (iter=ref.begin(); iter != ref.end(); ++iter){
        if (str.compare((*iter)->getChainId()) == 0){
          out.push_back(*iter);
        }
        else if (str.compare((*iter)->getSegId()) == 0){
          out.push_back(*iter);
        }
        else{
          continue;
        }
      }
    }
    else if (group.compare("residue") == 0){
      int resnum;
      std::stringstream(str) >> resnum;
      bool digitFlag=Misc::isdigit(str);
      for (iter=ref.begin(); iter != ref.end(); ++iter){
        if (digitFlag){
          if (resnum == (*iter)->getResId()){
            out.push_back(*iter);
          }
          else{
            continue;
          }
        }
        else{
          if (str.compare((*iter)->getResName()) == 0){
            out.push_back(*iter);
          }
          else if (str.compare(Misc::trim((*iter)->getRecName())) == 0){
            out.push_back(*iter);
          }
          else{
            continue;
          }
        }
      }
    }
    else if (group.compare("atom") == 0){
      for (iter=ref.begin(); iter != ref.end(); ++iter){
        if (str.compare(Misc::trim((*iter)->getAtmName())) == 0){
          out.push_back(*iter);
        }
        else if (Misc::toupper(str).compare(Misc::trim(Misc::toupper((*iter)->getAtmType()))) == 0){
          out.push_back(*iter);
        }
        else{
          continue;
        }
      }
    }
    else{
      //Do Nothing
    }
  }

  return out;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x328, %rsp            # imm = 0x328
movq %r8, 0x28(%rsp)
movq %rcx, %r14
andq $0x0, 0x40(%rsp)
movq %rdx, %r15
andq $0x0, 0x60(%rsp)
andq $0x0, 0x20(%rsp)
leaq 0x90(%rsp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
movq %rdi, %rbx
xorl %ecx, %ecx
leaq 0xd0(%rsp), %rdx
movq %rdx, -0x10(%rdx)
andq $0x0, -0x8(%rdx)
movb %cl, (%rax)
xorpd %xmm0, %xmm0
movb %cl, (%rdx)
leaq 0x2b8(%rsp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
movapd %xmm0, 0x30(%rsp)
movapd %xmm0, 0x50(%rsp)
movb %cl, (%rax)
leaq 0x298(%rsp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
movapd %xmm0, 0x10(%rsp)
movb %cl, (%rax)
cmpq %rcx, 0x8(%r15)
je 0x27fbc
movq %rsi, %r12
leaq 0x77fa(%rip), %rsi      # 0x2e82b
movq %r15, %rdi
xorl %edx, %edx
callq 0x45f0
cmpq $-0x1, %rax
movq %rbx, 0x8(%rsp)
je 0x2719b
movq %rax, %rbp
movq 0x10(%rsp), %rax
cmpq %rax, 0x18(%rsp)
je 0x2705e
movq %rax, 0x18(%rsp)
movq %r12, %r13
leaq 0x1(%rbp), %rdx
leaq 0xe0(%rsp), %rdi
pushq $-0x1
popq %rcx
movq %r15, %rsi
callq 0x4340
leaq 0xc0(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x4390
movq %r12, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x50(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x2896e
movq %r12, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
cmpq %rdi, %rsi
je 0x27d6e
callq 0x289bf
leaq 0xe0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4340
leaq 0x80(%rsp), %rbx
leaq 0xe0(%rsp), %r15
movq %rbx, %rdi
movq %r15, %rsi
callq 0x4390
movq %r15, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x30(%rsp), %rbx
leaq 0xe0(%rsp), %r14
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2896e
movq %r14, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
cmpq %rdi, %rsi
je 0x27d6e
callq 0x289bf
movq 0x8(%rsp), %rbx
movq 0x30(%rsp), %rdi
movq 0x38(%rsp), %rsi
movq 0x50(%rsp), %rdx
movq 0x58(%rsp), %rcx
leaq 0x10(%rsp), %r8
callq 0x28de5
jmp 0x27344
leaq 0x716e(%rip), %rsi      # 0x2e310
movq %r15, %rdi
xorl %edx, %edx
callq 0x45f0
cmpq $-0x1, %rax
movq 0x28(%rsp), %rbx
je 0x2734e
movq %rax, %rbp
movq %r12, %r13
leaq 0x1(%rax), %rdx
leaq 0xe0(%rsp), %rdi
pushq $-0x1
popq %rcx
movq %r15, %rsi
callq 0x4340
leaq 0xc0(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x4390
movq %r12, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x50(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x2896e
movq %r12, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
callq 0x289bf
leaq 0xe0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4340
leaq 0x80(%rsp), %rbx
leaq 0xe0(%rsp), %r15
movq %rbx, %rdi
movq %r15, %rsi
callq 0x4390
movq %r15, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x30(%rsp), %rbx
leaq 0xe0(%rsp), %r14
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2896e
movq %r14, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
callq 0x289bf
movq 0x8(%rsp), %rbx
movq 0x38(%rsp), %rax
subq 0x30(%rsp), %rax
sarq $0x3, %rax
movq 0x58(%rsp), %rsi
subq 0x50(%rsp), %rsi
sarq $0x3, %rsi
addq %rax, %rsi
leaq 0x10(%rsp), %rdi
callq 0x28834
movq 0x30(%rsp), %rdi
movq 0x38(%rsp), %rsi
movq 0x50(%rsp), %rdx
movq 0x58(%rsp), %rcx
movq 0x10(%rsp), %r8
callq 0x28f78
leaq 0x10(%rsp), %rdi
subq (%rdi), %rax
sarq $0x3, %rax
movq %rax, %rsi
callq 0x28834
movq 0x10(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0x29013
leaq 0x10(%rsp), %rdi
subq (%rdi), %rax
sarq $0x3, %rax
movq %rax, %rsi
callq 0x28834
movq 0x10(%rsp), %rax
jmp 0x27d78
leaq 0x7354(%rip), %rsi      # 0x2e6a9
movq %r15, %rdi
xorl %edx, %edx
callq 0x45f0
testq %rax, %rax
je 0x275c5
leaq 0x74be(%rip), %rsi      # 0x2e82d
pushq $-0x1
popq %rdx
movq %r15, %rdi
callq 0x42e0
cmpq $-0x1, %rax
je 0x2767b
movq %rax, %rbp
movq 0x10(%rsp), %rax
cmpq %rax, 0x18(%rsp)
je 0x27398
movq %rax, 0x18(%rsp)
movq %r12, %r13
leaq 0x1(%rbp), %rdx
leaq 0xe0(%rsp), %rdi
pushq $-0x1
popq %rcx
movq %r15, %rsi
callq 0x4340
leaq 0xc0(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x4390
movq %r12, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
pushq $0x18
popq %rdx
movq %rbx, %rsi
callq 0x44b0
leaq 0xe0(%rsp), %rdi
leaq 0x78(%rsp), %rsi
callq 0x41f0
movq 0x8(%rsp), %rbx
leaq 0xe0(%rsp), %rdi
callq 0x4260
testq %rbp, %rbp
je 0x27344
leaq 0xe0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4340
leaq 0x80(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x4390
movq %r12, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x30(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x2896e
movq %r12, %rdi
callq 0xf036
movq 0x8(%rbx), %rax
cmpq (%rbx), %rax
je 0x27d6e
xorpd %xmm0, %xmm0
ucomisd 0x78(%rsp), %xmm0
movq 0x8(%rsp), %rbx
jae 0x27344
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rcx
movq %r15, %rsi
movq %rbp, %rdx
callq 0x4340
leaq 0x736a(%rip), %rsi      # 0x2e831
leaq 0xe0(%rsp), %rbx
movq %rbx, %rdi
callq 0x4100
movl %eax, %r12d
movq %rbx, %rdi
callq 0x4170
testl %r12d, %r12d
je 0x27b6b
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rcx
movq %r15, %rsi
movq %rbp, %rdx
callq 0x4340
leaq 0x732b(%rip), %rsi      # 0x2e833
leaq 0xe0(%rsp), %rbx
movq %rbx, %rdi
callq 0x4100
movl %eax, %r12d
movq %rbx, %rdi
callq 0x4170
testl %r12d, %r12d
je 0x27da2
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rcx
movq %r15, %rsi
movq %rbp, %rdx
callq 0x4340
leaq 0x72e6(%rip), %rsi      # 0x2e82f
leaq 0xe0(%rsp), %rbx
movq %rbx, %rdi
callq 0x4100
movl %eax, %ebp
movq %rbx, %rdi
callq 0x4170
testl %ebp, %ebp
movq 0x8(%rsp), %rbx
jne 0x27e68
movq 0x30(%rsp), %rbx
leaq 0x10(%rsp), %r14
cmpq 0x38(%rsp), %rbx
je 0x27e34
movq 0x18(%rsp), %r15
movq (%rbx), %rdi
callq 0xea04
movq %rax, %rdi
callq 0x23aea
movq (%rax), %r12
movq (%rbx), %rdi
callq 0xea04
movq %rax, %rdi
callq 0x23aea
movq 0x8(%rax), %rcx
movq %r14, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x2886c
addq $0x8, %rbx
jmp 0x2757a
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rdx
pushq $-0x1
popq %rcx
movq %r15, %rsi
callq 0x4340
leaq 0x80(%rsp), %rbx
leaq 0xe0(%rsp), %r15
movq %rbx, %rdi
movq %r15, %rsi
callq 0x4390
movq %r15, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r12, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x30(%rsp), %rbx
leaq 0xe0(%rsp), %r15
movq %rbx, %rdi
movq %r15, %rsi
callq 0x2896e
movq %r15, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
callq 0x289bf
movq 0x8(%rsp), %rbx
movq 0x10(%rsp), %rax
cmpq %rax, 0x18(%rsp)
je 0x2765b
movq %rax, 0x18(%rsp)
movq (%r14), %rdi
movq 0x8(%r14), %rsi
movq 0x30(%rsp), %rdx
movq 0x38(%rsp), %rcx
leaq 0x10(%rsp), %r8
callq 0x29080
jmp 0x27344
leaq 0x5bb1(%rip), %rsi      # 0x2d233
movq %r15, %rdi
xorl %edx, %edx
callq 0x45f0
cmpq $-0x1, %rax
je 0x277d3
movq %rax, %rbp
movq %r12, %r13
leaq 0x1(%rax), %rdx
leaq 0xe0(%rsp), %rdi
pushq $-0x1
popq %rcx
movq %r15, %rsi
callq 0x4340
leaq 0xc0(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x4390
movq %r12, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x50(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x2896e
movq %r12, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
callq 0x289bf
movq 0x8(%rsp), %rbx
testq %rbp, %rbp
je 0x279a0
leaq 0xe0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4340
leaq 0x80(%rsp), %rdi
leaq 0xe0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4390
movq %rbx, %rdi
callq 0x4170
leaq 0x70ce(%rip), %rsi      # 0x2e835
leaq 0xe0(%rsp), %rdi
leaq 0x268(%rsp), %rdx
callq 0x58d8
leaq 0xa0(%rsp), %rdi
leaq 0x80(%rsp), %rdx
leaq 0xe0(%rsp), %r8
movq %r13, %rsi
movq %r14, %rcx
callq 0x26f88
leaq 0x30(%rsp), %rdi
leaq 0xa0(%rsp), %rbx
movq %rbx, %rsi
callq 0x2896e
movq %rbx, %rdi
callq 0xf036
leaq 0xe0(%rsp), %rdi
callq 0x4170
movq 0x8(%rsp), %rbx
jmp 0x279ad
leaq 0x6fa8(%rip), %rsi      # 0x2e782
movq %r15, %rdi
xorl %edx, %edx
callq 0x45f0
cmpq $-0x1, %rax
je 0x279d6
movq %rax, %rbp
leaq 0x7043(%rip), %rsi      # 0x2e83b
movq %rbx, %rdi
callq 0x4100
testl %eax, %eax
je 0x279d6
movq 0x10(%rsp), %rax
cmpq %rax, 0x18(%rsp)
je 0x27819
movq %rax, 0x18(%rsp)
leaq 0x1(%rbp), %rdx
leaq 0xe0(%rsp), %rdi
pushq $-0x1
popq %rcx
movq %r15, %rsi
callq 0x4340
leaq 0xc0(%rsp), %rdi
leaq 0xe0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4390
movq %rbx, %rdi
callq 0x4170
leaq 0x6fe4(%rip), %rsi      # 0x2e83b
leaq 0xe0(%rsp), %rdi
leaq 0x268(%rsp), %rdx
callq 0x58d8
leaq 0xa0(%rsp), %rdi
leaq 0xc0(%rsp), %rdx
leaq 0xe0(%rsp), %r8
movq %r12, %r13
movq %r12, %rsi
movq %r14, %rcx
callq 0x26f88
leaq 0x50(%rsp), %rbx
leaq 0xa0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x2896e
movq %r12, %rdi
callq 0xf036
leaq 0xe0(%rsp), %rdi
callq 0x4170
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
cmpq %rdi, %rsi
je 0x27d6e
callq 0x289bf
movq 0x8(%rsp), %rbx
testq %rbp, %rbp
je 0x27e7c
leaq 0xe0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4340
movq %r13, %r15
leaq 0x80(%rsp), %rdi
leaq 0xe0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4390
movq %rbx, %rdi
callq 0x4170
leaq 0x6f1f(%rip), %rsi      # 0x2e840
leaq 0xe0(%rsp), %rdi
leaq 0x268(%rsp), %rdx
callq 0x58d8
leaq 0xa0(%rsp), %rdi
leaq 0x80(%rsp), %rdx
leaq 0xe0(%rsp), %r8
movq %r15, %rsi
movq %r14, %rcx
callq 0x26f88
leaq 0x30(%rsp), %rbx
leaq 0xa0(%rsp), %r14
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2896e
movq %r14, %rdi
callq 0xf036
leaq 0xe0(%rsp), %rdi
callq 0x4170
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
cmpq %rdi, %rsi
movq 0x8(%rsp), %rbx
jne 0x27e93
jmp 0x27344
leaq 0x30(%rsp), %rdi
movq %r14, %rsi
callq 0xef2c
movq 0x30(%rsp), %rdi
movq 0x38(%rsp), %rsi
callq 0x289bf
movq 0x10(%rsp), %rax
cmpq %rax, 0x18(%rsp)
je 0x27178
movq %rax, 0x18(%rsp)
jmp 0x27178
leaq 0x5c5c(%rip), %rsi      # 0x2d639
movq %r15, %rdi
xorl %edx, %edx
callq 0x45f0
cmpq $-0x1, %rax
je 0x27c24
movq %rax, %rbp
movq %r12, %r13
leaq 0x1(%rax), %rdx
leaq 0xe0(%rsp), %rdi
pushq $-0x1
popq %rcx
movq %r15, %rsi
callq 0x4340
leaq 0xc0(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x4390
movq %r12, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x50(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x2896e
movq %r12, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
callq 0x289bf
leaq 0xe0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4340
leaq 0x80(%rsp), %rbx
leaq 0xe0(%rsp), %r15
movq %rbx, %rdi
movq %r15, %rsi
callq 0x4390
movq %r15, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x30(%rsp), %rbx
leaq 0xe0(%rsp), %r14
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2896e
movq %r14, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
callq 0x289bf
movq 0x8(%rsp), %rbx
movq 0x38(%rsp), %rax
subq 0x30(%rsp), %rax
sarq $0x3, %rax
movq 0x58(%rsp), %rsi
subq 0x50(%rsp), %rsi
sarq $0x3, %rsi
addq %rax, %rsi
leaq 0x10(%rsp), %rdi
callq 0x28834
movq 0x30(%rsp), %rdi
movq 0x38(%rsp), %rsi
movq 0x50(%rsp), %rdx
movq 0x58(%rsp), %rcx
movq 0x10(%rsp), %r8
callq 0x28f78
leaq 0x10(%rsp), %rdi
subq (%rdi), %rax
sarq $0x3, %rax
movq %rax, %rsi
callq 0x28834
movq 0x10(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0x29013
jmp 0x27330
movq 0x30(%rsp), %rbx
leaq 0x50(%rsp), %r15
cmpq 0x38(%rsp), %rbx
je 0x27bcd
movq (%r14), %r12
cmpq 0x8(%r14), %r12
je 0x27bc7
movq (%rbx), %rdi
cmpq (%r12), %rdi
je 0x27bc1
callq 0xea3c
movq %rax, %r13
movq (%r12), %rdi
callq 0xea3c
movq %r13, %rdi
movq %rax, %rsi
callq 0x91f8
movsd 0x78(%rsp), %xmm1
ucomisd %xmm0, %xmm1
jb 0x27bc1
movq %r15, %rdi
movq %r12, %rsi
callq 0xf018
addq $0x8, %r12
jmp 0x27b7f
addq $0x8, %rbx
jmp 0x27b75
movq 0x50(%rsp), %rdi
movq 0x58(%rsp), %rsi
callq 0x289bf
movq 0x8(%rsp), %rbx
movq 0x50(%rsp), %rdi
movq 0x58(%rsp), %rsi
callq 0x29013
leaq 0x50(%rsp), %rdi
movq 0x8(%rdi), %rdx
movq %rax, %rsi
callq 0x28866
movq 0x50(%rsp), %rdi
movq 0x58(%rsp), %rsi
movq 0x30(%rsp), %rdx
movq 0x38(%rsp), %rcx
leaq 0x10(%rsp), %r8
callq 0x2916e
jmp 0x27e68
leaq 0x6c1d(%rip), %rsi      # 0x2e848
movq %r15, %rdi
xorl %edx, %edx
callq 0x45f0
cmpq $-0x1, %rax
je 0x27e9d
movq %rax, %rbp
movq 0x10(%rsp), %rax
cmpq %rax, 0x18(%rsp)
je 0x27c53
movq %rax, 0x18(%rsp)
movq %r12, %r13
leaq 0x1(%rbp), %rdx
leaq 0xe0(%rsp), %rdi
pushq $-0x1
popq %rcx
movq %r15, %rsi
callq 0x4340
leaq 0xc0(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x4390
movq %r12, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x50(%rsp), %rbx
leaq 0xe0(%rsp), %r12
movq %rbx, %rdi
movq %r12, %rsi
callq 0x2896e
movq %r12, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
cmpq %rdi, %rsi
je 0x27d6e
callq 0x289bf
leaq 0xe0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rbp, %rcx
callq 0x4340
leaq 0x80(%rsp), %rbx
leaq 0xe0(%rsp), %r15
movq %rbx, %rdi
movq %r15, %rsi
callq 0x4390
movq %r15, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x30(%rsp), %rbx
leaq 0xe0(%rsp), %r14
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2896e
movq %r14, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
cmpq %rdi, %rsi
je 0x27d6e
callq 0x289bf
movq 0x8(%rsp), %rbx
jmp 0x27178
movq 0x10(%rsp), %rax
movq 0x8(%rsp), %rbx
movq %rax, (%rbx)
movq 0x18(%rsp), %rax
movq %rax, 0x8(%rbx)
movq 0x20(%rsp), %rax
movq %rax, 0x10(%rbx)
xorpd %xmm0, %xmm0
movapd %xmm0, 0x10(%rsp)
andq $0x0, 0x20(%rsp)
jmp 0x27fc7
movq 0x30(%rsp), %rbx
leaq 0x10(%rsp), %r15
cmpq 0x38(%rsp), %rbx
je 0x27dfe
movq (%r14), %r12
cmpq 0x8(%r14), %r12
je 0x27df8
movq (%rbx), %rdi
callq 0xea3c
movq %rax, %r13
movq (%r12), %rdi
callq 0xea3c
movq %r13, %rdi
movq %rax, %rsi
callq 0x91f8
movsd 0x78(%rsp), %xmm1
ucomisd %xmm0, %xmm1
jb 0x27df2
movq %r15, %rdi
movq %r12, %rsi
callq 0xf018
addq $0x8, %r12
jmp 0x27db6
addq $0x8, %rbx
jmp 0x27dac
movq 0x10(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0x289bf
movq 0x8(%rsp), %rbx
movq 0x10(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0x29013
leaq 0x10(%rsp), %rdi
movq 0x8(%rdi), %rdx
movq %rax, %rsi
callq 0x28866
jmp 0x27e68
movq 0x10(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0x289bf
movq 0x8(%rsp), %rbx
movq 0x10(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0x29013
leaq 0x10(%rsp), %rdi
movq 0x8(%rdi), %rdx
movq %rax, %rsi
callq 0x28866
movq 0x10(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0x289bf
jmp 0x27344
leaq 0x30(%rsp), %rdi
movq %r14, %rsi
callq 0xef2c
movq 0x30(%rsp), %rdi
movq 0x38(%rsp), %rsi
callq 0x289bf
jmp 0x27178
leaq 0x6556(%rip), %rsi      # 0x2e3fa
movq %r15, %rdi
xorl %edx, %edx
callq 0x45f0
cmpq $-0x1, %rax
je 0x2802e
movq %rax, %rbp
leaq 0xe0(%rsp), %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rax, %rcx
callq 0x4340
leaq 0x2a8(%rsp), %rdi
leaq 0xe0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4390
movq %rbx, %rdi
callq 0x4170
incq %rbp
leaq 0xe0(%rsp), %rdi
pushq $-0x1
popq %rcx
movq %r15, %rsi
movq %rbp, %rdx
callq 0x4340
leaq 0x288(%rsp), %rdi
leaq 0xe0(%rsp), %rbx
movq %rbx, %rsi
callq 0x4390
movq %rbx, %rdi
callq 0x4170
leaq 0x2a8(%rsp), %rdi
callq 0x18ad6
movq 0x8(%rsp), %rbx
testb %al, %al
je 0x27fbc
leaq 0x288(%rsp), %rdi
callq 0x18ad6
testb %al, %al
je 0x27fbc
leaq 0xe0(%rsp), %rdi
leaq 0x2a8(%rsp), %rsi
leaq 0x288(%rsp), %rdx
callq 0x18c6c
leaq 0xa0(%rsp), %rdi
leaq 0xe0(%rsp), %rdx
movq %r12, %rsi
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x10(%rsp), %rdi
leaq 0xa0(%rsp), %rbx
movq %rbx, %rsi
callq 0x2896e
movq %rbx, %rdi
callq 0xf036
leaq 0xe0(%rsp), %rdi
callq 0x4170
jmp 0x283eb
movq %rbx, %rdi
movq %r14, %rsi
callq 0x1cb58
leaq 0x288(%rsp), %rdi
callq 0x4170
leaq 0x2a8(%rsp), %rdi
callq 0x4170
leaq 0xc0(%rsp), %rdi
callq 0x4170
leaq 0x80(%rsp), %rdi
callq 0x4170
leaq 0x10(%rsp), %rdi
callq 0xf036
leaq 0x50(%rsp), %rdi
callq 0xf036
leaq 0x30(%rsp), %rdi
callq 0xf036
movq %rbx, %rax
addq $0x328, %rsp            # imm = 0x328
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x6815(%rip), %rsi      # 0x2e84a
movq %r15, %rdi
xorl %edx, %edx
callq 0x45f0
testq %rax, %rax
je 0x28243
leaq 0x30(%r12), %rbp
movq %rbp, %rdi
movq %r15, %rsi
callq 0x18874
leaq 0x38(%r12), %rcx
cmpq %rcx, %rax
je 0x28079
leaq 0x67d7(%rip), %rsi      # 0x2e840
movq %rbx, %rdi
callq 0x4100
testl %eax, %eax
je 0x282cd
movq %r12, %rdi
movq %r15, %rsi
callq 0x18874
leaq 0x8(%r12), %rcx
cmpq %rcx, %rax
je 0x280a8
movq %r12, %r13
leaq 0x67a3(%rip), %rsi      # 0x2e83b
movq %rbx, %rdi
callq 0x4100
testl %eax, %eax
je 0x2837c
movq 0x10(%rsp), %rax
cmpq %rax, 0x18(%rsp)
je 0x280b9
movq %rax, 0x18(%rsp)
leaq 0x6775(%rip), %rsi      # 0x2e835
movq %rbx, %rdi
callq 0x4100
testl %eax, %eax
je 0x28324
leaq 0x6769(%rip), %rsi      # 0x2e840
movq %rbx, %rdi
callq 0x4100
testl %eax, %eax
je 0x283f5
leaq 0x674d(%rip), %rsi      # 0x2e83b
movq 0x28(%rsp), %rdi
callq 0x4100
testl %eax, %eax
movq 0x8(%rsp), %rbx
jne 0x27344
movq (%r14), %rax
cmpq 0x8(%r14), %rax
je 0x27344
movq %rax, 0x28(%rsp)
movq (%rax), %rdi
callq 0xe9f0
movq %rax, %rbp
leaq 0x2e8(%rsp), %r13
movq %r13, %rdi
leaq 0x6490(%rip), %rsi      # 0x2e5c4
leaq 0xa0(%rsp), %rdx
callq 0x58d8
leaq 0xe0(%rsp), %r12
movq %r12, %rdi
movq %rbp, %rsi
movq %r13, %rdx
callq 0x18be4
movq %r15, %rdi
movq %r12, %rsi
callq 0x4040
movl %eax, %ebp
movq %r12, %rdi
callq 0x4170
leaq 0x2e8(%rsp), %rdi
callq 0x4170
testl %ebp, %ebp
je 0x28226
leaq 0xe0(%rsp), %rbp
movq %rbp, %rdi
movq %r15, %rsi
callq 0x18d7e
movq 0x28(%rsp), %rax
movq (%rax), %rdi
callq 0xe9f6
leaq 0xa0(%rsp), %r13
leaq 0x268(%rsp), %rdi
movq %rax, %rsi
callq 0x18d7e
leaq 0x2c8(%rsp), %r12
movq %r12, %rdi
leaq 0x63f9(%rip), %rsi      # 0x2e5c4
leaq 0x77(%rsp), %rdx
callq 0x58d8
movq %r13, %rdi
leaq 0x268(%rsp), %rsi
movq %r12, %rdx
callq 0x18be4
movq %rbp, %rdi
movq %r13, %rsi
callq 0x4040
movq %rbp, %r12
movl %eax, %ebp
movq %r13, %rdi
callq 0x4170
leaq 0x2c8(%rsp), %rdi
callq 0x4170
leaq 0x268(%rsp), %rdi
callq 0x4170
movq %r12, %rdi
callq 0x4170
testl %ebp, %ebp
jne 0x28235
leaq 0x10(%rsp), %rdi
movq 0x28(%rsp), %rsi
callq 0xf018
movq 0x28(%rsp), %rax
addq $0x8, %rax
jmp 0x28108
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rdx
pushq $-0x1
popq %rcx
movq %r15, %rsi
callq 0x4340
leaq 0x80(%rsp), %rbx
leaq 0xe0(%rsp), %r15
movq %rbx, %rdi
movq %r15, %rsi
callq 0x4390
movq %r15, %rdi
callq 0x4170
leaq 0xe0(%rsp), %rdi
movq %r12, %rsi
movq %rbx, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x30(%rsp), %rbx
leaq 0xe0(%rsp), %r15
movq %rbx, %rdi
movq %r15, %rsi
callq 0x2896e
movq %r15, %rdi
callq 0xf036
movq (%rbx), %rdi
movq 0x8(%rbx), %rsi
callq 0x289bf
movq 0x8(%rsp), %rbx
jmp 0x2764a
movq 0x10(%rsp), %rax
cmpq %rax, 0x18(%rsp)
je 0x282de
movq %rax, 0x18(%rsp)
movq %rbp, %rdi
movq %r15, %rsi
callq 0x2888c
movq 0x8(%rsp), %rbx
cmpq $0x0, 0x8(%rax)
je 0x27344
movq %rbp, %rdi
movq %r15, %rsi
callq 0x2888c
leaq 0xe0(%rsp), %rdi
movq %r12, %rsi
movq %rax, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
jmp 0x283ce
movq (%r14), %r12
leaq 0x10(%rsp), %r13
movq 0x8(%rsp), %rbx
cmpq 0x8(%r14), %r12
je 0x27344
movq (%r12), %rdi
callq 0xea1c
movq %r15, %rdi
movq %rax, %rsi
callq 0x4040
testl %eax, %eax
je 0x2836b
movq (%r12), %rdi
callq 0xea5c
movq %r15, %rdi
movq %rax, %rsi
callq 0x4040
testl %eax, %eax
jne 0x28376
movq %r13, %rdi
movq %r12, %rsi
callq 0xf018
addq $0x8, %r12
jmp 0x28331
movq 0x10(%rsp), %rax
cmpq %rax, 0x18(%rsp)
je 0x2838d
movq %rax, 0x18(%rsp)
movq %r13, %rdi
movq %r15, %rsi
callq 0x2888c
movq 0x8(%rsp), %rbx
cmpq $0x0, 0x8(%rax)
je 0x27344
movq %r13, %rdi
movq %r15, %rsi
callq 0x2888c
leaq 0xe0(%rsp), %rdi
movq %r13, %rsi
movq %rax, %rdx
movq %r14, %rcx
movq 0x28(%rsp), %r8
callq 0x26f88
leaq 0x10(%rsp), %rdi
leaq 0xe0(%rsp), %rbx
movq %rbx, %rsi
callq 0x2896e
movq %rbx, %rdi
callq 0xf036
movq 0x8(%rsp), %rbx
jmp 0x27344
leaq 0xe0(%rsp), %rdi
pushq $0x18
popq %rdx
movq %r15, %rsi
callq 0x44b0
leaq 0xe0(%rsp), %rdi
leaq 0xa0(%rsp), %rsi
callq 0x41d0
leaq 0xe0(%rsp), %rdi
callq 0x4260
movq %r15, %rdi
callq 0x18ad6
movb %al, 0x28(%rsp)
movq (%r14), %r12
movb 0x28(%rsp), %bpl
cmpq 0x8(%r14), %r12
je 0x283eb
testb %bpl, %bpl
je 0x28466
movl 0xa0(%rsp), %ebx
movq (%r12), %rdi
callq 0xea2c
cmpl (%rax), %ebx
je 0x284e7
jmp 0x284f4
movq (%r12), %rdi
callq 0xea0c
movq %r15, %rdi
movq %rax, %rsi
callq 0x4040
testl %eax, %eax
je 0x284e7
movq (%r12), %rdi
callq 0xe9e4
movq %rax, %r13
leaq 0x308(%rsp), %rbx
movq %rbx, %rdi
leaq 0x6128(%rip), %rsi      # 0x2e5c4
leaq 0x268(%rsp), %rdx
callq 0x58d8
leaq 0xe0(%rsp), %rbp
movq %rbp, %rdi
movq %r13, %rsi
movq %rbx, %rdx
callq 0x18be4
movq %r15, %rdi
movq %rbp, %rsi
callq 0x4040
movl %eax, %r13d
movq %rbp, %rdi
callq 0x4170
movq %rbx, %rdi
callq 0x4170
testl %r13d, %r13d
movb 0x28(%rsp), %bpl
jne 0x284f4
leaq 0x10(%rsp), %rdi
movq %r12, %rsi
callq 0xf018
addq $0x8, %r12
jmp 0x2843e
jmp 0x28676
jmp 0x28644
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28622
jmp 0x28676
jmp 0x28676
jmp 0x28676
movq %rax, %rbx
jmp 0x28553
jmp 0x28676
jmp 0x28676
movq %rax, %rbx
leaq 0xe0(%rsp), %rdi
callq 0x4170
leaq 0x308(%rsp), %rdi
jmp 0x2862d
jmp 0x28676
movq %rax, %rbx
jmp 0x28591
jmp 0x28676
movq %rax, %rbx
jmp 0x28584
movq %rax, %rbx
leaq 0xa0(%rsp), %rdi
callq 0x4170
leaq 0x2c8(%rsp), %rdi
callq 0x4170
leaq 0x268(%rsp), %rdi
callq 0x4170
jmp 0x28625
jmp 0x28676
jmp 0x28676
movq %rax, %rbx
jmp 0x285c2
movq %rax, %rbx
leaq 0xe0(%rsp), %rdi
callq 0x4170
leaq 0x2e8(%rsp), %rdi
jmp 0x2862d
jmp 0x28676
jmp 0x28676
jmp 0x28622
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28622
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28622
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
movq %rax, %rbx
leaq 0xe0(%rsp), %rdi
callq 0x4170
jmp 0x28679
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
movq %rax, %rbx
leaq 0xe0(%rsp), %rdi
callq 0x4260
jmp 0x28679
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
jmp 0x28676
movq %rax, %rbx
leaq 0x288(%rsp), %rdi
callq 0x4170
leaq 0x2a8(%rsp), %rdi
callq 0x4170
leaq 0xc0(%rsp), %rdi
callq 0x4170
leaq 0x80(%rsp), %rdi
callq 0x4170
leaq 0x10(%rsp), %rdi
callq 0xf036
leaq 0x50(%rsp), %rdi
callq 0xf036
leaq 0x30(%rsp), %rdi
callq 0xf036
movq %rbx, %rdi
callq 0x4560
nop