// File: jo-qzy[P]MyJson/./json.hpp
// Function: JSON::value_parse::parse_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>&)
int parse_string(std::string& tmp_str, std::string::const_iterator& tmp_it) {
            char ch = 0;
            tmp_it++;
            while (tmp_it != json_source.end()) {
                ch = *tmp_it++;
                switch (ch) {
                case '\"':
                    return PARSE_OK;
                case '\\':
                    if (tmp_it != json_source.end()) {
                        switch (*tmp_it++) {
                        case '\"': tmp_str += '\"'; break;
                        case 'n': tmp_str += '\n'; break;
                        case 'r': tmp_str += '\r'; break;
                        case 't': tmp_str += '\t'; break;
                        case 'f': tmp_str += '\f'; break;
                        case 'b': tmp_str += '\b'; break;
                        case '/': tmp_str += '/'; break;
                        case '\\': tmp_str += '\\'; break;
                        case 'u': { 
                            unsigned u = 0;
                            int ret = 0;
                            if ((ret = parse_hex4(tmp_it, u)) != PARSE_OK)
                                return ret;
                            if (u >= 0xD800 && u <= 0xDBFF) {
                                CHECK_ITERATOR(tmp_it);
                                if (*tmp_it++ != '\\')
                                    return PARSE_INVALID_UNICODE_SURROGATE;
                                CHECK_ITERATOR(tmp_it);
                                if (*tmp_it++ != 'u')
                                    return PARSE_INVALID_UNICODE_SURROGATE;
                                unsigned tmp_u;
                                if ((ret = parse_hex4(tmp_it, tmp_u)) != PARSE_OK)
                                    return ret;
                                if (tmp_u <0xDC00 || tmp_u > 0xDFFF)
                                    return PARSE_INVALID_UNICODE_SURROGATE;
                                u = 0x10000 + (u - 0xD800) * 0x400 + (tmp_u - 0xDC00);
                            }
                            if (u > 0x10FFFF)
                                return PARSE_INVALID_UNICODE_HEX;
                            encode_utf8(u, tmp_str);
                            break;
                        }
                        default: return PARSE_INVALID_STRING_ESCAPE;
                        }
                    }
                    else
                        return PARSE_MISS_QUOTATION_MARK;
                    break;
                case '\0':
                    return PARSE_MISS_QUOTATION_MARK;
                default:
                    if (ch < 0x20)
                        return PARSE_INVALID_STRING_CHAR;
                    tmp_str += ch;
                    break;
                }
            }
            return PARSE_MISS_QUOTATION_MARK;
        }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x88(%rbp)
