// File: /workspace/github_cpp_makefile_star2_O2/melop[P]admixem/simulation.cpp
// Function: PerformSimulation()
void PerformSimulation() {
	int nGenerations = (int)SimulConfig.GetNumericConfig("generations");
	vector< Population * > vPops;

	double nRandSeed = SimulConfig.GetNumericConfig("RandomSeed");
	if (nRandSeed != -1 && nRandSeed>0.0 && nRandSeed<1.0) {
		Random::Set(nRandSeed); //initialize random number generator
		#ifndef SRANDCALLED		
		srand((int) (nRandSeed * (double)RAND_MAX));
		#define SRANDCALLED
		#endif

		printf("User-specified random seed is %f \n" , nRandSeed);
	}
	else {
		#ifndef SRANDCALLED
		srand(time(NULL)); // set seed with time.
		#define SRANDCALLED
		#endif
		nRandSeed = (double)rand()/(double)RAND_MAX;
		if (nRandSeed == 0.0) {
			nRandSeed = 0.0001;
		}

		if (nRandSeed == 1.0) {
			nRandSeed = 0.9999;
		}

		Random::Set(nRandSeed); //initialize random number generator
		//srand((int) (nRandSeed * (double)RAND_MAX));
		printf("System chosen random seed is %f \n" , nRandSeed);
		SimulConfig.SetNumericConfig("RandomSeed" , nRandSeed);
	}

	#ifdef _OPENMP
		nTotalCPUCore =  omp_get_max_threads();//omp_get_num_threads();
		//printf("OpenMP enabled\n");
	#else
		nTotalCPUCore = 1;
		//printf("OpenMP disabled \n");
	#endif

	fnInitBinom(vBinomGen);
	fnInitNom(vNomGen);
	fnInitUniform(vUniformGen);

	string sOutFolder = SimulConfig.GetConfig("OutputFolder");
	
	if (!fnFileExists(sOutFolder.c_str())) {
		fnMakeDir(sOutFolder.c_str()); // make output folder
	}
	else { //output folder already exists, try another name
		int nTryFolder=1;
		while(true) {
			string sCurrFolderNum = fnIntToString(nTryFolder);
			sOutFolder = SimulConfig.GetConfig("OutputFolder") + "_" + sCurrFolderNum;
				if (!fnFileExists(sOutFolder.c_str())) {
					fnMakeDir(sOutFolder.c_str()); // make output folder
					SimulConfig.SetConfig("OutputFolder" , sOutFolder);
					break;
				}

			nTryFolder++;
		}

	}

	string sOutFileBase = sOutFolder + "/" + "Gen";

	int nPopId = 1;//start from 1
	while(true) { // now try to parse in populations.

		string sPopString = PopId2PopString(nPopId);
		Population * pNewPop = new Population();
		printf((sPopString+"_size_limit\n").c_str());
		if (SimulConfig.GetNumericConfig(sPopString+"_size_limit")==-1) {
			printf("%d populations defined in configuration.\n", (nPopId-1));
			break;
		}

		if (nPopId==1 || nPopId==2) { // parental pops
				printf(string("Initializing Parental " + sPopString + "...\n").c_str());
				pNewPop->Init(
					SimulConfig.GetConfig(sPopString+"_name"),nPopId, 
					SimulConfig.GetConfig(sPopString+"_ancestry_label").c_str()[0],
					(int)SimulConfig.GetNumericConfig(sPopString+"_init_size"),
					(int)SimulConfig.GetNumericConfig(sPopString+"_size_limit"),
					SimulConfig.GetNumericConfig(sPopString+"_male_ratio")
				);
		}
		else {
				printf(string("Initializing Hybrid pop " + sPopString + "...\n").c_str());
				pNewPop->Init(
					SimulConfig.GetConfig(sPopString+"_name"),nPopId, 
					NULL,
					0,
					(int)SimulConfig.GetNumericConfig(sPopString+"_size_limit"),
					0
				);
		}

		vPops.push_back(pNewPop);

		nPopId++;
	}




	// Now start simulation:


	// Do migration:
	int nSampleFreq = (int)SimulConfig.GetNumericConfig("samplefreq");

	for (int nCurrGen=0; nCurrGen <= nGenerations; nCurrGen++) {

		clock_t t;
		t = clock();
		
		
		printf("\n----------------------------------------\nGeneration: %d\n", nCurrGen);
		SimulConfig.SetCurrGen(nCurrGen);

		//Summarize phenotypes
		printf("Calculating phenotype distributions...\n");
		for (vector< Population * >::iterator itpPop = vPops.begin() ; itpPop != vPops.end(); ++itpPop)
		{
			(*itpPop)->SummarizePhenotype(true); // set previous
		}
	
		bool bAllOutputOff = (SimulConfig.GetConfig("AllOutput")=="Off");

		if (bAllOutputOff) {
			printf("Warning: AllOutput is set to Off, no output will be written. \n");
		}

		if ( (!bAllOutputOff) && ((nSampleFreq > 0  && (nCurrGen % nSampleFreq == 0)) || ( SimulConfig.IsOutputFirst3Gens() && (nCurrGen==0 || nCurrGen==1 || nCurrGen==2 ) ) || SimulConfig.IsInUserSpecifiedSamplingRange(nCurrGen))) {

		
			printf("Writing to disk...\n");
			/*
			char szCurrGen[100];
			_itoa(nCurrGen , szCurrGen, 10);
			*/
			string szCurrGen = fnIntToString(nCurrGen);
			//FILE * pOutFile = fopen( (sOutFileBase + szCurrGen + ".txt").c_str(), "w" );
			ofstream fMarkerOutFile, fGeneOutFile, fPhenotypeOutFile, fPhenoSumFile, fOffSpringNatSelProb;
			fMarkerOutFile.open((sOutFileBase + szCurrGen + "_markers.txt").c_str());// output file stream
			fGeneOutFile.open((sOutFileBase + szCurrGen + "_genes.txt").c_str());// output file stream
			fPhenotypeOutFile.open((sOutFileBase + szCurrGen + "_phenotypes.txt").c_str());// output file stream
			fPhenoSumFile.open((sOutFileBase + szCurrGen + "_phenostats.txt").c_str());// output file stream
			fOffSpringNatSelProb.open((sOutFileBase + szCurrGen + "_natselprobdump.txt").c_str());// output file stream

			fMarkerOutFile.setf(std::ios_base::fixed);
			fGeneOutFile.setf(std::ios_base::fixed);
			fPhenotypeOutFile.setf(std::ios_base::fixed);
			fOffSpringNatSelProb.setf(std::ios_base::fixed);

			//dump everything to disk:
			for (vector< Population * >::iterator itpPop = vPops.begin() ; itpPop != vPops.end(); ++itpPop)
			{
				(*itpPop)->Sample(fMarkerOutFile, fGeneOutFile, fPhenotypeOutFile, fPhenoSumFile, fOffSpringNatSelProb);
			}
		
			fMarkerOutFile.close();
			fGeneOutFile.close();
			fPhenotypeOutFile.close();
		}
		// do frequency-dependent selection

		for (vector< Population * >::iterator itpPop = vPops.begin() ; itpPop != vPops.end(); ++itpPop)
		{
				printf(string("FreqDependent Selection " + (*itpPop)->GetPopName() + "...\n").c_str());
				(*itpPop)->FreqDependentNaturalSelection();
				
		}



		//do migration:
		//try to do all pairwise migration, if the parameter is not specified, then it's deemed 0
		bool bMigrateOnlyFirstGen = SimulConfig.GetConfig("migration_only_first_gen") == "yes";

		if (bMigrateOnlyFirstGen && nCurrGen!=0) {//no migration then.

		}
		else {
			string szCurrGen = fnIntToString(nCurrGen);
			string sMigrationParamLabelPrefix = "gen" + szCurrGen + "_"; //generation specific rule prefix
			for (vector< Population * >::iterator itpPop1 = vPops.begin() ; itpPop1 != vPops.end(); ++itpPop1)
			{
				for (vector< Population * >::iterator itpPop2 = vPops.begin() ; itpPop2 != vPops.end(); ++itpPop2) {

					if ((*itpPop1)->GetPopId() == (*itpPop2)->GetPopId()) {
						continue; // same pops, no migration needed
					}
					string sMigrationParamLabel = sMigrationParamLabelPrefix + PopId2PopString((*itpPop1)->GetPopId()) + "_to_" + PopId2PopString((*itpPop2)->GetPopId()); 
					string sMigrationParamLabelGeneral = PopId2PopString((*itpPop1)->GetPopId()) + "_to_" + PopId2PopString((*itpPop2)->GetPopId()); 
					if (SimulConfig.GetNumericConfig(sMigrationParamLabel)==-1 && SimulConfig.GetNumericConfig(sMigrationParamLabelGeneral)==-1) {
						continue; // didn't find the configuration for this migration, move on
					}
					else {
						double nNumberMigrants = SimulConfig.GetNumericConfig(sMigrationParamLabel);
						double nNumberMigrantsGeneral = SimulConfig.GetNumericConfig(sMigrationParamLabelGeneral);
						if (nNumberMigrants == -1 && nNumberMigrantsGeneral!=-1) { // IF generation specific rule not available, use general rule
							nNumberMigrants = nNumberMigrantsGeneral;
						}
						else if (nNumberMigrants == -1 && nNumberMigrantsGeneral==-1) {
							continue;
						}

						if (SimulConfig.GetConfig("UseBinomMigrateRate") == "yes" && nNumberMigrants!=0 && (*itpPop1)->GetPopSize(4)>0) {
							if (nNumberMigrants <=0 || nNumberMigrants > 1) {
								printf("ERROR: When UseBinomMigrateRate is turned on, migrational rates must be 0-1.\n");
								Throw(Out_of_range("ERROR: When UseBinomMigrateRate is turned on, migrational rates must be 0-1."));
								
							}
							Binomial oBinom((*itpPop1)->GetPopSize(4) ,  nNumberMigrants);
							//std::binomial_distribution<int> oBinomDist((*itpPop1)->GetPopSize(4) ,  nNumberMigrants);
							printf("Migrant number drawn from Binom(n=%d , p=%f)\n", (*itpPop1)->GetPopSize(4) , nNumberMigrants);
							nNumberMigrants = round( oBinom.Next() );//oBinomDist(RandEngine) );
							
						}
						printf("Migration %s : %d migrants...\n", sMigrationParamLabel.c_str(), (int)nNumberMigrants);
						for (int i=0; i<nNumberMigrants; i++) {
							if ((*itpPop1)->GetPopSize(4) == 0) {
								printf("Population size of %s is now 0, only migrated %d individuals.\n", (*itpPop1)->GetPopName().c_str(), i);
								break;							
							}
							(*itpPop2)->Immigrate( (*itpPop1)->Emigrate() );
						}

					}
				}
				
			}

			//confirm immigrants for every pop
			for (vector< Population * >::iterator itpPop = vPops.begin() ; itpPop != vPops.end(); ++itpPop)
			{
				(*itpPop)->ImmigrateConfirm(true);
				cout << "Update trait summary stats after migration for pop " << (*itpPop)->GetPopName() << "\n";
				(*itpPop)->SummarizePhenotype(false); //do not reset previous
			}
		}

		//breed and kill
		
		bool bAtLeastOneBred = false;

		for (vector< Population * >::iterator itpPop = vPops.begin() ; itpPop != vPops.end(); ++itpPop)
		{
				
				if ((*itpPop)->Breed())
				{
					
					bAtLeastOneBred = true;
				}

				(*itpPop)->KillOldGen();
				
		}


		if (!bAtLeastOneBred ) {
			printf("All populations went extinct because all of them failed to breed.");
			exit(200);
		}

		ostringstream sPopSizeReport;
		sPopSizeReport<< "Population size: ";
		for (vector< Population * >::iterator itpPop = vPops.begin() ; itpPop != vPops.end(); ++itpPop)
		{
			sPopSizeReport <<  (*itpPop)->GetPopName() << "  ";
			sPopSizeReport << ((*itpPop)->GetPopSize(4));
			sPopSizeReport << " (m:f=" ;
			sPopSizeReport << ((double)(*itpPop)->GetPopSize(1) / (double)(*itpPop)->GetPopSize(0));
			sPopSizeReport << ") ";
		}
		sPopSizeReport << "\n";
		 
		printf(sPopSizeReport.str().c_str());

		t = clock() - t;
		printf ("Execution time for generation : %f seconds.\n",((float)t)/CLOCKS_PER_SEC);

	}
	
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xe18, %rsp            # imm = 0xE18
leaq 0x6113(%rip), %rsi      # 0x2fc33
leaq 0x1f8(%rsp), %rdi
leaq 0x378(%rsp), %rdx
callq 0x9512
leaq 0x1bdfc(%rip), %rdi     # 0x45938
leaq 0x1f8(%rsp), %rsi
callq 0x16872
movsd %xmm0, 0x18(%rsp)
leaq 0x1f8(%rsp), %rdi
callq 0x71a0
xorpd %xmm0, %xmm0
movapd %xmm0, 0x20(%rsp)
andq $0x0, 0x30(%rsp)
leaq 0x60cc(%rip), %rsi      # 0x2fc3f
leaq 0x1d8(%rsp), %rdi
leaq 0x378(%rsp), %rdx
callq 0x9512
leaq 0x1bda9(%rip), %rdi     # 0x45938
leaq 0x1d8(%rsp), %rsi
callq 0x16872
movsd %xmm0, (%rsp)
leaq 0x1d8(%rsp), %rdi
callq 0x71a0
movsd 0x345a(%rip), %xmm1     # 0x2d010
movsd (%rsp), %xmm0
ucomisd %xmm0, %xmm1
jbe 0x29c0a
ucomisd 0x385f(%rip), %xmm0     # 0x2d428
jne 0x29bcd
jnp 0x29c0a
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x29c0a
callq 0xb388
movsd (%rsp), %xmm0
mulsd 0x6007(%rip), %xmm0     # 0x2fbf0
cvttsd2si %xmm0, %edi
callq 0x73b0
leaq 0x6051(%rip), %rdi      # 0x2fc4a
movsd (%rsp), %xmm0
movb $0x1, %al
callq 0x7050
jmp 0x29cbc
callq 0x7110
cvtsi2sd %eax, %xmm0
divsd 0x5fd5(%rip), %xmm0     # 0x2fbf0
xorpd %xmm1, %xmm1
cmpeqsd %xmm0, %xmm1
movsd 0x5fcc(%rip), %xmm2     # 0x2fbf8
andpd %xmm1, %xmm2
andnpd %xmm0, %xmm1
orpd %xmm2, %xmm1
movapd %xmm1, %xmm0
cmpeqsd 0x33cb(%rip), %xmm0     # 0x2d010
movsd 0x5fb3(%rip), %xmm2     # 0x2fc00
andpd %xmm0, %xmm2
andnpd %xmm1, %xmm0
orpd %xmm0, %xmm2
movapd %xmm2, (%rsp)
movapd %xmm2, %xmm0
callq 0xb388
leaq 0x5fff(%rip), %rdi      # 0x2fc6d
movapd (%rsp), %xmm0
movb $0x1, %al
callq 0x7050
leaq 0x5fbe(%rip), %rsi      # 0x2fc3f
leaq 0x1b8(%rsp), %rdi
leaq 0x378(%rsp), %rdx
callq 0x9512
leaq 0x1bc9b(%rip), %rdi     # 0x45938
leaq 0x1b8(%rsp), %rsi
movapd (%rsp), %xmm0
callq 0x16aa2
leaq 0x1b8(%rsp), %rdi
callq 0x71a0
movl $0x1, 0x1b71e(%rip)     # 0x453e4
leaq 0x1bdc3(%rip), %rdi     # 0x45a90
callq 0x29884
leaq 0x1bdcf(%rip), %rdi     # 0x45aa8
callq 0x298fe
leaq 0x1bddb(%rip), %rdi     # 0x45ac0
callq 0x2996a
leaq 0x5f9e(%rip), %rsi      # 0x2fc8f
leaq 0x198(%rsp), %rdi
leaq 0x378(%rsp), %rdx
callq 0x9512
leaq 0x1bc2b(%rip), %rsi     # 0x45938
leaq 0xb8(%rsp), %rdi
leaq 0x198(%rsp), %rdx
callq 0xf118
leaq 0x198(%rsp), %rdi
callq 0x71a0
movq 0xb8(%rsp), %rdi
callq 0x2b537
testb %al, %al
je 0x29eaa
pushq $0x1
popq %rax
movl %eax, (%rsp)
leaq 0x378(%rsp), %r14
leaq 0x5f8(%rsp), %r12
leaq 0xc18(%rsp), %r15
leaq 0x618(%rsp), %rbp
leaq 0x818(%rsp), %rbx
movq %r14, %rdi
movl (%rsp), %esi
callq 0x25cc5
movq %r12, %rdi
leaq 0x5f08(%rip), %rsi      # 0x2fc8f
leaq 0xa18(%rsp), %rdx
callq 0x9512
movq %r15, %rdi
leaq 0x1bb9a(%rip), %rsi     # 0x45938
movq %r12, %rdx
callq 0xf118
movq %rbp, %rdi
movq %r15, %rsi
leaq 0x4423(%rip), %rdx      # 0x2e1d6
callq 0x22ff5
movq %rbx, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x23292
leaq 0xb8(%rsp), %rdi
movq %rbx, %rsi
callq 0x74c0
movq %rbx, %r13
movq %rbx, %rdi
callq 0x71a0
movq %rbp, %rdi
callq 0x71a0
movq %r15, %rbp
movq %r15, %rdi
callq 0x71a0
movq %r12, %r15
movq %r12, %rdi
callq 0x71a0
movq 0xb8(%rsp), %rdi
callq 0x2b537
movl %eax, %r12d
testb %al, %al
je 0x29e18
incl (%rsp)
jmp 0x29e7e
movq 0xb8(%rsp), %rdi
callq 0x2b571
leaq 0x358(%rsp), %rdi
leaq 0x5e5b(%rip), %rsi      # 0x2fc8f
movq %r13, %rdx
callq 0x9512
leaq 0x5d8(%rsp), %rbx
movq %rbx, %rdi
leaq 0xb8(%rsp), %rsi
callq 0x7550
leaq 0x1badd(%rip), %rdi     # 0x45938
leaq 0x358(%rsp), %r14
movq %r14, %rsi
movq %rbx, %rdx
callq 0x16a88
movq %rbx, %rdi
callq 0x71a0
movq %r14, %rdi
callq 0x71a0
leaq 0x378(%rsp), %r14
movq %r14, %rdi
callq 0x71a0
testb %r12b, %r12b
movq %r15, %r12
movq %rbp, %r15
leaq 0x618(%rsp), %rbp
movq %r13, %rbx
jne 0x29d72
jmp 0x29eb7
movq 0xb8(%rsp), %rdi
callq 0x2b571
leaq 0x5dde(%rip), %rdx      # 0x2fc9c
leaq 0x378(%rsp), %rdi
leaq 0xb8(%rsp), %rsi
callq 0x22ff5
leaq 0x61b4(%rip), %rdx      # 0x3008e
leaq 0xd8(%rsp), %rdi
leaq 0x378(%rsp), %rsi
callq 0x948c
cvttsd2si 0x18(%rsp), %eax
movl %eax, 0x74(%rsp)
pushq $0x1
popq %rax
movq %rax, (%rsp)
leaq 0x378(%rsp), %r14
movq %r14, %rdi
callq 0x71a0
leaq 0x818(%rsp), %r15
leaq 0x1ba19(%rip), %r12     # 0x45938
leaq 0x2f8(%rsp), %rbp
movq %r14, %rbx
movq %r14, %rdi
movq (%rsp), %rsi
callq 0x2b49a
movl $0x1f0, %edi            # imm = 0x1F0
callq 0x73f0
movq %rax, %r13
movq %rax, %rdi
callq 0x25d1c
movq %r13, 0xc18(%rsp)
movq %r15, %rdi
movq %rbx, %r14
movq %rbx, %rsi
leaq 0x5d3b(%rip), %rdx      # 0x2fc9e
callq 0x22ff5
movq 0x818(%rsp), %rdi
xorl %eax, %eax
callq 0x7050
movq %r15, %rdi
callq 0x71a0
leaq 0x338(%rsp), %rdi
movq %r14, %rsi
leaq 0x5d1a(%rip), %rdx      # 0x2fcab
callq 0x22ff5
movq %r12, %rdi
leaq 0x338(%rsp), %r13
movq %r13, %rsi
callq 0x16872
movsd %xmm0, 0x18(%rsp)
movq %r13, %rdi
callq 0x71a0
movq (%rsp), %rax
leal -0x1(%rax), %esi
movsd 0x18(%rsp), %xmm0
ucomisd 0x345c(%rip), %xmm0     # 0x2d428
jne 0x29fd4
jnp 0x2a18d
cmpl $0x1, %esi
ja 0x2a1a0
leaq 0x618(%rsp), %r13
movq %r13, %rdi
leaq 0x5cf2(%rip), %rsi      # 0x2fce1
movq %rbx, %rdx
callq 0x9325
movq %r15, %rdi
movq %r13, %rsi
leaq 0x3b88(%rip), %rdx      # 0x2db8c
callq 0x948c
movq 0x818(%rsp), %rdi
xorl %eax, %eax
callq 0x7050
movq %r15, %rdi
callq 0x71a0
movq %r13, %rdi
callq 0x71a0
movq 0xc18(%rsp), %rax
movq %rax, 0x40(%rsp)
leaq 0x178(%rsp), %rdi
movq %rbx, %rsi
leaq 0x5cb1(%rip), %rdx      # 0x2fcf8
callq 0x22ff5
leaq 0x318(%rsp), %rdi
movq %r12, %rsi
leaq 0x178(%rsp), %rdx
callq 0xf118
movq %rbp, %rdi
movq %rbx, %rsi
leaq 0x5c8d(%rip), %rdx      # 0x2fcfe
callq 0x22ff5
movq %rbp, %rdx
leaq 0x318(%rsp), %rbp
movq %r15, %r14
movq %r15, %rdi
movq %r12, %rsi
callq 0xf118
movq 0x818(%rsp), %rax
movb (%rax), %r15b
leaq 0x2d8(%rsp), %r13
movq %r13, %rdi
movq %rbx, %rsi
leaq 0x450b(%rip), %rdx      # 0x2e5ba
callq 0x22ff5
movq %r12, %rdi
movq %r13, %rsi
callq 0x16872
movsd %xmm0, 0x10(%rsp)
leaq 0x2b8(%rsp), %r13
movq %r13, %rdi
movq %rbx, %rsi
leaq 0x5bd1(%rip), %rdx      # 0x2fcab
callq 0x22ff5
movq %r12, %rdi
movq %r13, %rsi
callq 0x16872
movsd %xmm0, 0x68(%rsp)
leaq 0x298(%rsp), %r13
movq %r13, %rdi
movq %rbx, %rsi
leaq 0x5c09(%rip), %rdx      # 0x2fd0e
callq 0x22ff5
movq %r12, %rdi
movq %r13, %rsi
callq 0x16872
cvttsd2si 0x10(%rsp), %r8d
cvttsd2si 0x68(%rsp), %r9d
movsbl %r15b, %ecx
movq 0x40(%rsp), %rdi
movq %rbp, %rsi
movq (%rsp), %rdx
callq 0x26046
leaq 0x298(%rsp), %rdi
callq 0x71a0
leaq 0x2b8(%rsp), %rdi
callq 0x71a0
leaq 0x2d8(%rsp), %rdi
callq 0x71a0
movq %r14, %r15
movq %r14, %rdi
callq 0x71a0
leaq 0x2f8(%rsp), %r14
movq %r14, %rdi
callq 0x71a0
movq %rbp, %rdi
leaq 0x178(%rsp), %r13
movq %r14, %rbp
jmp 0x2a284
leaq 0x5b23(%rip), %rdi      # 0x2fcb7
xorl %eax, %eax
callq 0x7050
jmp 0x2a2ad
leaq 0x618(%rsp), %r13
movq %r13, %rdi
leaq 0x5b68(%rip), %rsi      # 0x2fd1a
movq %rbx, %rdx
callq 0x9325
movq %r15, %rdi
movq %r13, %rsi
leaq 0x39c5(%rip), %rdx      # 0x2db8c
callq 0x948c
movq 0x818(%rsp), %rdi
xorl %eax, %eax
callq 0x7050
movq %r15, %rdi
callq 0x71a0
movq %r13, %rdi
callq 0x71a0
movq 0xc18(%rsp), %r13
leaq 0x158(%rsp), %rdi
movq %rbx, %rsi
leaq 0x5af3(%rip), %rdx      # 0x2fcf8
callq 0x22ff5
leaq 0x278(%rsp), %rdi
movq %r12, %rsi
leaq 0x158(%rsp), %rdx
callq 0xf118
leaq 0x258(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
leaq 0x5a74(%rip), %rdx      # 0x2fcab
callq 0x22ff5
movq %r12, %rdi
movq %r14, %rsi
callq 0x16872
leaq 0x278(%rsp), %r14
cvttsd2si %xmm0, %r9d
xorpd %xmm0, %xmm0
movq %r13, %rdi
movq %r14, %rsi
movq (%rsp), %rdx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x26046
leaq 0x258(%rsp), %rdi
callq 0x71a0
movq %r14, %rdi
leaq 0x158(%rsp), %r13
callq 0x71a0
movq %r13, %rdi
callq 0x71a0
leaq 0x20(%rsp), %rdi
leaq 0xc18(%rsp), %rsi
callq 0x2c2e2
movq (%rsp), %rax
incl %eax
movq %rax, (%rsp)
movq %rbx, %r14
movq %rbx, %rdi
callq 0x71a0
movsd 0x18(%rsp), %xmm0
ucomisd 0x3162(%rip), %xmm0     # 0x2d428
jne 0x29f27
jp 0x29f27
leaq 0x5a5a(%rip), %rsi      # 0x2fd33
leaq 0x138(%rsp), %rdi
leaq 0x378(%rsp), %rdx
callq 0x9512
leaq 0x1b643(%rip), %rdi     # 0x45938
leaq 0x138(%rsp), %rsi
callq 0x16872
cvttsd2si %xmm0, %eax
movl %eax, 0x3c(%rsp)
leaq 0x138(%rsp), %rdi
callq 0x71a0
leaq 0x238(%rsp), %r15
leaq 0x818(%rsp), %r13
leaq 0x19c02(%rip), %rax     # 0x43f30
addq $0x10, %rax
movq %rax, 0x40(%rsp)
leaq 0xa18(%rsp), %r14
leaq 0xc18(%rsp), %rbp
xorl %ebx, %ebx
cmpl 0x74(%rsp), %ebx
jg 0x2aeeb
callq 0x7290
movq %rax, 0x68(%rsp)
leaq 0x59da(%rip), %rdi      # 0x2fd3e
movl %ebx, %esi
xorl %eax, %eax
callq 0x7050
leaq 0x1b5c4(%rip), %rdi     # 0x45938
movl %ebx, 0x10(%rsp)
movl %ebx, %esi
callq 0x16ac8
leaq 0x5e82(%rip), %rdi      # 0x30208
callq 0x75c0
movq 0x20(%rsp), %rbx
cmpq 0x28(%rsp), %rbx
je 0x2a3a8
movq (%rbx), %rdi
pushq $0x1
popq %rsi
callq 0x26278
addq $0x8, %rbx
jmp 0x2a390
movq %r15, %rdi
leaq 0x59c6(%rip), %rsi      # 0x2fd78
movq %r13, %rdx
callq 0x9512
leaq 0x378(%rsp), %r12
movq %r12, %rdi
leaq 0x1b56c(%rip), %rsi     # 0x45938
movq %r15, %rdx
callq 0xf118
movq %r15, %rbx
movq %r12, %rdi
leaq 0x5734(%rip), %rsi      # 0x2fb15
callq 0x954d
movl %eax, %r15d
movq %r12, %rdi
callq 0x71a0
movq %rbx, %rdi
callq 0x71a0
testb %r15b, %r15b
je 0x2a40f
leaq 0x5e2a(%rip), %rdi      # 0x3022f
callq 0x75c0
jmp 0x2a730
cmpl $0x0, 0x3c(%rsp)
jle 0x2a424
movl 0x10(%rsp), %eax
xorl %edx, %edx
divl 0x3c(%rsp)
testl %edx, %edx
je 0x2a454
leaq 0x1b50d(%rip), %rdi     # 0x45938
callq 0x16a40
cmpl $0x3, 0x10(%rsp)
setb %cl
testb %al, %cl
jne 0x2a454
leaq 0x1b4f5(%rip), %rdi     # 0x45938
movl 0x10(%rsp), %esi
callq 0x16a5a
testb %al, %al
je 0x2a730
leaq 0x5e12(%rip), %rdi      # 0x3026d
callq 0x75c0
leaq 0x78(%rsp), %rdi
movl 0x10(%rsp), %esi
callq 0x25cc5
leaq 0x378(%rsp), %rbx
movq %rbx, %rdi
callq 0x7690
movq %r13, %rdi
callq 0x7690
leaq 0x618(%rsp), %rdi
callq 0x7690
movq %rbp, %rdi
callq 0x7690
movq %r14, %rdi
callq 0x7690
leaq 0x98(%rsp), %r15
movq %r15, %rdi
leaq 0xd8(%rsp), %rsi
leaq 0x78(%rsp), %rdx
callq 0x23073
leaq 0x48(%rsp), %rdi
movq %r15, %rsi
leaq 0x58b3(%rip), %rdx      # 0x2fd82
callq 0x948c
movq 0x48(%rsp), %rsi
movq %rbx, %rdi
pushq $0x10
popq %rdx
callq 0x7060
leaq 0x48(%rsp), %r15
movq %r15, %rdi
callq 0x71a0
leaq 0x98(%rsp), %r12
movq %r12, %rdi
callq 0x71a0
movq %r12, %rdi
leaq 0xd8(%rsp), %rsi
leaq 0x78(%rsp), %rdx
callq 0x23073
movq %rbp, %rbx
movq %r15, %rdi
movq %r12, %rsi
leaq 0x5869(%rip), %rdx      # 0x2fd8f
callq 0x948c
movq 0x48(%rsp), %rsi
movq %r13, %rdi
pushq $0x10
popq %rdx
callq 0x7060
leaq 0x48(%rsp), %r15
movq %r15, %rdi
callq 0x71a0
leaq 0x98(%rsp), %r12
movq %r12, %rdi
callq 0x71a0
movq %r12, %rdi
leaq 0xd8(%rsp), %rsi
leaq 0x78(%rsp), %rdx
callq 0x23073
movq %r15, %rdi
movq %r12, %rsi
leaq 0x5820(%rip), %rdx      # 0x2fd9a
callq 0x948c
movq 0x48(%rsp), %rsi
leaq 0x618(%rsp), %rdi
pushq $0x10
popq %rdx
callq 0x7060
leaq 0x48(%rsp), %r15
movq %r15, %rdi
callq 0x71a0
leaq 0x98(%rsp), %r12
movq %r12, %rdi
callq 0x71a0
movq %r12, %rdi
leaq 0xd8(%rsp), %rsi
leaq 0x78(%rsp), %rdx
callq 0x23073
movq %r15, %rdi
movq %r12, %rsi
leaq 0x57d7(%rip), %rdx      # 0x2fdaa
callq 0x948c
movq 0x48(%rsp), %rsi
movq %rbx, %rdi
pushq $0x10
popq %rdx
callq 0x7060
leaq 0x48(%rsp), %rbx
movq %rbx, %rdi
callq 0x71a0
leaq 0x98(%rsp), %r15
movq %r15, %rdi
callq 0x71a0
movq %r15, %rdi
leaq 0xd8(%rsp), %rsi
leaq 0x78(%rsp), %rdx
callq 0x23073
movq %rbx, %rdi
movq %r15, %rsi
leaq 0x5793(%rip), %rdx      # 0x2fdba
callq 0x948c
movq 0x48(%rsp), %rsi
movq %r14, %rdi
pushq $0x10
popq %rdx
callq 0x7060
movq %rbx, %rdi
callq 0x71a0
leaq 0x98(%rsp), %rdi
callq 0x71a0
movq 0x378(%rsp), %rax
movq -0x18(%rax), %rax
orl $0x4, 0x390(%rsp,%rax)
movq 0x818(%rsp), %rax
movq -0x18(%rax), %rax
orl $0x4, 0x830(%rsp,%rax)
movq 0x618(%rsp), %rax
movq -0x18(%rax), %rax
orl $0x4, 0x630(%rsp,%rax)
movq 0xa18(%rsp), %rax
movq -0x18(%rax), %rax
orl $0x4, 0xa30(%rsp,%rax)
movq 0x20(%rsp), %rbx
cmpq 0x28(%rsp), %rbx
je 0x2a6d4
movq (%rbx), %rdi
leaq 0x378(%rsp), %rsi
movq %r13, %rdx
leaq 0x618(%rsp), %rcx
movq %rbp, %r8
movq %r14, %r9
callq 0x28154
addq $0x8, %rbx
jmp 0x2a6a6
leaq 0x378(%rsp), %rbx
movq %rbx, %rdi
callq 0x7560
movq %r13, %rdi
callq 0x7560
leaq 0x618(%rsp), %rdi
callq 0x7560
movq %r14, %rdi
callq 0x7590
movq %rbp, %rdi
callq 0x7590
leaq 0x618(%rsp), %rdi
callq 0x7590
movq %r13, %rdi
callq 0x7590
movq %rbx, %rdi
callq 0x7590
leaq 0x78(%rsp), %rdi
callq 0x71a0
movq 0x20(%rsp), %rbx
cmpq 0x28(%rsp), %rbx
je 0x2a7b5
movq (%rbx), %rsi
leaq 0x618(%rsp), %r15
movq %r15, %rdi
callq 0x27b7e
movq %r13, %rdi
leaq 0x5675(%rip), %rsi      # 0x2fdce
movq %r15, %rdx
callq 0x939b
leaq 0x378(%rsp), %r15
movq %r15, %rdi
movq %r13, %rsi
leaq 0x3416(%rip), %rdx      # 0x2db8c
callq 0x948c
movq 0x378(%rsp), %rdi
xorl %eax, %eax
callq 0x7050
movq %r15, %rdi
callq 0x71a0
movq %r13, %rdi
callq 0x71a0
leaq 0x618(%rsp), %rdi
callq 0x71a0
movq (%rbx), %rdi
callq 0x284d4
addq $0x8, %rbx
jmp 0x2a735
leaq 0x5b8(%rsp), %r12
movq %r12, %rdi
leaq 0x5620(%rip), %rsi      # 0x2fde7
movq %r13, %rdx
callq 0x9512
leaq 0x378(%rsp), %rbx
movq %rbx, %rdi
leaq 0x1b157(%rip), %rsi     # 0x45938
movq %r12, %rdx
callq 0xf118
movq %rbx, %rdi
leaq 0x4e43(%rip), %rsi      # 0x2f636
callq 0x954d
movl %eax, %r15d
movq %rbx, %rdi
callq 0x71a0
movq %r12, %rdi
callq 0x71a0
cmpl $0x0, 0x10(%rsp)
je 0x2a81b
testb %r15b, %r15b
jne 0x2ad56
movq %rbx, %rdi
movl 0x10(%rsp), %esi
callq 0x25cc5
leaq 0x618(%rsp), %r15
movq %r15, %rdi
leaq 0x55c3(%rip), %rsi      # 0x2fdfc
movq %rbx, %rdx
callq 0x9325
movq %r13, %rdi
movq %r15, %rsi
leaq 0x3988(%rip), %rdx      # 0x2e1d6
callq 0x948c
movq %r15, %rdi
callq 0x71a0
movq 0x20(%rsp), %r13
movq 0x28(%rsp), %rax
movq 0x20(%rsp), %rbx
cmpq %rax, %r13
je 0x2ad34
cmpq %rax, %rbx
je 0x2acc2
movq (%r13), %rdi
callq 0x292bc
movl %eax, %r15d
movq (%rbx), %rdi
callq 0x292bc
cmpl %eax, %r15d
je 0x2acb4
movq (%r13), %rdi
callq 0x292bc
leaq 0x78(%rsp), %r15
movq %r15, %rdi
movl %eax, %esi
callq 0x2b49a
movq %r14, %rdi
leaq 0x818(%rsp), %rsi
movq %r15, %rdx
callq 0x2c366
movq %rbp, %rdi
movq %r14, %rsi
leaq 0x552f(%rip), %rdx      # 0x2fe00
callq 0x948c
movq (%rbx), %rdi
callq 0x292bc
leaq 0x48(%rsp), %r12
movq %r12, %rdi
movl %eax, %esi
callq 0x2b49a
leaq 0x618(%rsp), %rdi
movq %rbp, %r15
movq %rbp, %rsi
movq %r12, %rdx
callq 0x2c2ff
movq %r12, %rdi
callq 0x71a0
movq %r15, %rdi
callq 0x71a0
movq %r14, %rdi
callq 0x71a0
leaq 0x78(%rsp), %r15
movq %r15, %rdi
callq 0x71a0
movq (%r13), %rdi
callq 0x292bc
movq %r15, %rdi
movl %eax, %esi
callq 0x2b49a
movq %r14, %rdi
movq %r15, %rsi
leaq 0x54b8(%rip), %rdx      # 0x2fe00
callq 0x948c
movq (%rbx), %rdi
callq 0x292bc
leaq 0x48(%rsp), %r15
movq %r15, %rdi
movl %eax, %esi
callq 0x2b49a
movq %rbp, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x2c2ff
movq %r15, %rdi
callq 0x71a0
movq %r14, %rdi
callq 0x71a0
leaq 0x78(%rsp), %rdi
callq 0x71a0
leaq 0x118(%rsp), %r15
movq %r15, %rdi
leaq 0x618(%rsp), %rsi
callq 0x7550
leaq 0x1af8d(%rip), %rdi     # 0x45938
movq %r15, %rsi
callq 0x16872
ucomisd 0x2a6d(%rip), %xmm0     # 0x2d428
jne 0x2aa17
jp 0x2aa17
leaq 0x218(%rsp), %rdi
movq %rbp, %rsi
callq 0x7550
leaq 0x1af62(%rip), %rdi     # 0x45938
leaq 0x218(%rsp), %r15
movq %r15, %rsi
callq 0x16872
movq %r15, %rdi
movsd %xmm0, (%rsp)
callq 0x71a0
leaq 0x118(%rsp), %rdi
callq 0x71a0
movsd (%rsp), %xmm0
ucomisd 0x2a1b(%rip), %xmm0     # 0x2d428
jne 0x2aa24
jnp 0x2ac9f
jmp 0x2aa24
leaq 0x118(%rsp), %rdi
callq 0x71a0
leaq 0x598(%rsp), %r15
movq %r15, %rdi
leaq 0x618(%rsp), %rsi
callq 0x7550
leaq 0x1aef5(%rip), %rdi     # 0x45938
movq %r15, %rsi
callq 0x16872
movsd %xmm0, (%rsp)
movq %r15, %rdi
callq 0x71a0
leaq 0x578(%rsp), %r15
movq %r15, %rdi
movq %rbp, %rsi
callq 0x7550
leaq 0x1aec6(%rip), %rdi     # 0x45938
movq %r15, %rsi
callq 0x16872
movq %r15, %rdi
movsd %xmm0, 0x18(%rsp)
callq 0x71a0
movsd 0x18(%rsp), %xmm2
movsd 0x2992(%rip), %xmm0     # 0x2d428
movsd (%rsp), %xmm1
ucomisd %xmm0, %xmm1
jne 0x2abd9
jp 0x2abd9
ucomisd %xmm0, %xmm2
jne 0x2aab7
jnp 0x2abd9
movsd %xmm2, (%rsp)
leaq 0xf8(%rsp), %r15
movq %r15, %rdi
leaq 0x5337(%rip), %rsi      # 0x2fe05
leaq 0x78(%rsp), %rdx
callq 0x9512
movq %r14, %rdi
leaq 0x1ae56(%rip), %rsi     # 0x45938
movq %r15, %rdx
callq 0xf118
movq %r14, %rdi
leaq 0x4b42(%rip), %rsi      # 0x2f636
callq 0x954d
movsd (%rsp), %xmm0
ucomisd 0x2512(%rip), %xmm0     # 0x2d018
jne 0x2ab0e
jnp 0x2ac03
testb %al, %al
je 0x2ac03
movq (%r13), %rdi
pushq $0x4
popq %rsi
callq 0x27d3c
movl %eax, %r15d
movq %r14, %rdi
callq 0x71a0
leaq 0xf8(%rsp), %rdi
callq 0x71a0
testl %r15d, %r15d
jle 0x2ac18
xorpd %xmm0, %xmm0
movsd (%rsp), %xmm1
ucomisd %xmm1, %xmm0
jae 0x2af21
ucomisd 0x24b2(%rip), %xmm1     # 0x2d010
ja 0x2af21
movq (%r13), %rdi
pushq $0x4
popq %rsi
callq 0x27d3c
movq %r14, %rdi
movl %eax, %esi
movsd (%rsp), %xmm0
callq 0xc5fc
movq (%r13), %rdi
pushq $0x4
popq %rsi
callq 0x27d3c
leaq 0x5287(%rip), %rdi      # 0x2fe19
movl %eax, %esi
movsd (%rsp), %xmm0
movb $0x1, %al
callq 0x7050
movq 0xa20(%rsp), %rdi
movq (%rdi), %rax
callq *(%rax)
callq 0x25c97
movsd %xmm0, (%rsp)
movq 0x40(%rsp), %rax
movq %rax, 0xa18(%rsp)
movq 0xa20(%rsp), %rdi
testq %rdi, %rdi
je 0x2ac18
movq (%rdi), %rax
callq *0x20(%rax)
jmp 0x2ac18
movsd (%rsp), %xmm1
ucomisd %xmm0, %xmm1
jne 0x2aabc
jp 0x2aabc
ucomisd %xmm0, %xmm2
jne 0x2aabc
jnp 0x2ac9f
jmp 0x2aabc
movq %r14, %rdi
callq 0x71a0
leaq 0xf8(%rsp), %rdi
callq 0x71a0
movq 0x618(%rsp), %rsi
cvttsd2si (%rsp), %edx
xorl %r12d, %r12d
leaq 0x5218(%rip), %rdi      # 0x2fe47
xorl %eax, %eax
callq 0x7050
cvtsi2sd %r12d, %xmm0
movsd (%rsp), %xmm1
ucomisd %xmm0, %xmm1
jbe 0x2ac9f
movq (%r13), %rdi
pushq $0x4
popq %rsi
callq 0x27d3c
testl %eax, %eax
je 0x2ac72
movq (%rbx), %r15
movq (%r13), %rdi
callq 0x27e50
movq %r15, %rdi
movq %rax, %rsi
callq 0x27eea
incl %r12d
jmp 0x2ac36
movq (%r13), %rsi
movq %r14, %rdi
callq 0x27b7e
movq 0xa18(%rsp), %rsi
leaq 0x51d9(%rip), %rdi      # 0x2fe66
movl %r12d, %edx
xorl %eax, %eax
callq 0x7050
movq %r14, %rdi
callq 0x71a0
movq %rbp, %rdi
callq 0x71a0
leaq 0x618(%rsp), %rdi
callq 0x71a0
addq $0x8, %rbx
movq 0x28(%rsp), %rax
jmp 0x2a873
addq $0x8, %r13
jmp 0x2a865
movq (%rbx), %rdi
pushq $0x1
popq %rsi
callq 0x27f48
movq 0x1a2b3(%rip), %rdi     # 0x44f90
leaq 0x51c1(%rip), %rsi      # 0x2fea5
callq 0x73d0
movq %rax, %r12
movq (%rbx), %rsi
leaq 0x618(%rsp), %r15
movq %r15, %rdi
callq 0x27b7e
movq %r12, %rdi
movq %r15, %rsi
callq 0x7370
movq %rax, %rdi
leaq 0x3233(%rip), %rsi      # 0x2df47
callq 0x73d0
movq %r15, %rdi
callq 0x71a0
movq (%rbx), %rdi
xorl %esi, %esi
callq 0x26278
addq $0x8, %rbx
movq 0x28(%rsp), %rax
cmpq %rax, %rbx
jne 0x2accb
leaq 0x818(%rsp), %r13
movq %r13, %rdi
callq 0x71a0
leaq 0x378(%rsp), %rdi
callq 0x71a0
movq 0x20(%rsp), %r12
xorl %ebx, %ebx
cmpq 0x28(%rsp), %r12
je 0x2ad82
movq (%r12), %rdi
callq 0x26888
movl %eax, %r15d
movq (%r12), %rdi
callq 0x27b8c
orb %r15b, %bl
addq $0x8, %r12
jmp 0x2ad5d
testb $0x1, %bl
je 0x2af57
leaq 0x378(%rsp), %rbx
movq %rbx, %rdi
callq 0x7530
leaq 0x238(%rsp), %r15
movq %rbx, %rdi
leaq 0x516e(%rip), %rsi      # 0x2ff1b
callq 0x73d0
movq 0x20(%rsp), %rbx
cmpq 0x28(%rsp), %rbx
je 0x2ae71
movq (%rbx), %rsi
movq %r13, %rdi
callq 0x27b7e
leaq 0x378(%rsp), %rdi
movq %r13, %rsi
callq 0x7370
movq %rax, %rdi
leaq 0x5146(%rip), %rsi      # 0x2ff2d
callq 0x73d0
movq %r13, %rdi
callq 0x71a0
movq (%rbx), %rdi
pushq $0x4
popq %rsi
callq 0x27d3c
leaq 0x378(%rsp), %rdi
movl %eax, %esi
callq 0x76b0
leaq 0x378(%rsp), %rdi
leaq 0x5113(%rip), %rsi      # 0x2ff30
callq 0x73d0
movq (%rbx), %rdi
pushq $0x1
popq %rsi
callq 0x27d3c
movl %eax, %r12d
movq (%rbx), %rdi
xorl %esi, %esi
callq 0x27d3c
cvtsi2sd %r12d, %xmm0
cvtsi2sd %eax, %xmm1
divsd %xmm1, %xmm0
leaq 0x378(%rsp), %rdi
callq 0x7620
leaq 0x378(%rsp), %rdi
leaq 0x50d4(%rip), %rsi      # 0x2ff37
callq 0x73d0
addq $0x8, %rbx
jmp 0x2adb7
leaq 0x378(%rsp), %rbx
movq %rbx, %rdi
leaq 0x30c4(%rip), %rsi      # 0x2df47
callq 0x73d0
movq %r13, %rdi
leaq 0x380(%rsp), %rsi
callq 0x75f0
movq 0x818(%rsp), %rdi
xorl %eax, %eax
callq 0x7050
movq %r13, %rdi
callq 0x71a0
callq 0x7290
subq 0x68(%rsp), %rax
cvtsi2ss %rax, %xmm0
divss 0x4d42(%rip), %xmm0     # 0x2fc08
cvtss2sd %xmm0, %xmm0
leaq 0x5069(%rip), %rdi      # 0x2ff3a
movb $0x1, %al
callq 0x7050
movq %rbx, %rdi
callq 0x70e0
movl 0x10(%rsp), %ebx
incl %ebx
jmp 0x2a349
leaq 0xd8(%rsp), %rdi
callq 0x71a0
leaq 0xb8(%rsp), %rdi
callq 0x71a0
leaq 0x20(%rsp), %rdi
callq 0x2c810
addq $0xe18, %rsp            # imm = 0xE18
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x5358(%rip), %rbx      # 0x30280
movq %rbx, %rdi
callq 0x75c0
pushq $0x1
popq %rdi
callq 0x71d0
movq %rax, %r14
movq %rax, %rdi
movq %rbx, %rsi
callq 0xb15e
leaq 0x19dab(%rip), %rsi     # 0x44cf8
movq %r14, %rdi
xorl %edx, %edx
callq 0x76a0
leaq 0x4f7b(%rip), %rdi      # 0x2fed9
xorl %eax, %eax
callq 0x7050
movl $0xc8, %edi
callq 0x74b0
movq %rax, %rbx
leaq 0x1b8(%rsp), %rdi
jmp 0x2b483
jmp 0x2afe6
movq %rax, %rbx
leaq 0x138(%rsp), %rdi
jmp 0x2b469
jmp 0x2b313
jmp 0x2b1fd
jmp 0x2b12a
movq %rax, %rbx
leaq 0x198(%rsp), %rdi
jmp 0x2b483
jmp 0x2afe6
movq %rax, %rbx
leaq 0x1d8(%rsp), %rdi
jmp 0x2b483
jmp 0x2afe6
movq %rax, %rbx
leaq 0x1f8(%rsp), %rdi
callq 0x71a0
jmp 0x2b492
movq %rax, %rbx
jmp 0x2b492
jmp 0x2b12a
movq %rax, %rbx
jmp 0x2b488
movq %rax, %rbx
jmp 0x2b003
movq %rax, %rbx
leaq 0x5d8(%rsp), %rdi
callq 0x71a0
leaq 0x358(%rsp), %rdi
jmp 0x2b11b
jmp 0x2b1fd
jmp 0x2b02b
jmp 0x2b02b
jmp 0x2b03e
jmp 0x2b03e
jmp 0x2b248
jmp 0x2b248
jmp 0x2b02b
jmp 0x2b02b
movq %rax, %rbx
leaq 0x48(%rsp), %rdi
callq 0x71a0
jmp 0x2b041
jmp 0x2b03e
jmp 0x2b03e
movq %rax, %rbx
leaq 0x98(%rsp), %rdi
callq 0x71a0
jmp 0x2b24b
jmp 0x2b248
jmp 0x2b248
jmp 0x2b248
movq %rax, %rbx
jmp 0x2b27f
movq %rax, %rbx
jmp 0x2b28c
jmp 0x2b313
movq %rax, %rbx
jmp 0x2b258
movq %rax, %rbx
jmp 0x2b265
movq %rax, %rbx
jmp 0x2b272
movq %rax, %rbx
jmp 0x2b1aa
movq %rax, %rbx
jmp 0x2b147
movq %rax, %rbx
jmp 0x2b1b7
movq %rax, %rbx
jmp 0x2b154
jmp 0x2b0d2
jmp 0x2b0d2
jmp 0x2b240
movq %rax, %rbx
jmp 0x2b190
jmp 0x2b240
movq %rax, %rbx
jmp 0x2b19d
jmp 0x2b313
movq %rax, %rbx
leaq 0x618(%rsp), %rdi
jmp 0x2b45c
jmp 0x2b240
jmp 0x2b313
movq %rax, %rbx
leaq 0x618(%rsp), %rdi
callq 0x71a0
jmp 0x2b101
movq %rax, %rbx
leaq 0xc18(%rsp), %rdi
callq 0x71a0
jmp 0x2b113
movq %rax, %rbx
leaq 0x5f8(%rsp), %rdi
callq 0x71a0
jmp 0x2b200
jmp 0x2b1fd
movq %rax, %rbx
jmp 0x2b47b
movq %rax, %rbx
jmp 0x2b183
movq %rax, %rbx
leaq 0x258(%rsp), %rdi
callq 0x71a0
leaq 0x278(%rsp), %rdi
callq 0x71a0
leaq 0x158(%rsp), %rdi
jmp 0x2b45c
movq %rax, %rbx
jmp 0x2b176
movq %rax, %rbx
leaq 0x298(%rsp), %rdi
callq 0x71a0
leaq 0x2b8(%rsp), %rdi
callq 0x71a0
leaq 0x2d8(%rsp), %rdi
callq 0x71a0
leaq 0x818(%rsp), %rdi
callq 0x71a0
leaq 0x2f8(%rsp), %rdi
callq 0x71a0
leaq 0x318(%rsp), %rdi
callq 0x71a0
leaq 0x178(%rsp), %rdi
jmp 0x2b45c
jmp 0x2b397
jmp 0x2b313
movq %rax, %rbx
leaq 0x5b8(%rsp), %rdi
jmp 0x2b469
jmp 0x2b313
movq %rax, %rbx
leaq 0x238(%rsp), %rdi
jmp 0x2b469
jmp 0x2b313
jmp 0x2b313
movq %rax, %rbx
leaq 0x378(%rsp), %rdi
jmp 0x2b476
jmp 0x2b248
movq %rax, %rbx
leaq 0x338(%rsp), %rdi
jmp 0x2b45c
jmp 0x2b240
movq %rax, %rbx
movl $0x1f0, %esi            # imm = 0x1F0
movq %r13, %rdi
callq 0x7400
jmp 0x2b461
jmp 0x2b313
jmp 0x2b397
movq %rax, %rbx
jmp 0x2b461
movq %rax, %rbx
leaq 0xa18(%rsp), %rdi
callq 0x7590
leaq 0xc18(%rsp), %rdi
callq 0x7590
leaq 0x618(%rsp), %rdi
callq 0x7590
leaq 0x818(%rsp), %rdi
callq 0x7590
leaq 0x378(%rsp), %rdi
callq 0x7590
leaq 0x78(%rsp), %rdi
jmp 0x2b469
jmp 0x2b432
jmp 0x2b437
movq %rax, %rbx
movq %r14, %rdi
callq 0x7300
jmp 0x2b43a
jmp 0x2b414
jmp 0x2b397
jmp 0x2b313
movq %rax, %rbx
jmp 0x2b2d1
movq %rax, %rbx
leaq 0x818(%rsp), %rdi
callq 0x71a0
leaq 0x618(%rsp), %rdi
jmp 0x2b469
jmp 0x2b313
jmp 0x2b313
jmp 0x2b432
jmp 0x2b437
movq %rax, %rbx
leaq 0xa18(%rsp), %rdi
callq 0x71a0
jmp 0x2b34f
movq %rax, %rbx
leaq 0x818(%rsp), %rdi
callq 0x71a0
jmp 0x2b39a
movq %rax, %rbx
jmp 0x2b46e
movq %rax, %rbx
movq 0x40(%rsp), %rax
movq %rax, 0xa18(%rsp)
movq 0xa20(%rsp), %rdi
testq %rdi, %rdi
je 0x2b43a
movq (%rdi), %rax
callq *0x20(%rax)
jmp 0x2b43a
jmp 0x2b437
movq %rax, %rbx
leaq 0xf8(%rsp), %rdi
jmp 0x2b3e9
jmp 0x2b437
movq %rax, %rbx
leaq 0x578(%rsp), %rdi
jmp 0x2b3e9
jmp 0x2b437
movq %rax, %rbx
leaq 0x598(%rsp), %rdi
jmp 0x2b3e9
jmp 0x2b437
movq %rax, %rbx
leaq 0x218(%rsp), %rdi
callq 0x71a0
jmp 0x2b3e1
movq %rax, %rbx
leaq 0x378(%rsp), %rdi
callq 0x70e0
jmp 0x2b46e
jmp 0x2b437
movq %rax, %rbx
jmp 0x2b40d
movq %rax, %rbx
leaq 0x48(%rsp), %rdi
callq 0x71a0
jmp 0x2b3f3
movq %rax, %rbx
leaq 0x48(%rsp), %rdi
callq 0x71a0
jmp 0x2b41c
movq %rax, %rbx
jmp 0x2b400
movq %rax, %rbx
jmp 0x2b429
movq %rax, %rbx
leaq 0x118(%rsp), %rdi
callq 0x71a0
jmp 0x2b43a
movq %rax, %rbx
leaq 0xc18(%rsp), %rdi
callq 0x71a0
leaq 0xa18(%rsp), %rdi
callq 0x71a0
leaq 0x78(%rsp), %rdi
jmp 0x2b44f
movq %rax, %rbx
jmp 0x2b447
movq %rax, %rbx
leaq 0xa18(%rsp), %rdi
callq 0x71a0
leaq 0x78(%rsp), %rdi
jmp 0x2b442
jmp 0x2b432
movq %rax, %rbx
jmp 0x2b454
movq %rax, %rbx
leaq 0xc18(%rsp), %rdi
callq 0x71a0
leaq 0x618(%rsp), %rdi
callq 0x71a0
leaq 0x818(%rsp), %rdi
callq 0x71a0
leaq 0x378(%rsp), %rdi
callq 0x71a0
leaq 0xd8(%rsp), %rdi
callq 0x71a0
leaq 0xb8(%rsp), %rdi
callq 0x71a0
leaq 0x20(%rsp), %rdi
callq 0x2c810
movq %rbx, %rdi
callq 0x76d0