// File: /workspace/github_c_makefile_star2_O0/nilyang[P]redis-tdd-annotation/src/cluster.c
// Function: clusterLoadConfig
int clusterLoadConfig(char *filename) {
    FILE *fp = fopen(filename,"r");
    struct stat sb;
    char *line;
    int maxline, j;

    if (fp == NULL) {
        if (errno == ENOENT) {
            return REDIS_ERR;
        } else {
            redisLog(REDIS_WARNING,
                "Loading the cluster node config from %s: %s",
                filename, strerror(errno));
            exit(1);
        }
    }

    /* Check if the file is zero-length: if so return REDIS_ERR to signal
     * we have to write the config. */
    if (fstat(fileno(fp),&sb) != -1 && sb.st_size == 0) {
        fclose(fp);
        return REDIS_ERR;
    }

    /* Parse the file. Note that single liens of the cluster config file can
     * be really long as they include all the hash slots of the node.
     * 集群配置文件中的行可能会非常长，
     * 因为它会在行里面记录所有哈希槽的节点。
     *
     * This means in the worst possible case, half of the Redis slots will be
     * present in a single line, possibly in importing or migrating state, so
     * together with the node ID of the sender/receiver.
     *
     * 在最坏情况下，一个行可能保存了半数的哈希槽数据，
     * 并且可能带有导入或导出状态，以及发送者和接受者的 ID 。
     *
     * To simplify we allocate 1024+REDIS_CLUSTER_SLOTS*128 bytes per line. 
     *
     * 为了简单起见，我们为每行分配 1024+REDIS_CLUSTER_SLOTS*128 字节的空间
     */
    maxline = 1024+REDIS_CLUSTER_SLOTS*128;
    line = zmalloc(maxline);
    while(fgets(line,maxline,fp) != NULL) {
        int argc;
        sds *argv;
        clusterNode *n, *master;
        char *p, *s;

        /* Skip blank lines, they can be created either by users manually
         * editing nodes.conf or by the config writing process if stopped
         * before the truncate() call. */
        if (line[0] == '\n') continue;

        /* Split the line into arguments for processing. */
        argv = sdssplitargs(line,&argc);
        if (argv == NULL) goto fmterr;

        /* Handle the special "vars" line. Don't pretend it is the last
         * line even if it actually is when generated by Redis. */
        if (strcasecmp(argv[0],"vars") == 0) {
            for (j = 1; j < argc; j += 2) {
                if (strcasecmp(argv[j],"currentEpoch") == 0) {
                    server.cluster->currentEpoch =
                            strtoull(argv[j+1],NULL,10);
                } else if (strcasecmp(argv[j],"lastVoteEpoch") == 0) {
                    server.cluster->lastVoteEpoch =
                            strtoull(argv[j+1],NULL,10);
                } else {
                    redisLog(REDIS_WARNING,
                        "Skipping unknown cluster config variable '%s'",
                        argv[j]);
                }
            }
            continue;
        }

        /* Create this node if it does not exist */
        // 检查节点是否已经存在
        n = clusterLookupNode(argv[0]);
        if (!n) {
            // 未存在则创建这个节点
            n = createClusterNode(argv[0],0);
            clusterAddNode(n);
        }
        /* Address and port */
        // 设置节点的 ip 和 port
        if ((p = strchr(argv[1],':')) == NULL) goto fmterr;
        *p = '\0';
        memcpy(n->ip,argv[1],strlen(argv[1])+1);
        n->port = atoi(p+1);

        /* Parse flags */
        // 分析节点的 flag
        p = s = argv[2];
        while(p) {
            p = strchr(s,',');
            if (p) *p = '\0';
            // 这是节点本身
            if (!strcasecmp(s,"myself")) {
                redisAssert(server.cluster->myself == NULL);
                myself = server.cluster->myself = n;
                n->flags |= REDIS_NODE_MYSELF;
            // 这是一个主节点
            } else if (!strcasecmp(s,"master")) {
                n->flags |= REDIS_NODE_MASTER;
            // 这是一个从节点
            } else if (!strcasecmp(s,"slave")) {
                n->flags |= REDIS_NODE_SLAVE;
            // 这是一个疑似下线节点
            } else if (!strcasecmp(s,"fail?")) {
                n->flags |= REDIS_NODE_PFAIL;
            // 这是一个已下线节点
            } else if (!strcasecmp(s,"fail")) {
                n->flags |= REDIS_NODE_FAIL;
                n->fail_time = mstime();
            // 等待向节点发送 PING
            } else if (!strcasecmp(s,"handshake")) {
                n->flags |= REDIS_NODE_HANDSHAKE;
            // 尚未获得这个节点的地址
            } else if (!strcasecmp(s,"noaddr")) {
                n->flags |= REDIS_NODE_NOADDR;
            // 无 flag
            } else if (!strcasecmp(s,"noflags")) {
                /* nothing to do */
            } else {
                redisPanic("Unknown flag in redis cluster config file");
            }
            if (p) s = p+1;
        }

        /* Get master if any. Set the master and populate master's
         * slave list. */
        // 如果有主节点的话，那么设置主节点
        if (argv[3][0] != '-') {
            master = clusterLookupNode(argv[3]);
            // 如果主节点不存在，那么添加它
            if (!master) {
                master = createClusterNode(argv[3],0);
                clusterAddNode(master);
            }
            // 设置主节点
            n->slaveof = master;
            // 将节点 n 加入到主节点 master 的从节点名单中
            clusterNodeAddSlave(master,n);
        }

        /* Set ping sent / pong received timestamps */
        // 设置最近一次发送 PING 命令以及接收 PING 命令回复的时间戳
        if (atoi(argv[4])) n->ping_sent = mstime();
        if (atoi(argv[5])) n->pong_received = mstime();

        /* Set configEpoch for this node. */
        // 设置配置纪元
        n->configEpoch = strtoull(argv[6],NULL,10);

        /* Populate hash slots served by this instance. */
        // 取出节点服务的槽
        for (j = 8; j < argc; j++) {
            int start, stop;

            // 正在导入或导出槽
            if (argv[j][0] == '[') {
                /* Here we handle migrating / importing slots */
                int slot;
                char direction;
                clusterNode *cn;

                p = strchr(argv[j],'-');
                redisAssert(p != NULL);
                *p = '\0';
                // 导入 or 导出？
                direction = p[1]; /* Either '>' or '<' */
                // 槽
                slot = atoi(argv[j]+1);
                p += 3;
                // 目标节点
                cn = clusterLookupNode(p);
                // 如果目标不存在，那么创建
                if (!cn) {
                    cn = createClusterNode(p,0);
                    clusterAddNode(cn);
                }
                // 根据方向，设定本节点要导入或者导出的槽的目标
                if (direction == '>') {
                    server.cluster->migrating_slots_to[slot] = cn;
                } else {
                    server.cluster->importing_slots_from[slot] = cn;
                }
                continue;

            // 没有导入或导出，这是一个区间范围的槽
            // 比如 0 - 10086
            } else if ((p = strchr(argv[j],'-')) != NULL) {
                *p = '\0';
                start = atoi(argv[j]);
                stop = atoi(p+1);

            // 没有导入或导出，这是单一个槽
            // 比如 10086
            } else {
                start = stop = atoi(argv[j]);
            }

            // 将槽载入节点
            while(start <= stop) clusterAddSlot(n, start++);
        }

        sdsfreesplitres(argv,argc);
    }
    zfree(line);
    fclose(fp);

    /* Config sanity check */
    redisAssert(server.cluster->myself != NULL);
    redisLog(REDIS_NOTICE,"Node configuration loaded, I'm %.40s", myself->name);

    /* Something that should never happen: currentEpoch smaller than
     * the max epoch found in the nodes configuration. However we handle this
     * as some form of protection against manual editing of critical files. */
    if (clusterGetMaxEpoch() > server.cluster->currentEpoch) {
        server.cluster->currentEpoch = clusterGetMaxEpoch();
    }
    return REDIS_OK;

fmterr:
    redisLog(REDIS_WARNING,
        "Unrecoverable error: corrupted cluster config file.");
    fclose(fp);
    exit(1);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x120, %rsp            # imm = 0x120
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
leaq 0x78ce9(%rip), %rsi     # 0xe0cd3
callq 0x1fa70
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0x6804e
callq 0x1f820
cmpl $0x2, (%rax)
jne 0x68010
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x689a4
movq -0x10(%rbp), %rax
movq %rax, -0x108(%rbp)
callq 0x1f820
movl (%rax), %edi
callq 0x1f630
movq -0x108(%rbp), %rdx
movq %rax, %rcx
movl $0x3, %edi
leaq 0x7dbcf(%rip), %rsi     # 0xe5c0c
movb $0x0, %al
callq 0x24fb0
movl $0x1, %edi
callq 0x1f2c0
movq -0x18(%rbp), %rdi
callq 0x1f070
movl %eax, %edi
leaq -0xa8(%rbp), %rsi
callq 0x1f690
cmpl $-0x1, %eax
je 0x68086
cmpq $0x0, -0x78(%rbp)
jne 0x68086
movq -0x18(%rbp), %rdi
callq 0x1f9b0
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x689a4
movl $0x200400, -0xb4(%rbp)  # imm = 0x200400
movslq -0xb4(%rbp), %rdi
callq 0x2e130
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rdi
movl -0xb4(%rbp), %esi
movq -0x18(%rbp), %rdx
callq 0x1f430
cmpq $0x0, %rax
je 0x688d7
movq -0xb0(%rbp), %rax
movsbl (%rax), %eax
cmpl $0xa, %eax
jne 0x680d4
jmp 0x680a3
movq -0xb0(%rbp), %rdi
leaq -0xbc(%rbp), %rsi
callq 0x2db50
movq %rax, -0xc8(%rbp)
cmpq $0x0, -0xc8(%rbp)
jne 0x680fd
jmp 0x6897e
movq -0xc8(%rbp), %rax
movq (%rax), %rdi
leaq 0x7db2a(%rip), %rsi     # 0xe5c38
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x6823e
movl $0x1, -0xb8(%rbp)
movl -0xb8(%rbp), %eax
cmpl -0xbc(%rbp), %eax
jge 0x68239
movq -0xc8(%rbp), %rax
movslq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
leaq 0x7daec(%rip), %rsi     # 0xe5c3d
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x6819a
movq -0xc8(%rbp), %rax
movl -0xb8(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movq (%rax,%rcx,8), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x1fa10
movq %rax, %rcx
leaq 0xab76e(%rip), %rax     # 0x1138f8
movq 0x7d0(%rax), %rax
movq %rcx, 0x8(%rax)
jmp 0x68223
movq -0xc8(%rbp), %rax
movslq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
leaq 0x7da97(%rip), %rsi     # 0xe5c4a
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x681fc
movq -0xc8(%rbp), %rax
movl -0xb8(%rbp), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movq (%rax,%rcx,8), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x1fa10
movq %rax, %rcx
leaq 0xab70c(%rip), %rax     # 0x1138f8
movq 0x7d0(%rax), %rax
movq %rcx, 0x60070(%rax)
jmp 0x68221
movq -0xc8(%rbp), %rax
movslq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rdx
movl $0x3, %edi
leaq 0x7da3e(%rip), %rsi     # 0xe5c58
movb $0x0, %al
callq 0x24fb0
jmp 0x68223
jmp 0x68225
movl -0xb8(%rbp), %eax
addl $0x2, %eax
movl %eax, -0xb8(%rbp)
jmp 0x68126
jmp 0x680a3
movq -0xc8(%rbp), %rax
movq (%rax), %rdi
callq 0x689b0
movq %rax, -0xd0(%rbp)
cmpq $0x0, -0xd0(%rbp)
jne 0x68282
movq -0xc8(%rbp), %rax
movq (%rax), %rdi
xorl %esi, %esi
callq 0x68a20
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rdi
callq 0x68bb0
movq -0xc8(%rbp), %rax
movq 0x8(%rax), %rdi
movl $0x3a, %esi
callq 0x1f790
movq %rax, -0xe0(%rbp)
cmpq $0x0, %rax
jne 0x682a9
jmp 0x6897e
movq -0xe0(%rbp), %rax
movb $0x0, (%rax)
movq -0xd0(%rbp), %rax
addq $0x888, %rax            # imm = 0x888
movq %rax, -0x118(%rbp)
movq -0xc8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x110(%rbp)
movq -0xc8(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x1f4d0
movq -0x118(%rbp), %rdi
movq -0x110(%rbp), %rsi
movq %rax, %rdx
addq $0x1, %rdx
callq 0x1fbf0
movq -0xe0(%rbp), %rdi
addq $0x1, %rdi
callq 0x1f700
movl %eax, %ecx
movq -0xd0(%rbp), %rax
movl %ecx, 0x8b8(%rax)
movq -0xc8(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0xe8(%rbp)
movq %rax, -0xe0(%rbp)
cmpq $0x0, -0xe0(%rbp)
je 0x68582
movq -0xe8(%rbp), %rdi
movl $0x2c, %esi
callq 0x1f790
movq %rax, -0xe0(%rbp)
cmpq $0x0, -0xe0(%rbp)
je 0x68375
movq -0xe0(%rbp), %rax
movb $0x0, (%rax)
movq -0xe8(%rbp), %rdi
leaq 0x7e51c(%rip), %rsi     # 0xe689f
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x683f9
leaq 0xab564(%rip), %rax     # 0x1138f8
movq 0x7d0(%rax), %rax
cmpq $0x0, (%rax)
jne 0x683a3
jmp 0x683c5
leaq 0x7d8dc(%rip), %rdi     # 0xe5c86
leaq 0x7d8f4(%rip), %rsi     # 0xe5ca5
movl $0xcc, %edx
callq 0x63ca0
movl $0x1, %edi
callq 0x1f3b0
movq -0xd0(%rbp), %rax
leaq 0xab525(%rip), %rcx     # 0x1138f8
movq 0x7d0(%rcx), %rcx
movq %rax, (%rcx)
movq %rax, 0xbfb94(%rip)     # 0x127f78
movq -0xd0(%rbp), %rax
movl 0x30(%rax), %ecx
orl $0x10, %ecx
movl %ecx, 0x30(%rax)
jmp 0x68561
movq -0xe8(%rbp), %rdi
leaq 0x7ea28(%rip), %rsi     # 0xe6e2f
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x68426
movq -0xd0(%rbp), %rax
movl 0x30(%rax), %ecx
orl $0x1, %ecx
movl %ecx, 0x30(%rax)
jmp 0x6855f
movq -0xe8(%rbp), %rdi
leaq 0x7ea2e(%rip), %rsi     # 0xe6e62
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x68453
movq -0xd0(%rbp), %rax
movl 0x30(%rax), %ecx
orl $0x2, %ecx
movl %ecx, 0x30(%rax)
jmp 0x6855d
movq -0xe8(%rbp), %rdi
leaq 0x7d84e(%rip), %rsi     # 0xe5caf
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x68480
movq -0xd0(%rbp), %rax
movl 0x30(%rax), %ecx
orl $0x4, %ecx
movl %ecx, 0x30(%rax)
jmp 0x6855b
movq -0xe8(%rbp), %rdi
leaq 0x7d827(%rip), %rsi     # 0xe5cb5
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x684c3
movq -0xd0(%rbp), %rax
movl 0x30(%rax), %ecx
orl $0x8, %ecx
movl %ecx, 0x30(%rax)
callq 0x252e0
movq %rax, %rcx
movq -0xd0(%rbp), %rax
movq %rcx, 0x868(%rax)
jmp 0x68559
movq -0xe8(%rbp), %rdi
leaq 0x7d7e9(%rip), %rsi     # 0xe5cba
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x684ed
movq -0xd0(%rbp), %rax
movl 0x30(%rax), %ecx
orl $0x20, %ecx
movl %ecx, 0x30(%rax)
jmp 0x68557
movq -0xe8(%rbp), %rdi
leaq 0x7d7c9(%rip), %rsi     # 0xe5cc4
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x68517
movq -0xd0(%rbp), %rax
movl 0x30(%rax), %ecx
orl $0x40, %ecx
movl %ecx, 0x30(%rax)
jmp 0x68555
movq -0xe8(%rbp), %rdi
leaq 0x7d7a6(%rip), %rsi     # 0xe5ccb
callq 0x1f2f0
cmpl $0x0, %eax
jne 0x68531
jmp 0x68553
leaq 0x7d79b(%rip), %rdi     # 0xe5cd3
leaq 0x7d766(%rip), %rsi     # 0xe5ca5
movl $0xe6, %edx
callq 0x63d40
movl $0x1, %edi
callq 0x1f3b0
jmp 0x68555
jmp 0x68557
jmp 0x68559
jmp 0x6855b
jmp 0x6855d
jmp 0x6855f
jmp 0x68561
cmpq $0x0, -0xe0(%rbp)
je 0x6857d
movq -0xe0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xe8(%rbp)
jmp 0x6833b
movq -0xc8(%rbp), %rax
movq 0x18(%rax), %rax
movsbl (%rax), %eax
cmpl $0x2d, %eax
je 0x68603
movq -0xc8(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x689b0
movq %rax, -0xd8(%rbp)
cmpq $0x0, -0xd8(%rbp)
jne 0x685db
movq -0xc8(%rbp), %rax
movq 0x18(%rax), %rdi
xorl %esi, %esi
callq 0x68a20
movq %rax, -0xd8(%rbp)
movq -0xd8(%rbp), %rdi
callq 0x68bb0
movq -0xd8(%rbp), %rcx
movq -0xd0(%rbp), %rax
movq %rcx, 0x850(%rax)
movq -0xd8(%rbp), %rdi
movq -0xd0(%rbp), %rsi
callq 0x68c10
movq -0xc8(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x1f700
cmpl $0x0, %eax
je 0x6862e
callq 0x252e0
movq %rax, %rcx
movq -0xd0(%rbp), %rax
movq %rcx, 0x858(%rax)
movq -0xc8(%rbp), %rax
movq 0x28(%rax), %rdi
callq 0x1f700
cmpl $0x0, %eax
je 0x68659
callq 0x252e0
movq %rax, %rcx
movq -0xd0(%rbp), %rax
movq %rcx, 0x860(%rax)
movq -0xc8(%rbp), %rax
movq 0x30(%rax), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0xa, %edx
callq 0x1fa10
movq %rax, %rcx
movq -0xd0(%rbp), %rax
movq %rcx, 0x38(%rax)
movl $0x8, -0xb8(%rbp)
movl -0xb8(%rbp), %eax
cmpl -0xbc(%rbp), %eax
jge 0x688c0
movq -0xc8(%rbp), %rax
movslq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsbl (%rax), %eax
cmpl $0x5b, %eax
jne 0x687ee
movq -0xc8(%rbp), %rax
movslq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movl $0x2d, %esi
callq 0x1f790
movq %rax, -0xe0(%rbp)
cmpq $0x0, -0xe0(%rbp)
je 0x686e9
jmp 0x6870b
leaq 0x7ac34(%rip), %rdi     # 0xe3324
leaq 0x7d5ae(%rip), %rsi     # 0xe5ca5
movl $0x111, %edx            # imm = 0x111
callq 0x63ca0
movl $0x1, %edi
callq 0x1f3b0
movq -0xe0(%rbp), %rax
movb $0x0, (%rax)
movq -0xe0(%rbp), %rax
movb 0x1(%rax), %al
movb %al, -0xf5(%rbp)
movq -0xc8(%rbp), %rax
movslq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
addq $0x1, %rdi
callq 0x1f700
movl %eax, -0xf4(%rbp)
movq -0xe0(%rbp), %rax
addq $0x3, %rax
movq %rax, -0xe0(%rbp)
movq -0xe0(%rbp), %rdi
callq 0x689b0
movq %rax, -0x100(%rbp)
cmpq $0x0, -0x100(%rbp)
jne 0x68796
movq -0xe0(%rbp), %rdi
xorl %esi, %esi
callq 0x68a20
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rdi
callq 0x68bb0
movsbl -0xf5(%rbp), %eax
cmpl $0x3e, %eax
jne 0x687c5
movq -0x100(%rbp), %rdx
leaq 0xab148(%rip), %rax     # 0x1138f8
movq 0x7d0(%rax), %rax
movslq -0xf4(%rbp), %rcx
movq %rdx, 0x28(%rax,%rcx,8)
jmp 0x687e9
movq -0x100(%rbp), %rdx
leaq 0xab125(%rip), %rax     # 0x1138f8
movq 0x7d0(%rax), %rax
movslq -0xf4(%rbp), %rcx
movq %rdx, 0x20028(%rax,%rcx,8)
jmp 0x688ac
movq -0xc8(%rbp), %rax
movslq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
movl $0x2d, %esi
callq 0x1f790
movq %rax, -0xe0(%rbp)
cmpq $0x0, %rax
je 0x68856
movq -0xe0(%rbp), %rax
movb $0x0, (%rax)
movq -0xc8(%rbp), %rax
movslq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x1f700
movl %eax, -0xec(%rbp)
movq -0xe0(%rbp), %rdi
addq $0x1, %rdi
callq 0x1f700
movl %eax, -0xf0(%rbp)
jmp 0x68879
movq -0xc8(%rbp), %rax
movslq -0xb8(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x1f700
movl %eax, -0xf0(%rbp)
movl %eax, -0xec(%rbp)
jmp 0x6887b
jmp 0x6887d
movl -0xec(%rbp), %eax
cmpl -0xf0(%rbp), %eax
jg 0x688aa
movq -0xd0(%rbp), %rdi
movl -0xec(%rbp), %esi
movl %esi, %eax
addl $0x1, %eax
movl %eax, -0xec(%rbp)
callq 0x68ce0
jmp 0x6887d
jmp 0x688ac
movl -0xb8(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xb8(%rbp)
jmp 0x6868a
movq -0xc8(%rbp), %rdi
movl -0xbc(%rbp), %esi
callq 0x2d7d0
jmp 0x680a3
movq -0xb0(%rbp), %rdi
callq 0x2e3a0
movq -0x18(%rbp), %rdi
callq 0x1f9b0
leaq 0xab005(%rip), %rax     # 0x1138f8
movq 0x7d0(%rax), %rax
cmpq $0x0, (%rax)
je 0x68902
jmp 0x68924
leaq 0x7d3f6(%rip), %rdi     # 0xe5cff
leaq 0x7d395(%rip), %rsi     # 0xe5ca5
movl $0x13e, %edx            # imm = 0x13E
callq 0x63ca0
movl $0x1, %edi
callq 0x1f3b0
movq 0xbf64d(%rip), %rdx     # 0x127f78
addq $0x8, %rdx
movl $0x2, %edi
leaq 0x7d3e3(%rip), %rsi     # 0xe5d1e
movb $0x0, %al
callq 0x24fb0
callq 0x67f20
leaq 0xaafaa(%rip), %rcx     # 0x1138f8
movq 0x7d0(%rcx), %rcx
cmpq 0x8(%rcx), %rax
jbe 0x68975
callq 0x67f20
movq %rax, %rcx
leaq 0xaaf8e(%rip), %rax     # 0x1138f8
movq 0x7d0(%rax), %rax
movq %rcx, 0x8(%rax)
movl $0x0, -0x4(%rbp)
jmp 0x689a4
movl $0x3, %edi
leaq 0x7d3b9(%rip), %rsi     # 0xe5d43
movb $0x0, %al
callq 0x24fb0
movq -0x18(%rbp), %rdi
callq 0x1f9b0
movl $0x1, %edi
callq 0x1f2c0
movl -0x4(%rbp), %eax
addq $0x120, %rsp            # imm = 0x120
popq %rbp
retq