// File: mattn[P]wandbox-run/./json.hpp
// Function: nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, bool, long, unsigned long, double, std::allocator, nlohmann::adl_serializer>::serializer::dump(nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, bool, long, unsigned long, double, std::allocator, nlohmann::adl_serializer> const&, bool, unsigned int, unsigned int)
void dump(const basic_json& val,
                  const bool pretty_print,
                  const unsigned int indent_step,
                  const unsigned int current_indent = 0)
        {
            switch (val.m_type)
            {
                case value_t::object:
                {
                    if (val.m_value.object->empty())
                    {
                        o.write("{}", 2);
                        return;
                    }

                    if (pretty_print)
                    {
                        o.write("{\n", 2);

                        // variable to hold indentation for recursive calls
                        const auto new_indent = current_indent + indent_step;
                        if (indent_string.size() < new_indent)
                        {
                            indent_string.resize(new_indent, ' ');
                        }

                        // first n-1 elements
                        auto i = val.m_value.object->cbegin();
                        for (size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)
                        {
                            o.write(indent_string.c_str(), new_indent);
                            o.put('\"');
                            dump_escaped(i->first);
                            o.write("\": ", 3);
                            dump(i->second, true, indent_step, new_indent);
                            o.write(",\n", 2);
                        }

                        // last element
                        assert(i != val.m_value.object->cend());
                        o.write(indent_string.c_str(), new_indent);
                        o.put('\"');
                        dump_escaped(i->first);
                        o.write("\": ", 3);
                        dump(i->second, true, indent_step, new_indent);

                        o.put('\n');
                        o.write(indent_string.c_str(), current_indent);
                        o.put('}');
                    }
                    else
                    {
                        o.put('{');

                        // first n-1 elements
                        auto i = val.m_value.object->cbegin();
                        for (size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i)
                        {
                            o.put('\"');
                            dump_escaped(i->first);
                            o.write("\":", 2);
                            dump(i->second, false, indent_step, current_indent);
                            o.put(',');
                        }

                        // last element
                        assert(i != val.m_value.object->cend());
                        o.put('\"');
                        dump_escaped(i->first);
                        o.write("\":", 2);
                        dump(i->second, false, indent_step, current_indent);

                        o.put('}');
                    }

                    return;
                }

                case value_t::array:
                {
                    if (val.m_value.array->empty())
                    {
                        o.write("[]", 2);
                        return;
                    }

                    if (pretty_print)
                    {
                        o.write("[\n", 2);

                        // variable to hold indentation for recursive calls
                        const auto new_indent = current_indent + indent_step;
                        if (indent_string.size() < new_indent)
                        {
                            indent_string.resize(new_indent, ' ');
                        }

                        // first n-1 elements
                        for (auto i = val.m_value.array->cbegin(); i != val.m_value.array->cend() - 1; ++i)
                        {
                            o.write(indent_string.c_str(), new_indent);
                            dump(*i, true, indent_step, new_indent);
                            o.write(",\n", 2);
                        }

                        // last element
                        assert(not val.m_value.array->empty());
                        o.write(indent_string.c_str(), new_indent);
                        dump(val.m_value.array->back(), true, indent_step, new_indent);

                        o.put('\n');
                        o.write(indent_string.c_str(), current_indent);
                        o.put(']');
                    }
                    else
                    {
                        o.put('[');

                        // first n-1 elements
                        for (auto i = val.m_value.array->cbegin(); i != val.m_value.array->cend() - 1; ++i)
                        {
                            dump(*i, false, indent_step, current_indent);
                            o.put(',');
                        }

                        // last element
                        assert(not val.m_value.array->empty());
                        dump(val.m_value.array->back(), false, indent_step, current_indent);

                        o.put(']');
                    }

                    return;
                }

                case value_t::string:
                {
                    o.put('\"');
                    dump_escaped(*val.m_value.string);
                    o.put('\"');
                    return;
                }

                case value_t::boolean:
                {
                    if (val.m_value.boolean)
                    {
                        o.write("true", 4);
                    }
                    else
                    {
                        o.write("false", 5);
                    }
                    return;
                }

                case value_t::number_integer:
                {
                    dump_integer(val.m_value.number_integer);
                    return;
                }

                case value_t::number_unsigned:
                {
                    dump_integer(val.m_value.number_unsigned);
                    return;
                }

                case value_t::number_float:
                {
                    dump_float(val.m_value.number_float);
                    return;
                }

                case value_t::discarded:
                {
                    o.write("<discarded>", 11);
                    return;
                }

                case value_t::null:
                {
                    o.write("null", 4);
                    return;
                }
            }
        }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xe0, %rsp
