// File: /workspace/github_cpp_makefile_star2_O3/andrakis[P]alisp/eval_simple.cpp
// Function: ALisp::Eval::Simple::eval(ALisp::Cell const&, ALisp::Cell const&)
Cell eval(const Cell &_x, const Cell &_env) {
				Cell x = _x;
				Cell env = _env;
			recurse:
				switch (x.type()) {
					case CellType::Atom:
						return env.env()->get(x.atomId());
					case CellType::String:
					case CellType::Integer:
					case CellType::Float:
						return x;
				}
				if (x.empty()) return Nil;

				const Cell sym = x.head();
				if (sym.type() == CellType::Atom) {
					const AtomType id = sym.atomId();
					if (id == _quote) {				// (quote exp)
						return x.index(1);
					} else if (id == _if) {			// (if test conseq [alt])
						const Cell test = x.index(1);
						const Cell conseq = x.index(2);
						const Cell alt = x.index(3); // default: Nil
						const Cell result = eval(test, env);
						x = (result == False) ? alt : conseq;
						goto recurse;
					} else if (id == _define) {		// (define var exp) - create new variable
						AtomType newid = x.index(1).atomId();
						x = eval(x.index(2), env);
						env.env()->create(newid, x);
						return x;
					} else if (id == _set) {		// (set! var exp) - update existing variable
						AtomType newid = x.index(1).atomId();
						x = eval(x.index(2), env);
						env.env()->set(newid, x);
						return x;
					} else if (id == _lambda) {		// (lambda (var*) exp)
						LambdaCell lambda;
						lambda.lambda_ptr(env);
						lambda.lambda_args(x.index(1));
						lambda.lambda_body(x.index(2));
						return lambda;
					} else if (id == _macro) {		// (macro (var*) exp)
						MacroCell macro;
						macro.lambda_ptr(env);
						macro.lambda_args(x.index(1));
						macro.lambda_body(x.index(2));
						return macro;
					} else if (id == _begin) {		// (begin exp*)
						auto it = x.cbegin() + 1;
						for (; it != x.cend() - 1; ++it) {
							eval(*it, env);
						}
						x = *it;
						goto recurse;
					}
				}

				// (proc exp*)
				const Cell proc = eval(x.index(0), env);
				ListType exps;
				if (proc.type() == CellType::Macro) {
					const Cell tail = x.tail();
					exps = ListType(tail.cbegin(), tail.cend());
				}  else {
					// (map (tail x) (lambda (y) (eval y env)))
					for (auto it = x.cbegin() + 1; it != x.cend(); ++it)
						exps.push_back(eval(*it, env));
				}
				switch (proc.type()) {
					case CellType::Lambda: {
						EnvironmentType env_shared = std::make_shared<Environment>(proc.lambda_args(), exps, proc.lambda_ptr().env());
						env = EnvironmentCell(env_shared); // swap environments
						x = proc.lambda_body();
						goto recurse;
					}
					case CellType::Macro: {
						EnvironmentType env_shared = std::make_shared<Environment>(proc.lambda_args(), exps, proc.lambda_ptr().env());
						EnvironmentCell env2(env_shared); // short life
						x = eval(proc.lambda_body(), env2);
						// env2 should deallocate here
						goto recurse;
					}
					case CellType::Proc:
						return proc.proc()(exps);
					case CellType::ProcEnv:
						return proc.proc_env()(exps, env.env());
					default:
						throw Exception("Not an executable cell");
				}
			}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x108, %rsp            # imm = 0x108
