// File: dechimal[P]TaggedUnion/test_sum.cpp
// Function: main
int main() {
    {
        // construct, assign, exception safety
        sum<int, double, hoge, hoge> a(_1, 10.0);
        assert(a.get(_1) == 10.0);
        auto b = a;
        assert(b.get(_1) == 10.0);
        a = { _0, 5 };
        assert(a.get(_0) == 5);
        a = { _2, hoge{42} };
        a.get(_2).b = true;
        try {
            b = a;
            assert(false);
        } catch (int) {
            assert(b.get(_1) == 10.0);
        }
        a.get(_2).b = false;
        a = { _3, hoge{24} };
        assert(a.get(_3).x == 24);
        try {
            b = { _2, hoge{36} };
            assert(b.get(_2).x == 36);
            b.get(_2).b = true;
            a = b;
            assert(false);
        } catch (int) {
            assert(a.get(_0) == 0);
        }
    }
    {
        // strong guarantee without fallback type
        sum<hoge, hoge> a(_0, hoge{42});
        sum<hoge, hoge> b(_1, hoge{24});
        b.get(_1).b = true;
        try {
            a = b;
            assert(false);
        } catch (int) {
            assert(a.get(_0).x == 42);
        }
    }
    {
        // equality
        sum<int, hoge> a(_0, 42);
        sum<int, hoge> b(_1, hoge{42});
        assert(a != b);
        a = { _1, hoge{42} };
        assert(a == b);
    }
    {
        // strong guarantee without nothrow constructible type
        sum<hoge, hoge> a(_0, hoge{42});
        sum<hoge, hoge> b(_1, hoge{42});
        b.get(_1).b = true;
        try {
            a = b;
            assert(false);
        } catch (int) {
            assert(a.get(_0) == b.get(_1));
        }
    }
    {
        // less
        sum<int, double> a(_0, 42);
        sum<int, double> b(_1, 10.0);
        assert(a < b);
    }
    {
        // move
        sum<int, std::vector<int>> a(_0, 10);
        sum<int, std::vector<int>> b(_1, {1, 2, 3});
        a = std::move(b);
        auto & v1 = a.get(_1);
        auto v2 = {1, 2, 3};
        assert(std::equal(v1.begin(), v1.end(), v2.begin(), v2.end()));
        auto & v3 = b.get(_1);
        assert(v3.empty());
    }
    {
        // recursive type using class member
        struct leaf {};
        struct node {
            node(int x, leaf l, leaf r) : x(x), l(_0, l), r(_0, r) {}
            node(int x, node l, leaf r) : x(x), l(_1, l), r(_0, r) {}
            node(int x, leaf l, node r) : x(x), l(_0, l), r(_1, r) {}
            node(int x, node l, node r) : x(x), l(_1, l), r(_1, r) {}
            int x;
            sum<leaf, rec_guard<node>> l; // rec_guard<T> prevent cyclic class definition.
            sum<leaf, rec_guard<node>> r;
        };
        node n(1,
               leaf{},
               node(2,
                    node(3,
                         leaf{},
                         leaf{}),
                    node(4,
                         node(5,
                              leaf{},
                              leaf{}),
                         leaf{})));
        auto g = ::fix(::tie(
            [] (auto, tag<0>, leaf) {
                return 0;
            }, [] (auto f, tag<1>, node const & n) -> int {
                return n.x + n.l.when(f) + n.r.when(f);
            }));
        assert(n.x + n.l.when(g) + n.r.when(g) == 15);
    }
    {
        // direct recursive type
        struct leaf {};
        using node = sum<leaf, std::tuple<int, _, _>>;
        auto make_leaf = [] () { return node(_0, leaf{}); };
        auto make_node = [] (int v, node l, node r) {
                return node(_1, std::make_tuple(v, std::move(l), std::move(r)));
            };
        auto n = make_node(1,
                           make_leaf(),
                           make_node(2,
                                     make_node(3,
                                               make_leaf(),
                                               make_leaf()),
                                     make_node(4,
                                               make_node(5,
                                                         make_leaf(),
                                                         make_leaf()),
                                               make_leaf())));
        auto g = ::fix(::tie(
            [] (auto, tag<0>, leaf) {
                return 0;
            }, [] (auto f, tag<1>, std::tuple<int, node, node> const & tup) -> int {
                return std::get<0>(tup) + std::get<1>(tup).when(f) + std::get<2>(tup).when(f);
            }));
        assert(n.when(g) == 15);
    }
    {
        // recursion with nest
        using u1 = sum<int, _>;
        using u2 = sum<_, u1, char>;
        static_assert(std::is_same<decltype(std::declval<u1&>().get(_1)), u1&>::value, "failed at recursion type 1");
        static_assert(std::is_same<decltype(std::declval<u2&>().get(_0)), u2&>::value, "failed at recursion type 2");
        u2 x = u2(_1, u1(_1, u1(_0, 42)));
        assert(x.get(_1).get(_1).get(_0) == 42);
    }
    {
        // fallback type in recursion type
        using u = sum<std::tuple<_>, char>;
        u x(_1, 'a');
        assert(x == x);
    }
    {
        // recursion with nested and outer placeholder
        using u = sum<sum<_, rec<1>, char>, int>;
        static_assert(std::is_same<decltype(std::declval<u&>().get(_0)), sum<_, u, char>&>::value, "failed at recursion with nested and outer placeholder 1");
        static_assert(std::is_same<decltype(std::declval<u&>().get(_0).get(_1)), u&>::value, "failed at recursion with nested and outer placeholder 2");
        u a(_1, 42);
        u b(_0, { _0, { _2, 'a' } });
        u c(_0, { _1, { _1, 42 } });
        u d(_0, { _2, 'a' });
        assert(a == c.get(_0).get(_1));
        assert(b.get(_0).get(_0) == d.get(_0));
        a = { _0, { _1, d } };
        assert(a.get(_0).get(_1).get(_0) == b.get(_0).get(_0));
    }
    {
        // implicit conversions
        struct unit {
            bool operator==(unit) const { return true; }
        };
        using ilist = sum<unit, std::tuple<int, _>>;
        using clist = sum<unit, std::tuple<char, _>>;

        ilist xs(_1, std::make_tuple(42, ilist(_0)));
        clist ys(_1, std::make_tuple(42, clist(_0)));
        assert(xs == ys);
    }
    {
        // recursion with non-type parameter using traits
        // (traits of std::array is already defined in this implementation)
        using ternary_tree = sum<int, std::array<_, 3>>;
        auto n = ternary_tree(_1, {{{_0, 1}, {_0, 2}, {_0, 3}}});
        n.when(::tie(
            [] (tag<0>, int) {
                assert(false);
            },
            [] (tag<1>, std::array<ternary_tree, 3> const & ar) {
                assert(ar[0].get(_0) == 1 && ar[1].get(_0) == 2 && ar[2].get(_0) == 3);
            }));
        // Following is also OK (same with above).
        n.when(
            [] (tag<0>, int) {
                assert(false);
            },
            [] (tag<1>, std::array<ternary_tree, 3> const & ar) {
                assert(ar[0].get(_0) == 1 && ar[1].get(_0) == 2 && ar[2].get(_0) == 3);
            });
    }
    {
        // recursion with non-type parameter (ad-hoc way)
        using type = type_fun<make_non_type_parameter_template<_, 2, int>>;
        using u = sum<rec_guard<type>, int>;
        // print<decltype(std::declval<u>().get(_0))>;
        u x(_1, 42);
        using expected = non_type_parameter_template<u, 2, int>;
        static_assert(std::is_same<decltype(std::declval<u>().get(_0)), expected &&>::value, "failed at recursion with non-type parameter (ad-hoc way)");
    }
    {
        // return type deduction of dispatch/when member function
        using u = sum<int, int, int, int>;
        struct hogera{};
        struct piyo{ piyo()=default; piyo(hogera){} };
        struct fuga{ fuga()=default; fuga(piyo){} };
        struct hoge{ hoge()=default; hoge(fuga){} };

        u x(_0, {});
        x.dispatch(::tie([] (tag<0>) {
            return hoge{};
        }, [] (tag<1>) {
            return fuga{};
        }, [] (tag<2>) {
            return piyo{};
        }, [] (tag<3>) {
            return hogera{};
        }));
    }
    {
        // extension
        using u = sum<int, int>;
        auto x = u(_0, 42);
        auto y = ::extend<tag<1>, char, tag<0>>(x);
        static_assert(std::is_same<decltype(y), sum<int, char, int>>::value, "failed at extension");
        assert(y.which() == 2 && y.get(_2) == 42);
        auto z = ::extend_right<short>(x);
        static_assert(std::is_same<decltype(z), sum<short, int, int>>::value, "failed at extension");
        assert(z.which() == 1 && z.get(_1) == 42);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x960, %rsp            # imm = 0x960
movl $0x0, -0x4(%rbp)
movabsq $0x4024000000000000, %rax # imm = 0x4024000000000000
movq %rax, -0x28(%rbp)
leaq -0x18(%rbp), %rdi
movq %rdi, -0x788(%rbp)
leaq -0x28(%rbp), %rsi
callq 0xa7c0
movq -0x788(%rbp), %rdi
callq 0xa7f0
movq %rax, -0x780(%rbp)
jmp 0x3299
movq -0x780(%rbp), %rax
movsd (%rax), %xmm0
movsd 0x17d5c(%rip), %xmm1    # 0x1b008
ucomisd %xmm1, %xmm0
jne 0x32b6
jp 0x32b6
jmp 0x32e6
leaq 0x17d59(%rip), %rdi     # 0x1b016
leaq 0x17d64(%rip), %rsi     # 0x1b028
movl $0x46, %edx
leaq 0x17d65(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x3812
leaq -0x50(%rbp), %rdi
leaq -0x18(%rbp), %rsi
callq 0xa810
jmp 0x32f5
leaq -0x50(%rbp), %rdi
callq 0xa7f0
movq %rax, -0x790(%rbp)
jmp 0x3307
movq -0x790(%rbp), %rax
movsd (%rax), %xmm0
movsd 0x17cee(%rip), %xmm1    # 0x1b008
ucomisd %xmm1, %xmm0
jne 0x3324
jp 0x3324
jmp 0x3354
leaq 0x17d15(%rip), %rdi     # 0x1b040
leaq 0x17cf6(%rip), %rsi     # 0x1b028
movl $0x48, %edx
leaq 0x17cf7(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x3809
movl $0x5, -0x70(%rbp)
leaq -0x68(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0xa850
jmp 0x336a
leaq -0x18(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0xa880
jmp 0x3379
leaq -0x68(%rbp), %rdi
callq 0xa8b0
leaq -0x18(%rbp), %rdi
callq 0xa8e0
movq %rax, -0x798(%rbp)
jmp 0x3394
movq -0x798(%rbp), %rax
cmpl $0x5, (%rax)
jne 0x33a2
jmp 0x33db
leaq 0x17ca9(%rip), %rdi     # 0x1b052
leaq 0x17c78(%rip), %rsi     # 0x1b028
movl $0x4a, %edx
leaq 0x17c79(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x68(%rbp), %rdi
callq 0xa8b0
jmp 0x3809
leaq -0x94(%rbp), %rdi
movl $0x2a, %esi
callq 0xa900
jmp 0x33ee
leaq -0x88(%rbp), %rdi
leaq -0x94(%rbp), %rsi
callq 0xa920
jmp 0x3403
leaq -0x18(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0xa880
jmp 0x3415
leaq -0x88(%rbp), %rdi
callq 0xa8b0
leaq -0x18(%rbp), %rdi
callq 0xa950
movq %rax, -0x7a0(%rbp)
jmp 0x3433
movq -0x7a0(%rbp), %rax
movb $0x1, (%rax)
leaq -0x50(%rbp), %rdi
leaq -0x18(%rbp), %rsi
callq 0xa970
jmp 0x344c
leaq 0x17c0e(%rip), %rdi     # 0x1b061
leaq 0x17bce(%rip), %rsi     # 0x1b028
movl $0x4f, %edx
leaq 0x17bcf(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x88(%rbp), %rdi
callq 0xa8b0
jmp 0x3809
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
movl $0x1, %ecx
cmpl %ecx, %eax
jne 0x3809
movq -0x38(%rbp), %rdi
callq 0x3060
movl (%rax), %eax
movl %eax, -0x9c(%rbp)
leaq -0x50(%rbp), %rdi
callq 0xa7f0
movq %rax, -0x7a8(%rbp)
jmp 0x34c7
movq -0x7a8(%rbp), %rax
movsd (%rax), %xmm0
movsd 0x17b2e(%rip), %xmm1    # 0x1b008
ucomisd %xmm1, %xmm0
jne 0x34e4
jp 0x34e4
jmp 0x3519
leaq 0x17b55(%rip), %rdi     # 0x1b040
leaq 0x17b36(%rip), %rsi     # 0x1b028
movl $0x51, %edx
leaq 0x17b37(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
callq 0x3120
jmp 0x3809
callq 0x3120
leaq -0x18(%rbp), %rdi
callq 0xa950
movq %rax, -0x7b0(%rbp)
jmp 0x3530
movq -0x7b0(%rbp), %rax
movb $0x0, (%rax)
leaq -0xbc(%rbp), %rdi
movl $0x18, %esi
callq 0xa900
jmp 0x354d
leaq -0xb0(%rbp), %rdi
leaq -0xbc(%rbp), %rsi
callq 0xa9a0
jmp 0x3562
leaq -0x18(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0xa880
jmp 0x3574
leaq -0xb0(%rbp), %rdi
callq 0xa8b0
leaq -0x18(%rbp), %rdi
callq 0xa9d0
movq %rax, -0x7b8(%rbp)
jmp 0x3592
movq -0x7b8(%rbp), %rax
cmpl $0x18, 0x4(%rax)
jne 0x35a1
jmp 0x35dd
leaq 0x17abf(%rip), %rdi     # 0x1b067
leaq 0x17a79(%rip), %rsi     # 0x1b028
movl $0x55, %edx
leaq 0x17a7a(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0xa8b0
jmp 0x3809
leaq -0xdc(%rbp), %rdi
movl $0x24, %esi
callq 0xa900
jmp 0x35f0
leaq -0xd0(%rbp), %rdi
leaq -0xdc(%rbp), %rsi
callq 0xa920
jmp 0x3605
leaq -0x50(%rbp), %rdi
leaq -0xd0(%rbp), %rsi
callq 0xa880
jmp 0x3617
leaq -0xd0(%rbp), %rdi
callq 0xa8b0
leaq -0x50(%rbp), %rdi
callq 0xa950
movq %rax, -0x7c0(%rbp)
jmp 0x3635
movq -0x7c0(%rbp), %rax
cmpl $0x24, 0x4(%rax)
jne 0x3647
jmp 0x36ec
leaq 0x17a2b(%rip), %rdi     # 0x1b079
leaq 0x179d3(%rip), %rsi     # 0x1b028
movl $0x58, %edx
leaq 0x179d4(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x368c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0xd0(%rbp), %rdi
callq 0xa8b0
movl -0x3c(%rbp), %eax
movl $0x1, %ecx
cmpl %ecx, %eax
jne 0x3809
movq -0x38(%rbp), %rdi
callq 0x3060
movl (%rax), %eax
movl %eax, -0xe4(%rbp)
leaq -0x18(%rbp), %rdi
callq 0xa8e0
movq %rax, -0x7c8(%rbp)
jmp 0x36bf
movq -0x7c8(%rbp), %rax
cmpl $0x0, (%rax)
jne 0x36cd
jmp 0x374c
leaq 0x179b7(%rip), %rdi     # 0x1b08b
leaq 0x1794d(%rip), %rsi     # 0x1b028
movl $0x5d, %edx
leaq 0x1794e(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x50(%rbp), %rdi
callq 0xa950
movq %rax, -0x7d0(%rbp)
jmp 0x36fe
movq -0x7d0(%rbp), %rax
movb $0x1, (%rax)
leaq -0x18(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0xa970
jmp 0x3717
leaq 0x17943(%rip), %rdi     # 0x1b061
leaq 0x17903(%rip), %rsi     # 0x1b028
movl $0x5b, %edx
leaq 0x17904(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
callq 0x3120
jmp 0x3809
callq 0x3120
leaq -0x50(%rbp), %rdi
callq 0xa8b0
leaq -0x18(%rbp), %rdi
callq 0xa8b0
leaq -0x104(%rbp), %rdi
movq %rdi, -0x7d8(%rbp)
movl $0x2a, %esi
callq 0xa900
movq -0x7d8(%rbp), %rsi
leaq -0xf8(%rbp), %rdi
callq 0xa9f0
leaq -0x124(%rbp), %rdi
movl $0x18, %esi
callq 0xa900
jmp 0x37a1
leaq -0x118(%rbp), %rdi
leaq -0x124(%rbp), %rsi
callq 0xaa20
jmp 0x37b6
leaq -0x118(%rbp), %rdi
callq 0xaa50
movq %rax, -0x7e0(%rbp)
jmp 0x37cb
movq -0x7e0(%rbp), %rax
movb $0x1, (%rax)
leaq -0xf8(%rbp), %rdi
leaq -0x118(%rbp), %rsi
callq 0xaa70
jmp 0x37ea
leaq 0x17870(%rip), %rdi     # 0x1b061
leaq 0x17830(%rip), %rsi     # 0x1b028
movl $0x67, %edx
leaq 0x17831(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x50(%rbp), %rdi
callq 0xa8b0
leaq -0x18(%rbp), %rdi
callq 0xa8b0
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x397e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x3972
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
movl $0x1, %ecx
cmpl %ecx, %eax
jne 0x3972
movq -0x38(%rbp), %rdi
callq 0x3060
movl (%rax), %eax
movl %eax, -0x12c(%rbp)
leaq -0xf8(%rbp), %rdi
callq 0xaaa0
movq %rax, -0x7e8(%rbp)
jmp 0x3884
movq -0x7e8(%rbp), %rax
cmpl $0x2a, 0x4(%rax)
jne 0x3893
jmp 0x38c8
leaq 0x17800(%rip), %rdi     # 0x1b09a
leaq 0x17787(%rip), %rsi     # 0x1b028
movl $0x69, %edx
leaq 0x17788(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
callq 0x3120
jmp 0x3972
callq 0x3120
leaq -0x118(%rbp), %rdi
callq 0xaac0
leaq -0xf8(%rbp), %rdi
callq 0xaac0
movl $0x2a, -0x144(%rbp)
leaq -0x13c(%rbp), %rdi
leaq -0x144(%rbp), %rsi
callq 0xaaf0
leaq -0x15c(%rbp), %rdi
movl $0x2a, %esi
callq 0xa900
jmp 0x3915
leaq -0x150(%rbp), %rdi
leaq -0x15c(%rbp), %rsi
callq 0xab20
jmp 0x392a
leaq -0x13c(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0xab50
movb %al, -0x7e9(%rbp)
jmp 0x3945
movb -0x7e9(%rbp), %al
testb $0x1, %al
jne 0x3951
jmp 0x3953
jmp 0x39b1
leaq 0x17752(%rip), %rdi     # 0x1b0ac
leaq 0x176c7(%rip), %rsi     # 0x1b028
movl $0x70, %edx
leaq 0x176c8(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x118(%rbp), %rdi
callq 0xaac0
leaq -0xf8(%rbp), %rdi
callq 0xaac0
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x3b30
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x3b24
leaq -0x174(%rbp), %rdi
movl $0x2a, %esi
callq 0xa900
jmp 0x39c4
leaq -0x168(%rbp), %rdi
leaq -0x174(%rbp), %rsi
callq 0xab20
jmp 0x39d9
leaq -0x13c(%rbp), %rdi
leaq -0x168(%rbp), %rsi
callq 0xab80
jmp 0x39ee
leaq -0x168(%rbp), %rdi
callq 0xabb0
leaq -0x13c(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0xabe0
movb %al, -0x7ea(%rbp)
jmp 0x3a15
movb -0x7ea(%rbp), %al
testb $0x1, %al
jne 0x3a21
jmp 0x3a23
jmp 0x3a5f
leaq 0x17689(%rip), %rdi     # 0x1b0b3
leaq 0x175f7(%rip), %rsi     # 0x1b028
movl $0x72, %edx
leaq 0x175f8(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x168(%rbp), %rdi
callq 0xabb0
jmp 0x3b24
leaq -0x150(%rbp), %rdi
callq 0xabb0
leaq -0x13c(%rbp), %rdi
callq 0xabb0
leaq -0x194(%rbp), %rdi
movq %rdi, -0x7f8(%rbp)
movl $0x2a, %esi
movl %esi, -0x7f0(%rbp)
callq 0xa900
movq -0x7f8(%rbp), %rsi
leaq -0x188(%rbp), %rdi
callq 0xa9f0
movl -0x7f0(%rbp), %esi
leaq -0x1b4(%rbp), %rdi
callq 0xa900
jmp 0x3abc
leaq -0x1a8(%rbp), %rdi
leaq -0x1b4(%rbp), %rsi
callq 0xaa20
jmp 0x3ad1
leaq -0x1a8(%rbp), %rdi
callq 0xaa50
movq %rax, -0x800(%rbp)
jmp 0x3ae6
movq -0x800(%rbp), %rax
movb $0x1, (%rax)
leaq -0x188(%rbp), %rdi
leaq -0x1a8(%rbp), %rsi
callq 0xaa70
jmp 0x3b05
leaq 0x17555(%rip), %rdi     # 0x1b061
leaq 0x17515(%rip), %rsi     # 0x1b028
movl $0x7b, %edx
leaq 0x17516(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x150(%rbp), %rdi
callq 0xabb0
leaq -0x13c(%rbp), %rdi
callq 0xabb0
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x3ccc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x3cc0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
movl $0x1, %ecx
cmpl %ecx, %eax
jne 0x3cc0
movq -0x38(%rbp), %rdi
callq 0x3060
movl (%rax), %eax
movl %eax, -0x1bc(%rbp)
leaq -0x188(%rbp), %rdi
callq 0xaaa0
movq %rax, -0x808(%rbp)
jmp 0x3ba5
leaq -0x1a8(%rbp), %rdi
callq 0xaa50
movq %rax, -0x810(%rbp)
jmp 0x3bba
movq -0x810(%rbp), %rsi
movq -0x808(%rbp), %rdi
callq 0xac50
movb %al, -0x811(%rbp)
jmp 0x3bd5
movb -0x811(%rbp), %al
testb $0x1, %al
jne 0x3be1
jmp 0x3be3
jmp 0x3c18
leaq 0x174d0(%rip), %rdi     # 0x1b0ba
leaq 0x17437(%rip), %rsi     # 0x1b028
movl $0x7d, %edx
leaq 0x17438(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
callq 0x3120
jmp 0x3cc0
callq 0x3120
leaq -0x1a8(%rbp), %rdi
callq 0xaac0
leaq -0x188(%rbp), %rdi
callq 0xaac0
movl $0x2a, -0x1d8(%rbp)
leaq -0x1d0(%rbp), %rdi
leaq -0x1d8(%rbp), %rsi
callq 0xac80
movabsq $0x4024000000000000, %rax # imm = 0x4024000000000000
movq %rax, -0x1f8(%rbp)
leaq -0x1e8(%rbp), %rdi
leaq -0x1f8(%rbp), %rsi
callq 0xacb0
jmp 0x3c78
leaq -0x1d0(%rbp), %rdi
leaq -0x1e8(%rbp), %rsi
callq 0xace0
movb %al, -0x812(%rbp)
jmp 0x3c93
movb -0x812(%rbp), %al
testb $0x1, %al
jne 0x3c9f
jmp 0x3ca1
jmp 0x3d0b
leaq 0x17429(%rip), %rdi     # 0x1b0d1
leaq 0x17379(%rip), %rsi     # 0x1b028
movl $0x84, %edx
leaq 0x1737a(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x1a8(%rbp), %rdi
callq 0xaac0
leaq -0x188(%rbp), %rdi
callq 0xaac0
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x3eea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x1e8(%rbp), %rdi
callq 0xad70
jmp 0x3eea
leaq -0x1e8(%rbp), %rdi
callq 0xad70
leaq -0x1d0(%rbp), %rdi
callq 0xad70
movl $0xa, -0x220(%rbp)
leaq -0x218(%rbp), %rdi
leaq -0x220(%rbp), %rsi
callq 0xada0
movl $0x1, -0x27c(%rbp)
movl $0x2, -0x278(%rbp)
movl $0x3, -0x274(%rbp)
leaq -0x27c(%rbp), %rax
movq %rax, -0x270(%rbp)
movq $0x3, -0x268(%rbp)
leaq -0x27d(%rbp), %rdi
movq %rdi, -0x820(%rbp)
callq 0xadd0
movq -0x820(%rbp), %rcx
movq -0x270(%rbp), %rsi
movq -0x268(%rbp), %rdx
leaq -0x260(%rbp), %rdi
callq 0xadf0
jmp 0x3dad
leaq -0x240(%rbp), %rdi
leaq -0x260(%rbp), %rsi
callq 0xae70
jmp 0x3dc2
leaq -0x260(%rbp), %rdi
callq 0xaea0
leaq -0x27d(%rbp), %rdi
callq 0xaf00
leaq -0x218(%rbp), %rdi
leaq -0x240(%rbp), %rsi
callq 0xaf10
jmp 0x3def
leaq -0x218(%rbp), %rdi
callq 0xaf40
movq %rax, -0x828(%rbp)
jmp 0x3e04
movq -0x828(%rbp), %rax
movq %rax, -0x288(%rbp)
movl $0x1, -0x2ac(%rbp)
movl $0x2, -0x2a8(%rbp)
movl $0x3, -0x2a4(%rbp)
leaq -0x2ac(%rbp), %rax
movq %rax, -0x2a0(%rbp)
movq $0x3, -0x298(%rbp)
movq -0x288(%rbp), %rdi
callq 0xafb0
movq %rax, -0x2b8(%rbp)
movq -0x288(%rbp), %rdi
callq 0xafe0
movq %rax, -0x2c0(%rbp)
leaq -0x2a0(%rbp), %rdi
movq %rdi, -0x840(%rbp)
callq 0xb010
movq -0x840(%rbp), %rdi
movq %rax, -0x838(%rbp)
callq 0xb030
movq -0x838(%rbp), %rdx
movq %rax, %rcx
movq -0x2b8(%rbp), %rdi
movq -0x2c0(%rbp), %rsi
callq 0xaf60
movb %al, -0x829(%rbp)
jmp 0x3eba
movb -0x829(%rbp), %al
testb $0x1, %al
jne 0x3ec6
jmp 0x3ecb
jmp 0x3f4f
leaq 0x17205(%rip), %rdi     # 0x1b0d7
leaq 0x1714f(%rip), %rsi     # 0x1b028
movl $0x8d, %edx
leaq 0x17150(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x1d0(%rbp), %rdi
callq 0xad70
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x3f21
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x260(%rbp), %rdi
callq 0xaea0
leaq -0x27d(%rbp), %rdi
callq 0xaf00
jmp 0x412e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x240(%rbp), %rdi
callq 0xb0b0
jmp 0x412e
leaq -0x240(%rbp), %rdi
callq 0xaf40
movq %rax, -0x848(%rbp)
jmp 0x3f64
movq -0x848(%rbp), %rax
movq %rax, -0x2c8(%rbp)
movq -0x2c8(%rbp), %rdi
callq 0xb070
testb $0x1, %al
jne 0x3f84
jmp 0x3f86
jmp 0x3fa5
leaq 0x17181(%rip), %rdi     # 0x1b10e
leaq 0x17094(%rip), %rsi     # 0x1b028
movl $0x8f, %edx
leaq 0x17095(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x240(%rbp), %rdi
callq 0xb0b0
leaq -0x218(%rbp), %rdi
callq 0xb0b0
leaq -0x350(%rbp), %rdi
movl $0x3, %esi
callq 0x5170
leaq -0x3a8(%rbp), %rdi
movl $0x5, %esi
callq 0x5170
jmp 0x3fe1
leaq -0x380(%rbp), %rdi
movl $0x4, %esi
leaq -0x3a8(%rbp), %rdx
callq 0x51e0
jmp 0x3ffb
leaq -0x328(%rbp), %rdi
movl $0x2, %esi
leaq -0x350(%rbp), %rdx
leaq -0x380(%rbp), %rcx
callq 0x5250
jmp 0x401c
leaq -0x2f8(%rbp), %rdi
movl $0x1, %esi
leaq -0x328(%rbp), %rdx
callq 0x52d0
jmp 0x4036
leaq -0x328(%rbp), %rdi
callq 0x5340
leaq -0x380(%rbp), %rdi
callq 0x5340
leaq -0x3a8(%rbp), %rdi
callq 0x5340
leaq -0x350(%rbp), %rdi
callq 0x5340
leaq -0x3ad(%rbp), %rdi
callq 0x53a0
jmp 0x4074
leaq -0x3ac(%rbp), %rdi
leaq -0x3ad(%rbp), %rsi
callq 0x5370
jmp 0x4089
movl -0x2f8(%rbp), %eax
movl %eax, -0x850(%rbp)
leaq -0x2f0(%rbp), %rdi
movb -0x3ac(%rbp), %al
movb %al, -0x3b0(%rbp)
leaq -0x3b0(%rbp), %rsi
callq 0x53d0
movl %eax, -0x84c(%rbp)
jmp 0x40bc
movl -0x84c(%rbp), %ecx
movl -0x850(%rbp), %eax
addl %ecx, %eax
movl %eax, -0x858(%rbp)
leaq -0x2e0(%rbp), %rdi
movb -0x3ac(%rbp), %al
movb %al, -0x3b1(%rbp)
leaq -0x3b1(%rbp), %rsi
callq 0x53d0
movl %eax, -0x854(%rbp)
jmp 0x40f7
movl -0x854(%rbp), %ecx
movl -0x858(%rbp), %eax
addl %ecx, %eax
cmpl $0xf, %eax
jne 0x410f
jmp 0x41c7
leaq 0x17003(%rip), %rdi     # 0x1b119
leaq 0x16f0b(%rip), %rsi     # 0x1b028
movl $0xae, %edx
leaq 0x16f0c(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x218(%rbp), %rdi
callq 0xb0b0
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4199
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x418d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4181
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x328(%rbp), %rdi
callq 0x5340
leaq -0x380(%rbp), %rdi
callq 0x5340
leaq -0x3a8(%rbp), %rdi
callq 0x5340
leaq -0x350(%rbp), %rdi
callq 0x5340
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x2f8(%rbp), %rdi
callq 0x5340
jmp 0x5162
leaq -0x2f8(%rbp), %rdi
callq 0x5340
movb $0x0, -0x3b2(%rbp)
movb $0x0, -0x3b3(%rbp)
leaq -0x3d8(%rbp), %rdi
leaq -0x3b2(%rbp), %rsi
movq %rsi, -0x860(%rbp)
callq 0x54a0
movq -0x860(%rbp), %rsi
leaq -0x408(%rbp), %rdi
callq 0x54a0
jmp 0x4210
leaq -0x418(%rbp), %rdi
leaq -0x3b2(%rbp), %rsi
callq 0x54a0
jmp 0x4225
leaq -0x3f8(%rbp), %rdi
leaq -0x3b3(%rbp), %rsi
movl $0x3, %edx
leaq -0x408(%rbp), %rcx
leaq -0x418(%rbp), %r8
callq 0x5400
jmp 0x424d
leaq -0x448(%rbp), %rdi
leaq -0x3b2(%rbp), %rsi
callq 0x54a0
jmp 0x4262
leaq -0x458(%rbp), %rdi
leaq -0x3b2(%rbp), %rsi
callq 0x54a0
jmp 0x4277
leaq -0x438(%rbp), %rdi
leaq -0x3b3(%rbp), %rsi
movl $0x5, %edx
leaq -0x448(%rbp), %rcx
leaq -0x458(%rbp), %r8
callq 0x5400
jmp 0x429f
leaq -0x468(%rbp), %rdi
leaq -0x3b2(%rbp), %rsi
callq 0x54a0
jmp 0x42b4
leaq -0x428(%rbp), %rdi
leaq -0x3b3(%rbp), %rsi
movl $0x4, %edx
leaq -0x438(%rbp), %rcx
leaq -0x468(%rbp), %r8
callq 0x5400
jmp 0x42dc
leaq -0x3e8(%rbp), %rdi
leaq -0x3b3(%rbp), %rsi
movl $0x2, %edx
leaq -0x3f8(%rbp), %rcx
leaq -0x428(%rbp), %r8
callq 0x5400
jmp 0x4304
leaq -0x3c8(%rbp), %rdi
leaq -0x3b3(%rbp), %rsi
movl $0x1, %edx
leaq -0x3d8(%rbp), %rcx
leaq -0x3e8(%rbp), %r8
callq 0x5400
jmp 0x432c
leaq -0x3e8(%rbp), %rdi
callq 0x54d0
leaq -0x428(%rbp), %rdi
callq 0x54d0
leaq -0x468(%rbp), %rdi
callq 0x54d0
leaq -0x438(%rbp), %rdi
callq 0x54d0
leaq -0x458(%rbp), %rdi
callq 0x54d0
leaq -0x448(%rbp), %rdi
callq 0x54d0
leaq -0x3f8(%rbp), %rdi
callq 0x54d0
leaq -0x418(%rbp), %rdi
callq 0x54d0
leaq -0x408(%rbp), %rdi
callq 0x54d0
leaq -0x3d8(%rbp), %rdi
callq 0x54d0
leaq -0x46a(%rbp), %rdi
callq 0x5530
jmp 0x43b2
leaq -0x469(%rbp), %rdi
leaq -0x46a(%rbp), %rsi
callq 0x5500
jmp 0x43c7
movb -0x469(%rbp), %al
movb %al, -0x46d(%rbp)
leaq -0x3c8(%rbp), %rdi
leaq -0x46d(%rbp), %rsi
callq 0x5560
movl %eax, -0x864(%rbp)
jmp 0x43ee
movl -0x864(%rbp), %eax
cmpl $0xf, %eax
jne 0x43fe
jmp 0x4550
leaq 0x16d3a(%rip), %rdi     # 0x1b13f
leaq 0x16c1c(%rip), %rsi     # 0x1b028
movl $0xc9, %edx
leaq 0x16c1d(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4522
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4516
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x450a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x44fe
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x44f2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x44e6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x44da
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x44ce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x44c2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x3e8(%rbp), %rdi
callq 0x54d0
leaq -0x428(%rbp), %rdi
callq 0x54d0
leaq -0x468(%rbp), %rdi
callq 0x54d0
leaq -0x438(%rbp), %rdi
callq 0x54d0
leaq -0x458(%rbp), %rdi
callq 0x54d0
leaq -0x448(%rbp), %rdi
callq 0x54d0
leaq -0x3f8(%rbp), %rdi
callq 0x54d0
leaq -0x418(%rbp), %rdi
callq 0x54d0
leaq -0x408(%rbp), %rdi
callq 0x54d0
leaq -0x3d8(%rbp), %rdi
callq 0x54d0
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x3c8(%rbp), %rdi
callq 0x54d0
jmp 0x5162
leaq -0x3c8(%rbp), %rdi
callq 0x54d0
movl $0x2a, -0x4c0(%rbp)
leaq -0x4b8(%rbp), %rdi
movq %rdi, -0x870(%rbp)
leaq -0x4c0(%rbp), %rsi
callq 0xb0e0
movq -0x870(%rbp), %rsi
leaq -0x4a0(%rbp), %rdi
callq 0xb110
jmp 0x4595
leaq -0x488(%rbp), %rdi
leaq -0x4a0(%rbp), %rsi
callq 0xb140
jmp 0x45aa
leaq -0x4a0(%rbp), %rdi
callq 0xb170
leaq -0x4b8(%rbp), %rdi
callq 0xb170
leaq -0x488(%rbp), %rdi
callq 0xb1a0
movq %rax, -0x878(%rbp)
jmp 0x45d7
movq -0x878(%rbp), %rdi
callq 0xb1c0
movq %rax, -0x880(%rbp)
jmp 0x45ec
movq -0x880(%rbp), %rdi
callq 0xb1f0
movq %rax, -0x888(%rbp)
jmp 0x4601
movq -0x888(%rbp), %rax
cmpl $0x2a, (%rax)
jne 0x460f
jmp 0x4682
leaq 0x16b39(%rip), %rdi     # 0x1b14f
leaq 0x16a0b(%rip), %rsi     # 0x1b028
movl $0xd2, %edx
leaq 0x16a0c(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4654
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x4a0(%rbp), %rdi
callq 0xb170
leaq -0x4b8(%rbp), %rdi
callq 0xb170
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x488(%rbp), %rdi
callq 0xb210
jmp 0x5162
leaq -0x488(%rbp), %rdi
callq 0xb210
movb $0x61, -0x4da(%rbp)
leaq -0x4d8(%rbp), %rdi
movq %rdi, -0x898(%rbp)
leaq -0x4da(%rbp), %rsi
callq 0xb240
movq -0x898(%rbp), %rsi
movq %rsi, %rdi
callq 0xb270
movb %al, -0x889(%rbp)
jmp 0x46c6
movb -0x889(%rbp), %al
testb $0x1, %al
jne 0x46d2
jmp 0x46d4
jmp 0x4710
leaq 0x16a94(%rip), %rdi     # 0x1b16f
leaq 0x16946(%rip), %rsi     # 0x1b028
movl $0xd8, %edx
leaq 0x16947(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x4d8(%rbp), %rdi
callq 0xb2e0
jmp 0x5162
leaq -0x4d8(%rbp), %rdi
callq 0xb2e0
movl $0x2a, -0x4f8(%rbp)
leaq -0x4f0(%rbp), %rdi
leaq -0x4f8(%rbp), %rsi
callq 0xb310
movb $0x61, -0x54a(%rbp)
leaq -0x548(%rbp), %rdi
leaq -0x54a(%rbp), %rsi
callq 0xb340
jmp 0x4755
leaq -0x528(%rbp), %rdi
leaq -0x548(%rbp), %rsi
callq 0xb370
jmp 0x476a
leaq -0x508(%rbp), %rdi
leaq -0x528(%rbp), %rsi
callq 0xb3a0
jmp 0x477f
leaq -0x528(%rbp), %rdi
callq 0xb3d0
leaq -0x548(%rbp), %rdi
callq 0xb3d0
movl $0x2a, -0x5a0(%rbp)
leaq -0x598(%rbp), %rdi
leaq -0x5a0(%rbp), %rsi
callq 0xb310
jmp 0x47b6
leaq -0x580(%rbp), %rdi
leaq -0x598(%rbp), %rsi
callq 0xb400
jmp 0x47cb
leaq -0x560(%rbp), %rdi
leaq -0x580(%rbp), %rsi
callq 0xb3a0
jmp 0x47e0
leaq -0x580(%rbp), %rdi
callq 0xb3d0
leaq -0x598(%rbp), %rdi
callq 0xb430
movb $0x61, -0x5d2(%rbp)
leaq -0x5d0(%rbp), %rdi
leaq -0x5d2(%rbp), %rsi
callq 0xb340
jmp 0x4814
leaq -0x5b0(%rbp), %rdi
leaq -0x5d0(%rbp), %rsi
callq 0xb3a0
jmp 0x4829
leaq -0x5d0(%rbp), %rdi
callq 0xb3d0
leaq -0x560(%rbp), %rdi
callq 0xb4d0
movq %rax, -0x8a0(%rbp)
jmp 0x484a
movq -0x8a0(%rbp), %rdi
callq 0xb500
movq %rax, -0x8a8(%rbp)
jmp 0x485f
movq -0x8a8(%rbp), %rsi
leaq -0x4f0(%rbp), %rdi
callq 0xb460
movb %al, -0x8a9(%rbp)
jmp 0x487a
movb -0x8a9(%rbp), %al
testb $0x1, %al
jne 0x4886
jmp 0x488b
jmp 0x4979
leaq 0x168e4(%rip), %rdi     # 0x1b176
leaq 0x1678f(%rip), %rsi     # 0x1b028
movl $0xe3, %edx
leaq 0x16790(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4ca5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x48e1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x528(%rbp), %rdi
callq 0xb3d0
leaq -0x548(%rbp), %rdi
callq 0xb3d0
jmp 0x4ca5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4c99
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4929
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x580(%rbp), %rdi
callq 0xb3d0
leaq -0x598(%rbp), %rdi
callq 0xb430
jmp 0x4c99
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4c8d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x5d0(%rbp), %rdi
callq 0xb3d0
jmp 0x4c8d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4c81
leaq -0x508(%rbp), %rdi
callq 0xb4d0
movq %rax, -0x8b8(%rbp)
jmp 0x498e
movq -0x8b8(%rbp), %rdi
callq 0xb590
movq %rax, -0x8c0(%rbp)
jmp 0x49a3
leaq -0x5b0(%rbp), %rdi
callq 0xb4d0
movq %rax, -0x8c8(%rbp)
jmp 0x49b8
movq -0x8c8(%rbp), %rsi
movq -0x8c0(%rbp), %rdi
callq 0xb520
movb %al, -0x8c9(%rbp)
jmp 0x49d3
movb -0x8c9(%rbp), %al
testb $0x1, %al
jne 0x49df
jmp 0x49e1
jmp 0x4a00
leaq 0x167a5(%rip), %rdi     # 0x1b18d
leaq 0x16639(%rip), %rsi     # 0x1b028
movl $0xe4, %edx
leaq 0x1663a(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x608(%rbp), %rdi
leaq -0x5b0(%rbp), %rsi
callq 0xb5c0
jmp 0x4a15
leaq -0x5e8(%rbp), %rdi
leaq -0x608(%rbp), %rsi
callq 0xb3a0
jmp 0x4a2a
leaq -0x4f0(%rbp), %rdi
leaq -0x5e8(%rbp), %rsi
callq 0xb5f0
jmp 0x4a3f
leaq -0x5e8(%rbp), %rdi
callq 0xb430
leaq -0x608(%rbp), %rdi
callq 0xb3d0
leaq -0x4f0(%rbp), %rdi
callq 0xb4d0
movq %rax, -0x8d8(%rbp)
jmp 0x4a6c
movq -0x8d8(%rbp), %rdi
callq 0xb500
movq %rax, -0x8e0(%rbp)
jmp 0x4a81
movq -0x8e0(%rbp), %rdi
callq 0xb4d0
movq %rax, -0x8e8(%rbp)
jmp 0x4a96
leaq -0x508(%rbp), %rdi
callq 0xb4d0
movq %rax, -0x8f0(%rbp)
jmp 0x4aab
movq -0x8f0(%rbp), %rdi
callq 0xb590
movq %rax, -0x8f8(%rbp)
jmp 0x4ac0
movq -0x8f8(%rbp), %rsi
movq -0x8e8(%rbp), %rdi
callq 0xb520
movb %al, -0x8f9(%rbp)
jmp 0x4adb
movb -0x8f9(%rbp), %al
testb $0x1, %al
jne 0x4ae7
jmp 0x4ae9
jmp 0x4b3f
leaq 0x166bc(%rip), %rdi     # 0x1b1ac
leaq 0x16531(%rip), %rsi     # 0x1b028
movl $0xe6, %edx
leaq 0x16532(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4b2e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x5e8(%rbp), %rdi
callq 0xb430
leaq -0x608(%rbp), %rdi
callq 0xb3d0
jmp 0x4c81
leaq -0x5b0(%rbp), %rdi
callq 0xb430
leaq -0x560(%rbp), %rdi
callq 0xb430
leaq -0x508(%rbp), %rdi
callq 0xb430
leaq -0x4f0(%rbp), %rdi
callq 0xb430
movl $0x2a, -0x644(%rbp)
leaq -0x658(%rbp), %rdi
movq %rdi, -0x908(%rbp)
callq 0x55d0
movq -0x908(%rbp), %rdx
leaq -0x640(%rbp), %rdi
leaq -0x644(%rbp), %rsi
callq 0x5590
jmp 0x4ba8
leaq -0x620(%rbp), %rdi
leaq -0x640(%rbp), %rsi
callq 0x5600
jmp 0x4bbd
leaq -0x640(%rbp), %rdi
callq 0x5630
leaq -0x658(%rbp), %rdi
callq 0x5650
movl $0x2a, -0x694(%rbp)
leaq -0x6a8(%rbp), %rdi
callq 0x56c0
jmp 0x4bed
leaq -0x690(%rbp), %rdi
leaq -0x694(%rbp), %rsi
leaq -0x6a8(%rbp), %rdx
callq 0x5680
jmp 0x4c09
leaq -0x670(%rbp), %rdi
leaq -0x690(%rbp), %rsi
callq 0x56f0
jmp 0x4c1e
leaq -0x690(%rbp), %rdi
callq 0x5720
leaq -0x6a8(%rbp), %rdi
callq 0x5740
leaq -0x620(%rbp), %rdi
leaq -0x670(%rbp), %rsi
callq 0x5770
movb %al, -0x909(%rbp)
jmp 0x4c51
movb -0x909(%rbp), %al
testb $0x1, %al
jne 0x4c5d
jmp 0x4c62
jmp 0x4d52
leaq 0x16572(%rip), %rdi     # 0x1b1db
leaq 0x163b8(%rip), %rsi     # 0x1b028
movl $0xf2, %edx
leaq 0x163b9(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x5b0(%rbp), %rdi
callq 0xb430
leaq -0x560(%rbp), %rdi
callq 0xb430
leaq -0x508(%rbp), %rdi
callq 0xb430
leaq -0x4f0(%rbp), %rdi
callq 0xb430
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4cdc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x640(%rbp), %rdi
callq 0x5630
leaq -0x658(%rbp), %rdi
callq 0x5650
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4f7d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4d24
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x690(%rbp), %rdi
callq 0x5720
leaq -0x6a8(%rbp), %rdi
callq 0x5740
jmp 0x4f7d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x670(%rbp), %rdi
callq 0x5740
jmp 0x4f7d
leaq -0x670(%rbp), %rdi
callq 0x5740
leaq -0x620(%rbp), %rdi
callq 0x5650
leaq -0x6f8(%rbp), %rdi
movq %rdi, -0x918(%rbp)
movq %rdi, -0x700(%rbp)
movl $0x1, -0x708(%rbp)
leaq -0x708(%rbp), %rsi
callq 0xb620
jmp 0x4d97
movq -0x918(%rbp), %rdi
addq $0x10, %rdi
movq %rdi, -0x700(%rbp)
movl $0x2, -0x710(%rbp)
leaq -0x710(%rbp), %rsi
callq 0xb620
jmp 0x4dc1
movq -0x918(%rbp), %rdi
addq $0x20, %rdi
movq %rdi, -0x700(%rbp)
movl $0x3, -0x718(%rbp)
leaq -0x718(%rbp), %rsi
callq 0xb620
jmp 0x4deb
leaq -0x6c0(%rbp), %rdi
leaq -0x6f8(%rbp), %rsi
callq 0xb680
jmp 0x4e00
leaq -0x6f8(%rbp), %rdi
callq 0xb6b0
leaq -0x719(%rbp), %rdi
callq 0x5810
jmp 0x4e1a
leaq -0x6c0(%rbp), %rdi
leaq -0x719(%rbp), %rsi
callq 0x57e0
jmp 0x4e2f
leaq -0x6c0(%rbp), %rdi
callq 0x5840
jmp 0x4e3d
leaq -0x6c0(%rbp), %rdi
callq 0xb650
movl $0x2a, -0x738(%rbp)
leaq -0x730(%rbp), %rdi
movq %rdi, -0x920(%rbp)
leaq -0x738(%rbp), %rsi
callq 0xb700
movq -0x920(%rbp), %rdi
callq 0xb730
movl $0x0, -0x748(%rbp)
leaq -0x740(%rbp), %rdi
leaq -0x748(%rbp), %rsi
callq 0xb760
leaq -0x749(%rbp), %rdi
callq 0x58b0
jmp 0x4ea4
leaq -0x740(%rbp), %rdi
leaq -0x749(%rbp), %rsi
callq 0x5870
jmp 0x4eb9
leaq -0x740(%rbp), %rdi
callq 0xb790
movl $0x2a, -0x760(%rbp)
leaq -0x758(%rbp), %rdi
movq %rdi, -0x928(%rbp)
leaq -0x760(%rbp), %rsi
callq 0xb7c0
movq -0x928(%rbp), %rsi
leaq -0x768(%rbp), %rdi
callq 0xb7f0
jmp 0x4efe
leaq -0x768(%rbp), %rdi
callq 0xb820
movl %eax, -0x92c(%rbp)
jmp 0x4f12
movl -0x92c(%rbp), %ecx
xorl %eax, %eax
cmpl $0x2, %ecx
movb %al, -0x92d(%rbp)
jne 0x4f4d
leaq -0x768(%rbp), %rdi
callq 0xb840
movq %rax, -0x938(%rbp)
jmp 0x4f3a
movq -0x938(%rbp), %rax
cmpl $0x2a, (%rax)
sete %al
movb %al, -0x92d(%rbp)
movb -0x92d(%rbp), %al
testb $0x1, %al
jne 0x4f59
jmp 0x4f5e
jmp 0x506f
leaq 0x1627f(%rip), %rdi     # 0x1b1e4
leaq 0x160bc(%rip), %rsi     # 0x1b028
movl $0x12b, %edx            # imm = 0x12B
leaq 0x160bd(%rip), %rcx     # 0x1b035
callq 0x30a0
leaq -0x620(%rbp), %rdi
callq 0x5650
jmp 0x5162
movq -0x918(%rbp), %rcx
movq %rdx, -0x948(%rbp)
movq %rax, %rdx
movq -0x948(%rbp), %rax
movq %rdx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
movq -0x700(%rbp), %rax
cmpq %rax, %rcx
movq %rax, -0x940(%rbp)
je 0x4ff1
movq -0x940(%rbp), %rdi
addq $-0x10, %rdi
movq %rdi, -0x950(%rbp)
callq 0xb650
movq -0x918(%rbp), %rcx
movq -0x950(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x940(%rbp)
jne 0x4fc0
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x6f8(%rbp), %rdi
callq 0xb6b0
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x6c0(%rbp), %rdi
callq 0xb650
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x740(%rbp), %rdi
callq 0xb790
jmp 0x5162
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x5156
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x514a
leaq -0x774(%rbp), %rdi
leaq -0x758(%rbp), %rsi
callq 0xb860
jmp 0x5084
leaq -0x774(%rbp), %rdi
callq 0xb8a0
movl %eax, -0x954(%rbp)
jmp 0x5098
movl -0x954(%rbp), %ecx
xorl %eax, %eax
cmpl $0x1, %ecx
movb %al, -0x955(%rbp)
jne 0x50d3
leaq -0x774(%rbp), %rdi
callq 0xb8c0
movq %rax, -0x960(%rbp)
jmp 0x50c0
movq -0x960(%rbp), %rax
cmpl $0x2a, (%rax)
sete %al
movb %al, -0x955(%rbp)
movb -0x955(%rbp), %al
testb $0x1, %al
jne 0x50df
jmp 0x50e1
jmp 0x511a
leaq 0x1611e(%rip), %rdi     # 0x1b206
leaq 0x15f39(%rip), %rsi     # 0x1b028
movl $0x12e, %edx            # imm = 0x12E
leaq 0x15f3a(%rip), %rcx     # 0x1b035
callq 0x30a0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x774(%rbp), %rdi
callq 0xb8e0
jmp 0x514a
leaq -0x774(%rbp), %rdi
callq 0xb8e0
leaq -0x768(%rbp), %rdi
callq 0xb910
leaq -0x758(%rbp), %rdi
callq 0xb940
movl -0x4(%rbp), %eax
addq $0x960, %rsp            # imm = 0x960
popq %rbp
retq
leaq -0x768(%rbp), %rdi
callq 0xb910
leaq -0x758(%rbp), %rdi
callq 0xb940
movq -0x38(%rbp), %rdi
callq 0x3140
nopl (%rax,%rax)