// File: Heptagon196[P]Gos/GosTokenizer.cpp
// Function: Gos::GosTokenizer::ReadToken()
Gos::GosToken Gos::GosTokenizer::ReadToken() {
    char ch = 0;
    while (!ch) {
        ch = fin.get();
    }
    while (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') {
        if (ch == '\n') {
            lineCount++;
        }
        ch = fin.get();
    }
    if (ch == EOF) {
        return { NONE, lineCount };
    }
    if (isdigit(ch) || ch == '+' || ch == '-' || ch == '.') {
        std::stringstream ss;
        ss << ch;
        char start = ch;
        bool startWithSign = ch == '+' || ch == '-';
        bool hasDot = ch == '.';
        ch = fin.get();
        if (startWithSign && !isdigit(ch)) {
            if (start == '+') {
                if (ch == '=') {
                    return { ASSIGN_ADD, lineCount };
                } else if (ch == '+') {
                    return { INC, lineCount };
                } else {
                    fin.unget();
                    return { ADD, lineCount };
                }
            } else {
                if (ch == '=') {
                    return { ASSIGN_SUB, lineCount };
                } else if (ch == '-') {
                    return { DEC, lineCount };
                } else {
                    fin.unget();
                    return { SUB, lineCount };
                }
            }
        }
        if (hasDot && !isdigit(ch)) {
            fin.unget();
            return { DOT, lineCount };
        }
        while (isdigit(ch) || ch == '.') {
            if (ch == '.') {
                if (hasDot) {
                    std::cerr << "Error: " << inputName << ": " << lineCount << ": illegal number format" << std::endl;
                }
                hasDot = true;
            }
            ss << ch;
            ch = fin.get();
        }
        int8_t numType;
        GosVM::RTConstNum num;
        num.data.i64 = 0;
        if (hasDot) {
            if (ch == 'f') {
                ss >> num.data.f;
                numType = 3;
            } else {
                fin.unget();
                ss >> num.data.d;
                numType = 4;
            }
        } else {
            numType = 1;
            if (ch == 'i') {
                ss >> num.data.i64;
                ch = fin.get();
                if (ch == '8') {
                    numType = 0;
                } else if (ch == '3') {
                    fin.get();
                    numType = 1;
                } else if (ch == '6') {
                    fin.get();
                    numType = 2;
                }
            } else if (ch == 'l') {
                ss >> num.data.i64;
                numType = 2;
            } else if (ch == 'f') {
                ss >> num.data.f;
                numType = 3;
            } else if (ch == 'd') {
                ss >> num.data.d;
                numType = 4;
            } else {
                ss >> num.data.i64;
                fin.unget();
            }
        }
        return { NUMBER, numType, num, lineCount };
    } else if (ch == '*') {
        TRY_GET(ASSIGN_MUL, MUL);
    } else if (ch == '#') {
        while (ch != '\n' && ch != '\r' && ch != EOF) {
            ch = fin.get();
        }
        return ReadToken();
    } else if (ch == '/') {
        ch = fin.get();
        if (ch == '/') {
            while (ch != '\n' && ch != '\r' && ch != EOF) {
                ch = fin.get();
            }
            return ReadToken();
        } else if (ch == '=') {
            return { ASSIGN_DIV, lineCount };
        } else {
            fin.unget();
            return { DIV, lineCount };
        }
    } else if (ch == '%') {
        TRY_GET(ASSIGN_REM, REM);
    } else if (ch == '^') {
        TRY_GET(ASSIGN_XOR, XOR);
    } else if (ch == '=') {
        TRY_GET(E, ASSIGN);
    } else if (ch == '!') {
        TRY_GET(NE, NOT);
    } else if (ch == '<') {
        TRY_GET(LE, L);
    } else if (ch == '>') {
        TRY_GET(GE, G);
    } else if (ch == '&') {
        ch = fin.get();
        if (ch == '=') {
            return { ASSIGN_AND, lineCount };
        } else {
            if (ch != '&') {
                fin.unget();
                return { ADDR, lineCount };
            }
            return { AND, lineCount };
        }
    } else if (ch == '|') {
        ch = fin.get();
        if (ch == '=') {
            return { ASSIGN_OR, lineCount };
        } else {
            if (ch != '|') {
                fin.unget();
            }
            return { OR, lineCount };
        }
    } else if (ch == ',') {
        return { COM, lineCount };
    } else if (ch == ';') {
        return { SEM, lineCount };
    } else if (ch == ':') {
        return { COLON, lineCount };
    } else if (ch == '?') {
        return { QUESTION, lineCount };
    } else if (ch == '(') {
        return { L_ROUND, lineCount };
    } else if (ch == ')') {
        return { R_ROUND, lineCount };
    } else if (ch == '[') {
        return { L_SQUARE, lineCount };
    } else if (ch == ']') {
        return { R_SQUARE, lineCount };
    } else if (ch == '{') {
        return { L_CURLY, lineCount };
    } else if (ch == '}') {
        return { R_CURLY, lineCount };
    } else if (ch == '\"') {
        int line = lineCount;
        std::string content = "";
        bool convNext = false;
        ch = fin.get();
        while (convNext || ch != '\"') {
            if (convNext) {
                if (ch == 'n') {
                    content += '\n';
                } else if (ch == 't') {
                    content += '\t';
                } else {
                    if (ch == '\n') {
                        lineCount++;
                    }
                    content += ch;
                }
                convNext = false;
            } else {
                if (ch == '\\') {
                    convNext = true;
                } else {
                    if (ch == '\n') {
                        lineCount++;
                    }
                    content += ch;
                }
            }
            ch = fin.get();
        }
        return { STRING, content, line };
    } else {
        std::string symbol = "";
        symbol += ch;
        ch = fin.get();
        bool prevColon = false;
        while (isalnum(ch) || ch == ':' || ch == '_') {
            if (prevColon && ch != ':') {
                fin.unget();
                symbol.pop_back();
                break;
            }
            prevColon = ch == ':' && !prevColon;
            symbol += ch;
            ch = fin.get();
        }
        if (prevColon) {
            symbol.pop_back();
            fin.unget();
        }
        fin.unget();
        TokenType type = SYMBOL;
        for (int i = 0; i < RESERVED_WORD_COUNT; i++) {
            if (GosToken::TokenName[i] == symbol) {
                type = (TokenType)i;
                break;
            }
        }
        if (type == SYMBOL) {
            return { type, symbol, lineCount };
        } else {
            return { type, lineCount };
        }
    }
}

