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

```asm
<ex6>:
  endbr64
  push   %r15
  lea    D13(%rip),%rdi
  xor    %r15d,%r15d
  push   %r14
  xor    %r14d,%r14d
  push   %r13
  xor    %r13d,%r13d
  push   %r12
  lea    D207(%rip),%r12
  push   %rbp
  push   %rbx
  lea    D218(%rip),%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    0x14(%rsp),%rbp
  call   <puts@plt>
  lea    D99(%rip),%rdi
  call   <puts@plt>
  lea    D48(%rip),%rdi
  call   <puts@plt>
  lea    D18(%rip),%rdi
  call   <puts@plt>
  lea    D113(%rip),%rdi
  call   <puts@plt>
  lea    D82(%rip),%rdi
  call   <puts@plt>
  lea    D38(%rip),%rdi
  call   <puts@plt>
  lea    D199(%rip),%rdi
  call   <puts@plt>
  movl   $0x0,0x4(%rsp)
  movl   $0x0,0x8(%rsp)
  movl   $0x0,(%rsp)
  nopl   (%rax)
L141:
  mov    %r12,%rdi
  call   <puts@plt>
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  mov    0x14(%rsp),%eax
  test   %eax,%eax
  je     L109
  cmp    $0x1,%eax
  je     L21
  cmp    $0x2,%eax
  je     L137
  cmp    $0x3,%eax
  je     L28
  cmp    $0x4,%eax
  je     L159
  cmp    $0x63,%eax
  je     L2
  addl   $0x1,0x4(%rsp)
  jmp    L141
  nopl   0x0(%rax,%rax,1)
L21:
  add    $0x1,%r13d
  jmp    L141
  cs nopw 0x0(%rax,%rax,1)
L137:
  add    $0x1,%r14d
  jmp    L141
  cs nopw 0x0(%rax,%rax,1)
L28:
  add    $0x1,%r15d
  jmp    L141
  cs nopw 0x0(%rax,%rax,1)
L109:
  mov    (%rsp),%eax
  lea    0x0(%r13,%r14,1),%esi
  pxor   %xmm1,%xmm1
  pxor   %xmm2,%xmm2
  add    %r15d,%esi
  cvtsi2ss %r13d,%xmm2
  movss  D79(%rip),%xmm0
  lea    D84(%rip),%rdi
  add    %eax,%esi
  cvtsi2ss %esi,%xmm1
  divss  %xmm1,%xmm2
  mulss  %xmm0,%xmm2
  movd   %xmm2,%ebx
  pxor   %xmm2,%xmm2
  cvtsi2ss %r14d,%xmm2
  divss  %xmm1,%xmm2
  mulss  %xmm0,%xmm2
  movd   %xmm2,%ebp
  pxor   %xmm2,%xmm2
  cvtsi2ss %r15d,%xmm2
  divss  %xmm1,%xmm2
  mulss  %xmm0,%xmm2
  movd   %xmm2,%r12d
  pxor   %xmm2,%xmm2
  cvtsi2ss %eax,%xmm2
  xor    %eax,%eax
  divss  %xmm1,%xmm2
  mulss  %xmm0,%xmm2
  movss  %xmm2,0xc(%rsp)
  call   <printf@plt>
  movd   %ebx,%xmm3
  mov    %r13d,%esi
  pxor   %xmm0,%xmm0
  lea    D86(%rip),%rdi
  mov    $0x1,%eax
  cvtss2sd %xmm3,%xmm0
  call   <printf@plt>
  movd   %ebp,%xmm4
  mov    %r14d,%esi
  pxor   %xmm0,%xmm0
  lea    D23(%rip),%rdi
  mov    $0x1,%eax
  cvtss2sd %xmm4,%xmm0
  call   <printf@plt>
  movd   %r12d,%xmm5
  mov    %r15d,%esi
  pxor   %xmm0,%xmm0
  lea    D249(%rip),%rdi
  mov    $0x1,%eax
  cvtss2sd %xmm5,%xmm0
  call   <printf@plt>
  mov    (%rsp),%esi
  pxor   %xmm0,%xmm0
  lea    D173(%rip),%rdi
  mov    $0x1,%eax
  cvtss2sd 0xc(%rsp),%xmm0
  call   <printf@plt>
  mov    0x8(%rsp),%esi
  lea    D255(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x4(%rsp),%esi
  xor    %eax,%eax
  lea    D64(%rip),%rdi
  call   <printf@plt>
  movd   %ebx,%xmm6
  comiss D233(%rip),%xmm6
  ja     L16
  movd   %ebp,%xmm7
  comiss D233(%rip),%xmm7
  ja     L64
  movd   %r12d,%xmm7
  comiss D233(%rip),%xmm7
  ja     L127
  movss  0xc(%rsp),%xmm3
  comiss D233(%rip),%xmm3
  jbe    L42
  lea    D178(%rip),%rdi
  call   <puts@plt>
  jmp    L97
  nopl   0x0(%rax)
L159:
  addl   $0x1,(%rsp)
  jmp    L141
  nopl   0x0(%rax)
L2:
  addl   $0x1,0x8(%rsp)
  jmp    L141
  nopw   0x0(%rax,%rax,1)
L64:
  lea    D93(%rip),%rdi
  call   <puts@plt>
L97:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L107
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L16:
  lea    D36(%rip),%rdi
  call   <puts@plt>
  jmp    L97
  cs nopw 0x0(%rax,%rax,1)
L42:
  lea    D232(%rip),%rdi
  call   <puts@plt>
  jmp    L97
  xchg   %ax,%ax
L127:
  lea    D47(%rip),%rdi
  call   <puts@plt>
  jmp    L97
L107:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D13
type: string
name: retrieve_data
arguments: label: D207
type: string
name: retrieve_data
arguments: label: D218
type: string
name: retrieve_data
arguments: label: D99
type: string
name: retrieve_data
arguments: label: D48
type: string
name: retrieve_data
arguments: label: D18
type: string
name: retrieve_data
arguments: label: D113
type: string
name: retrieve_data
arguments: label: D82
type: string
name: retrieve_data
arguments: label: D38
type: string
name: retrieve_data
arguments: label: D199
type: string
name: retrieve_data
arguments: label: D79
type: f32
name: retrieve_data
arguments: label: D84
type: string
name: retrieve_data
arguments: label: D86
type: string
name: retrieve_data
arguments: label: D23
type: string
name: retrieve_data
arguments: label: D249
type: string
name: retrieve_data
arguments: label: D173
type: string
name: retrieve_data
arguments: label: D255
type: string
name: retrieve_data
arguments: label: D64
type: string
name: retrieve_data
arguments: label: D233
type: byte[4]
name: retrieve_data
arguments: label: D178
type: string
name: retrieve_data
arguments: label: D93
type: string
name: retrieve_data
arguments: label: D36
type: string
name: retrieve_data
arguments: label: D232
type: string
name: retrieve_data
arguments: label: D47
type: string

tool: D13: Eleicao:

tool: D207: Informe o voto:

tool: D218: %d

tool: D99: 	0 para encerrar a votacao;

tool: D48: 	1 para o candidato 1;

tool: D18: 	2 para o candidato 2;

tool: D113: 	3 para o candidato 3;

tool: D82: 	4 para o candidato 4;

tool: D38: 	99 para votar em branco;

tool: D199: 	Qualquer outro valor para votar nulo.

tool: D79: 100

tool: D84: 
Votos validos: %d


tool: D86: Primeiro Candidato:
	Votos:%d
	Percentual:%.2f%%


tool: D23: Segundo Candidato:
	Votos:%d
	Percentual:%.2f%%


tool: D249: Terceiro Candidato:
	Votos:%d
	Percentual:%.2f%%


tool: D173: Quarto Candidato:
	Votos:%d
	Percentual:%.2f%%


tool: D255: Votos brancos: %d


tool: D64: Votos nulos: %d


tool: {"D233": [0x00,0x00,0x48,0x42]}

tool: D178: 
Vencedor: Quarto Candidato.

tool: D93: 
Vencedor: Segundo Candidato.

tool: D36: 
Vencedor: Primeiro Candidato.

tool: D232: 
Havera segundo turno.

tool: D47: 
Vencedor: Terceiro Candidato.

assistant: ```c
void ex6() {
  int num, c1 = 0, c2 = 0, c3 = 0, c4 = 0, b = 0, n = 0;
  printf("Eleicao:\n");
  printf("\t0 para encerrar a votacao;\n");
  printf("\t1 para o candidato 1;\n");
  printf("\t2 para o candidato 2;\n");
  printf("\t3 para o candidato 3;\n");
  printf("\t4 para o candidato 4;\n");
  printf("\t99 para votar em branco;\n");
  printf("\tQualquer outro valor para votar nulo.\n");
  while (1) {
    printf("Informe o voto:\n");
    scanf("%d", &num);
    if (!num)
      break;
    if (num == 1)
      c1++;
    else if (num == 2)
      c2++;
    else if (num == 3)
      c3++;
    else if (num == 4)
      c4++;
    else if (num == 99)
      b++;
    else
      n++;
  }
  int validos = c1 + c2 + c3 + c4;
  float p1 = (float)c1 / validos * 100;
  float p2 = (float)c2 / validos * 100;
  float p3 = (float)c3 / validos * 100;
  float p4 = (float)c4 / validos * 100;
  printf("\nVotos validos: %d\n", validos);
  printf("Primeiro Candidato:\n\tVotos:%d\n\tPercentual:%.2f%%\n", c1, p1);
  printf("Segundo Candidato:\n\tVotos:%d\n\tPercentual:%.2f%%\n", c2, p2);
  printf("Terceiro Candidato:\n\tVotos:%d\n\tPercentual:%.2f%%\n", c3, p3);
  printf("Quarto Candidato:\n\tVotos:%d\n\tPercentual:%.2f%%\n", c4, p4);
  printf("Votos brancos: %d\n", b);
  printf("Votos nulos: %d\n", n);
  if (p1 > 50)
    printf("\nVencedor: Primeiro Candidato.\n");
  else if (p2 > 50)
    printf("\nVencedor: Segundo Candidato.\n");
  else if (p3 > 50)
    printf("\nVencedor: Terceiro Candidato.\n");
  else if (p4 > 50)
    printf("\nVencedor: Quarto Candidato.\n");
  else
    printf("\nHavera segundo turno.\n");
}
```