// File: /workspace/github_cpp_makefile_star2_O3/pranavmodx[P]modlang/src/evaluator.cpp
// Function: Evaluator::Eval(Node*, Environment*)
Object *Evaluator::Eval(Node *node, Environment *env)
{
	std::string nodeType = node->nodeType();

	// Statements
	if (nodeType == "Program")
		return evalProgram(((Program *)node), env);

	else if (nodeType == "ExpressionStatement")
		return Eval(((ExpressionStatement *)node)->expression, env);

	else if (nodeType == "BlockStatement")
		return evalBlockStatement(((BlockStatement *)node), env);

	else if (nodeType == "ReturnStatement")
	{
		Object *value = Eval(((ReturnStatement *)node)->returnValue, env);

		if (value->type() == ERROR_OBJ)
			return value;

		ReturnValue *returnValue = new ReturnValue(value);
		return returnValue;
	}

	else if (nodeType == "LetStatement")
	{
		Object *value = Eval(((LetStatement *)node)->value, env);

		if (value->type() == ERROR_OBJ)
			return value;

		env->Set((((LetStatement *)node)->name).value, value);
	}

	else if (nodeType == "AssignStatement")
	{
		Object *value = Eval(((AssignStatement *)node)->value, env);

		if (value->type() == ERROR_OBJ)
			return value;

		Object *obj = env->Get((((AssignStatement *)node)->name).value);

		if (obj->type() == ERROR_OBJ)
			return obj;

		env->Set((((AssignStatement *)node)->name).value, value);
	}

	// Expressions
	else if (nodeType == "IntegerLiteral")
	{
		Integer *integer = new Integer(((IntegerLiteral *)node)->value);
		return integer;
	}

	else if (nodeType == "BooleanLiteral")
	{
		return ((BooleanLiteral *)node)->value ? __TRUE : __FALSE;
	}

	else if (nodeType == "StringLiteral")
	{
		String *str = new String(((StringLiteral *)node)->value);
		return str;
	}

	else if (nodeType == "PrefixExpression")
	{
		Object *right = Eval(((PrefixExpression *)node)->right, env);
		if (right->type() == ERROR_OBJ)
			return right;

		return evalPrefixExpression(((PrefixExpression *)node)->operand, right);
	}

	else if (nodeType == "InfixExpression")
	{
		Object *left = Eval(((InfixExpression *)node)->left, env);
		if (left->type() == ERROR_OBJ)
			return left;

		Object *right = Eval(((InfixExpression *)node)->right, env);
		if (right->type() == ERROR_OBJ)
			return right;

		return evalInfixExpression(((InfixExpression *)node)->operand, left, right);
	}

	else if (nodeType == "IfExpression")
		return evalIfExpression((IfExpression *)node, env);

	else if (nodeType == "WhileExpression")
	{
		while (true)
		{
			Object *condition = Eval(((WhileExpression *)node)->condition, env);

			if (condition->type() == ERROR_OBJ)
				return condition;

			if (!isTruthy(condition))
				return __NULL;

			Object *result = Eval(((WhileExpression *)node)->consequence, env);

			if (result->type() == ERROR_OBJ ||
				result->type() == RETURN_VALUE_OBJ)
				return result;
		}
	}

	else if (nodeType == "Identifier")
	{
		return evalIdentifier((Identifier *)node, env);
	}

	else if (nodeType == "FunctionLiteral")
	{
		Object *fn = new Function(((FunctionLiteral *)node)->parameters, ((FunctionLiteral *)node)->body, env);

		return fn;
	}

	else if (nodeType == "CallExpression")
	{
		Object *fn = Eval(((CallExpression *)node)->function, env);

		if (fn->type() == ERROR_OBJ)
			return fn;

		std::vector<Object *> args;

		for (auto *argument : ((CallExpression *)node)->arguments)
		{
			Object *arg = Eval(argument, env);

			if (arg->type() == ERROR_OBJ)
				return arg;

			args.push_back(arg);
		}

		return evalCallExpression(fn, args);
	}

	else if (nodeType == "ArrayLiteral")
	{
		std::vector<Object *> elems;

		for (auto *element : ((ArrayLiteral *)node)->elements)
		{
			Object *elem = Eval(element, env);

			if (elem->type() == ERROR_OBJ)
				return elem;

			elems.push_back(elem);
		}

		return new Array(elems);
	}

	else if (nodeType == "IndexExpression")
	{
		Object *array = Eval(((IndexExpression *)node)->array, env);

		if (array->type() == ERROR_OBJ)
			return array;

		Object *index = Eval(((IndexExpression *)node)->index, env);

		if (index->type() == ERROR_OBJ)
			return index;

		return evalIndexExpression(array, index, env);
	}

	else if (nodeType == "HashMapLiteral")
		return evalHashMapLiteral((HashMapLiteral *)node, env);

	else if (nodeType == "HashSetLiteral")
		return evalHashSetLiteral((HashSetLiteral *)node, env);

	else if (nodeType == "StackLiteral")
		return evalStackLiteral((StackLiteral *)node, env);

	else if (nodeType == "QueueLiteral")
		return evalQueueLiteral((QueueLiteral *)node, env);

	else if (nodeType == "DequeLiteral")
		return evalDequeLiteral((DequeLiteral *)node, env);

	else if (nodeType == "MaxHeapLiteral")
		return evalMaxHeapLiteral((MaxHeapLiteral *)node, env);

	else if (nodeType == "MinHeapLiteral")
		return evalMinHeapLiteral((MinHeapLiteral *)node, env);

	return __NULL;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x138, %rsp            # imm = 0x138
movq %rdx, %r14
movq %rsi, %r12
movq %rdi, %r15
movq (%rsi), %rax
leaq 0x28(%rsp), %rbx
movq %rbx, %rdi
callq *0x10(%rax)
leaq 0xa488(%rip), %rsi      # 0x29201
movq %rbx, %rdi
callq 0x50a0
testl %eax, %eax
je 0x1eff4
leaq 0xa4be(%rip), %rsi      # 0x2924e
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f007
leaq 0xa4da(%rip), %rsi      # 0x29283
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f01c
leaq 0xa47c(%rip), %rsi      # 0x2923e
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f02f
leaq 0xa43b(%rip), %rsi      # 0x29216
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f089
leaq 0xa43a(%rip), %rsi      # 0x2922e
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f0f2
leaq 0xa7c9(%rip), %rsi      # 0x295d6
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f157
leaq 0xa7c4(%rip), %rsi      # 0x295ea
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f35f
leaq 0xa7ba(%rip), %rsi      # 0x295f9
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f3e9
leaq 0xa40a(%rip), %rsi      # 0x29262
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f54e
leaq 0xa402(%rip), %rsi      # 0x29273
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f5a8
leaq 0xa408(%rip), %rsi      # 0x29292
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f698
leaq 0xa3fc(%rip), %rsi      # 0x2929f
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f2db
leaq 0xa367(%rip), %rsi      # 0x29223
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f737
leaq 0xa3da(%rip), %rsi      # 0x292af
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f7cf
leaq 0xa3d1(%rip), %rsi      # 0x292bf
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f80b
leaq 0xa302(%rip), %rsi      # 0x29209
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f8f4
leaq 0xa3ae(%rip), %rsi      # 0x292ce
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1f9e5
leaq 0xa3a5(%rip), %rsi      # 0x292de
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fa3b
leaq 0xa39b(%rip), %rsi      # 0x292ed
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fb78
leaq 0xa391(%rip), %rsi      # 0x292fc
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fb8b
leaq 0xa385(%rip), %rsi      # 0x29309
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fc1c
leaq 0xa379(%rip), %rsi      # 0x29316
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fc2f
leaq 0xa36d(%rip), %rsi      # 0x29323
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
je 0x1fc7b
leaq 0xa363(%rip), %rsi      # 0x29332
leaq 0x28(%rsp), %rdi
callq 0x50a0
testl %eax, %eax
jne 0x1f680
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x226c8
jmp 0x1f1bf
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x1fe3e
jmp 0x1f1bf
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
jmp 0x1f1bf
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x1ffec
jmp 0x1f1bf
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %rbx
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x192dd(%rip), %rdx     # 0x38338
jne 0x1f0e6
movq 0x8(%rsp), %r14
testq %rdx, %rdx
je 0x1f185
movq 0x192ba(%rip), %rsi     # 0x38330
movq %r14, %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f188
movq 0xb0(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %rbx
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x19280(%rip), %rdx     # 0x38338
jne 0x1f14b
movq 0x8(%rsp), %r15
testq %rdx, %rdx
je 0x1f377
movq 0x1925d(%rip), %rsi     # 0x38330
movq %r15, %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f37a
movq 0x8(%rsp), %r14
xorl %ebp, %ebp
jmp 0x1f188
movq 0xb0(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %r15
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %r15, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x19217(%rip), %rdx     # 0x38338
jne 0x1f178
movq 0x8(%rsp), %rbx
testq %rdx, %rdx
je 0x1f46e
movq 0x191f8(%rip), %rsi     # 0x38330
movq %rbx, %rdi
callq 0x51d0
testl %eax, %eax
sete %r13b
jmp 0x1f471
movq 0x8(%rsp), %r15
xorl %ebp, %ebp
jmp 0x1f37a
movl $0x10, %edi
callq 0x51b0
movq %rax, %rbx
movl 0x48(%r12), %eax
leaq 0x15960(%rip), %rcx     # 0x34ad0
movq %rcx, (%rbx)
movl %eax, 0x8(%rbx)
jmp 0x1f1c2
movq 0x8(%rsp), %rbx
xorl %r13d, %r13d
jmp 0x1f471
movb $0x1, %bpl
leaq 0x18(%rsp), %rax
cmpq %rax, %r14
je 0x1f1a2
movq 0x18(%rsp), %rsi
incq %rsi
movq %r14, %rdi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f1c2
movl $0x10, %edi
callq 0x51b0
leaq 0x15988(%rip), %rcx     # 0x34b40
movq %rcx, (%rax)
movq %rbx, 0x8(%rax)
movq %rax, %rbx
leaq 0x38(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x1f1dd
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x51c0
movq %rbx, %rax
addq $0x138, %rsp            # imm = 0x138
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rbx, %rdi
callq 0x1ec84
testb %al, %al
je 0x1f680
movq 0x50(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %rbx
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x1910a(%rip), %rdx     # 0x38338
jne 0x1f250
movb $0x1, %r13b
movq 0x8(%rsp), %rbp
testq %rdx, %rdx
je 0x1f2b8
movq 0x190ec(%rip), %rsi     # 0x38330
movq %rbp, %rdi
callq 0x51d0
testl %eax, %eax
je 0x1f2b8
movq (%rbx), %rax
leaq 0x50(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x58(%rsp), %rdx
cmpq 0x1906f(%rip), %rdx     # 0x382d8
jne 0x1f28c
movq 0x50(%rsp), %rbp
testq %rdx, %rdx
je 0x1f296
movq 0x19054(%rip), %rsi     # 0x382d0
movq %rbp, %rdi
callq 0x51d0
testl %eax, %eax
sete %r13b
jmp 0x1f299
movq 0x50(%rsp), %rbp
xorl %r13d, %r13d
jmp 0x1f299
movb $0x1, %r13b
leaq 0x60(%rsp), %rax
cmpq %rax, %rbp
je 0x1f2b3
movq 0x60(%rsp), %rsi
incq %rsi
movq %rbp, %rdi
callq 0x51c0
movq 0x8(%rsp), %rbp
leaq 0x18(%rsp), %rax
cmpq %rax, %rbp
je 0x1f2d2
movq 0x18(%rsp), %rsi
incq %rsi
movq %rbp, %rdi
callq 0x51c0
testb %r13b, %r13b
jne 0x1f1c2
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %rbx
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x19031(%rip), %rdx     # 0x38338
jne 0x1f32a
movq 0x8(%rsp), %rbp
testq %rdx, %rdx
je 0x1f334
movq 0x19016(%rip), %rsi     # 0x38330
movq %rbp, %rdi
callq 0x51d0
testl %eax, %eax
sete %r13b
jmp 0x1f337
movq 0x8(%rsp), %rbp
xorl %r13d, %r13d
jmp 0x1f337
movb $0x1, %r13b
leaq 0x18(%rsp), %rax
cmpq %rax, %rbp
je 0x1f351
movq 0x18(%rsp), %rsi
incq %rsi
movq %rbp, %rdi
callq 0x51c0
testb %r13b, %r13b
je 0x1f1f2
jmp 0x1f1c2
cmpb $0x0, 0x48(%r12)
je 0x1f462
leaq 0x18186(%rip), %rax     # 0x374f8
jmp 0x1f687
movb $0x1, %bpl
leaq 0x18(%rsp), %rax
cmpq %rax, %r15
je 0x1f394
movq 0x18(%rsp), %rsi
incq %rsi
movq %r15, %rdi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f1c2
leaq 0x128(%rsp), %r13
movq %r13, -0x10(%r13)
movq 0x90(%r12), %rsi
movq 0x98(%r12), %rdx
addq %rsi, %rdx
leaq 0x118(%rsp), %rdi
callq 0xbdc6
leaq 0x118(%rsp), %rsi
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1929c
movq 0x118(%rsp), %rdi
jmp 0x1f66f
movl $0x28, %edi
callq 0x51b0
movq %rax, %rbx
leaq 0x88(%rsp), %r15
movq %r15, -0x10(%r15)
movq 0x48(%r12), %rsi
movq 0x50(%r12), %rdx
addq %rsi, %rdx
leaq 0x78(%rsp), %rdi
callq 0xbdc6
leaq 0x15758(%rip), %rax     # 0x34b78
movq %rax, (%rbx)
leaq 0x8(%rbx), %rdi
movq %rbx, %rax
addq $0x18, %rax
movq %rax, 0x8(%rbx)
movq 0x78(%rsp), %rsi
movq 0x80(%rsp), %rdx
addq %rsi, %rdx
callq 0xbdc6
movq 0x78(%rsp), %rdi
cmpq %r15, %rdi
je 0x1f1c2
movq 0x88(%rsp), %rsi
jmp 0x1f8e7
leaq 0x18097(%rip), %rax     # 0x37500
jmp 0x1f687
movb $0x1, %r13b
leaq 0x18(%rsp), %rbp
cmpq %rbp, %rbx
je 0x1f48b
movq 0x18(%rsp), %rsi
incq %rsi
movq %rbx, %rdi
callq 0x51c0
testb %r13b, %r13b
je 0x1f498
movq %r15, %rbx
jmp 0x1f1c2
leaq 0xe8(%rsp), %r13
movq %r13, -0x10(%r13)
movq 0x90(%r12), %rsi
movq 0x98(%r12), %rdx
addq %rsi, %rdx
leaq 0xd8(%rsp), %rdi
callq 0xbdc6
leaq 0xd8(%rsp), %rsi
movq %r14, %rdi
callq 0x19168
movq %rax, %rbx
movq 0xd8(%rsp), %rdi
cmpq %r13, %rdi
je 0x1f4f4
movq 0xe8(%rsp), %rsi
incq %rsi
callq 0x51c0
movq (%rbx), %rax
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq %r15, 0x70(%rsp)
movq 0x10(%rsp), %rdx
cmpq 0x18e26(%rip), %rdx     # 0x38338
jne 0x1f53f
movq %rbp, %r15
movq 0x8(%rsp), %r13
testq %rdx, %rdx
je 0x1f602
movq 0x18e04(%rip), %rsi     # 0x38330
movq %r13, %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f605
movq %rbp, %r15
movq 0x8(%rsp), %r13
xorl %ebp, %ebp
jmp 0x1f605
movq 0x68(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %rbx
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x18dbe(%rip), %rdx     # 0x38338
jne 0x1f68f
movq 0x8(%rsp), %r14
testq %rdx, %rdx
je 0x1f6b7
movq 0x18d9b(%rip), %rsi     # 0x38330
movq %r14, %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f6ba
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %rbx
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x18d64(%rip), %rdx     # 0x38338
jne 0x1f6ab
movq 0x8(%rsp), %r13
testq %rdx, %rdx
je 0x1f747
movq 0x18d41(%rip), %rsi     # 0x38330
movq %r13, %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f74a
movb $0x1, %bpl
cmpq %r15, %r13
je 0x1f61a
movq 0x18(%rsp), %rsi
incq %rsi
movq %r13, %rdi
callq 0x51c0
testb %bpl, %bpl
movq 0x70(%rsp), %r15
jne 0x1f1c2
leaq 0x108(%rsp), %r13
movq %r13, -0x10(%r13)
movq 0x90(%r12), %rsi
movq 0x98(%r12), %rdx
addq %rsi, %rdx
leaq 0xf8(%rsp), %rdi
callq 0xbdc6
leaq 0xf8(%rsp), %rsi
movq %r14, %rdi
movq %r15, %rdx
callq 0x1929c
movq 0xf8(%rsp), %rdi
cmpq %r13, %rdi
je 0x1f680
movq (%r13), %rsi
incq %rsi
callq 0x51c0
leaq 0x17e69(%rip), %rax     # 0x374f0
movq (%rax), %rbx
jmp 0x1f1c2
movq 0x8(%rsp), %r14
xorl %ebp, %ebp
jmp 0x1f6ba
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x20e5e
jmp 0x1f1bf
movq 0x8(%rsp), %r13
xorl %ebp, %ebp
jmp 0x1f74a
movb $0x1, %bpl
leaq 0x18(%rsp), %rax
cmpq %rax, %r14
je 0x1f6d4
movq 0x18(%rsp), %rsi
incq %rsi
movq %r14, %rdi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f1c2
leaq 0xc8(%rsp), %r13
movq %r13, -0x10(%r13)
movq 0x48(%r12), %rsi
movq 0x50(%r12), %rdx
addq %rsi, %rdx
leaq 0xb8(%rsp), %rdi
callq 0xbdc6
leaq 0xb8(%rsp), %rsi
movq %r15, %rdi
movq %rbx, %rdx
callq 0x200f8
movq %rax, %rbx
movq 0xb8(%rsp), %rdi
cmpq %r13, %rdi
je 0x1f1c2
movq 0xc8(%rsp), %rsi
jmp 0x1f8e7
movq %r12, %rsi
movq %r14, %rdx
callq 0x20eb0
jmp 0x1f1bf
movb $0x1, %bpl
leaq 0x18(%rsp), %rax
cmpq %rax, %r13
je 0x1f764
movq 0x18(%rsp), %rsi
incq %rsi
movq %r13, %rdi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f1c2
movq 0x70(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %r14
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x18b9f(%rip), %rdx     # 0x38338
jne 0x1f7c3
movq 0x8(%rsp), %r13
testq %rdx, %rdx
je 0x1f865
movq 0x18b80(%rip), %rsi     # 0x38330
movq %r13, %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1f868
movq 0x8(%rsp), %r13
xorl %ebp, %ebp
jmp 0x1f868
movl $0x30, %edi
callq 0x51b0
movq %rax, %rbx
movq 0x60(%r12), %r15
addq $0x48, %r12
leaq 0x153c4(%rip), %rax     # 0x34bb0
movq %rax, (%rbx)
movq %rbx, %rdi
addq $0x8, %rdi
movq %r12, %rsi
callq 0x24f34
movq %r15, 0x20(%rbx)
movq %r14, 0x28(%rbx)
jmp 0x1f1c2
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %rbx
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x18b01(%rip), %rdx     # 0x38338
jne 0x1f9ac
movq 0x8(%rsp), %r13
testq %rdx, %rdx
je 0x1fa5a
movq 0x18ade(%rip), %rsi     # 0x38330
movq %r13, %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1fa5d
movb $0x1, %bpl
leaq 0x18(%rsp), %rax
cmpq %rax, %r13
je 0x1f882
movq 0x18(%rsp), %rsi
incq %rsi
movq %r13, %rdi
callq 0x51c0
testb %bpl, %bpl
je 0x1f88f
movq %r14, %rbx
jmp 0x1f1c2
leaq 0xa8(%rsp), %r13
movq %r13, -0x10(%r13)
movq 0x50(%r12), %rsi
movq 0x58(%r12), %rdx
addq %rsi, %rdx
leaq 0x98(%rsp), %rdi
callq 0xbdc6
leaq 0x98(%rsp), %rsi
movq %r15, %rdi
movq %rbx, %rdx
movq %r14, %rcx
callq 0x203ae
movq %rax, %rbx
movq 0x98(%rsp), %rdi
cmpq %r13, %rdi
je 0x1f1c2
movq 0xa8(%rsp), %rsi
incq %rsi
callq 0x51c0
jmp 0x1f1c2
xorps %xmm0, %xmm0
movaps %xmm0, 0x50(%rsp)
movq $0x0, 0x60(%rsp)
movq 0x48(%r12), %r13
movq 0x50(%r12), %r12
cmpq %r12, %r13
je 0x1f9b8
movq (%r13), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, 0x48(%rsp)
movq (%rax), %rcx
leaq 0x8(%rsp), %rdi
movq %rax, %rsi
callq *(%rcx)
movq 0x10(%rsp), %rdx
cmpq 0x189f3(%rip), %rdx     # 0x38338
jne 0x1f967
movq 0x8(%rsp), %rbp
testq %rdx, %rdx
je 0x1f970
movq 0x189d8(%rip), %rsi     # 0x38330
movq %rbp, %rdi
callq 0x51d0
testl %eax, %eax
sete %bl
jmp 0x1f972
movq 0x8(%rsp), %rbp
xorl %ebx, %ebx
jmp 0x1f972
movb $0x1, %bl
leaq 0x18(%rsp), %rax
cmpq %rax, %rbp
je 0x1f98c
movq 0x18(%rsp), %rsi
incq %rsi
movq %rbp, %rdi
callq 0x51c0
testb %bl, %bl
jne 0x1fb58
leaq 0x50(%rsp), %rdi
leaq 0x48(%rsp), %rsi
callq 0x240b4
addq $0x8, %r13
jmp 0x1f90f
movq 0x8(%rsp), %r13
xorl %ebp, %ebp
jmp 0x1fa5d
movl $0x20, %edi
callq 0x51b0
movq %rax, %rbx
leaq 0x1521c(%rip), %rax     # 0x34be8
movq %rax, (%rbx)
movq %rbx, %rdi
addq $0x8, %rdi
leaq 0x50(%rsp), %rsi
callq 0x2451e
jmp 0x1fb5d
movq 0x48(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %rbx
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x18927(%rip), %rdx     # 0x38338
jne 0x1fa4e
movq 0x8(%rsp), %r13
testq %rdx, %rdx
je 0x1fb9e
movq 0x18908(%rip), %rsi     # 0x38330
movq %r13, %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1fba1
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x21b30
jmp 0x1f1bf
movq 0x8(%rsp), %r13
xorl %ebp, %ebp
jmp 0x1fba1
movb $0x1, %bpl
leaq 0x18(%rsp), %rax
cmpq %rax, %r13
je 0x1fa77
movq 0x18(%rsp), %rsi
incq %rsi
movq %r13, %rdi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f1c2
xorps %xmm0, %xmm0
movaps %xmm0, 0x50(%rsp)
movq $0x0, 0x60(%rsp)
movq 0x50(%r12), %rbp
movq 0x58(%r12), %rax
movq %rax, 0x70(%rsp)
cmpq %rax, %rbp
je 0x1fb43
movq (%rbp), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, 0x48(%rsp)
movq (%rax), %rcx
leaq 0x8(%rsp), %rdi
movq %rax, %rsi
callq *(%rcx)
movq 0x10(%rsp), %rdx
cmpq 0x18862(%rip), %rdx     # 0x38338
jne 0x1faf9
movq 0x8(%rsp), %r13
testq %rdx, %rdx
je 0x1fb03
movq 0x18847(%rip), %rsi     # 0x38330
movq %r13, %rdi
callq 0x51d0
testl %eax, %eax
sete %r12b
jmp 0x1fb06
movq 0x8(%rsp), %r13
xorl %r12d, %r12d
jmp 0x1fb06
movb $0x1, %r12b
leaq 0x18(%rsp), %rax
cmpq %rax, %r13
je 0x1fb20
movq 0x18(%rsp), %rsi
incq %rsi
movq %r13, %rdi
callq 0x51c0
testb %r12b, %r12b
jne 0x1fb58
leaq 0x50(%rsp), %rdi
leaq 0x48(%rsp), %rsi
callq 0x240b4
addq $0x8, %rbp
cmpq 0x70(%rsp), %rbp
jne 0x1faa9
leaq 0x50(%rsp), %rdx
movq %r15, %rdi
movq %rbx, %rsi
callq 0x20ff0
movq %rax, %rbx
jmp 0x1fb5d
movq 0x48(%rsp), %rbx
movq 0x50(%rsp), %rdi
testq %rdi, %rdi
je 0x1f1c2
movq 0x60(%rsp), %rsi
subq %rdi, %rsi
jmp 0x1f8ea
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x21e30
jmp 0x1f1bf
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x22090
jmp 0x1f1bf
movb $0x1, %bpl
leaq 0x18(%rsp), %rax
cmpq %rax, %r13
je 0x1fbbb
movq 0x18(%rsp), %rsi
incq %rsi
movq %r13, %rdi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f1c2
movq 0x50(%r12), %rsi
movq %r15, %rdi
movq %r14, %rdx
callq 0x1ed4a
movq %rax, %r14
movq (%rax), %rax
leaq 0x8(%rsp), %rdi
movq %r14, %rsi
callq *(%rax)
movq 0x10(%rsp), %rdx
cmpq 0x18748(%rip), %rdx     # 0x38338
jne 0x1fc13
movq 0x8(%rsp), %r12
testq %rdx, %rdx
je 0x1fc42
movq 0x1872d(%rip), %rsi     # 0x38330
movq %r12, %rdi
callq 0x51d0
testl %eax, %eax
sete %bpl
jmp 0x1fc45
movq 0x8(%rsp), %r12
xorl %ebp, %ebp
jmp 0x1fc45
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x221fa
jmp 0x1f1bf
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x22364
jmp 0x1f1bf
movb $0x1, %bpl
leaq 0x18(%rsp), %rax
cmpq %rax, %r12
je 0x1fc5f
movq 0x18(%rsp), %rsi
incq %rsi
movq %r12, %rdi
callq 0x51c0
testb %bpl, %bpl
jne 0x1f887
movq %r15, %rdi
movq %rbx, %rsi
movq %r14, %rdx
callq 0x217cc
jmp 0x1f1bf
movq %r15, %rdi
movq %r12, %rsi
movq %r14, %rdx
callq 0x224ce
jmp 0x1f1bf
jmp 0x1fe17
jmp 0x1fe17
jmp 0x1fd33
jmp 0x1fe17
jmp 0x1fe17
movq %rax, %r14
movl $0x20, %esi
movq %rbx, %rdi
callq 0x51c0
jmp 0x1fd36
jmp 0x1fd33
jmp 0x1fe17
jmp 0x1fe17
movq %rax, %r14
movl $0x30, %esi
jmp 0x1fd82
jmp 0x1fe17
movq %rax, %r14
movq 0x98(%rsp), %rdi
cmpq %r13, %rdi
je 0x1fe1a
movq 0xa8(%rsp), %rsi
jmp 0x1fdfd
jmp 0x1fd33
jmp 0x1fe17
jmp 0x1fd33
jmp 0x1fe17
movq %rax, %r14
movq 0xb8(%rsp), %rdi
cmpq %r13, %rdi
je 0x1fe1a
movq 0xc8(%rsp), %rsi
jmp 0x1fdfd
jmp 0x1fd33
jmp 0x1fe17
jmp 0x1fe17
movq %rax, %r14
movq 0x50(%rsp), %rdi
testq %rdi, %rdi
je 0x1fe1a
movq 0x60(%rsp), %rsi
subq %rdi, %rsi
jmp 0x1fe00
jmp 0x1fe17
jmp 0x1fe17
movq %rax, %r14
movq 0x78(%rsp), %rdi
cmpq %r15, %rdi
je 0x1fd7d
movq 0x88(%rsp), %rsi
incq %rsi
callq 0x51c0
jmp 0x1fd7d
movq %rax, %r14
movl $0x28, %esi
movq %rbx, %rdi
jmp 0x1fe00
jmp 0x1fe17
movq %rax, %r14
movq 0xf8(%rsp), %rdi
cmpq %r13, %rdi
je 0x1fe1a
movq 0x108(%rsp), %rsi
jmp 0x1fdfd
movq %rax, %r14
movq 0x8(%rsp), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x1fe1a
movq 0x18(%rsp), %rsi
jmp 0x1fdfd
jmp 0x1fe17
jmp 0x1fe17
jmp 0x1fe17
jmp 0x1fe17
movq %rax, %r14
movq 0xd8(%rsp), %rdi
cmpq %r13, %rdi
je 0x1fe1a
movq 0xe8(%rsp), %rsi
jmp 0x1fdfd
jmp 0x1fe17
jmp 0x1fe17
movq %rax, %r14
movq 0x118(%rsp), %rdi
cmpq %r13, %rdi
je 0x1fe1a
movq 0x128(%rsp), %rsi
incq %rsi
callq 0x51c0
jmp 0x1fe1a
jmp 0x1fe17
jmp 0x1fe17
jmp 0x1fe17
jmp 0x1fe17
jmp 0x1fe17
jmp 0x1fe17
jmp 0x1fe17
jmp 0x1fe17
movq %rax, %r14
leaq 0x38(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0x1fe35
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x51c0
movq %r14, %rdi
callq 0x5330
nop