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

```asm
<dga>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %edi,-0x74(%rbp)
  mov    %esi,-0x78(%rbp)
  mov    %edx,-0x7c(%rbp)
  mov    %ecx,-0x80(%rbp)
  mov    %r8d,-0x84(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D18(%rip),%rax
  mov    %rax,-0x60(%rbp)
  lea    D70(%rip),%rax
  mov    %rax,-0x58(%rbp)
  lea    D80(%rip),%rax
  mov    %rax,-0x50(%rbp)
  lea    D37(%rip),%rax
  mov    %rax,-0x48(%rbp)
  lea    D16(%rip),%rax
  mov    %rax,-0x40(%rbp)
  lea    D32(%rip),%rax
  mov    %rax,-0x38(%rbp)
  lea    D56(%rip),%rax
  mov    %rax,-0x30(%rbp)
  lea    D3(%rip),%rax
  mov    %rax,-0x28(%rbp)
  lea    D97(%rip),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x74(%rbp),%eax
  mov    %eax,-0x6c(%rbp)
  movl   $0x0,-0x70(%rbp)
  jmp    L48
L23:
  movl   $0x0,-0x68(%rbp)
  jmp    L45
L0:
  mov    -0x74(%rbp),%eax
  shr    $0xf,%eax
  mov    %eax,%edx
  mov    -0x74(%rbp),%eax
  and    $0x1fff,%eax
  mov    %eax,%ecx
  mov    -0x80(%rbp),%eax
  xor    -0x74(%rbp),%eax
  shl    $0x2,%eax
  xor    %ecx,%eax
  shl    $0x4,%eax
  xor    %edx,%eax
  mov    %eax,-0x74(%rbp)
  mov    -0x7c(%rbp),%eax
  shl    $0x11,%eax
  and    $0xffe00000,%eax
  mov    %eax,%ecx
  mov    -0x7c(%rbp),%edx
  mov    %edx,%eax
  shl    $0x3,%eax
  sub    %edx,%eax
  xor    -0x7c(%rbp),%eax
  shr    $0xb,%eax
  xor    %ecx,%eax
  mov    %eax,-0x7c(%rbp)
  mov    -0x78(%rbp),%eax
  and    $0xfffffffe,%eax
  imul   $0xe,%eax,%edx
  mov    -0x78(%rbp),%eax
  shl    $0x2,%eax
  xor    -0x78(%rbp),%eax
  shr    $0x8,%eax
  xor    %edx,%eax
  mov    %eax,-0x78(%rbp)
  mov    -0x80(%rbp),%eax
  shr    $0x6,%eax
  mov    %eax,%edx
  mov    -0x80(%rbp),%eax
  lea    0x0(,%rax,8),%ecx
  mov    -0x74(%rbp),%eax
  add    %ecx,%eax
  shl    $0x8,%eax
  and    $0x3ffff00,%eax
  xor    %edx,%eax
  mov    %eax,-0x80(%rbp)
  mov    -0x74(%rbp),%eax
  xor    -0x78(%rbp),%eax
  xor    -0x7c(%rbp),%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  imul   $0x51eb851f,%rax,%rax
  shr    $0x20,%rax
  mov    %eax,%edx
  shr    $0x3,%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  lea    0x0(,%rax,4),%edx
  add    %edx,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  lea    0x61(%rdx),%eax
  mov    %eax,-0x64(%rbp)
  mov    -0x64(%rbp),%eax
  mov    %eax,%edx
  mov    -0x68(%rbp),%eax
  mov    %dl,-0x17(%rbp,%rax,1)
  addl   $0x1,-0x68(%rbp)
L45:
  cmpl   $0xd,-0x68(%rbp)
  jbe    L0
  mov    -0x6c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x6c(%rbp)
  cltd
  shr    $0x1d,%edx
  add    %edx,%eax
  and    $0x7,%eax
  sub    %edx,%eax
  cltq
  mov    -0x60(%rbp,%rax,8),%rdx
  lea    -0x17(%rbp),%rax
  mov    %rax,%rsi
  lea    D46(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  addl   $0x1,-0x70(%rbp)
L48:
  mov    -0x70(%rbp),%eax
  cmp    %eax,-0x84(%rbp)
  ja     L23
  nop
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L4
  call   <__stack_chk_fail@plt>
L4:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D18
type: string
name: unpack_data
arguments: data_tag: D70
type: string
name: unpack_data
arguments: data_tag: D80
type: string
name: unpack_data
arguments: data_tag: D37
type: string
name: unpack_data
arguments: data_tag: D16
type: string
name: unpack_data
arguments: data_tag: D32
type: string
name: unpack_data
arguments: data_tag: D56
type: string
name: unpack_data
arguments: data_tag: D3
type: string
name: unpack_data
arguments: data_tag: D97
type: string
name: unpack_data
arguments: data_tag: D46
type: string

tool: D18: in

tool: D70: me

tool: D80: cc

tool: D37: su

tool: D16: tw

tool: D32: net

tool: D56: com

tool: D3: pw

tool: D97: org

tool: D46: %s.%s


assistant: ```c
char *dga(unsigned int day, unsigned int month, unsigned int year, unsigned int seed, unsigned int nr) {
  char *tlds[] = {"in", "me", "cc", "su", "tw", "net", "com", "pw", "org"};
  char domain[15];
  int d;
  int tld_index = day;
  for (d = 0; d < nr; d++) {
    unsigned int i;
    for (i = 0; i < 14; i++) {
      day = (day >> 15) ^ 16 * (day & 0x1FFF ^ 4 * (seed ^ day));
      year = ((year & 0xFFFFFFF0) << 17) ^ ((year ^ (7 * year)) >> 11);
      month = 14 * (month & 0xFFFFFFFE) ^ ((month ^ (4 * month)) >> 8);
      seed = (seed >> 6) ^ ((day + 8 * seed) << 8) & 0x3FFFF00;
      int x = ((day ^ month ^ year) % 25) + 97;
      domain[i] = x;
    }
    printf("%s.%s\n", domain, tlds[tld_index++ % 8]);
  }
}
```