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

```asm
<main>:
  endbr64
  push   %r15
  lea    D4(%rip),%rsi
  mov    $0x70,%ecx
  mov    $0x2,%r15d
  push   %r14
  xor    %r14d,%r14d
  push   %r13
  mov    $0x1,%r13d
  push   %r12
  mov    $0x2,%r12d
  push   %rbp
  mov    $0x2,%ebp
  push   %rbx
  sub    $0x3a8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x398(%rsp)
  xor    %eax,%eax
  lea    0x10(%rsp),%rdi
  rep movsq %ds:(%rsi),%es:(%rdi)
  movl   $0xa9,0x90(%rsp)
  mov    (%rsi),%eax
  mov    %eax,(%rdi)
  xor    %edi,%edi
  call   <time@plt>
  mov    %eax,%edi
  call   <srand@plt>
  xor    %eax,%eax
  call   <rand@plt>
  lea    0x10(%rsp),%rdi
  cltd
  mov    %rdi,0x8(%rsp)
  shr    $0x1e,%edx
  lea    (%rax,%rdx,1),%ebx
  and    $0x3,%ebx
  sub    %edx,%ebx
  add    $0x1,%ebx
  mov    %ebx,%esi
  call   <imprimir@plt>
  movl   $0x2,0x4(%rsp)
  jmp    L127
  nopw   0x0(%rax,%rax,1)
L106:
  test   %r13d,%r13d
  je     L24
L83:
  mov    %rbp,%rax
  lea    0x1(%r15),%ecx
  shl    $0x4,%rax
  sub    %rbp,%rax
  lea    (%rax,%r12,1),%rdx
  movl   $0xff,0x10(%rsp,%rdx,4)
  cmp    $0x1,%ebx
  je     L85
  lea    -0x1(%r15),%ecx
  cmp    $0x2,%ebx
  je     L85
  cmp    $0x3,%ebx
  jne    L113
  mov    0x4(%rsp),%esi
  lea    0x1(%rsi),%ecx
L82:
  movslq %ecx,%rdx
  mov    %rdx,%rax
  shl    $0x4,%rax
  sub    %rdx,%rax
  add    %r12,%rax
  cmpl   $0xff,0x10(%rsp,%rax,4)
  cmovne %esi,%ecx
  cmove  %rdx,%rbp
  mov    %ecx,0x4(%rsp)
L136:
  mov    %rbp,%rax
  mov    0x8(%rsp),%rdi
  mov    %ebx,%esi
  add    $0x1,%r14d
  shl    $0x4,%rax
  sub    %rbp,%rax
  add    %r12,%rax
  movl   $0xa9,0x10(%rsp,%rax,4)
  call   <imprimir@plt>
  imul   $0xcccccccd,%r14d,%eax
  ror    %eax
  cmp    $0x19999999,%eax
  jbe    L123
L120:
  mov    $0x1,%r13d
L24:
  mov    $0x64,%edi
  call   <Sleep@plt>
L127:
  xor    %eax,%eax
  call   <kbhit@plt>
  test   %rax,%rax
  je     L106
  xor    %eax,%eax
  call   <getch@plt>
  cmp    $0x72,%al
  je     L83
  cmp    $0x70,%al
  jne    L106
  xor    %r13d,%r13d
  jmp    L24
  nopl   (%rax)
L85:
  movslq %ecx,%rdx
  add    %rdx,%rax
  cmpl   $0xff,0x10(%rsp,%rax,4)
  cmove  %ecx,%r15d
  cmove  %rdx,%r12
  jmp    L136
L113:
  cmp    $0x4,%ebx
  jne    L136
  mov    0x4(%rsp),%esi
  lea    -0x1(%rsi),%ecx
  jmp    L82
L123:
  xor    %eax,%eax
  call   <rand@plt>
  cltd
  shr    $0x1e,%edx
  lea    (%rax,%rdx,1),%ebx
  and    $0x3,%ebx
  sub    %edx,%ebx
  add    $0x1,%ebx
  jmp    L120
```

tool_calls: name: disassemble_data
arguments: data_label: D4
type: string

tool: D4: #

assistant: ```c
int main(int argc, char *argv[]) {
  int mapa[15][15] = {{35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 35}, {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}};
  char tecla;
  int band, dir, fp, cp, tiempo;
  fp = 2;
  cp = 2;
  mapa[fp][cp] = 169;
  band = 1;
  srand(time(0));
  dir = rand() % 4 + 1;
  imprimir(mapa, dir);
  tiempo = 0;
  while (1) {
    tecla = 0;
    if (kbhit())
      tecla = getch();
    if (tecla == 'r')
      band = 1;
    if (tecla == 'p')
      band = 0;
    if (band) {
      mapa[fp][cp] = 255;
      if (dir == 1) {
        if (mapa[fp][cp + 1] == 255) {
          cp++;
        }
      }
      if (dir == 2) {
        if (mapa[fp][cp - 1] == 255) {
          cp--;
        }
      }
      if (dir == 3) {
        if (mapa[fp + 1][cp] == 255) {
          fp++;
        }
      }
      if (dir == 4) {
        if (mapa[fp - 1][cp] == 255) {
          fp--;
        }
      }
      mapa[fp][cp] = 169;
      imprimir(mapa, dir);
      tiempo++;
      if (tiempo % 10 == 0) {
        dir = rand() % 4 + 1;
      }
    }
    if (tecla == 'p')
      band = 0;
    if (tecla == 'r')
      band = 1;
    Sleep(100);
  }
  return 0;
}
```