// File: Falldog[P]dcinja/src/include/nlohmann/json.hpp
// Function: nlohmann::detail::lexer<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, std::vector<unsigned char, std::allocator<unsigned char>>>, nlohmann::detail::iterator_input_adapter<char const*>>::scan()
token_type scan()
    {
        // initially, skip the BOM
        if (position.chars_read_total == 0 && !skip_bom())
        {
            error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given";
            return token_type::parse_error;
        }

        // read next character and ignore whitespace
        skip_whitespace();

        // ignore comments
        while (ignore_comments && current == '/')
        {
            if (!scan_comment())
            {
                return token_type::parse_error;
            }

            // skip following whitespace
            skip_whitespace();
        }

        switch (current)
        {
            // structural characters
            case '[':
                return token_type::begin_array;
            case ']':
                return token_type::end_array;
            case '{':
                return token_type::begin_object;
            case '}':
                return token_type::end_object;
            case ':':
                return token_type::name_separator;
            case ',':
                return token_type::value_separator;

            // literals
            case 't':
            {
                std::array<char_type, 4> true_literal = {{'t', 'r', 'u', 'e'}};
                return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true);
            }
            case 'f':
            {
                std::array<char_type, 5> false_literal = {{'f', 'a', 'l', 's', 'e'}};
                return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false);
            }
            case 'n':
            {
                std::array<char_type, 4> null_literal = {{'n', 'u', 'l', 'l'}};
                return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null);
            }

            // string
            case '\"':
                return scan_string();

            // number
            case '-':
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                return scan_number();

            // end of input (the null byte is needed when parsing from
            // string literals)
            case '\0':
            case std::char_traits<char_type>::eof():
                return token_type::end_of_input;

            // error
            default:
                error_message = "invalid literal";
                return token_type::parse_error;
        }
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, 0x20(%rax)
jne 0x408c3
movq -0x28(%rbp), %rdi
callq 0x40a90
testb $0x1, %al
jne 0x408c3
movq -0x28(%rbp), %rax
leaq 0x821d5(%rip), %rcx     # 0xc2a88
movq %rcx, 0x70(%rax)
movl $0xe, -0x4(%rbp)
jmp 0x40a7c
movq -0x28(%rbp), %rdi
callq 0x40b00
movq -0x28(%rbp), %rcx
xorl %eax, %eax
testb $0x1, 0x10(%rcx)
movb %al, -0x29(%rbp)
je 0x408e9
movq -0x28(%rbp), %rax
cmpl $0x2f, 0x14(%rax)
sete %al
movb %al, -0x29(%rbp)
movb -0x29(%rbp), %al
testb $0x1, %al
jne 0x408f2
jmp 0x40916
movq -0x28(%rbp), %rdi
callq 0x40b70
testb $0x1, %al
jne 0x4090b
movl $0xe, -0x4(%rbp)
jmp 0x40a7c
movq -0x28(%rbp), %rdi
callq 0x40b00
jmp 0x408cc
movq -0x28(%rbp), %rax
movl 0x14(%rax), %eax
incl %eax
movl %eax, %ecx
movq %rcx, -0x38(%rbp)
subl $0x7e, %eax
ja 0x40a66
movq -0x38(%rbp), %rax
leaq 0x7fa27(%rip), %rcx     # 0xc0360
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl $0x8, -0x4(%rbp)
jmp 0x40a7c
movl $0xa, -0x4(%rbp)
jmp 0x40a7c
movl $0x9, -0x4(%rbp)
jmp 0x40a7c
movl $0xb, -0x4(%rbp)
jmp 0x40a7c
movl $0xc, -0x4(%rbp)
jmp 0x40a7c
movl $0xd, -0x4(%rbp)
jmp 0x40a7c
movl 0x7f678(%rip), %eax     # 0xc0008
movl %eax, -0x14(%rbp)
leaq -0x14(%rbp), %rdi
callq 0x40d40
movq %rax, -0x40(%rbp)
leaq -0x14(%rbp), %rdi
callq 0x40d60
movq -0x28(%rbp), %rdi
movq -0x40(%rbp), %rsi
movq %rax, %rdx
movl $0x1, %ecx
callq 0x40c60
movl %eax, -0x4(%rbp)
jmp 0x40a7c
movl 0x8a6e0(%rip), %eax     # 0xcb0ac
movl %eax, -0x19(%rbp)
movb 0x8a6db(%rip), %al      # 0xcb0b0
movb %al, -0x15(%rbp)
leaq -0x19(%rbp), %rdi
callq 0x40d70
movq %rax, -0x48(%rbp)
leaq -0x19(%rbp), %rdi
callq 0x40d90
movq -0x28(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq %rax, %rdx
movl $0x2, %ecx
callq 0x40c60
movl %eax, -0x4(%rbp)
jmp 0x40a7c
movl 0x7f5fe(%rip), %eax     # 0xc000c
movl %eax, -0x1d(%rbp)
leaq -0x1d(%rbp), %rdi
callq 0x40d40
movq %rax, -0x50(%rbp)
leaq -0x1d(%rbp), %rdi
callq 0x40d60
movq -0x28(%rbp), %rdi
movq -0x50(%rbp), %rsi
movq %rax, %rdx
movl $0x3, %ecx
callq 0x40c60
movl %eax, -0x4(%rbp)
jmp 0x40a7c
movq -0x28(%rbp), %rdi
callq 0x40da0
movl %eax, -0x4(%rbp)
jmp 0x40a7c
movq -0x28(%rbp), %rdi
callq 0x41970
movl %eax, -0x4(%rbp)
jmp 0x40a7c
movl $0xf, -0x4(%rbp)
jmp 0x40a7c
movq -0x28(%rbp), %rax
leaq 0x82044(%rip), %rcx     # 0xc2ab5
movq %rcx, 0x70(%rax)
movl $0xe, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nop