// Assembly:
subq $0x2b8, %rsp            # imm = 0x2B8
movq %rdi, 0x78(%rsp)
movq %rdi, %rax
movq %rax, 0x80(%rsp)
movq %rdi, 0x2b0(%rsp)
movq %rsi, 0x2a8(%rsp)
movq 0x2a8(%rsp), %rax
movq %rax, 0x88(%rsp)
movb $0x0, 0x2a7(%rsp)
cmpb $0x0, 0x2a7(%rsp)
setne %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x1c3de2
jmp 0x1c3dfb
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
jmp 0x1c3dcf
jmp 0x1c3dfd
movsbl 0x2a7(%rsp), %ecx
movb $0x1, %al
cmpl $0x20, %ecx
movb %al, 0x77(%rsp)
je 0x1c3e48
movsbl 0x2a7(%rsp), %ecx
movb $0x1, %al
cmpl $0x9, %ecx
movb %al, 0x77(%rsp)
je 0x1c3e48
movsbl 0x2a7(%rsp), %ecx
movb $0x1, %al
cmpl $0xa, %ecx
movb %al, 0x77(%rsp)
je 0x1c3e48
movsbl 0x2a7(%rsp), %eax
cmpl $0xd, %eax
sete %al
movb %al, 0x77(%rsp)
movb 0x77(%rsp), %al
testb $0x1, %al
jne 0x1c3e52
jmp 0x1c3e8c
movsbl 0x2a7(%rsp), %eax
cmpl $0xa, %eax
jne 0x1c3e70
movq 0x88(%rsp), %rax
movl 0x8(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x8(%rax)
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
jmp 0x1c3dfd
movsbl 0x2a7(%rsp), %eax
cmpl $-0x1, %eax
jne 0x1c3eb8
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x38, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %edi
callq 0x132d0
cmpl $0x0, %eax
jne 0x1c3ef5
movsbl 0x2a7(%rsp), %eax
cmpl $0x2b, %eax
je 0x1c3ef5
movsbl 0x2a7(%rsp), %eax
cmpl $0x2d, %eax
je 0x1c3ef5
movsbl 0x2a7(%rsp), %eax
cmpl $0x2e, %eax
jne 0x1c452e
leaq 0x118(%rsp), %rdi
callq 0x131b0
leaq 0x128(%rsp), %rdi
movsbl 0x2a7(%rsp), %esi
callq 0x13400
jmp 0x1c3f19
movb 0x2a7(%rsp), %al
movb %al, 0x10b(%rsp)
movsbl 0x2a7(%rsp), %ecx
movb $0x1, %al
cmpl $0x2b, %ecx
movb %al, 0x76(%rsp)
je 0x1c3f4c
movsbl 0x2a7(%rsp), %eax
cmpl $0x2d, %eax
sete %al
movb %al, 0x76(%rsp)
movq 0x88(%rsp), %rax
movb 0x76(%rsp), %cl
andb $0x1, %cl
movb %cl, 0x10a(%rsp)
movb 0x2a7(%rsp), %cl
subb $0x2e, %cl
sete 0x109(%rsp)
movq (%rax), %rdi
callq 0x13560
movl %eax, 0x70(%rsp)
jmp 0x1c3f82
movl 0x70(%rsp), %eax
movb %al, 0x2a7(%rsp)
testb $0x1, 0x10a(%rsp)
je 0x1c4148
movsbl 0x2a7(%rsp), %edi
callq 0x132d0
cmpl $0x0, %eax
jne 0x1c4148
movsbl 0x10b(%rsp), %eax
cmpl $0x2b, %eax
jne 0x1c4098
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c4021
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x10, %esi
callq 0x1c3940
jmp 0x1c3feb
movl $0x1, 0x104(%rsp)
jmp 0x1c451c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x110(%rsp)
movl %eax, 0x10c(%rsp)
leaq 0x118(%rsp), %rdi
callq 0x13240
jmp 0x1c5252
movsbl 0x2a7(%rsp), %eax
cmpl $0x2b, %eax
jne 0x1c405a
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x18, %esi
callq 0x1c3940
jmp 0x1c404a
movl $0x1, 0x104(%rsp)
jmp 0x1c451c
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
jmp 0x1c406c
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x1a, %esi
callq 0x1c3940
jmp 0x1c4088
movl $0x1, 0x104(%rsp)
jmp 0x1c451c
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c40d1
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x11, %esi
callq 0x1c3940
jmp 0x1c40c1
movl $0x1, 0x104(%rsp)
jmp 0x1c451c
movsbl 0x2a7(%rsp), %eax
cmpl $0x2d, %eax
jne 0x1c410a
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x19, %esi
callq 0x1c3940
jmp 0x1c40fa
movl $0x1, 0x104(%rsp)
jmp 0x1c451c
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
jmp 0x1c411c
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x1b, %esi
callq 0x1c3940
jmp 0x1c4138
movl $0x1, 0x104(%rsp)
jmp 0x1c451c
testb $0x1, 0x109(%rsp)
je 0x1c41a2
movsbl 0x2a7(%rsp), %edi
callq 0x132d0
cmpl $0x0, %eax
jne 0x1c41a2
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
jmp 0x1c4176
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x2f, %esi
callq 0x1c3940
jmp 0x1c4192
movl $0x1, 0x104(%rsp)
jmp 0x1c451c
jmp 0x1c41a4
movsbl 0x2a7(%rsp), %edi
callq 0x132d0
movl %eax, %ecx
movb $0x1, %al
cmpl $0x0, %ecx
movb %al, 0x6f(%rsp)
jne 0x1c41d0
movsbl 0x2a7(%rsp), %eax
cmpl $0x2e, %eax
sete %al
movb %al, 0x6f(%rsp)
movb 0x6f(%rsp), %al
testb $0x1, %al
jne 0x1c41dd
jmp 0x1c42d9
movsbl 0x2a7(%rsp), %eax
cmpl $0x2e, %eax
jne 0x1c429c
testb $0x1, 0x109(%rsp)
je 0x1c4294
movq 0x13cded(%rip), %rdi    # 0x300ff0
leaq 0x5c9b2(%rip), %rsi     # 0x220bbc
callq 0x13380
movq %rax, 0x60(%rsp)
jmp 0x1c4216
movq 0x60(%rsp), %rdi
movq 0x88(%rsp), %rsi
addq $0x10, %rsi
callq 0x131a0
movq %rax, 0x58(%rsp)
jmp 0x1c4233
movq 0x58(%rsp), %rdi
leaq 0x48bb8(%rip), %rsi     # 0x20cdf7
callq 0x13380
movq %rax, 0x50(%rsp)
jmp 0x1c424b
movq 0x50(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %esi
callq 0x131d0
movq %rax, 0x48(%rsp)
jmp 0x1c4267
movq 0x48(%rsp), %rdi
leaq 0x5c97d(%rip), %rsi     # 0x220bf0
callq 0x13380
movq %rax, 0x40(%rsp)
jmp 0x1c427f
movq 0x40(%rsp), %rdi
movq 0x13cd55(%rip), %rsi    # 0x300fe0
callq 0x135d0
jmp 0x1c4292
jmp 0x1c4294
movb $0x1, 0x109(%rsp)
leaq 0x128(%rsp), %rdi
movsbl 0x2a7(%rsp), %esi
callq 0x13400
jmp 0x1c42b3
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movl %eax, 0x3c(%rsp)
jmp 0x1c42c9
movl 0x3c(%rsp), %eax
movb %al, 0x2a7(%rsp)
jmp 0x1c41a4
movq $0x0, 0xf8(%rsp)
testb $0x1, 0x109(%rsp)
je 0x1c4353
movsbl 0x2a7(%rsp), %eax
cmpl $0x66, %eax
jne 0x1c431d
leaq 0x118(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
callq 0x13530
jmp 0x1c4313
movb $0x3, 0x103(%rsp)
jmp 0x1c434e
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
jmp 0x1c432f
leaq 0x118(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
callq 0x13690
jmp 0x1c4346
movb $0x4, 0x103(%rsp)
jmp 0x1c44d4
movb $0x1, 0x103(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x69, %eax
jne 0x1c4414
leaq 0x118(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
callq 0x133c0
jmp 0x1c4383
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movl %eax, 0x38(%rsp)
jmp 0x1c4399
movl 0x38(%rsp), %eax
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x38, %eax
jne 0x1c43bb
movb $0x0, 0x103(%rsp)
jmp 0x1c440f
movsbl 0x2a7(%rsp), %eax
cmpl $0x33, %eax
jne 0x1c43e4
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
jmp 0x1c43da
movb $0x1, 0x103(%rsp)
jmp 0x1c440d
movsbl 0x2a7(%rsp), %eax
cmpl $0x36, %eax
jne 0x1c440b
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
jmp 0x1c4403
movb $0x2, 0x103(%rsp)
jmp 0x1c440d
jmp 0x1c440f
jmp 0x1c44d2
movsbl 0x2a7(%rsp), %eax
cmpl $0x6c, %eax
jne 0x1c4445
leaq 0x118(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
callq 0x133c0
jmp 0x1c4438
movb $0x2, 0x103(%rsp)
jmp 0x1c44d0
movsbl 0x2a7(%rsp), %eax
cmpl $0x66, %eax
jne 0x1c4473
leaq 0x118(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
callq 0x13530
jmp 0x1c4469
movb $0x3, 0x103(%rsp)
jmp 0x1c44ce
movsbl 0x2a7(%rsp), %eax
cmpl $0x64, %eax
jne 0x1c44a1
leaq 0x118(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
callq 0x13690
jmp 0x1c4497
movb $0x4, 0x103(%rsp)
jmp 0x1c44cc
leaq 0x118(%rsp), %rdi
leaq 0xf8(%rsp), %rsi
callq 0x133c0
jmp 0x1c44b8
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
jmp 0x1c44ca
jmp 0x1c44cc
jmp 0x1c44ce
jmp 0x1c44d0
jmp 0x1c44d2
jmp 0x1c44d4
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movsbl 0x103(%rsp), %edx
movq 0xf8(%rsp), %rcx
movq %rcx, 0xf0(%rsp)
movl 0x8(%rax), %r8d
movq 0xf0(%rsp), %rcx
movl $0x2b, %esi
callq 0x1c39c0
jmp 0x1c4511
movl $0x1, 0x104(%rsp)
leaq 0x118(%rsp), %rdi
callq 0x13240
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x2a, %eax
jne 0x1c45ad
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c457e
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x12, %esi
callq 0x1c3940
jmp 0x1c5242
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x1c, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x23, %eax
jne 0x1c462e
jmp 0x1c45bc
movsbl 0x2a7(%rsp), %ecx
xorl %eax, %eax
cmpl $0xa, %ecx
movb %al, 0x37(%rsp)
je 0x1c45f4
movsbl 0x2a7(%rsp), %ecx
xorl %eax, %eax
cmpl $0xd, %ecx
movb %al, 0x37(%rsp)
je 0x1c45f4
movsbl 0x2a7(%rsp), %eax
cmpl $-0x1, %eax
setne %al
movb %al, 0x37(%rsp)
movb 0x37(%rsp), %al
testb $0x1, %al
jne 0x1c45fe
jmp 0x1c4617
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
jmp 0x1c45bc
movq 0x88(%rsp), %rsi
movq 0x78(%rsp), %rdi
callq 0x1c3d90
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x2f, %eax
jne 0x1c4732
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x2f, %eax
jne 0x1c46d7
jmp 0x1c4665
movsbl 0x2a7(%rsp), %ecx
xorl %eax, %eax
cmpl $0xa, %ecx
movb %al, 0x36(%rsp)
je 0x1c469d
movsbl 0x2a7(%rsp), %ecx
xorl %eax, %eax
cmpl $0xd, %ecx
movb %al, 0x36(%rsp)
je 0x1c469d
movsbl 0x2a7(%rsp), %eax
cmpl $-0x1, %eax
setne %al
movb %al, 0x36(%rsp)
movb 0x36(%rsp), %al
testb $0x1, %al
jne 0x1c46a7
jmp 0x1c46c0
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
jmp 0x1c4665
movq 0x88(%rsp), %rsi
movq 0x78(%rsp), %rdi
callq 0x1c3d90
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c4703
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x13, %esi
callq 0x1c3940
jmp 0x1c5242
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x1e, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x25, %eax
jne 0x1c47b1
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c4782
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x14, %esi
callq 0x1c3940
jmp 0x1c5242
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x1f, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x5e, %eax
jne 0x1c4830
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c4801
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x15, %esi
callq 0x1c3940
jmp 0x1c5242
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x20, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c48af
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c4880
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x21, %esi
callq 0x1c3940
jmp 0x1c5242
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0xf, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x21, %eax
jne 0x1c492e
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c48ff
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x22, %esi
callq 0x1c3940
jmp 0x1c5242
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x27, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x3c, %eax
jne 0x1c49ad
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c497e
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x25, %esi
callq 0x1c3940
jmp 0x1c5242
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x23, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x3e, %eax
jne 0x1c4a2c
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c49fd
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x26, %esi
callq 0x1c3940
jmp 0x1c5242
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x24, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x26, %eax
jne 0x1c4adb
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c4a80
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x16, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x26, %eax
je 0x1c4abc
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x1d, %esi
callq 0x1c3940
jmp 0x1c5242
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x28, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x7c, %eax
jne 0x1c4b67
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movb %al, 0x2a7(%rsp)
movsbl 0x2a7(%rsp), %eax
cmpl $0x3d, %eax
jne 0x1c4b2b
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x17, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x7c, %eax
je 0x1c4b48
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x29, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x2c, %eax
jne 0x1c4b93
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x2d, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x3b, %eax
jne 0x1c4bbf
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x2e, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x3a, %eax
jne 0x1c4beb
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x30, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x3f, %eax
jne 0x1c4c17
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x31, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x28, %eax
jne 0x1c4c43
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x32, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x29, %eax
jne 0x1c4c6f
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x33, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x5b, %eax
jne 0x1c4c9b
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x34, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x5d, %eax
jne 0x1c4cc7
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x35, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x7b, %eax
jne 0x1c4cf3
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x36, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x7d, %eax
jne 0x1c4d1f
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x8(%rax), %edx
movl $0x37, %esi
callq 0x1c3940
jmp 0x1c5242
movsbl 0x2a7(%rsp), %eax
cmpl $0x22, %eax
jne 0x1c4f6d
movq 0x88(%rsp), %rax
movl 0x8(%rax), %eax
movl %eax, 0xec(%rsp)
leaq 0xc7(%rsp), %rdi
movq %rdi, 0x28(%rsp)
callq 0x13570
movq 0x28(%rsp), %rdx
leaq 0x5bf66(%rip), %rsi     # 0x220cc6
leaq 0xc8(%rsp), %rdi
callq 0x165520
jmp 0x1c4d6f
leaq 0xc7(%rsp), %rdi
callq 0x136a0
movq 0x88(%rsp), %rax
movb $0x0, 0xc6(%rsp)
movq (%rax), %rdi
callq 0x13560
movl %eax, 0x24(%rsp)
jmp 0x1c4d9a
movl 0x24(%rsp), %eax
movb %al, 0x2a7(%rsp)
movb $0x1, %al
testb $0x1, 0xc6(%rsp)
movb %al, 0x23(%rsp)
jne 0x1c4dc7
movsbl 0x2a7(%rsp), %eax
cmpl $0x22, %eax
setne %al
movb %al, 0x23(%rsp)
movb 0x23(%rsp), %al
testb $0x1, %al
jne 0x1c4dd4
jmp 0x1c4f30
testb $0x1, 0xc6(%rsp)
je 0x1c4eba
movsbl 0x2a7(%rsp), %eax
cmpl $0x6e, %eax
jne 0x1c4e54
leaq 0xc8(%rsp), %rdi
movl $0xa, %esi
callq 0x168440
jmp 0x1c4e03
jmp 0x1c4eb0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x110(%rsp)
movl %eax, 0x10c(%rsp)
leaq 0xc7(%rsp), %rdi
callq 0x136a0
jmp 0x1c5252
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x110(%rsp)
movl %eax, 0x10c(%rsp)
leaq 0xc8(%rsp), %rdi
callq 0x52f50
jmp 0x1c5252
movsbl 0x2a7(%rsp), %eax
cmpl $0x74, %eax
jne 0x1c4e77
leaq 0xc8(%rsp), %rdi
movl $0x9, %esi
callq 0x168440
jmp 0x1c4e75
jmp 0x1c4eae
movsbl 0x2a7(%rsp), %eax
cmpl $0xa, %eax
jne 0x1c4e95
movq 0x88(%rsp), %rax
movl 0x8(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x8(%rax)
movsbl 0x2a7(%rsp), %esi
leaq 0xc8(%rsp), %rdi
callq 0x168440
jmp 0x1c4eac
jmp 0x1c4eae
jmp 0x1c4eb0
movb $0x0, 0xc6(%rsp)
jmp 0x1c4f0a
movsbl 0x2a7(%rsp), %eax
cmpl $0x5c, %eax
jne 0x1c4ed1
movb $0x1, 0xc6(%rsp)
jmp 0x1c4f08
movsbl 0x2a7(%rsp), %eax
cmpl $0xa, %eax
jne 0x1c4eef
movq 0x88(%rsp), %rax
movl 0x8(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x8(%rax)
movsbl 0x2a7(%rsp), %esi
leaq 0xc8(%rsp), %rdi
callq 0x168440
jmp 0x1c4f06
jmp 0x1c4f08
jmp 0x1c4f0a
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movl %eax, 0x1c(%rsp)
jmp 0x1c4f20
movl 0x1c(%rsp), %eax
movb %al, 0x2a7(%rsp)
jmp 0x1c4da5
movq 0x78(%rsp), %rdi
movl 0xec(%rsp), %ecx
movl $0x2c, %esi
leaq 0xc8(%rsp), %rdx
callq 0x1c3980
jmp 0x1c4f50
movl $0x1, 0x104(%rsp)
leaq 0xc8(%rsp), %rdi
callq 0x52f50
jmp 0x1c5242
leaq 0x9f(%rsp), %rdi
movq %rdi, 0x10(%rsp)
callq 0x13570
movq 0x10(%rsp), %rdx
leaq 0x5bd3b(%rip), %rsi     # 0x220cc6
leaq 0xa0(%rsp), %rdi
callq 0x165520
jmp 0x1c4f9a
leaq 0x9f(%rsp), %rdi
callq 0x136a0
movsbl 0x2a7(%rsp), %esi
leaq 0xa0(%rsp), %rdi
callq 0x168440
jmp 0x1c4fbe
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movl %eax, 0xc(%rsp)
jmp 0x1c4fd4
movl 0xc(%rsp), %eax
movb %al, 0x2a7(%rsp)
movb $0x0, 0x9e(%rsp)
movsbl 0x2a7(%rsp), %edi
callq 0x13290
movl %eax, %ecx
movb $0x1, %al
cmpl $0x0, %ecx
movb %al, 0xb(%rsp)
jne 0x1c5026
movsbl 0x2a7(%rsp), %ecx
movb $0x1, %al
cmpl $0x3a, %ecx
movb %al, 0xb(%rsp)
je 0x1c5026
movsbl 0x2a7(%rsp), %eax
cmpl $0x5f, %eax
sete %al
movb %al, 0xb(%rsp)
movb 0xb(%rsp), %al
testb $0x1, %al
jne 0x1c5033
jmp 0x1c5124
testb $0x1, 0x9e(%rsp)
je 0x1c50ba
movsbl 0x2a7(%rsp), %eax
cmpl $0x3a, %eax
je 0x1c50ba
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
jmp 0x1c505c
leaq 0xa0(%rsp), %rdi
callq 0x11be80
jmp 0x1c5124
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x110(%rsp)
movl %eax, 0x10c(%rsp)
leaq 0x9f(%rsp), %rdi
callq 0x136a0
jmp 0x1c5252
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x110(%rsp)
movl %eax, 0x10c(%rsp)
leaq 0xa0(%rsp), %rdi
callq 0x52f50
jmp 0x1c5252
movsbl 0x2a7(%rsp), %ecx
xorl %eax, %eax
cmpl $0x3a, %ecx
movb %al, 0xa(%rsp)
jne 0x1c50da
movb 0x9e(%rsp), %al
xorb $-0x1, %al
movb %al, 0xa(%rsp)
movb 0xa(%rsp), %al
andb $0x1, %al
movb %al, 0x9e(%rsp)
movsbl 0x2a7(%rsp), %esi
leaq 0xa0(%rsp), %rdi
callq 0x168440
jmp 0x1c50fe
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x13560
movl %eax, 0x4(%rsp)
jmp 0x1c5114
movl 0x4(%rsp), %eax
movb %al, 0x2a7(%rsp)
jmp 0x1c4fe7
testb $0x1, 0x9e(%rsp)
je 0x1c514f
leaq 0xa0(%rsp), %rdi
callq 0x11be80
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
jmp 0x1c514d
jmp 0x1c514f
movq 0x88(%rsp), %rax
movq (%rax), %rdi
callq 0x133e0
jmp 0x1c5161
movl $0x2a, 0x98(%rsp)
movl $0x0, 0x94(%rsp)
cmpl $0xf, 0x94(%rsp)
jge 0x1c51cf
movslq 0x94(%rsp), %rax
leaq 0x13c950(%rip), %rdi    # 0x301ae0
shlq $0x5, %rax
addq %rax, %rdi
leaq 0xa0(%rsp), %rsi
callq 0x111710
testb $0x1, %al
jne 0x1c51aa
jmp 0x1c51ba
movl 0x94(%rsp), %eax
movl %eax, 0x98(%rsp)
jmp 0x1c51cf
jmp 0x1c51bc
movl 0x94(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x94(%rsp)
jmp 0x1c5177
cmpl $0x2a, 0x98(%rsp)
jne 0x1c520c
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x98(%rsp), %esi
movl 0x8(%rax), %ecx
leaq 0xa0(%rsp), %rdx
callq 0x1c3980
jmp 0x1c51ff
movl $0x1, 0x104(%rsp)
jmp 0x1c5235
movq 0x78(%rsp), %rdi
movq 0x88(%rsp), %rax
movl 0x98(%rsp), %esi
movl 0x8(%rax), %edx
callq 0x1c3940
jmp 0x1c522a
movl $0x1, 0x104(%rsp)
leaq 0xa0(%rsp), %rdi
callq 0x52f50
movq 0x80(%rsp), %rax
addq $0x2b8, %rsp            # imm = 0x2B8
retq
movq 0x110(%rsp), %rdi
callq 0x133f0
nop