// File: /workspace/github_cpp_makefile_star2_O1/pfnet-research[P]pml/src/evaluator.cpp
// Function: evaluator::eval(std::shared_ptr<ast::expr_t>, environment_t<ast::expr_t> const&)
ptr<ast::expr_t> eval(ptr<ast::expr_t> e, environment_t const& env) {
    using namespace ast;
    switch (e->kind()) {
    case expr_kind_t::Let: {
        auto& let_expr = cast<let_expr_t>(*e);
        auto init = eval(let_expr.init, env);
        auto new_env = env.append(let_expr.name, init);
        return eval(let_expr.body, new_env);
        }
    case expr_kind_t::LetFun: {
        auto& letfun_expr = cast<letfun_expr_t>(*e);
        auto fun = make<ast::fun_expr_t>(letfun_expr.type, letfun_expr.init);
        auto new_env = env.append(letfun_expr.name, fun);
        return eval(letfun_expr.body, new_env);
        }
    case expr_kind_t::If: {
        auto& if_expr = cast<if_expr_t>(*e);
        auto cond_val = eval(if_expr.cond_expr, env);
        if (cond_val->kind() != ast::expr_kind_t::Bool) {
            std::cerr << "eval error: if-condition must be boolean " + ast::to_debug_string(*cond_val) << std::endl;
            assert(false);
            return nullptr;
        } else if (cast<bool_expr_t>(*cond_val).b == true) {
            return eval(if_expr.true_expr, env);
        } {
            return eval(if_expr.false_expr, env);
        }
        }
    case expr_kind_t::Eq:  case expr_kind_t::Neq:
    case expr_kind_t::Leq:  case expr_kind_t::Geq:
    case expr_kind_t::Add: case expr_kind_t::Sub:
    case expr_kind_t::Mul: case expr_kind_t::Div:
    case expr_kind_t::And: case expr_kind_t::Or: {
            auto& binop_expr = cast<binop_expr_t>(*e);
            return calc_int_binop(
                    *eval(binop_expr.lhs, env),
                    *eval(binop_expr.rhs, env),
                    e->kind());
        }
    case expr_kind_t::Neg: {
            auto val = eval(cast<neg_expr_t>(*e).inner, env);
            return make<bool_expr_t>(!cast<bool_expr_t>(*val).b);
        }
    case expr_kind_t::Int: case expr_kind_t::Bool: case expr_kind_t::Fun:
        return e;
    case expr_kind_t::Var:
        return env.lookup(cast<var_expr_t>(*e).name);
    case expr_kind_t::App: {
            auto const& app_expr = cast<app_expr_t>(*e);
            auto f_ = eval(app_expr.f, env);
            if (f_->kind() != ast::expr_kind_t::Fun)
                throw std::logic_error{"arienai"};
            auto f = cast<fun_expr_t>(*f_);
            if (f.type.args.size() != app_expr.args.size())
                throw std::logic_error{"arienai"};
            environment_t new_env = env;
            for (size_t i=0; i<app_expr.args.size(); ++i) {
                new_env = new_env.append(
                        f.type.args[i].name,
                        eval(app_expr.args[i], env));
            }
            return eval(f.body, new_env);
        }
    case expr_kind_t::Rand: {
            auto& rand_expr = cast<rand_expr_t>(*e);
            int start = rand_expr.start;
            int end = rand_expr.end;
            return make<int_expr_t>(std::rand() % (end - start + 1) + start);
        }
    case expr_kind_t::Typed:
        return eval(cast<typed_expr_t>(*e).expr, env);
    }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x1b8, %rsp            # imm = 0x1B8
movq %rdx, %r14
movq %rsi, %r15
movq %rdi, %r13
movq (%rsi), %rdi
movq (%rdi), %rax
callq *(%rax)
movl %eax, %eax
leaq 0x3976b(%rip), %rcx     # 0x4525c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq (%r15), %rdi
leaq 0x54f6c(%rip), %rsi     # 0x60a70
leaq 0x550f5(%rip), %rdx     # 0x60c00
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d4
movq %rax, %r12
movq 0x8(%rax), %rax
movq %rax, 0x118(%rsp)
movq 0x10(%r12), %rax
movq %rax, 0x120(%rsp)
testq %rax, %rax
je 0xbb72
movq 0x5746d(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xbb6e
incl 0x8(%rax)
jmp 0xbb72
movq (%r15), %rax
movq %rax, (%r13)
xorl %eax, %eax
movq %rax, 0x8(%r13)
movq 0x8(%r15), %rcx
movq %rax, 0x8(%r15)
movq %rcx, 0x8(%r13)
movq %rax, (%r15)
jmp 0xbc34
lock
incl 0x8(%rax)
leaq 0x40(%rsp), %rdi
leaq 0x118(%rsp), %rsi
movq %r14, %rdx
callq 0xbac6
movq 0x40(%rsp), %rbx
movq 0x18(%r12), %rax
movq %rax, 0x108(%rsp)
movq 0x20(%r12), %rax
movq %rax, 0x110(%rsp)
testq %rax, %rax
je 0xbbc0
movq 0x573fe(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xbbbc
incl 0x8(%rax)
jmp 0xbbc0
lock
incl 0x8(%rax)
leaq 0x8(%rsp), %rdi
leaq 0x108(%rsp), %rsi
movq %r14, %rdx
callq 0xbac6
movq 0x8(%rsp), %r14
movq (%r15), %rdi
movq (%rdi), %rax
callq *(%rax)
movq %r13, %rdi
movq %rbx, %rsi
movq %r14, %rdx
movl %eax, %ecx
callq 0xb590
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0xbc01
callq 0xaa12
movq 0x110(%rsp), %rdi
testq %rdi, %rdi
je 0xbc13
callq 0xaa12
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0xbc22
callq 0xaa12
movq 0x120(%rsp), %rdi
testq %rdi, %rdi
je 0xbc34
callq 0xaa12
movq %r13, %rax
addq $0x1b8, %rsp            # imm = 0x1B8
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq (%r15), %rdi
leaq 0x54e1d(%rip), %rsi     # 0x60a70
leaq 0x55006(%rip), %rdx     # 0x60c60
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d4
movl 0x8(%rax), %ebp
movl 0xc(%rax), %ebx
callq 0x90a0
subl %ebp, %ebx
incl %ebx
cltd
idivl %ebx
movl %edx, %ebx
addl %ebp, %ebx
movl $0x20, %edi
callq 0x92d0
movabsq $0x100000001, %rcx      # imm = 0x100000001
movq %rcx, 0x8(%rax)
leaq 0x54e21(%rip), %rcx     # 0x60ac0
movq %rcx, (%rax)
leaq 0x10(%rax), %rcx
leaq 0x54e63(%rip), %rdx     # 0x60b10
movq %rdx, 0x10(%rax)
movl %ebx, 0x18(%rax)
movq %rcx, (%r13)
movq %rax, 0x8(%r13)
jmp 0xbc34
movq (%r15), %rdi
leaq 0x54da5(%rip), %rsi     # 0x60a70
leaq 0x54f16(%rip), %rdx     # 0x60be8
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d4
movq %rax, %rbx
movq 0x8(%rax), %rax
movq %rax, 0x148(%rsp)
movq 0x10(%rbx), %rax
movq %rax, 0x150(%rsp)
testq %rax, %rax
je 0xbf4a
movq 0x572a3(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xbf46
incl 0x8(%rax)
jmp 0xbf4a
movq (%r15), %rdi
leaq 0x54d48(%rip), %rsi     # 0x60a70
leaq 0x54f19(%rip), %rdx     # 0x60c48
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d4
movq %rax, %r12
movq 0x8(%rax), %rax
movq %rax, 0xd8(%rsp)
movq 0x10(%r12), %rax
movq %rax, 0xe0(%rsp)
testq %rax, %rax
je 0xc023
movq 0x57245(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc01f
incl 0x8(%rax)
jmp 0xc023
movq (%r15), %rdi
leaq 0x54cea(%rip), %rsi     # 0x60a70
leaq 0x54d9b(%rip), %rdx     # 0x60b28
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d4
movq %rax, %rbx
movq 0x28(%rax), %rax
movq %rax, 0x178(%rsp)
movq 0x30(%rbx), %rax
movq %rax, 0x180(%rsp)
testq %rax, %rax
je 0xc10d
movq 0x571e8(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc109
incl 0x8(%rax)
jmp 0xc10d
movq (%r15), %rdi
leaq 0x54c8d(%rip), %rsi     # 0x60a70
leaq 0x54d56(%rip), %rdx     # 0x60b40
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d4
movq %rax, %rbx
leaq 0x28(%rax), %rcx
leaq 0x78(%rax), %r8
leaq 0x10(%rsp), %rdi
movq $0x0, -0x8(%rdi)
leaq 0x8(%rsp), %r15
leaq 0x40(%rsp), %rdx
movq %r15, %rsi
callq 0xccda
leaq 0x8(%rbx), %rdx
movq (%r15), %rcx
movq 0x8(%r15), %rax
movq %rcx, 0x28(%rsp)
movq %rax, 0x30(%rsp)
testq %rax, %rax
je 0xc18a
movq 0x57167(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc186
incl 0x8(%rax)
jmp 0xc18a
movq (%r15), %rdi
leaq 0x54c0c(%rip), %rsi     # 0x60a70
leaq 0x54e0d(%rip), %rdx     # 0x60c78
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d4
movq 0x8(%rax), %rcx
movq %rcx, 0xa8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0xb0(%rsp)
testq %rax, %rax
je 0xc1ee
movq 0x5710d(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc1ea
incl 0x8(%rax)
jmp 0xc1ee
movq (%r15), %rdi
leaq 0x54bb2(%rip), %rsi     # 0x60a70
leaq 0x54d6b(%rip), %rdx     # 0x60c30
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d4
addq $0x8, %rax
movq %r13, %rdi
movq %r14, %rsi
movq %rax, %rdx
callq 0xca6a
jmp 0xbc34
movq (%r15), %rdi
leaq 0x54b7a(%rip), %rsi     # 0x60a70
leaq 0x54d1b(%rip), %rdx     # 0x60c18
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d4
movq 0x8(%rax), %rcx
movq %rcx, 0xf8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x100(%rsp)
testq %rax, %rax
je 0xc212
movq 0x5707b(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc20e
incl 0x8(%rax)
jmp 0xc212
lock
incl 0x8(%rax)
leaq 0x28(%rsp), %rdi
leaq 0x148(%rsp), %rsi
movq %r14, %rdx
callq 0xbac6
movq 0x150(%rsp), %rdi
testq %rdi, %rdi
je 0xbf71
callq 0xaa12
movq 0x28(%rsp), %rdi
movq (%rdi), %rax
callq *(%rax)
cmpl $0x12, %eax
jne 0xc5de
movq 0x28(%rsp), %rdi
leaq 0x54ae0(%rip), %rsi     # 0x60a70
leaq 0x54ae9(%rip), %rdx     # 0x60a80
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc688
cmpb $0x1, 0x8(%rax)
jne 0xbfe6
movq 0x18(%rbx), %rax
movq %rax, 0x138(%rsp)
movq 0x20(%rbx), %rax
movq %rax, 0x140(%rsp)
testq %rax, %rax
je 0xc584
movq 0x56fdb(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc580
incl 0x8(%rax)
jmp 0xc584
movq 0x28(%rbx), %rax
movq %rax, 0x128(%rsp)
movq 0x30(%rbx), %rax
movq %rax, 0x130(%rsp)
testq %rax, %rax
je 0xc5a5
movq 0x56fa2(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc5a1
incl 0x8(%rax)
jmp 0xc5a5
lock
incl 0x8(%rax)
leaq 0xe8(%rsp), %rdi
leaq 0xd8(%rsp), %rsi
movq %r14, %rdx
callq 0xbac6
movq 0xe0(%rsp), %rdi
testq %rdi, %rdi
je 0xc04d
callq 0xaa12
movq 0xe8(%rsp), %rdi
movq (%rdi), %rax
callq *(%rax)
cmpl $0x13, %eax
jne 0xc654
movq 0xe8(%rsp), %rdi
leaq 0x549fe(%rip), %rsi     # 0x60a70
leaq 0x54b57(%rip), %rdx     # 0x60bd0
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc68d
movq %rax, %rbx
leaq 0x54b25(%rip), %rax     # 0x60bb8
leaq 0x48(%rsp), %r15
movq %rax, -0x8(%r15)
leaq 0x8(%rbx), %rsi
movq %r15, %rdi
callq 0xcede
leaq 0x60(%rsp), %rdi
leaq 0x70(%rsp), %rax
movq %rax, -0x10(%rax)
movq 0x20(%rbx), %rsi
movq 0x28(%rbx), %rdx
addq %rsi, %rdx
callq 0xad30
movl 0x40(%rbx), %eax
movl %eax, 0x80(%rsp)
movq 0x48(%rbx), %rax
movq %rax, 0x88(%rsp)
movq 0x50(%rbx), %rax
movq %rax, 0x90(%rsp)
testq %rax, %rax
je 0xc311
movq 0x56eb8(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc30d
incl 0x8(%rax)
jmp 0xc311
lock
incl 0x8(%rax)
leaq 0x8(%rsp), %rdi
leaq 0x178(%rsp), %rsi
movq %r14, %rdx
callq 0xbac6
movq 0x180(%rsp), %rdi
testq %rdi, %rdi
je 0xc134
callq 0xaa12
movq %rbx, %rdx
addq $0x8, %rdx
leaq 0x40(%rsp), %rdi
leaq 0x8(%rsp), %rcx
movq %r14, %rsi
callq 0xc9ec
movq 0x38(%rbx), %rax
movq %rax, 0x168(%rsp)
movq 0x40(%rbx), %rax
movq %rax, 0x170(%rsp)
testq %rax, %rax
je 0xc2d2
movq 0x56e3b(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc2ce
incl 0x8(%rax)
jmp 0xc2d2
lock
incl 0x8(%rax)
leaq 0x40(%rsp), %rdi
leaq 0x28(%rsp), %rcx
movq %r14, %rsi
callq 0xc9ec
movq 0x30(%rsp), %rdi
testq %rdi, %rdi
je 0xc1ab
callq 0xaa12
movq 0x88(%rbx), %rax
movq %rax, 0x158(%rsp)
movq 0x90(%rbx), %rax
movq %rax, 0x160(%rsp)
testq %rax, %rax
je 0xc2af
movq 0x56dd7(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc2ab
incl 0x8(%rax)
jmp 0xc2af
lock
incl 0x8(%rax)
leaq 0xa8(%rsp), %rsi
movq %r13, %rdi
movq %r14, %rdx
callq 0xbac6
movq 0xb0(%rsp), %rdi
jmp 0xbc2a
lock
incl 0x8(%rax)
leaq 0x40(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
movq %r14, %rdx
callq 0xbac6
movq 0x100(%rsp), %rdi
testq %rdi, %rdi
je 0xc239
callq 0xaa12
movq 0x40(%rsp), %rdi
leaq 0x5482b(%rip), %rsi     # 0x60a70
leaq 0x54834(%rip), %rdx     # 0x60a80
xorl %ecx, %ecx
callq 0x9340
testq %rax, %rax
je 0xc5d9
movb 0x8(%rax), %bl
movl $0x20, %edi
callq 0x92d0
xorb $0x1, %bl
movabsq $0x100000001, %rcx      # imm = 0x100000001
movq %rcx, 0x8(%rax)
leaq 0x54727(%rip), %rcx     # 0x609a8
movq %rcx, (%rax)
movq %rax, %rcx
addq $0x10, %rcx
leaq 0x547c6(%rip), %rdx     # 0x60a58
movq %rdx, 0x10(%rax)
movb %bl, 0x18(%rax)
movq %rcx, (%r13)
movq %rax, 0x8(%r13)
movq 0x48(%rsp), %rdi
jmp 0xbc2a
lock
incl 0x8(%rax)
leaq 0x158(%rsp), %rsi
leaq 0x40(%rsp), %rdx
movq %r13, %rdi
callq 0xbac6
movq 0x160(%rsp), %rdi
jmp 0xc2ef
lock
incl 0x8(%rax)
leaq 0x168(%rsp), %rsi
leaq 0x40(%rsp), %rdx
movq %r13, %rdi
callq 0xbac6
movq 0x170(%rsp), %rdi
testq %rdi, %rdi
je 0xc2f9
callq 0xaa12
leaq 0x40(%rsp), %rdi
callq 0xcc7a
movq 0x10(%rsp), %rdi
jmp 0xbc2a
lock
incl 0x8(%rax)
movq 0x58(%rbx), %rax
movq %rax, 0x98(%rsp)
movq 0x60(%rbx), %rax
movq %rax, 0xa0(%rsp)
testq %rax, %rax
je 0xc343
movq 0x56c7b(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc33f
incl 0x8(%rax)
jmp 0xc343
lock
incl 0x8(%rax)
movq 0x50(%rsp), %rax
subq 0x48(%rsp), %rax
sarq $0x3, %rax
movabsq $0x6db6db6db6db6db7, %rcx # imm = 0x6DB6DB6DB6DB6DB7
imulq %rax, %rcx
movq 0x20(%r12), %rax
subq 0x18(%r12), %rax
sarq $0x4, %rax
cmpq %rax, %rcx
jne 0xc692
movq %r13, 0x188(%rsp)
leaq 0x8(%rsp), %rdi
movq %r14, 0x198(%rsp)
movq %r14, %rsi
callq 0xd0ca
movq 0x18(%r12), %rax
movq %r12, 0x190(%rsp)
cmpq %rax, 0x20(%r12)
je 0xc4a7
movl $0x8, %r14d
xorl %ecx, %ecx
leaq 0x1a8(%rsp), %rbx
leaq 0x28(%rsp), %r12
xorl %r13d, %r13d
movq 0x48(%rsp), %rbp
movq %rcx, 0x1a0(%rsp)
addq %rcx, %rbp
movq -0x8(%rax,%r14), %rcx
movq %rcx, 0xc8(%rsp)
movq (%rax,%r14), %rax
movq %rax, 0xd0(%rsp)
testq %rax, %rax
je 0xc406
movq 0x56bb8(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc402
incl 0x8(%rax)
jmp 0xc406
lock
incl 0x8(%rax)
movq %rbx, %rdi
leaq 0xc8(%rsp), %rsi
movq 0x198(%rsp), %rdx
callq 0xbac6
movq %r12, %rdi
leaq 0x8(%rsp), %r15
movq %r15, %rsi
movq %rbp, %rdx
movq %rbx, %rbp
movq %rbx, %rcx
callq 0xc9ec
movq %r15, %rdi
movq %r12, %rsi
callq 0xd24c
movq %r12, %rdi
callq 0xcc7a
movq 0x1b0(%rsp), %rdi
testq %rdi, %rdi
je 0xc45c
callq 0xaa12
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0xc46e
callq 0xaa12
incq %r13
movq 0x190(%rsp), %rcx
movq 0x18(%rcx), %rax
movq 0x20(%rcx), %rcx
subq %rax, %rcx
sarq $0x4, %rcx
movq 0x1a0(%rsp), %rdx
addq $0x38, %rdx
addq $0x10, %r14
cmpq %rcx, %r13
movq %rdx, %rcx
movq %rbp, %rbx
jb 0xc3c3
movq 0x98(%rsp), %rcx
movq 0xa0(%rsp), %rax
movq %rcx, 0xb8(%rsp)
movq %rax, 0xc0(%rsp)
testq %rax, %rax
movq 0x188(%rsp), %r13
leaq 0x48(%rsp), %rbx
je 0xc4ee
movq 0x56ad0(%rip), %rcx     # 0x62fb0
cmpb $0x0, (%rcx)
je 0xc4ea
incl 0x8(%rax)
jmp 0xc4ee
lock
incl 0x8(%rax)
leaq 0xb8(%rsp), %rsi
leaq 0x8(%rsp), %rdx
movq %r13, %rdi
callq 0xbac6
movq 0xc0(%rsp), %rdi
testq %rdi, %rdi
je 0xc515
callq 0xaa12
leaq 0x8(%rsp), %rdi
callq 0xcc7a
leaq 0x54692(%rip), %rax     # 0x60bb8
movq %rax, 0x40(%rsp)
movq 0xa0(%rsp), %rdi
testq %rdi, %rdi
je 0xc53d
callq 0xaa12
movq 0x90(%rsp), %rdi
testq %rdi, %rdi
je 0xc54f
callq 0xaa12
movq 0x60(%rsp), %rdi
leaq 0x70(%rsp), %rax
cmpq %rax, %rdi
je 0xc56b
movq 0x70(%rsp), %rsi
incq %rsi
callq 0x92e0
movq %rbx, %rdi
callq 0xcf76
movq 0xf0(%rsp), %rdi
jmp 0xbc2a
lock
incl 0x8(%rax)
leaq 0x138(%rsp), %rsi
movq %r13, %rdi
movq %r14, %rdx
callq 0xbac6
movq 0x140(%rsp), %rdi
jmp 0xc5c0
lock
incl 0x8(%rax)
leaq 0x128(%rsp), %rsi
movq %r13, %rdi
movq %r14, %rdx
callq 0xbac6
movq 0x130(%rsp), %rdi
testq %rdi, %rdi
je 0xc5ca
callq 0xaa12
movq 0x30(%rsp), %rdi
jmp 0xbc2a
callq 0x9530
callq 0x9530
movq 0x28(%rsp), %rsi
leaq 0x8(%rsp), %rdi
callq 0xeab5
leaq 0x38d57(%rip), %rsi     # 0x4534b
leaq 0x40(%rsp), %rdi
leaq 0x8(%rsp), %rdx
callq 0xc97c
movq 0x40(%rsp), %rsi
movq 0x48(%rsp), %rdx
movq 0x569d4(%rip), %rdi     # 0x62fe8
callq 0x9350
movq %rax, %rdi
callq 0x9140
leaq 0x40(%rsp), %rdi
callq 0x9130
leaq 0x8(%rsp), %rdi
callq 0x9130
leaq 0x3e817(%rip), %rdi     # 0x4ae53
leaq 0x38c7b(%rip), %rsi     # 0x452be
leaq 0x38d2b(%rip), %rcx     # 0x45375
movl $0x43, %edx
callq 0x91a0
movl $0x10, %edi
callq 0x9150
movq %rax, %r14
leaq 0x38d57(%rip), %rsi     # 0x453bf
movq %rax, %rdi
callq 0x93c0
movq 0x56959(%rip), %rsi     # 0x62fd0
movq 0x5692a(%rip), %rdx     # 0x62fa8
movq %r14, %rdi
callq 0x94b0
jmp 0xc6c4
callq 0x9530
callq 0x9530
movl $0x10, %edi
callq 0x9150
movq %rax, %r14
leaq 0x38d19(%rip), %rsi     # 0x453bf
movq %rax, %rdi
callq 0x93c0
movq 0x5691b(%rip), %rsi     # 0x62fd0
movq 0x568ec(%rip), %rdx     # 0x62fa8
movq %r14, %rdi
callq 0x94b0
movq %rax, %rbx
leaq 0x50(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0xc6e7
movq 0x50(%rsp), %rsi
incq %rsi
callq 0x92e0
jmp 0xc6e7
movq %rax, %rbx
leaq 0x18(%rsp), %rax
movq -0x10(%rax), %rdi
cmpq %rax, %rdi
je 0xc82e
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x92e0
jmp 0xc82e
jmp 0xc76d
movq %rax, %rbx
movq %r14, %rdi
callq 0x9200
jmp 0xc885
movq %rax, %rbx
movq 0x130(%rsp), %rdi
jmp 0xc735
movq %rax, %rbx
movq 0x140(%rsp), %rdi
testq %rdi, %rdi
je 0xc82e
callq 0xaa12
jmp 0xc82e
movq %rax, %rbx
movq %r14, %rdi
callq 0x9200
jmp 0xc88f
jmp 0xc82b
movq %rax, %rbx
movq 0xc0(%rsp), %rdi
jmp 0xc871
movq %rax, %rbx
jmp 0xc885
movq %rax, %rbx
movq %r15, %rdi
callq 0xcf76
jmp 0xc88f
movq %rax, %rbx
movq 0x170(%rsp), %rdi
jmp 0xc79d
movq %rax, %rbx
movq 0x160(%rsp), %rdi
testq %rdi, %rdi
je 0xc7a7
callq 0xaa12
leaq 0x40(%rsp), %rdi
callq 0xcc7a
jmp 0xc7ea
movq %rax, %rbx
jmp 0xc7ea
movq %rax, %rbx
movq 0x100(%rsp), %rdi
jmp 0xc8d4
movq %rax, %rbx
movq 0xb0(%rsp), %rdi
jmp 0xc8d4
movq %rax, %rbx
movq 0x30(%rsp), %rdi
testq %rdi, %rdi
je 0xc7ea
callq 0xaa12
movq 0x10(%rsp), %rdi
jmp 0xc8d4
movq %rax, %rbx
movq 0x180(%rsp), %rdi
jmp 0xc8d4
movq %rax, %rbx
movq 0xe0(%rsp), %rdi
jmp 0xc8d4
movq %rax, %rbx
movq 0x150(%rsp), %rdi
jmp 0xc8d4
jmp 0xc826
movq %rax, %rbx
jmp 0xc88f
movq %rax, %rbx
movq 0x30(%rsp), %rdi
jmp 0xc8d4
movq %rax, %rbx
movq 0x48(%rsp), %rdi
jmp 0xc8d4
movq %rax, %rbx
jmp 0xc8ab
movq %rax, %rbx
jmp 0xc8cc
movq %rax, %rbx
jmp 0xc869
movq %rax, %rbx
movq 0x1b0(%rsp), %rdi
testq %rdi, %rdi
je 0xc869
callq 0xaa12
movq 0xd0(%rsp), %rdi
testq %rdi, %rdi
je 0xc87b
callq 0xaa12
leaq 0x8(%rsp), %rdi
callq 0xcc7a
leaq 0x40(%rsp), %rdi
callq 0xcb30
movq 0xf0(%rsp), %rdi
jmp 0xc8d4
movq %rax, %rbx
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0xc8ab
callq 0xaa12
movq 0x110(%rsp), %rdi
testq %rdi, %rdi
je 0xc8bd
callq 0xaa12
movq 0x48(%rsp), %rdi
testq %rdi, %rdi
je 0xc8cc
callq 0xaa12
movq 0x120(%rsp), %rdi
testq %rdi, %rdi
je 0xc8de
callq 0xaa12
movq %rbx, %rdi
callq 0x94e0