user: What is the c source code of the assembly code below:

```asm
<CheckUserinfo>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0xc(%rbp)
  movl   $0x0,-0x14(%rbp)
  movl   $0x0,-0x10(%rbp)
  cmpl   $0x0,-0xc(%rbp)
  jg     L502
  lea    D2(%rip),%rax
  jmp    L274
L502:
  cmpl   $0x3d4,-0xc(%rbp)
  jle    L213
  lea    D102(%rip),%rax
  jmp    L274
L213:
  mov    -0x30(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  je     L167
  lea    D127(%rip),%rax
  jmp    L274
L167:
  mov    -0xc(%rbp),%eax
  cltq
  lea    -0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L645
  lea    D42(%rip),%rax
  jmp    L274
L645:
  movl   $0x0,-0x18(%rbp)
  jmp    L44
L408:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L414
  addl   $0x1,-0x14(%rbp)
L414:
  addl   $0x1,-0x18(%rbp)
L44:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L408
  mov    -0x14(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L693
  lea    D142(%rip),%rax
  jmp    L274
L693:
  cmpl   $0x4,-0xc(%rbp)
  jle    L279
  movl   $0x0,-0x18(%rbp)
  jmp    L81
L80:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L598
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x69,%al
  jne    L598
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x70,%al
  jne    L598
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x3(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L598
  addl   $0x1,-0x10(%rbp)
L598:
  addl   $0x1,-0x18(%rbp)
L81:
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x3(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L80
L279:
  cmpl   $0x0,-0x10(%rbp)
  jne    L520
  lea    D60(%rip),%rax
  jmp    L274
L520:
  cmpl   $0x1,-0x10(%rbp)
  jle    L302
  lea    D62(%rip),%rax
  jmp    L274
L302:
  mov    -0x30(%rbp),%rax
  lea    D141(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <Info_ValueForKey@plt>
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <GetParsedIP@plt>
  test   %eax,%eax
  jne    L191
  lea    D114(%rip),%rax
  jmp    L274
L191:
  movl   $0x0,-0x10(%rbp)
  cmpl   $0x9,-0xc(%rbp)
  jle    L412
  movl   $0x0,-0x18(%rbp)
  jmp    L205
L260:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L726
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x63,%al
  jne    L726
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6c,%al
  jne    L726
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x3(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5f,%al
  jne    L726
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x4(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x67,%al
  jne    L726
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x5(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x75,%al
  jne    L726
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x6(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x69,%al
  jne    L726
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x7(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x64,%al
  jne    L726
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x8(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L726
  addl   $0x1,-0x10(%rbp)
L726:
  addl   $0x1,-0x18(%rbp)
L205:
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x8(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L260
L412:
  cmpl   $0x1,-0x10(%rbp)
  jle    L321
  lea    D4(%rip),%rax
  jmp    L274
L321:
  movl   $0x0,-0x10(%rbp)
  cmpl   $0x6,-0xc(%rbp)
  jle    L154
  movl   $0x0,-0x18(%rbp)
  jmp    L644
L707:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L730
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6e,%al
  jne    L730
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L730
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x3(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6d,%al
  jne    L730
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x4(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L730
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x5(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L730
  addl   $0x1,-0x10(%rbp)
L730:
  addl   $0x1,-0x18(%rbp)
L644:
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x5(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L707
L154:
  cmpl   $0x0,-0x10(%rbp)
  jne    L25
  lea    D38(%rip),%rax
  jmp    L274
L25:
  cmpl   $0x1,-0x10(%rbp)
  jle    L529
  lea    D9(%rip),%rax
  jmp    L274
L529:
  movl   $0x0,-0x10(%rbp)
  cmpl   $0xf,-0xc(%rbp)
  jle    L744
  movl   $0x0,-0x18(%rbp)
  jmp    L89
L606:
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x63,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6c,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x3(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5f,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x4(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x70,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x5(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x75,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x6(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6e,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x7(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x6b,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x8(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x62,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x9(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x75,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0xa(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x73,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0xb(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x74,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0xc(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0xd(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x72,%al
  jne    L125
  mov    -0x18(%rbp),%eax
  cltq
  lea    0xe(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L125
  addl   $0x1,-0x10(%rbp)
L125:
  addl   $0x1,-0x18(%rbp)
L89:
  mov    -0x18(%rbp),%eax
  cltq
  lea    0xe(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L606
L744:
  cmpl   $0x1,-0x10(%rbp)
  jle    L489
  lea    D34(%rip),%rax
  jmp    L274
L489:
  mov    -0x30(%rbp),%rax
  lea    D120(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <Info_ValueForKey@plt>
  cltq
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  je     L36
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L632
L36:
  lea    D103(%rip),%rax
  jmp    L274
L632:
  mov    $0x0,%eax
L274:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D2
type_infered: string
name: unpack_data
arguments: data_label: D102
type_infered: string
name: unpack_data
arguments: data_label: D127
type_infered: string
name: unpack_data
arguments: data_label: D42
type_infered: string
name: unpack_data
arguments: data_label: D142
type_infered: string
name: unpack_data
arguments: data_label: D60
type_infered: string
name: unpack_data
arguments: data_label: D62
type_infered: string
name: unpack_data
arguments: data_label: D141
type_infered: string
name: unpack_data
arguments: data_label: D114
type_infered: string
name: unpack_data
arguments: data_label: D4
type_infered: string
name: unpack_data
arguments: data_label: D38
type_infered: string
name: unpack_data
arguments: data_label: D9
type_infered: string
name: unpack_data
arguments: data_label: D34
type_infered: string
name: unpack_data
arguments: data_label: D120
type_infered: string
name: unpack_data
arguments: data_label: D103
type_infered: string

tool: D2: Userinfo too short

tool: D102: Userinfo too long.

tool: D127: Missing leading slash in userinfo.

tool: D42: Trailing slash in userinfo.

tool: D142: Bad number of slashes in userinfo.

tool: D60: Missing IP in userinfo.

tool: D62: Too many IP fields in userinfo.

tool: D141: ip

tool: D114: Malformed IP in userinfo.

tool: D4: Too many cl_guid fields in userinfo.

tool: D38: Missing name field in userinfo.

tool: D9: Too many name fields in userinfo.

tool: D34: Too many cl_punkbuster fields in userinfo.

tool: D120: rate

tool: D103: Wrong rate field in userinfo.

assistant: ```c
char *CheckUserinfo(int clientNum, char *userinfo) {
  char *value;
  int length = strlen(userinfo);
  int i, slashCount = 0, count = 0;
  if (length < 1) {
    return "Userinfo too short";
  }
  if (length > 1024 - 44) {
    return "Userinfo too long.";
  }
  if (userinfo[0] != '\\') {
    return "Missing leading slash in userinfo.";
  }
  if (userinfo[length - 1] == '\\') {
    return "Trailing slash in userinfo.";
  }
  for (i = 0; userinfo[i]; ++i) {
    if (userinfo[i] == '\\') {
      slashCount++;
    }
  }
  if (slashCount % 2 != 0) {
    return "Bad number of slashes in userinfo.";
  }
  if (length > 4) {
    for (i = 0; userinfo[i + 3]; ++i) {
      if (userinfo[i] == '\\' && userinfo[i + 1] == 'i' && userinfo[i + 2] == 'p' && userinfo[i + 3] == '\\') {
        count++;
      }
    }
  }
  if (count == 0) {
    return "Missing IP in userinfo.";
  } else if (count > 1) {
    return "Too many IP fields in userinfo.";
  } else {
    if (GetParsedIP(Info_ValueForKey(userinfo, "ip")) == ((void *)0)) {
      return "Malformed IP in userinfo.";
    }
  }
  count = 0;
  if (length > 9) {
    for (i = 0; userinfo[i + 8]; ++i) {
      if (userinfo[i] == '\\' && userinfo[i + 1] == 'c' && userinfo[i + 2] == 'l' && userinfo[i + 3] == '_' && userinfo[i + 4] == 'g' && userinfo[i + 5] == 'u' && userinfo[i + 6] == 'i' && userinfo[i + 7] == 'd' && userinfo[i + 8] == '\\') {
        count++;
      }
    }
  }
  if (count > 1) {
    return "Too many cl_guid fields in userinfo.";
  }
  count = 0;
  if (length > 6) {
    for (i = 0; userinfo[i + 5]; ++i) {
      if (userinfo[i] == '\\' && userinfo[i + 1] == 'n' && userinfo[i + 2] == 'a' && userinfo[i + 3] == 'm' && userinfo[i + 4] == 'e' && userinfo[i + 5] == '\\') {
        count++;
      }
    }
  }
  if (count == 0) {
    return "Missing name field in userinfo.";
  } else if (count > 1) {
    return "Too many name fields in userinfo.";
  }
  count = 0;
  if (length > 15) {
    for (i = 0; userinfo[i + 14]; ++i) {
      if (userinfo[i] == '\\' && userinfo[i + 1] == 'c' && userinfo[i + 2] == 'l' && userinfo[i + 3] == '_' && userinfo[i + 4] == 'p' && userinfo[i + 5] == 'u' && userinfo[i + 6] == 'n' && userinfo[i + 7] == 'k' && userinfo[i + 8] == 'b' && userinfo[i + 9] == 'u' && userinfo[i + 10] == 's' && userinfo[i + 11] == 't' && userinfo[i + 12] == 'e' && userinfo[i + 13] == 'r' && userinfo[i + 14] == '\\') {
        count++;
      }
    }
  }
  if (count > 1) {
    return "Too many cl_punkbuster fields in userinfo.";
  }
  value = Info_ValueForKey(userinfo, "rate");
  if (value == ((void *)0) || value[0] == '\0') {
    return "Wrong rate field in userinfo.";
  }
  return 0;
}
```