// File: /workspace/github_c_makefile_star2_O0/cbouilla[P]AES-attacks-finder/Solver.c
// Function: OptimizeSolver
Solver OptimizeSolver(Solver B, SysEqLin E) 
{
	/*
	 *  Fonction censée mettre en forme la solver avant implémentation.
	 * 	Plusieurs objectifs :
	 * 		- ne doit pas être trop longue.
	 * 		- avoir un maximum d'unions avec des solvers de type 0 (ie 1 variable)
	 * 		- essayer de supprimer les variables en commun
	 */
	  
	if (B==NULL || B->type==0) return copySolver(B); // cas simple : rien à faire
	
	if (B->type==2) // cas union sequentielle, on met en forme les deux parties.
	{
		SysEqLin F=EsachantX(B->fils2->var,B->fils2->Nvar,E);
		Solver B1=OptimizeSolver(B->fils1,F);
		freeSysEq(F);
		Solver B2=OptimizeSolver(B->fils2,E);
		if (B1==NULL) return B2;
		Solver tmp=NewSolver();
		tmp->var=UnionListesTriees(B1->var,B1->Nvar,B2->var,B2->Nvar,&(tmp->Nvar));
		tmp->sortie=B->sortie;
		tmp->temps=max(B2->temps,max(B2->sortie,0)+B1->temps);
		tmp->memoire=max(B1->memoire,B2->memoire);
		tmp->type=2;
		tmp->fils1=B1;
		tmp->fils2=B2;		
		return tmp;
	}
	
	if (B->fils2->sortie<=0) // la solver 2 a moins d'une solution -> passage au sequentiel
	{
		SysEqLin F=EsachantX(B->fils2->var,B->fils2->Nvar,E);
		Solver B2=AjusteSolver(B->fils1,F); // On met à jour la solver car maintenant les variables de la solver 2 sont connues
		Solver B1=OptimizeSolver(B2,F);
		freeSolver(B2);
		freeSysEq(F);
		B2=OptimizeSolver(B->fils2,E);
		if (B1==NULL) return B2;
		Solver tmp=NewSolver();
		tmp->var=UnionListesTriees(B1->var,B1->Nvar,B2->var,B2->Nvar,&(tmp->Nvar));
		tmp->sortie=B->sortie;
		tmp->temps=max(B2->temps,B1->temps);
		tmp->memoire=max(B1->memoire,B2->memoire);
		tmp->type=2;
		tmp->fils1=B1;
		tmp->fils2=B2;
		return tmp;
	}
	
	if (B->fils1->sortie<=0) // pareil que ci-dessus
	{
		SysEqLin F=EsachantX(B->fils1->var,B->fils1->Nvar,E);
		Solver B2=AjusteSolver(B->fils2,F);
		Solver B1=OptimizeSolver(B2,F);
		freeSolver(B2);
		freeSysEq(F);
		B2=OptimizeSolver(B->fils1,E);
		if (B1==NULL) return B2;
		Solver tmp=NewSolver();
		tmp->var=UnionListesTriees(B1->var,B1->Nvar,B2->var,B2->Nvar,&(tmp->Nvar));
		tmp->sortie=B->sortie;
		tmp->temps=max(B2->temps,B1->temps);
		tmp->memoire=max(B1->memoire,B2->memoire);
		tmp->type=2;
		//tmp->parents=1;
		tmp->fils1=B1;
		tmp->fils2=B2;
		if (tmp->Nvar!=B->Nvar)
		{
			printf("Gros bug 3");
			getchar();
		}
		return tmp;
	}
	
	if (B->sortie==B->fils1->sortie + B->fils2->sortie) // les deux solvers sont indépendantes -> passage au séquentiel
	{
		/* Les deux temps possibles */
		int t1=max(max(B->fils1->sortie,0) + B->fils2->temps, B->fils1->temps);
		int t2=max(max(B->fils2->sortie,0) + B->fils1->temps, B->fils2->temps);
		if (min(t1,t2)<=B->temps)
		{
			Solver tmp=NewSolver();
			tmp->var=UnionListesTriees(B->fils1->var,B->fils1->Nvar,B->fils2->var,B->fils2->Nvar,&(tmp->Nvar));
			tmp->sortie=B->sortie;
			tmp->type=2;
			//tmp->parents=1;
			Solver B1,B2;
			/* On choisit la meilleur option */
			if (t1<t2 || (t1==t2 && B->fils1->Nvar>=B->fils2->Nvar))
			{
				tmp->temps=t1;
				SysEqLin F=EsachantX(B->fils1->var,B->fils1->Nvar,E);
				B2=AjusteSolver(B->fils2,F);
				B1=OptimizeSolver(B2,F);
				freeSolver(B2);
				freeSysEq(F);
				B2=OptimizeSolver(B->fils1,E);
			}
			else
			{
				tmp->temps=t2;
				SysEqLin F=EsachantX(B->fils2->var,B->fils2->Nvar,E);
				B2=AjusteSolver(B->fils1,F);
				B1=OptimizeSolver(B2,F);
				freeSolver(B2);
				freeSysEq(F);
				B2=OptimizeSolver(B->fils2,E);
			}
			tmp->memoire=max(B1->memoire,B2->memoire);
			tmp->fils1=B1;
			tmp->fils2=B2;
			if (tmp->Nvar!=B->Nvar)
			{
				printf("Gros bug 4");
				getchar();
			}
			return tmp;
		}
	}

	/* Cas idéal */
	if (B->fils2->Nvar==1) 
	{
		Solver B1=OptimizeSolver(B->fils1,E);
		Solver B2=UnionSolver(B1,B->fils2,E);
		freeSolver(B1);
		return B2;
	}
	if (B->fils1->Nvar==1)
	{
		Solver B1=OptimizeSolver(B->fils2,E);
		Solver B2=UnionSolver(B1,B->fils1,E);
		freeSolver(B1);
		return B2;
	}

	/* Partie d'amélioration */

	// On est donc dans le cas d'une union de type 1, chacune des solvers à au moins 2 variables
	// On garde le fils1 pour l'énumération et on va chercher à diviser fils2

	int N1;	
	int *X1=DifferenceListesTriees(B->fils2->var,B->fils2->Nvar,B->fils1->var,B->fils1->Nvar,&N1);
	Solver *L1=malloc((N1+1)*sizeof(Solver));
	int i;
	for (i = 0; i < N1; i++) L1[i]=BaseSolver(X1[i],E);
	
	if (B->fils1->Nvar>=B->fils2->Nvar && N1<B->fils2->Nvar)
	{
		L1[N1]=copySolver(B->fils1);
		int N2;
		Solver *L2=ExhaustiveSearch(L1,N1+1,B->temps,B->memoire,&N2,E);
		Solver tmp=NULL;
		for (i = 0; i < N2; i++)
		{
			if (B->Nvar==L2[i]->Nvar) tmp=L2[i];
			else freeSolver(L2[i]);
		}
		free(L2);
		if (tmp!=NULL)
		{
			for (i = 0; i <= N1; i++) freeSolver(L1[i]);
			free(L1);
			free(X1);
			Solver B3=OptimizeSolver(tmp,E);
			freeSolver(tmp);
			return B3;
		}
	}
	
	Solver B1 = PropagateSolver2(B->fils1,E,L1,N1);
	free(X1);
	for (i = 0; i < N1; i++) freeSolver(L1[i]);
	free(L1);
	Solver B2 = copySolver(B->fils2);


	while (B2->type==1 && ContenuListesTriees(B2->fils2->var,B2->fils2->Nvar,B1->var,B1->Nvar))
	{
		Solver B3 = copySolver(B2->fils1);
		freeSolver(B2);
		B2 = B3;
	}
	while (B2->type==1 && ContenuListesTriees(B2->fils1->var,B2->fils1->Nvar,B1->var,B1->Nvar))
	{
		Solver B3 = copySolver(B2->fils2);
		freeSolver(B2);
		B2 = B3;
	}
	
	/* Partie qui foire, la fonction peut boucler indéfiniment */ 
	if (B2->type==1)
	{
		Solver B3 = UnionSolver(B1,B2->fils1,E);
		if (B3->temps<=B->temps)
		{
			Solver B4 = UnionSolver(B3,B2->fils2,E);
			freeSolver(B3);
			freeSolver(B2);
			freeSolver(B1);
			B1 = OptimizeSolver(B4,E);
			freeSolver(B4);
			return B1;
		}
		freeSolver(B3);
		B3 = UnionSolver(B1,B2->fils2,E);
		if (B3->temps<=B->temps)
		{
			Solver B4 = UnionSolver(B3,B2->fils1,E);
			freeSolver(B3);
			freeSolver(B2);
			freeSolver(B1);
			B1 = OptimizeSolver(B4,E);
			freeSolver(B4);
			return B1;
		}
		freeSolver(B3);			
	}
	if (B2->type==2)
	{
		X1=DifferenceListesTriees(B2->var,B2->Nvar,B1->var,B1->Nvar,&N1);
		L1=malloc((N1+1)*sizeof(Solver));
		for (i = 0; i < N1; i++) L1[i]=BaseSolver(X1[i],E);
		L1[N1]=copySolver(B1);
		int N2;
		Solver *L2=ExhaustiveSearch(L1,N1+1,B->temps,B2->sortie-1,&N2,E);
		Solver tmp=NULL;
		for (i = 0; i < N2; i++)
		{
			if (B->Nvar==L2[i]->Nvar) tmp=L2[i];
			else freeSolver(L2[i]);
		}
		free(L2);
		for (i = 0; i <= N1; i++) freeSolver(L1[i]);
		free(L1);
		free(X1);
		if (tmp!=NULL)
		{
			freeSolver(B1);
			freeSolver(B2);
			Solver B3=OptimizeSolver(tmp,E);
			freeSolver(tmp);
			return B3;
		}
	}

	/* Rien n'a marché */
	
	Solver B3 = OptimizeSolver(B1,E);
	freeSolver(B1);
	B1 = OptimizeSolver(B2,E);
	freeSolver(B2);
	B2 = UnionSolver(B3,B1,E);
	freeSolver(B3);
	freeSolver(B1);
	return B2;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1b0, %rsp            # imm = 0x1B0
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0xc077
movq -0x10(%rbp), %rax
movsbl 0x18(%rax), %eax
cmpl $0x0, %eax
jne 0xc089
movq -0x10(%rbp), %rdi
callq 0x9380
movq %rax, -0x8(%rbp)
jmp 0xd2ee
movq -0x10(%rbp), %rax
movsbl 0x18(%rax), %eax
cmpl $0x2, %eax
jne 0xc24d
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x8(%rax), %esi
movq -0x18(%rbp), %rdx
callq 0x11aa0
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x20(%rbp), %rsi
callq 0xc050
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rdi
callq 0x12220
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0xc104
movq -0x30(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
callq 0x9280
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rdi
movq -0x28(%rbp), %rax
movl 0x8(%rax), %esi
movq -0x30(%rbp), %rax
movq (%rax), %rdx
movq -0x30(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x38(%rbp), %r8
addq $0x8, %r8
callq 0x24e0
movq %rax, %rcx
movq -0x38(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movl 0x14(%rax), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x30(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x164(%rbp)
movq -0x30(%rbp), %rax
cmpl $0x0, 0x14(%rax)
jle 0xc174
movq -0x30(%rbp), %rax
movl 0x14(%rax), %eax
movl %eax, -0x168(%rbp)
jmp 0xc17e
xorl %eax, %eax
movl %eax, -0x168(%rbp)
jmp 0xc17e
movl -0x164(%rbp), %eax
movl -0x168(%rbp), %ecx
movq -0x28(%rbp), %rdx
addl 0xc(%rdx), %ecx
cmpl %ecx, %eax
jle 0xc1a4
movq -0x30(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x16c(%rbp)
jmp 0xc1da
movq -0x30(%rbp), %rax
cmpl $0x0, 0x14(%rax)
jle 0xc1bd
movq -0x30(%rbp), %rax
movl 0x14(%rax), %eax
movl %eax, -0x170(%rbp)
jmp 0xc1c7
xorl %eax, %eax
movl %eax, -0x170(%rbp)
jmp 0xc1c7
movl -0x170(%rbp), %eax
movq -0x28(%rbp), %rcx
addl 0xc(%rcx), %eax
movl %eax, -0x16c(%rbp)
movl -0x16c(%rbp), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x28(%rbp), %rax
movl 0x10(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0x10(%rcx), %eax
jle 0xc206
movq -0x28(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x174(%rbp)
jmp 0xc213
movq -0x30(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x174(%rbp)
movl -0x174(%rbp), %ecx
movq -0x38(%rbp), %rax
movl %ecx, 0x10(%rax)
movq -0x38(%rbp), %rax
movb $0x2, 0x18(%rax)
movq -0x28(%rbp), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x30(%rbp), %rcx
movq -0x38(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x38(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
cmpl $0x0, 0x14(%rax)
jg 0xc3cc
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x8(%rax), %esi
movq -0x18(%rbp), %rdx
callq 0x11aa0
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x40(%rbp), %rsi
callq 0xd300
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rdi
movq -0x40(%rbp), %rsi
callq 0xc050
movq %rax, -0x50(%rbp)
movq -0x48(%rbp), %rdi
callq 0x93b0
movq -0x40(%rbp), %rdi
callq 0x12220
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x48(%rbp)
cmpq $0x0, -0x50(%rbp)
jne 0xc2e3
movq -0x48(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
callq 0x9280
movq %rax, -0x58(%rbp)
movq -0x50(%rbp), %rax
movq (%rax), %rdi
movq -0x50(%rbp), %rax
movl 0x8(%rax), %esi
movq -0x48(%rbp), %rax
movq (%rax), %rdx
movq -0x48(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x58(%rbp), %r8
addq $0x8, %r8
callq 0x24e0
movq %rax, %rcx
movq -0x58(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movl 0x14(%rax), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x48(%rbp), %rax
movl 0xc(%rax), %eax
movq -0x50(%rbp), %rcx
cmpl 0xc(%rcx), %eax
jle 0xc34c
movq -0x48(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x178(%rbp)
jmp 0xc359
movq -0x50(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x178(%rbp)
movl -0x178(%rbp), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x50(%rbp), %rax
movl 0x10(%rax), %eax
movq -0x48(%rbp), %rcx
cmpl 0x10(%rcx), %eax
jle 0xc385
movq -0x50(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x17c(%rbp)
jmp 0xc392
movq -0x48(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x17c(%rbp)
movl -0x17c(%rbp), %ecx
movq -0x58(%rbp), %rax
movl %ecx, 0x10(%rax)
movq -0x58(%rbp), %rax
movb $0x2, 0x18(%rax)
movq -0x50(%rbp), %rcx
movq -0x58(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x48(%rbp), %rcx
movq -0x58(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x58(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
cmpl $0x0, 0x14(%rax)
jg 0xc56e
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movl 0x8(%rax), %esi
movq -0x18(%rbp), %rdx
callq 0x11aa0
movq %rax, -0x60(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x60(%rbp), %rsi
callq 0xd300
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0xc050
movq %rax, -0x70(%rbp)
movq -0x68(%rbp), %rdi
callq 0x93b0
movq -0x60(%rbp), %rdi
callq 0x12220
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x68(%rbp)
cmpq $0x0, -0x70(%rbp)
jne 0xc462
movq -0x68(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
callq 0x9280
movq %rax, -0x78(%rbp)
movq -0x70(%rbp), %rax
movq (%rax), %rdi
movq -0x70(%rbp), %rax
movl 0x8(%rax), %esi
movq -0x68(%rbp), %rax
movq (%rax), %rdx
movq -0x68(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x78(%rbp), %r8
addq $0x8, %r8
callq 0x24e0
movq %rax, %rcx
movq -0x78(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movl 0x14(%rax), %ecx
movq -0x78(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x68(%rbp), %rax
movl 0xc(%rax), %eax
movq -0x70(%rbp), %rcx
cmpl 0xc(%rcx), %eax
jle 0xc4cb
movq -0x68(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x180(%rbp)
jmp 0xc4d8
movq -0x70(%rbp), %rax
movl 0xc(%rax), %eax
movl %eax, -0x180(%rbp)
movl -0x180(%rbp), %ecx
movq -0x78(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x70(%rbp), %rax
movl 0x10(%rax), %eax
movq -0x68(%rbp), %rcx
cmpl 0x10(%rcx), %eax
jle 0xc504
movq -0x70(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x184(%rbp)
jmp 0xc511
movq -0x68(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x184(%rbp)
movl -0x184(%rbp), %ecx
movq -0x78(%rbp), %rax
movl %ecx, 0x10(%rax)
movq -0x78(%rbp), %rax
movb $0x2, 0x18(%rax)
movq -0x70(%rbp), %rcx
movq -0x78(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x68(%rbp), %rcx
movq -0x78(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x78(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x8(%rcx), %eax
je 0xc561
leaq 0x28da8(%rip), %rdi     # 0x352fd
movb $0x0, %al
callq 0x2100
callq 0x2170
movq -0x78(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
movq -0x10(%rbp), %rax
movl 0x14(%rax), %eax
movq -0x10(%rbp), %rcx
movq 0x20(%rcx), %rcx
movl 0x14(%rcx), %ecx
movq -0x10(%rbp), %rdx
movq 0x28(%rdx), %rdx
addl 0x14(%rdx), %ecx
cmpl %ecx, %eax
jne 0xc98a
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
cmpl $0x0, 0x14(%rax)
jle 0xc5b4
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movl 0x14(%rax), %eax
movl %eax, -0x188(%rbp)
jmp 0xc5be
xorl %eax, %eax
movl %eax, -0x188(%rbp)
jmp 0xc5be
movl -0x188(%rbp), %eax
movq -0x10(%rbp), %rcx
movq 0x28(%rcx), %rcx
addl 0xc(%rcx), %eax
movq -0x10(%rbp), %rcx
movq 0x20(%rcx), %rcx
cmpl 0xc(%rcx), %eax
jle 0xc620
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
cmpl $0x0, 0x14(%rax)
jle 0xc5fd
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movl 0x14(%rax), %eax
movl %eax, -0x18c(%rbp)
jmp 0xc607
xorl %eax, %eax
movl %eax, -0x18c(%rbp)
jmp 0xc607
movl -0x18c(%rbp), %eax
movq -0x10(%rbp), %rcx
movq 0x28(%rcx), %rcx
addl 0xc(%rcx), %eax
movl %eax, -0x190(%rbp)
jmp 0xc631
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movl 0xc(%rax), %eax
movl %eax, -0x190(%rbp)
movl -0x190(%rbp), %eax
movl %eax, -0x7c(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
cmpl $0x0, 0x14(%rax)
jle 0xc65b
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x14(%rax), %eax
movl %eax, -0x194(%rbp)
jmp 0xc665
xorl %eax, %eax
movl %eax, -0x194(%rbp)
jmp 0xc665
movl -0x194(%rbp), %eax
movq -0x10(%rbp), %rcx
movq 0x20(%rcx), %rcx
addl 0xc(%rcx), %eax
movq -0x10(%rbp), %rcx
movq 0x28(%rcx), %rcx
cmpl 0xc(%rcx), %eax
jle 0xc6c7
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
cmpl $0x0, 0x14(%rax)
jle 0xc6a4
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x14(%rax), %eax
movl %eax, -0x198(%rbp)
jmp 0xc6ae
xorl %eax, %eax
movl %eax, -0x198(%rbp)
jmp 0xc6ae
movl -0x198(%rbp), %eax
movq -0x10(%rbp), %rcx
movq 0x20(%rcx), %rcx
addl 0xc(%rcx), %eax
movl %eax, -0x19c(%rbp)
jmp 0xc6d8
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movl 0xc(%rax), %eax
movl %eax, -0x19c(%rbp)
movl -0x19c(%rbp), %eax
movl %eax, -0x80(%rbp)
movl -0x7c(%rbp), %eax
cmpl -0x80(%rbp), %eax
jge 0xc6f4
movl -0x7c(%rbp), %eax
movl %eax, -0x1a0(%rbp)
jmp 0xc6fd
movl -0x80(%rbp), %eax
movl %eax, -0x1a0(%rbp)
movl -0x1a0(%rbp), %eax
movq -0x10(%rbp), %rcx
cmpl 0xc(%rcx), %eax
jg 0xc988
callq 0x9280
movq %rax, -0x88(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movl 0x8(%rax), %esi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rdx
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x8(%rax), %ecx
movq -0x88(%rbp), %r8
addq $0x8, %r8
callq 0x24e0
movq %rax, %rcx
movq -0x88(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movl 0x14(%rax), %ecx
movq -0x88(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x88(%rbp), %rax
movb $0x2, 0x18(%rax)
movl -0x7c(%rbp), %eax
cmpl -0x80(%rbp), %eax
jl 0xc7b1
movl -0x7c(%rbp), %eax
cmpl -0x80(%rbp), %eax
jne 0xc84e
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movl 0x8(%rax), %eax
movq -0x10(%rbp), %rcx
movq 0x28(%rcx), %rcx
cmpl 0x8(%rcx), %eax
jl 0xc84e
movl -0x7c(%rbp), %ecx
movq -0x88(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movl 0x8(%rax), %esi
movq -0x18(%rbp), %rdx
callq 0x11aa0
movq %rax, -0xa0(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0xa0(%rbp), %rsi
callq 0xd300
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rdi
movq -0xa0(%rbp), %rsi
callq 0xc050
movq %rax, -0x90(%rbp)
movq -0x98(%rbp), %rdi
callq 0x93b0
movq -0xa0(%rbp), %rdi
callq 0x12220
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x98(%rbp)
jmp 0xc8e6
movl -0x80(%rbp), %ecx
movq -0x88(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x8(%rax), %esi
movq -0x18(%rbp), %rdx
callq 0x11aa0
movq %rax, -0xa8(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0xa8(%rbp), %rsi
callq 0xd300
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rdi
movq -0xa8(%rbp), %rsi
callq 0xc050
movq %rax, -0x90(%rbp)
movq -0x98(%rbp), %rdi
callq 0x93b0
movq -0xa8(%rbp), %rdi
callq 0x12220
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x98(%rbp)
movq -0x90(%rbp), %rax
movl 0x10(%rax), %eax
movq -0x98(%rbp), %rcx
cmpl 0x10(%rcx), %eax
jle 0xc90e
movq -0x90(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x1a4(%rbp)
jmp 0xc91e
movq -0x98(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, -0x1a4(%rbp)
movl -0x1a4(%rbp), %ecx
movq -0x88(%rbp), %rax
movl %ecx, 0x10(%rax)
movq -0x90(%rbp), %rcx
movq -0x88(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x98(%rbp), %rcx
movq -0x88(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x88(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0x8(%rcx), %eax
je 0xc978
leaq 0x2899c(%rip), %rdi     # 0x35308
movb $0x0, %al
callq 0x2100
callq 0x2170
movq -0x88(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
jmp 0xc98a
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
cmpl $0x1, 0x8(%rax)
jne 0xc9eb
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rsi
movq -0x18(%rbp), %rdx
callq 0xaa60
movq %rax, -0xb8(%rbp)
movq -0xb0(%rbp), %rdi
callq 0x93b0
movq -0xb8(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
cmpl $0x1, 0x8(%rax)
jne 0xca4c
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0xc0(%rbp)
movq -0xc0(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0x18(%rbp), %rdx
callq 0xaa60
movq %rax, -0xc8(%rbp)
movq -0xc0(%rbp), %rdi
callq 0x93b0
movq -0xc8(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x8(%rax), %esi
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq (%rax), %rdx
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movl 0x8(%rax), %ecx
leaq -0xcc(%rbp), %r8
callq 0x2a20
movq %rax, -0xd8(%rbp)
movl -0xcc(%rbp), %eax
addl $0x1, %eax
movslq %eax, %rdi
shlq $0x3, %rdi
callq 0x21c0
movq %rax, -0xe0(%rbp)
movl $0x0, -0xe4(%rbp)
movl -0xe4(%rbp), %eax
cmpl -0xcc(%rbp), %eax
jge 0xcaff
movq -0xd8(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movl (%rax,%rcx,4), %edi
movq -0x18(%rbp), %rsi
callq 0x9a40
movq %rax, %rdx
movq -0xe0(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movl -0xe4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xe4(%rbp)
jmp 0xcab1
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movl 0x8(%rax), %eax
movq -0x10(%rbp), %rcx
movq 0x28(%rcx), %rcx
cmpl 0x8(%rcx), %eax
jl 0xccb6
movl -0xcc(%rbp), %eax
movq -0x10(%rbp), %rcx
movq 0x28(%rcx), %rcx
cmpl 0x8(%rcx), %eax
jge 0xccb6
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x9380
movq %rax, %rdx
movq -0xe0(%rbp), %rax
movslq -0xcc(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0xe0(%rbp), %rdi
movl -0xcc(%rbp), %esi
addl $0x1, %esi
movq -0x10(%rbp), %rax
movl 0xc(%rax), %edx
movq -0x10(%rbp), %rax
movl 0x10(%rax), %ecx
movq -0x18(%rbp), %r9
leaq -0xe8(%rbp), %r8
callq 0x208d0
movq %rax, -0xf0(%rbp)
movq $0x0, -0xf8(%rbp)
movl $0x0, -0xe4(%rbp)
movl -0xe4(%rbp), %eax
cmpl -0xe8(%rbp), %eax
jge 0xcc0f
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movq -0xf0(%rbp), %rcx
movslq -0xe4(%rbp), %rdx
movq (%rcx,%rdx,8), %rcx
cmpl 0x8(%rcx), %eax
jne 0xcbe5
movq -0xf0(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0xf8(%rbp)
jmp 0xcbfc
movq -0xf0(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x93b0
jmp 0xcbfe
movl -0xe4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xe4(%rbp)
jmp 0xcb9e
movq -0xf0(%rbp), %rdi
callq 0x2030
cmpq $0x0, -0xf8(%rbp)
je 0xccb4
movl $0x0, -0xe4(%rbp)
movl -0xe4(%rbp), %eax
cmpl -0xcc(%rbp), %eax
jg 0xcc69
movq -0xe0(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x93b0
movl -0xe4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xe4(%rbp)
jmp 0xcc33
movq -0xe0(%rbp), %rdi
callq 0x2030
movq -0xd8(%rbp), %rdi
callq 0x2030
movq -0xf8(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x100(%rbp)
movq -0xf8(%rbp), %rdi
callq 0x93b0
movq -0x100(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
jmp 0xccb6
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x18(%rbp), %rsi
movq -0xe0(%rbp), %rdx
movl -0xcc(%rbp), %ecx
callq 0xb580
movq %rax, -0x108(%rbp)
movq -0xd8(%rbp), %rdi
callq 0x2030
movl $0x0, -0xe4(%rbp)
movl -0xe4(%rbp), %eax
cmpl -0xcc(%rbp), %eax
jge 0xcd27
movq -0xe0(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x93b0
movl -0xe4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xe4(%rbp)
jmp 0xccf1
movq -0xe0(%rbp), %rdi
callq 0x2030
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
callq 0x9380
movq %rax, -0x110(%rbp)
movq -0x110(%rbp), %rax
movsbl 0x18(%rax), %ecx
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x1a5(%rbp)
jne 0xcda0
movq -0x110(%rbp), %rax
movq 0x28(%rax), %rax
movq (%rax), %rdi
movq -0x110(%rbp), %rax
movq 0x28(%rax), %rax
movl 0x8(%rax), %esi
movq -0x108(%rbp), %rax
movq (%rax), %rdx
movq -0x108(%rbp), %rax
movl 0x8(%rax), %ecx
callq 0x3360
cmpl $0x0, %eax
setne %al
movb %al, -0x1a5(%rbp)
movb -0x1a5(%rbp), %al
testb $0x1, %al
jne 0xcdac
jmp 0xcde2
movq -0x110(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x9380
movq %rax, -0x118(%rbp)
movq -0x110(%rbp), %rdi
callq 0x93b0
movq -0x118(%rbp), %rax
movq %rax, -0x110(%rbp)
jmp 0xcd47
jmp 0xcde4
movq -0x110(%rbp), %rax
movsbl 0x18(%rax), %ecx
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x1a6(%rbp)
jne 0xce3d
movq -0x110(%rbp), %rax
movq 0x20(%rax), %rax
movq (%rax), %rdi
movq -0x110(%rbp), %rax
movq 0x20(%rax), %rax
movl 0x8(%rax), %esi
movq -0x108(%rbp), %rax
movq (%rax), %rdx
movq -0x108(%rbp), %rax
movl 0x8(%rax), %ecx
callq 0x3360
cmpl $0x0, %eax
setne %al
movb %al, -0x1a6(%rbp)
movb -0x1a6(%rbp), %al
testb $0x1, %al
jne 0xce49
jmp 0xce7f
movq -0x110(%rbp), %rax
movq 0x28(%rax), %rdi
callq 0x9380
movq %rax, -0x120(%rbp)
movq -0x110(%rbp), %rdi
callq 0x93b0
movq -0x120(%rbp), %rax
movq %rax, -0x110(%rbp)
jmp 0xcde4
movq -0x110(%rbp), %rax
movsbl 0x18(%rax), %eax
cmpl $0x1, %eax
jne 0xd007
movq -0x108(%rbp), %rdi
movq -0x110(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0x18(%rbp), %rdx
callq 0xaa60
movq %rax, -0x128(%rbp)
movq -0x128(%rbp), %rax
movl 0xc(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0xc(%rcx), %eax
jg 0xcf41
movq -0x128(%rbp), %rdi
movq -0x110(%rbp), %rax
movq 0x28(%rax), %rsi
movq -0x18(%rbp), %rdx
callq 0xaa60
movq %rax, -0x130(%rbp)
movq -0x128(%rbp), %rdi
callq 0x93b0
movq -0x110(%rbp), %rdi
callq 0x93b0
movq -0x108(%rbp), %rdi
callq 0x93b0
movq -0x130(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x108(%rbp)
movq -0x130(%rbp), %rdi
callq 0x93b0
movq -0x108(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
movq -0x128(%rbp), %rdi
callq 0x93b0
movq -0x108(%rbp), %rdi
movq -0x110(%rbp), %rax
movq 0x28(%rax), %rsi
movq -0x18(%rbp), %rdx
callq 0xaa60
movq %rax, -0x128(%rbp)
movq -0x128(%rbp), %rax
movl 0xc(%rax), %eax
movq -0x10(%rbp), %rcx
cmpl 0xc(%rcx), %eax
jg 0xcffb
movq -0x128(%rbp), %rdi
movq -0x110(%rbp), %rax
movq 0x20(%rax), %rsi
movq -0x18(%rbp), %rdx
callq 0xaa60
movq %rax, -0x138(%rbp)
movq -0x128(%rbp), %rdi
callq 0x93b0
movq -0x110(%rbp), %rdi
callq 0x93b0
movq -0x108(%rbp), %rdi
callq 0x93b0
movq -0x138(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x108(%rbp)
movq -0x138(%rbp), %rdi
callq 0x93b0
movq -0x108(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
movq -0x128(%rbp), %rdi
callq 0x93b0
movq -0x110(%rbp), %rax
movsbl 0x18(%rax), %eax
cmpl $0x2, %eax
jne 0xd267
movq -0x110(%rbp), %rax
movq (%rax), %rdi
movq -0x110(%rbp), %rax
movl 0x8(%rax), %esi
movq -0x108(%rbp), %rax
movq (%rax), %rdx
movq -0x108(%rbp), %rax
movl 0x8(%rax), %ecx
leaq -0xcc(%rbp), %r8
callq 0x2a20
movq %rax, -0xd8(%rbp)
movl -0xcc(%rbp), %eax
addl $0x1, %eax
movslq %eax, %rdi
shlq $0x3, %rdi
callq 0x21c0
movq %rax, -0xe0(%rbp)
movl $0x0, -0xe4(%rbp)
movl -0xe4(%rbp), %eax
cmpl -0xcc(%rbp), %eax
jge 0xd0ca
movq -0xd8(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movl (%rax,%rcx,4), %edi
movq -0x18(%rbp), %rsi
callq 0x9a40
movq %rax, %rdx
movq -0xe0(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movl -0xe4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xe4(%rbp)
jmp 0xd07c
movq -0x108(%rbp), %rdi
callq 0x9380
movq %rax, %rdx
movq -0xe0(%rbp), %rax
movslq -0xcc(%rbp), %rcx
movq %rdx, (%rax,%rcx,8)
movq -0xe0(%rbp), %rdi
movl -0xcc(%rbp), %esi
addl $0x1, %esi
movq -0x10(%rbp), %rax
movl 0xc(%rax), %edx
movq -0x110(%rbp), %rax
movl 0x14(%rax), %ecx
subl $0x1, %ecx
movq -0x18(%rbp), %r9
leaq -0x13c(%rbp), %r8
callq 0x208d0
movq %rax, -0x148(%rbp)
movq $0x0, -0x150(%rbp)
movl $0x0, -0xe4(%rbp)
movl -0xe4(%rbp), %eax
cmpl -0x13c(%rbp), %eax
jge 0xd1ac
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x148(%rbp), %rcx
movslq -0xe4(%rbp), %rdx
movq (%rcx,%rdx,8), %rcx
cmpl 0x8(%rcx), %eax
jne 0xd182
movq -0x148(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x150(%rbp)
jmp 0xd199
movq -0x148(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x93b0
jmp 0xd19b
movl -0xe4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xe4(%rbp)
jmp 0xd13b
movq -0x148(%rbp), %rdi
callq 0x2030
movl $0x0, -0xe4(%rbp)
movl -0xe4(%rbp), %eax
cmpl -0xcc(%rbp), %eax
jg 0xd1f8
movq -0xe0(%rbp), %rax
movslq -0xe4(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x93b0
movl -0xe4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xe4(%rbp)
jmp 0xd1c2
movq -0xe0(%rbp), %rdi
callq 0x2030
movq -0xd8(%rbp), %rdi
callq 0x2030
cmpq $0x0, -0x150(%rbp)
je 0xd265
movq -0x108(%rbp), %rdi
callq 0x93b0
movq -0x110(%rbp), %rdi
callq 0x93b0
movq -0x150(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x158(%rbp)
movq -0x150(%rbp), %rdi
callq 0x93b0
movq -0x158(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd2ee
jmp 0xd267
movq -0x108(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x160(%rbp)
movq -0x108(%rbp), %rdi
callq 0x93b0
movq -0x110(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xc050
movq %rax, -0x108(%rbp)
movq -0x110(%rbp), %rdi
callq 0x93b0
movq -0x160(%rbp), %rdi
movq -0x108(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0xaa60
movq %rax, -0x110(%rbp)
movq -0x160(%rbp), %rdi
callq 0x93b0
movq -0x108(%rbp), %rdi
callq 0x93b0
movq -0x110(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x1b0, %rsp            # imm = 0x1B0
popq %rbp
retq
nopl (%rax,%rax)