movb $0x0, -0x21(%rbp)
movq -0x20(%rbp), %rdi
xorl %esi, %esi
callq 0x3f10
movq %rax, -0x30(%rbp)
movq -0x88(%rbp), %rdi
movq -0x20(%rbp), %rax
movq %rax, -0x90(%rbp)
callq 0x20f0
movq -0x90(%rbp), %rdi
movq %rax, -0x38(%rbp)
leaq -0x38(%rbp), %rsi
callq 0x3eb0
testb $0x1, %al
jne 0x88a9
jmp 0x8c0f
movq -0x20(%rbp), %rdi
xorl %esi, %esi
callq 0x3f10
movq %rax, -0x40(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x3ef0
movb (%rax), %al
movb %al, -0x21(%rbp)
movsbl -0x21(%rbp), %eax
movl %eax, -0x94(%rbp)
testl %eax, %eax
je 0x8be0
jmp 0x88da
movl -0x94(%rbp), %eax
subl $0x22, %eax
je 0x88f7
jmp 0x88e7
movl -0x94(%rbp), %eax
subl $0x5c, %eax
je 0x8903
jmp 0x8be9
movl $0x0, -0x4(%rbp)
jmp 0x8c16
movq -0x88(%rbp), %rdi
movq -0x20(%rbp), %rax
movq %rax, -0xa0(%rbp)
callq 0x20f0
movq -0xa0(%rbp), %rdi
movq %rax, -0x48(%rbp)
leaq -0x48(%rbp), %rsi
callq 0x3eb0
testb $0x1, %al
jne 0x8937
jmp 0x8bd5
movq -0x20(%rbp), %rdi
xorl %esi, %esi
callq 0x3f10
movq %rax, -0x50(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x3ef0
movsbl (%rax), %eax
addl $-0x22, %eax
movl %eax, %ecx
movq %rcx, -0xa8(%rbp)
subl $0x53, %eax
ja 0x8bca
movq -0xa8(%rbp), %rax
leaq 0x46df(%rip), %rcx      # 0xd054
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x18(%rbp), %rdi
movl $0x22, %esi
callq 0x2130
jmp 0x8bd3
movq -0x18(%rbp), %rdi
movl $0xa, %esi
callq 0x2130
jmp 0x8bd3
movq -0x18(%rbp), %rdi
movl $0xd, %esi
callq 0x2130
jmp 0x8bd3
movq -0x18(%rbp), %rdi
movl $0x9, %esi
callq 0x2130
jmp 0x8bd3
movq -0x18(%rbp), %rdi
movl $0xc, %esi
callq 0x2130
jmp 0x8bd3
movq -0x18(%rbp), %rdi
movl $0x8, %esi
callq 0x2130
jmp 0x8bd3
movq -0x18(%rbp), %rdi
movl $0x2f, %esi
callq 0x2130
jmp 0x8bd3
movq -0x18(%rbp), %rdi
movl $0x5c, %esi
callq 0x2130
jmp 0x8bd3
movq -0x88(%rbp), %rdi
movl $0x0, -0x54(%rbp)
movl $0x0, -0x58(%rbp)
movq -0x20(%rbp), %rsi
leaq -0x54(%rbp), %rdx
callq 0x9270
movl %eax, -0x58(%rbp)
cmpl $0x0, %eax
je 0x8a4b
movl -0x58(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x8c16
cmpl $0xd800, -0x54(%rbp)    # imm = 0xD800
jb 0x8ba2
cmpl $0xdbff, -0x54(%rbp)    # imm = 0xDBFF
ja 0x8ba2
jmp 0x8a67
movq -0x88(%rbp), %rdi
movq -0x20(%rbp), %rax
movq %rax, -0xb0(%rbp)
callq 0x20f0
movq -0xb0(%rbp), %rdi
movq %rax, -0x60(%rbp)
leaq -0x60(%rbp), %rsi
callq 0x3f70
testb $0x1, %al
jne 0x8a98
jmp 0x8aa4
movl $0x5, -0x4(%rbp)
jmp 0x8c16
jmp 0x8aa6
movq -0x20(%rbp), %rdi
xorl %esi, %esi
callq 0x3f10
movq %rax, -0x68(%rbp)
leaq -0x68(%rbp), %rdi
callq 0x3ef0
movsbl (%rax), %eax
cmpl $0x5c, %eax
je 0x8ad2
movl $0x9, -0x4(%rbp)
jmp 0x8c16
jmp 0x8ad4
movq -0x88(%rbp), %rdi
movq -0x20(%rbp), %rax
movq %rax, -0xb8(%rbp)
callq 0x20f0
movq -0xb8(%rbp), %rdi
movq %rax, -0x70(%rbp)
leaq -0x70(%rbp), %rsi
callq 0x3f70
testb $0x1, %al
jne 0x8b05
jmp 0x8b11
movl $0x5, -0x4(%rbp)
jmp 0x8c16
jmp 0x8b13
movq -0x20(%rbp), %rdi
xorl %esi, %esi
callq 0x3f10
movq %rax, -0x78(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x3ef0
movsbl (%rax), %eax
cmpl $0x75, %eax
je 0x8b3f
movl $0x9, -0x4(%rbp)
jmp 0x8c16
movq -0x88(%rbp), %rdi
movq -0x20(%rbp), %rsi
leaq -0x7c(%rbp), %rdx
callq 0x9270
movl %eax, -0x58(%rbp)
cmpl $0x0, %eax
je 0x8b66
movl -0x58(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x8c16
cmpl $0xdc00, -0x7c(%rbp)    # imm = 0xDC00
jb 0x8b78
cmpl $0xdfff, -0x7c(%rbp)    # imm = 0xDFFF
jbe 0x8b84
movl $0x9, -0x4(%rbp)
jmp 0x8c16
movl -0x54(%rbp), %eax
subl $0xd800, %eax           # imm = 0xD800
shll $0xa, %eax
addl $0x10000, %eax          # imm = 0x10000
movl -0x7c(%rbp), %ecx
subl $0xdc00, %ecx           # imm = 0xDC00
addl %ecx, %eax
movl %eax, -0x54(%rbp)
cmpl $0x10ffff, -0x54(%rbp)  # imm = 0x10FFFF
jbe 0x8bb4
movl $0x8, -0x4(%rbp)
jmp 0x8c16
movq -0x88(%rbp), %rdi
movq -0x18(%rbp), %rdx
leaq -0x54(%rbp), %rsi
callq 0x93b0
jmp 0x8bd3
movl $0x7, -0x4(%rbp)
jmp 0x8c16
jmp 0x8bde
movl $0x5, -0x4(%rbp)
jmp 0x8c16
jmp 0x8c0a
movl $0x5, -0x4(%rbp)
jmp 0x8c16
movsbl -0x21(%rbp), %eax
cmpl $0x20, %eax
jge 0x8bfb
movl $0x6, -0x4(%rbp)
jmp 0x8c16
movb -0x21(%rbp), %al
movq -0x18(%rbp), %rdi
movsbl %al, %esi
callq 0x2130
jmp 0x8875
movl $0x5, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0xc0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nopl (%rax)