movq %rdx, %rbx
movq %rdi, 0x40(%rsp)
movq (%rsi), %rsi
testq %rsi, %rsi
je 0x155bb
movq (%rsi), %rax
leaq 0x10(%rsp), %r14
movq %r14, %rdi
callq *(%rax)
movq (%r14), %rax
jmp 0x155bd
xorl %eax, %eax
movq %rax, (%rsp)
movq (%rbx), %rsi
testq %rsi, %rsi
je 0x155da
movq (%rsi), %rax
leaq 0x10(%rsp), %rdi
callq *(%rax)
movq 0x10(%rsp), %rax
jmp 0x155dc
xorl %eax, %eax
leaq 0xa0(%rsp), %r14
movq %rax, (%r14)
movq %rsp, %r13
leaq 0x10(%rsp), %r15
leaq 0x70(%rsp), %rbp
movq (%rsp), %rax
testq %rax, %rax
je 0x15615
movl 0x8(%rax), %ecx
leal -0x2(%rcx), %edx
cmpl $0x3, %edx
jb 0x16082
cmpl $0x1, %ecx
je 0x160b4
movq %r13, %rdi
callq 0xf2b0
testb %al, %al
jne 0x16094
leaq 0xa8(%rsp), %rdi
movq %r13, %rsi
callq 0xf208
movq 0xa8(%rsp), %rax
testq %rax, %rax
je 0x15b84
cmpl $0x1, 0x8(%rax)
jne 0x15b84
leaq 0xa8(%rsp), %rdi
callq 0xac7e
leaq 0x19104(%rip), %rcx     # 0x2e768
cmpq (%rcx), %rax
jne 0x15680
movl $0x1, %edx
movq 0x40(%rsp), %rdi
movq %r13, %rsi
callq 0xf310
jmp 0x15b19
leaq 0x190d9(%rip), %rcx     # 0x2e760
cmpq (%rcx), %rax
jne 0x15728
movl $0x1, %edx
movq %rbp, %rdi
movq %r13, %rsi
callq 0xf310
movl $0x2, %edx
leaq 0x50(%rsp), %rdi
movq %r13, %rsi
callq 0xf310
movl $0x3, %edx
leaq 0x38(%rsp), %rdi
movq %r13, %rsi
callq 0xf310
leaq 0x8(%rsp), %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x15588
movq 0x8(%rsp), %rdi
leaq 0x50(%rsp), %rcx
testq %rdi, %rdi
je 0x1570a
leaq 0x1906e(%rip), %rax     # 0x2e758
cmpq %rdi, (%rax)
je 0x15705
movq (%rdi), %rax
leaq 0x1905f(%rip), %rsi     # 0x2e758
callq *0x78(%rax)
leaq 0x50(%rsp), %rcx
testb %al, %al
je 0x1570a
leaq 0x38(%rsp), %rcx
movq (%rcx), %rsi
testq %rsi, %rsi
je 0x158cc
movq (%rsi), %rax
movq %r15, %rdi
callq *(%rax)
movq 0x10(%rsp), %rax
jmp 0x158ce
leaq 0x19041(%rip), %rcx     # 0x2e770
cmpq (%rcx), %rax
jne 0x157fa
movl $0x1, %edx
movq %r15, %rdi
movq %r13, %rsi
callq 0xf310
movq %r15, %rdi
callq 0xac7e
movq %rax, %r12
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x15763
movq (%rdi), %rax
callq *0x10(%rax)
movl $0x2, %edx
movq %rbp, %rdi
movq %r13, %rsi
callq 0xf310
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x15588
movq 0x10(%rsp), %rax
movq $0x0, 0x10(%rsp)
movq (%rsp), %rdi
movq %rax, (%rsp)
testq %rdi, %rdi
je 0x157b2
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x157b2
movq (%rdi), %rax
callq *0x10(%rax)
movq $0x0, 0x10(%rsp)
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x157cb
movq (%rdi), %rax
callq *0x10(%rax)
movq %r15, %rdi
movq %r14, %rsi
callq 0xa552
movq 0x10(%rsp), %rbx
movq (%rsp), %rsi
testq %rsi, %rsi
je 0x159bd
movq (%rsi), %rax
movq %rbp, %rdi
callq *(%rax)
movq 0x70(%rsp), %rax
jmp 0x159bf
leaq 0x18f77(%rip), %rcx     # 0x2e778
cmpq (%rcx), %rax
jne 0x15928
movl $0x1, %edx
movq %r15, %rdi
movq %r13, %rsi
callq 0xf310
movq %r15, %rdi
callq 0xac7e
movq %rax, %r12
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x15835
movq (%rdi), %rax
callq *0x10(%rax)
movl $0x2, %edx
movq %rbp, %rdi
movq %r13, %rsi
callq 0xf310
movq %r15, %rdi
movq %rbp, %rsi
movq %r14, %rdx
callq 0x15588
movq 0x10(%rsp), %rax
movq $0x0, 0x10(%rsp)
movq (%rsp), %rdi
movq %rax, (%rsp)
testq %rdi, %rdi
je 0x15884
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x15884
movq (%rdi), %rax
callq *0x10(%rax)
movq $0x0, 0x10(%rsp)
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x1589d
movq (%rdi), %rax
callq *0x10(%rax)
movq %r15, %rdi
movq %r14, %rsi
callq 0xa552
movq 0x10(%rsp), %rbx
movq (%rsp), %rsi
testq %rsi, %rsi
je 0x15aba
movq (%rsi), %rax
movq %rbp, %rdi
callq *(%rax)
movq 0x70(%rsp), %rax
jmp 0x15abc
xorl %eax, %eax
movq (%rsp), %rdi
movq %rax, (%rsp)
testq %rdi, %rdi
je 0x158e1
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x158f1
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x38(%rsp), %rdi
testq %rdi, %rdi
je 0x15901
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x50(%rsp), %rdi
testq %rdi, %rdi
je 0x15911
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x15921
movq (%rdi), %rax
callq *0x10(%rax)
movb $0x1, %bl
jmp 0x1603d
leaq 0x18e51(%rip), %rcx     # 0x2e780
cmpq (%rcx), %rax
jne 0x15a0b
movl $0x28, %edi
callq 0x7310
movl $0x6, 0x8(%rax)
leaq 0x17b50(%rip), %rcx     # 0x2d4a0
movq %rcx, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rax)
movq $0x0, 0x20(%rax)
movq %rax, 0x10(%rsp)
movq %r15, %rdi
movq %r14, %rsi
callq 0xf3b8
movl $0x1, %edx
movq %rbp, %rdi
movq %r13, %rsi
callq 0xf310
movq %r15, %rdi
movq %rbp, %rsi
callq 0xf428
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x1599d
movq (%rdi), %rax
callq *0x10(%rax)
movl $0x2, %edx
movq %rbp, %rdi
movq %r13, %rsi
callq 0xf310
movq %r15, %rdi
movq %rbp, %rsi
callq 0xf498
jmp 0x15a9b
xorl %eax, %eax
movq %rax, 0x98(%rsp)
movq %r12, 0x70(%rsp)
movq %rbx, %rdi
movq %rbp, %rsi
callq 0xad8e
movq %rax, %rdi
leaq 0x98(%rsp), %rsi
callq 0xad50
movq 0x98(%rsp), %rdi
testq %rdi, %rdi
je 0x159fa
movq (%rdi), %rax
callq *0x10(%rax)
movq $0x0, 0x98(%rsp)
jmp 0x15af6
leaq 0x18d76(%rip), %rcx     # 0x2e788
cmpq (%rcx), %rax
jne 0x15b20
movl $0x28, %edi
callq 0x7310
movl $0x7, 0x8(%rax)
leaq 0x17b9d(%rip), %rcx     # 0x2d5d0
movq %rcx, (%rax)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%rax)
movq $0x0, 0x20(%rax)
movq %rax, 0x10(%rsp)
movq %r15, %rdi
movq %r14, %rsi
callq 0xf3b8
movl $0x1, %edx
movq %rbp, %rdi
movq %r13, %rsi
callq 0xf310
movq %r15, %rdi
movq %rbp, %rsi
callq 0xf428
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x15a80
movq (%rdi), %rax
callq *0x10(%rax)
movl $0x2, %edx
movq %rbp, %rdi
movq %r13, %rsi
callq 0xf310
movq %r15, %rdi
movq %rbp, %rsi
callq 0xf498
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x15aab
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x10(%rsp), %rax
movq 0x40(%rsp), %rcx
movq %rax, (%rcx)
jmp 0x15b19
xorl %eax, %eax
movq %rax, 0x90(%rsp)
movq %rbx, %rdi
movq %r12, %rsi
leaq 0x90(%rsp), %rdx
callq 0x1654a
movq 0x90(%rsp), %rdi
testq %rdi, %rdi
je 0x15aea
movq (%rdi), %rax
callq *0x10(%rax)
movq $0x0, 0x90(%rsp)
movq 0x18(%rsp), %rdi
testq %rdi, %rdi
je 0x15b05
callq 0xac0e
movq (%rsp), %rax
movq 0x40(%rsp), %rcx
movq %rax, (%rcx)
movq $0x0, (%rsp)
xorl %ebx, %ebx
jmp 0x1603d
leaq 0x18c69(%rip), %rcx     # 0x2e790
cmpq (%rcx), %rax
jne 0x15b84
movq %r13, %rdi
callq 0xceac
movq %rax, %rbx
addq $0x8, %rbx
movq %r13, %rdi
callq 0xcf74
addq $-0x8, %rax
cmpq %rax, %rbx
je 0x1605d
leaq 0xb0(%rsp), %rdi
movq %rbx, %rsi
movq %r14, %rdx
callq 0x15588
movq 0xb0(%rsp), %rdi
testq %rdi, %rdi
je 0x15b76
movq (%rdi), %rax
callq *0x10(%rax)
movq $0x0, 0xb0(%rsp)
jmp 0x15b37
movq %r15, %rdi
movq %r13, %rsi
xorl %edx, %edx
callq 0xf310
leaq 0x38(%rsp), %rdi
movq %r15, %rsi
movq %r14, %rdx
callq 0x15588
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x15bb1
movq (%rdi), %rax
callq *0x10(%rax)
xorps %xmm0, %xmm0
movaps %xmm0, 0x70(%rsp)
movq $0x0, 0x80(%rsp)
movq 0x38(%rsp), %rax
testq %rax, %rax
je 0x15d66
cmpl $0x7, 0x8(%rax)
jne 0x15d66
leaq 0x8(%rsp), %r12
movq %r12, %rdi
movq %r13, %rsi
callq 0xf25c
movq %r12, %rdi
callq 0xceac
movq %rax, %rbx
movq %r12, %rdi
callq 0xcf74
leaq 0x50(%rsp), %r12
movq %r12, %rdi
movq %rbx, %rsi
movq %rax, %rdx
leaq 0x48(%rsp), %rcx
callq 0xcb64
movq 0x80(%rsp), %rax
movaps 0x50(%rsp), %xmm0
movq 0x60(%rsp), %rcx
movq %rcx, 0x80(%rsp)
movaps 0x70(%rsp), %xmm1
movaps %xmm0, 0x70(%rsp)
movaps %xmm1, 0x10(%rsp)
movq %rax, 0x20(%rsp)
xorps %xmm0, %xmm0
movaps %xmm0, 0x50(%rsp)
movq $0x0, 0x60(%rsp)
movq %r15, %rdi
callq 0xaa3a
movq %r12, %rdi
callq 0xaa3a
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x15c77
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x38(%rsp), %rax
testq %rax, %rax
je 0x16137
movl 0x8(%rax), %eax
addl $-0x6, %eax
cmpl $0x3, %eax
ja 0x16137
leaq 0xbacd(%rip), %rcx      # 0x21768
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0x8(%rsp), %rdi
leaq 0x38(%rsp), %rbx
movq %rbx, %rsi
callq 0xf3d4
leaq 0x48(%rsp), %r12
movq %r12, %rdi
movq %rbx, %rsi
callq 0xf364
leaq 0x50(%rsp), %rbx
movq %rbx, %rdi
movq %r12, %rsi
callq 0xa552
movq $0x0, 0x10(%rsp)
leaq 0x18(%rsp), %rdi
movq %r15, %rsi
leaq 0x37(%rsp), %rdx
leaq 0x8(%rsp), %rcx
movq %rbp, %r8
movq %rbx, %r9
callq 0x179c2
movq 0x58(%rsp), %rdi
testq %rdi, %rdi
je 0x15d0b
callq 0xac0e
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0x15d1b
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x15d2b
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x10(%rsp), %rcx
movq 0x18(%rsp), %rax
movq %rcx, 0xc8(%rsp)
movq %rax, 0xd0(%rsp)
testq %rax, %rax
je 0x15ed5
movq 0x1826b(%rip), %rcx     # 0x2dfc0
cmpb $0x0, (%rcx)
je 0x15ed1
incl 0x8(%rax)
jmp 0x15ed5
movq %r13, %rdi
callq 0xceac
movq %rax, %rbx
addq $0x8, %rbx
movq %r13, %rdi
callq 0xcf74
cmpq %rax, %rbx
je 0x15c77
movq %r15, %rdi
movq %rbx, %rsi
movq %r14, %rdx
callq 0x15588
movq %rbp, %rdi
movq %r15, %rsi
callq 0xaa8e
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x15d71
movq (%rdi), %rax
callq *0x10(%rax)
jmp 0x15d71
leaq 0x38(%rsp), %rdi
callq 0x1669c
movq 0x40(%rsp), %rdi
movq %rbp, %rsi
callq *%rax
jmp 0x15e08
leaq 0x38(%rsp), %rdi
callq 0x16762
movq %rax, %rbx
leaq 0xd8(%rsp), %rdi
movq %r14, %rsi
callq 0xa552
movq 0x40(%rsp), %rdi
movq %rbp, %rsi
leaq 0xd8(%rsp), %rdx
callq *%rbx
movq 0xe0(%rsp), %rdi
testq %rdi, %rdi
je 0x15e08
callq 0xac0e
xorl %ebx, %ebx
jmp 0x16025
leaq 0x8(%rsp), %rdi
leaq 0x38(%rsp), %rbx
movq %rbx, %rsi
callq 0xf3d4
leaq 0x48(%rsp), %r12
movq %r12, %rdi
movq %rbx, %rsi
callq 0xf364
leaq 0x50(%rsp), %rbx
movq %rbx, %rdi
movq %r12, %rsi
callq 0xa552
movq $0x0, 0x10(%rsp)
leaq 0x18(%rsp), %rdi
movq %r15, %rsi
leaq 0x37(%rsp), %rdx
leaq 0x8(%rsp), %rcx
movq %rbp, %r8
movq %rbx, %r9
callq 0x179c2
movq 0x58(%rsp), %rdi
testq %rdi, %rdi
je 0x15e76
callq 0xac0e
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0x15e86
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x15e96
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x10(%rsp), %rcx
movq 0x18(%rsp), %rax
movq %rcx, 0xb8(%rsp)
movq %rax, 0xc0(%rsp)
testq %rax, %rax
je 0x15f72
movq 0x18100(%rip), %rcx     # 0x2dfc0
cmpb $0x0, (%rcx)
je 0x15f6e
incl 0x8(%rax)
jmp 0x15f72
lock
incl 0x8(%rax)
leaq 0x50(%rsp), %rdi
leaq 0xc8(%rsp), %rsi
callq 0xa4a2
movq 0x50(%rsp), %rax
movq $0x0, 0x50(%rsp)
movq 0xa0(%rsp), %rdi
movq %rax, 0xa0(%rsp)
testq %rdi, %rdi
je 0x15f20
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x50(%rsp), %rdi
testq %rdi, %rdi
je 0x15f20
movq (%rdi), %rax
callq *0x10(%rax)
movq $0x0, 0x50(%rsp)
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0x15f3b
callq 0xac0e
leaq 0x50(%rsp), %rdi
leaq 0x38(%rsp), %rsi
callq 0xf444
movq 0x50(%rsp), %rax
movq $0x0, 0x50(%rsp)
movq (%rsp), %rdi
movq %rax, (%rsp)
testq %rdi, %rdi
jne 0x15ffe
jmp 0x16014
lock
incl 0x8(%rax)
leaq 0x50(%rsp), %rdi
leaq 0xb8(%rsp), %rsi
callq 0xa4a2
movq 0xc0(%rsp), %rdi
testq %rdi, %rdi
je 0x15f96
callq 0xac0e
leaq 0x48(%rsp), %rbx
movq %rbx, %rdi
leaq 0x38(%rsp), %rsi
callq 0xf444
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
leaq 0x50(%rsp), %rdx
callq 0x15588
movq 0x8(%rsp), %rax
movq $0x0, 0x8(%rsp)
movq (%rsp), %rdi
movq %rax, (%rsp)
testq %rdi, %rdi
je 0x15feb
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x15feb
movq (%rdi), %rax
callq *0x10(%rax)
movq $0x0, 0x8(%rsp)
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0x16004
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x50(%rsp), %rdi
testq %rdi, %rdi
je 0x16014
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x18(%rsp), %rdi
testq %rdi, %rdi
je 0x16023
callq 0xac0e
movb $0x1, %bl
movq %rbp, %rdi
callq 0xaa3a
movq 0x38(%rsp), %rdi
testq %rdi, %rdi
je 0x1603d
movq (%rdi), %rax
callq *0x10(%rax)
movq 0xa8(%rsp), %rdi
testq %rdi, %rdi
je 0x16050
movq (%rdi), %rax
callq *0x10(%rax)
testb %bl, %bl
jne 0x155f4
jmp 0x160fe
movq (%rbx), %rsi
testq %rsi, %rsi
je 0x16074
movq (%rsi), %rax
movq %r15, %rdi
callq *(%rax)
movq 0x10(%rsp), %rax
jmp 0x16076
xorl %eax, %eax
movq (%rsp), %rdi
movq %rax, (%rsp)
movb $0x1, %bl
jmp 0x16032
movq 0x40(%rsp), %rcx
movq %rax, (%rcx)
movq $0x0, (%rsp)
jmp 0x160fe
leaq 0x186ad(%rip), %rax     # 0x2e748
movq (%rax), %rsi
testq %rsi, %rsi
je 0x160f4
movq (%rsi), %rax
leaq 0x10(%rsp), %rdi
callq *(%rax)
movq 0x10(%rsp), %rax
jmp 0x160f6
leaq 0x10(%rsp), %rdi
leaq 0xa0(%rsp), %rsi
callq 0xa552
movq 0x10(%rsp), %rbx
movq %rsp, %rdi
callq 0xac7e
movq 0x40(%rsp), %rdi
movq %rbx, %rsi
movq %rax, %rdx
callq 0x1648a
movq 0x18(%rsp), %rdi
testq %rdi, %rdi
je 0x160fe
callq 0xac0e
jmp 0x160fe
xorl %eax, %eax
movq 0x40(%rsp), %rcx
movq %rax, (%rcx)
movq 0xa0(%rsp), %rdi
testq %rdi, %rdi
je 0x16111
movq (%rdi), %rax
callq *0x10(%rax)
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x16120
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x40(%rsp), %rax
addq $0x108, %rsp            # imm = 0x108
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movl $0x28, %edi
callq 0x71b0
movq %rax, %r14
leaq 0xf8(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xb621(%rip), %rsi      # 0x21778
leaq 0xb630(%rip), %rdx      # 0x2178e
leaq 0xe8(%rsp), %rdi
callq 0xb160
movb $0x1, %bpl
leaq 0xe8(%rsp), %rsi
movq %r14, %rdi
callq 0xacd6
xorl %ebp, %ebp
leaq 0x16b39(%rip), %rsi     # 0x2ccc0
leaq -0xb46e(%rip), %rdx     # 0xad20
movq %r14, %rdi
callq 0x7600
jmp 0x16400
jmp 0x16400
jmp 0x161bf
jmp 0x16407
jmp 0x161bf
jmp 0x16407
jmp 0x16407
jmp 0x16400
jmp 0x161bf
jmp 0x16407
movq %rax, %rbx
movq 0x70(%rsp), %rdi
testq %rdi, %rdi
je 0x1640a
movq (%rdi), %rax
callq *0x10(%rax)
jmp 0x1640a
jmp 0x16407
jmp 0x16407
jmp 0x16400
jmp 0x16233
movq %rax, %rbx
movq 0x90(%rsp), %rdi
testq %rdi, %rdi
je 0x16202
movq (%rdi), %rax
callq *0x10(%rax)
movq $0x0, 0x90(%rsp)
jmp 0x162a4
jmp 0x16400
jmp 0x16278
jmp 0x16400
jmp 0x16407
jmp 0x16400
jmp 0x16413
jmp 0x16413
movq %rax, %rbx
jmp 0x162a4
jmp 0x16400
jmp 0x16278
jmp 0x16400
jmp 0x16407
jmp 0x16400
movq %rax, %rbx
movq 0x18(%rsp), %rdi
testq %rdi, %rdi
je 0x1645f
callq 0xac0e
jmp 0x1645f
jmp 0x16400
movq %rax, %rbx
jmp 0x162d4
movq %rax, %rbx
jmp 0x162e4
movq %rax, %rbx
jmp 0x162f4
jmp 0x16400
movq %rax, %rbx
movq 0x98(%rsp), %rdi
testq %rdi, %rdi
je 0x16298
movq (%rdi), %rax
callq *0x10(%rax)
movq $0x0, 0x98(%rsp)
movq 0x18(%rsp), %rdi
testq %rdi, %rdi
je 0x1644c
callq 0xac0e
jmp 0x1644c
jmp 0x16400
movq %rax, %rbx
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x162d4
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x38(%rsp), %rdi
testq %rdi, %rdi
je 0x162e4
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x50(%rsp), %rdi
testq %rdi, %rdi
je 0x162f4
movq (%rdi), %rax
callq *0x10(%rax)
movq 0x70(%rsp), %rdi
jmp 0x16441
movq %rax, %rbx
jmp 0x16472
movq %rax, %rbx
jmp 0x16365
movq %rax, %rbx
movq 0xd0(%rsp), %rdi
jmp 0x1635b
jmp 0x1637d
jmp 0x16391
jmp 0x163f2
jmp 0x1642f
movq %rax, %rbx
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0x1633e
movq (%rdi), %rax
callq *0x10(%rax)
jmp 0x1633e
movq %rax, %rbx
movq 0x50(%rsp), %rdi
testq %rdi, %rdi
je 0x16365
movq (%rdi), %rax
callq *0x10(%rax)
jmp 0x16365
movq %rax, %rbx
movq 0xc0(%rsp), %rdi
testq %rdi, %rdi
je 0x16365
callq 0xac0e
movq 0x18(%rsp), %rdi
testq %rdi, %rdi
je 0x16432
callq 0xac0e
jmp 0x16432
movq %rax, %rbx
movq 0x58(%rsp), %rdi
testq %rdi, %rdi
je 0x16394
callq 0xac0e
jmp 0x16394
movq %rax, %rbx
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0x163f5
movq (%rdi), %rax
callq *0x10(%rax)
jmp 0x163f5
jmp 0x163f2
jmp 0x1642f
movq %rax, %rbx
movq 0xe0(%rsp), %rdi
jmp 0x1636a
jmp 0x163f2
jmp 0x1642f
movq %rax, %rbx
movq 0xe8(%rsp), %rdi
cmpq %r15, %rdi
je 0x163de
movq 0xf8(%rsp), %rsi
incq %rsi
callq 0x7330
testb %bpl, %bpl
jne 0x163e8
jmp 0x16432
movq %rax, %rbx
movq %r14, %rdi
callq 0x7270
jmp 0x16432
movq %rax, %rbx
movq 0x8(%rsp), %rdi
jmp 0x16422
jmp 0x16400
jmp 0x1642f
movq %rax, %rbx
jmp 0x1644c
jmp 0x1642f
movq %rax, %rbx
movq 0x10(%rsp), %rdi
jmp 0x16441
jmp 0x16413
movq %rax, %rbx
jmp 0x1645f
jmp 0x1642f
movq %rax, %rbx
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x16432
movq (%rdi), %rax
callq *0x10(%rax)
jmp 0x16432
movq %rax, %rbx
leaq 0x70(%rsp), %rdi
callq 0xaa3a
movq 0x38(%rsp), %rdi
testq %rdi, %rdi
je 0x1644c
movq (%rdi), %rax
callq *0x10(%rax)
movq 0xa8(%rsp), %rdi
testq %rdi, %rdi
je 0x1645f
movq (%rdi), %rax
callq *0x10(%rax)
movq 0xa0(%rsp), %rdi
testq %rdi, %rdi
je 0x16472
movq (%rdi), %rax
callq *0x10(%rax)
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x16481
movq (%rdi), %rax
callq *0x10(%rax)
movq %rbx, %rdi
callq 0x7630
nop