movb %dl, %al
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
andb $0x1, %al
movb %al, -0x11(%rbp)
movl %ecx, -0x18(%rbp)
movl %r8d, -0x1c(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x10(%rbp), %rax
movzbl (%rax), %eax
movq %rax, -0x90(%rbp)
subq $0x8, %rax
ja 0x22cc6
movq -0x90(%rbp), %rax
leaq 0xb1e66(%rip), %rcx     # 0xd4228
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x22d60
testb $0x1, %al
jne 0x223de
jmp 0x223fe
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb454c(%rip), %rsi     # 0xd693b
movl $0x2, %edx
callq 0x91840
jmp 0x22cc6
testb $0x1, -0x11(%rbp)
je 0x226b5
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb4525(%rip), %rsi     # 0xd693e
movl $0x2, %edx
callq 0x91840
movq -0x98(%rbp), %rdi
movl -0x1c(%rbp), %eax
addl -0x18(%rbp), %eax
movl %eax, -0x20(%rbp)
addq $0x58, %rdi
callq 0xa25f0
movl -0x20(%rbp), %ecx
cmpq %rcx, %rax
jae 0x2245e
movq -0x98(%rbp), %rdi
addq $0x58, %rdi
movl -0x20(%rbp), %eax
movl %eax, %esi
movl $0x20, %edx
callq 0xa2fd0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x22d80
movq %rax, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x22db0
movq %rax, %rcx
movq -0xa0(%rbp), %rax
subq $0x1, %rcx
cmpq %rcx, %rax
jae 0x22578
movq -0x98(%rbp), %rdi
movq (%rdi), %rax
movq %rax, -0xa8(%rbp)
addq $0x58, %rdi
callq 0xa3e10
movq -0xa8(%rbp), %rdi
movq %rax, %rsi
movl -0x20(%rbp), %eax
movl %eax, %edx
callq 0x91840
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x22, %esi
callq 0x916c0
leaq -0x28(%rbp), %rdi
callq 0x232a0
movq -0x98(%rbp), %rdi
movq %rax, %rsi
callq 0x22dd0
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb4430(%rip), %rsi     # 0xd6941
movl $0x3, %edx
callq 0x91840
leaq -0x28(%rbp), %rdi
callq 0x232a0
movq -0x98(%rbp), %rdi
movq %rax, %rsi
addq $0x20, %rsi
movl -0x18(%rbp), %ecx
movl -0x20(%rbp), %r8d
movl $0x1, %edx
callq 0x22370
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb43f1(%rip), %rsi     # 0xd6945
movl $0x2, %edx
callq 0x91840
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x232c0
jmp 0x22477
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x23320
movq %rax, -0x38(%rbp)
leaq -0x28(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x232f0
testb $0x1, %al
jne 0x2259c
jmp 0x2259e
jmp 0x225bd
leaq 0xb43a3(%rip), %rdi     # 0xd6948
leaq 0xb2135(%rip), %rsi     # 0xd46e1
movl $0x1854, %edx           # imm = 0x1854
leaq 0xb43b0(%rip), %rcx     # 0xd6968
callq 0x13130
movq -0x98(%rbp), %rdi
movq (%rdi), %rax
movq %rax, -0xb8(%rbp)
addq $0x58, %rdi
callq 0xa3e10
movq -0xb8(%rbp), %rdi
movq %rax, %rsi
movl -0x20(%rbp), %eax
movl %eax, %edx
callq 0x91840
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x22, %esi
callq 0x916c0
leaq -0x28(%rbp), %rdi
callq 0x232a0
movq -0x98(%rbp), %rdi
movq %rax, %rsi
callq 0x22dd0
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb4319(%rip), %rsi     # 0xd6941
movl $0x3, %edx
callq 0x91840
leaq -0x28(%rbp), %rdi
callq 0x232a0
movq -0x98(%rbp), %rdi
movq %rax, %rsi
addq $0x20, %rsi
movl -0x18(%rbp), %ecx
movl -0x20(%rbp), %r8d
movl $0x1, %edx
callq 0x22370
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0xa, %esi
callq 0x916c0
movq -0x98(%rbp), %rdi
movq (%rdi), %rax
movq %rax, -0xb0(%rbp)
addq $0x58, %rdi
callq 0xa3e10
movq -0xb0(%rbp), %rdi
movq %rax, %rsi
movl -0x1c(%rbp), %eax
movl %eax, %edx
callq 0x91840
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x7d, %esi
callq 0x916c0
jmp 0x22870
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x7b, %esi
callq 0x916c0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x22d80
movq %rax, -0x40(%rbp)
movq $0x0, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x22db0
movq %rax, %rcx
movq -0xc0(%rbp), %rax
subq $0x1, %rcx
cmpq %rcx, %rax
jae 0x227ab
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x22, %esi
callq 0x916c0
leaq -0x40(%rbp), %rdi
callq 0x232a0
movq -0x98(%rbp), %rdi
movq %rax, %rsi
callq 0x22dd0
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb4425(%rip), %rsi     # 0xd6b73
movl $0x2, %edx
callq 0x91840
leaq -0x40(%rbp), %rdi
callq 0x232a0
movq -0x98(%rbp), %rdi
movq %rax, %rsi
addq $0x20, %rsi
movl -0x18(%rbp), %ecx
movl -0x1c(%rbp), %r8d
xorl %edx, %edx
callq 0x22370
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x2c, %esi
callq 0x916c0
movq -0x48(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x48(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x232c0
jmp 0x226e2
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x23320
movq %rax, -0x50(%rbp)
leaq -0x40(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x232f0
testb $0x1, %al
jne 0x227cf
jmp 0x227d1
jmp 0x227f0
leaq 0xb4170(%rip), %rdi     # 0xd6948
leaq 0xb1f02(%rip), %rsi     # 0xd46e1
movl $0x186f, %edx           # imm = 0x186F
leaq 0xb417d(%rip), %rcx     # 0xd6968
callq 0x13130
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x22, %esi
callq 0x916c0
leaq -0x40(%rbp), %rdi
callq 0x232a0
movq -0x98(%rbp), %rdi
movq %rax, %rsi
callq 0x22dd0
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb4346(%rip), %rsi     # 0xd6b73
movl $0x2, %edx
callq 0x91840
leaq -0x40(%rbp), %rdi
callq 0x232a0
movq -0x98(%rbp), %rdi
movq %rax, %rsi
addq $0x20, %rsi
movl -0x18(%rbp), %ecx
movl -0x1c(%rbp), %r8d
xorl %edx, %edx
callq 0x22370
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x7d, %esi
callq 0x916c0
jmp 0x22cc6
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x23350
testb $0x1, %al
jne 0x22888
jmp 0x228a8
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb8b15(%rip), %rsi     # 0xdb3ae
movl $0x2, %edx
callq 0x91840
jmp 0x22cc6
testb $0x1, -0x11(%rbp)
je 0x22ab1
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb42b3(%rip), %rsi     # 0xd6b76
movl $0x2, %edx
callq 0x91840
movq -0x98(%rbp), %rdi
movl -0x1c(%rbp), %eax
addl -0x18(%rbp), %eax
movl %eax, -0x54(%rbp)
addq $0x58, %rdi
callq 0xa25f0
movl -0x54(%rbp), %ecx
cmpq %rcx, %rax
jae 0x22908
movq -0x98(%rbp), %rdi
addq $0x58, %rdi
movl -0x54(%rbp), %eax
movl %eax, %esi
movl $0x20, %edx
callq 0xa2fd0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x23390
movq %rax, -0x60(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x23400
movq %rax, -0x70(%rbp)
leaq -0x70(%rbp), %rdi
movl $0x1, %esi
callq 0x23430
movq %rax, -0x68(%rbp)
leaq -0x60(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0x233c0
testb $0x1, %al
jne 0x2294f
jmp 0x229ca
movq -0x98(%rbp), %rdi
movq (%rdi), %rax
movq %rax, -0xc8(%rbp)
addq $0x58, %rdi
callq 0xa3e10
movq -0xc8(%rbp), %rdi
movq %rax, %rsi
movl -0x54(%rbp), %eax
movl %eax, %edx
callq 0x91840
leaq -0x60(%rbp), %rdi
callq 0x23470
movq -0x98(%rbp), %rdi
movq %rax, %rsi
movl -0x18(%rbp), %ecx
movl -0x54(%rbp), %r8d
movl $0x1, %edx
callq 0x22370
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb3f93(%rip), %rsi     # 0xd6945
movl $0x2, %edx
callq 0x91840
leaq -0x60(%rbp), %rdi
callq 0x23490
jmp 0x22919
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x23350
xorb $-0x1, %al
testb $0x1, %al
jne 0x229df
jmp 0x229e1
jmp 0x22a00
leaq 0xb4191(%rip), %rdi     # 0xd6b79
leaq 0xb1cf2(%rip), %rsi     # 0xd46e1
movl $0x1897, %edx           # imm = 0x1897
leaq 0xb3f6d(%rip), %rcx     # 0xd6968
callq 0x13130
movq -0x98(%rbp), %rdi
movq (%rdi), %rax
movq %rax, -0xd8(%rbp)
addq $0x58, %rdi
callq 0xa3e10
movq -0xd8(%rbp), %rdi
movq %rax, %rsi
movl -0x54(%rbp), %eax
movl %eax, %edx
callq 0x91840
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x20330
movq -0x98(%rbp), %rdi
movq %rax, %rsi
movl -0x18(%rbp), %ecx
movl -0x54(%rbp), %r8d
movl $0x1, %edx
callq 0x22370
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0xa, %esi
callq 0x916c0
movq -0x98(%rbp), %rdi
movq (%rdi), %rax
movq %rax, -0xd0(%rbp)
addq $0x58, %rdi
callq 0xa3e10
movq -0xd0(%rbp), %rdi
movq %rax, %rsi
movl -0x1c(%rbp), %eax
movl %eax, %edx
callq 0x91840
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x5d, %esi
callq 0x916c0
jmp 0x22bc1
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x5b, %esi
callq 0x916c0
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x23390
movq %rax, -0x78(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x23400
movq %rax, -0x88(%rbp)
leaq -0x88(%rbp), %rdi
movl $0x1, %esi
callq 0x23430
movq %rax, -0x80(%rbp)
leaq -0x78(%rbp), %rdi
leaq -0x80(%rbp), %rsi
callq 0x233c0
testb $0x1, %al
jne 0x22b12
jmp 0x22b52
leaq -0x78(%rbp), %rdi
callq 0x23470
movq -0x98(%rbp), %rdi
movq %rax, %rsi
movl -0x18(%rbp), %ecx
movl -0x1c(%rbp), %r8d
xorl %edx, %edx
callq 0x22370
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x2c, %esi
callq 0x916c0
leaq -0x78(%rbp), %rdi
callq 0x23490
jmp 0x22ad6
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x23350
xorb $-0x1, %al
testb $0x1, %al
jne 0x22b67
jmp 0x22b69
jmp 0x22b88
leaq 0xb4009(%rip), %rdi     # 0xd6b79
leaq 0xb1b6a(%rip), %rsi     # 0xd46e1
movl $0x18ab, %edx           # imm = 0x18AB
leaq 0xb3de5(%rip), %rcx     # 0xd6968
callq 0x13130
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x20330
movq -0x98(%rbp), %rdi
movq %rax, %rsi
movl -0x18(%rbp), %ecx
movl -0x1c(%rbp), %r8d
xorl %edx, %edx
callq 0x22370
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x5d, %esi
callq 0x916c0
jmp 0x22cc6
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x22, %esi
callq 0x916c0
movq -0x98(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x22dd0
movq -0x98(%rbp), %rax
movq (%rax), %rdi
movl $0x22, %esi
callq 0x916c0
jmp 0x22cc6
movq -0x10(%rbp), %rax
testb $0x1, 0x8(%rax)
je 0x22c2e
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb3f76(%rip), %rsi     # 0xd6b98
movl $0x4, %edx
callq 0x91840
jmp 0x22c49
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb3f5e(%rip), %rsi     # 0xd6b9d
movl $0x5, %edx
callq 0x91840
jmp 0x22cc6
movq -0x98(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x234b0
jmp 0x22cc6
movq -0x98(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x23690
jmp 0x22cc6
movq -0x98(%rbp), %rdi
movq -0x10(%rbp), %rax
movsd 0x8(%rax), %xmm0
callq 0x23870
jmp 0x22cc6
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb3f04(%rip), %rsi     # 0xd6ba3
movl $0xb, %edx
callq 0x91840
jmp 0x22cc6
movq -0x98(%rbp), %rax
movq (%rax), %rdi
leaq 0xb2bf7(%rip), %rsi     # 0xd58b3
movl $0x4, %edx
callq 0x91840
addq $0xe0, %rsp
popq %rbp
retq
nop