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

```asm
<timegm>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x45,%eax
  jle    L70
  mov    -0x18(%rbp),%rax
  mov    0x4(%rax),%eax
  test   %eax,%eax
  js     L70
  mov    -0x18(%rbp),%rax
  mov    0x4(%rax),%eax
  cmp    $0xb,%eax
  jg     L70
  mov    -0x18(%rbp),%rax
  mov    0x8(%rax),%eax
  test   %eax,%eax
  jle    L70
  mov    -0x18(%rbp),%rax
  mov    0x8(%rax),%eax
  cmp    $0x1f,%eax
  jg     L70
  mov    -0x18(%rbp),%rax
  mov    0xc(%rax),%eax
  test   %eax,%eax
  js     L70
  mov    -0x18(%rbp),%rax
  mov    0xc(%rax),%eax
  cmp    $0x17,%eax
  jg     L70
  mov    -0x18(%rbp),%rax
  mov    0x10(%rax),%eax
  test   %eax,%eax
  js     L70
  mov    -0x18(%rbp),%rax
  mov    0x10(%rax),%eax
  cmp    $0x3b,%eax
  jg     L70
  mov    -0x18(%rbp),%rax
  mov    0x14(%rax),%eax
  test   %eax,%eax
  js     L70
  mov    -0x18(%rbp),%rax
  mov    0x14(%rax),%eax
  cmp    $0x3c,%eax
  jle    L104
L70:
  mov    $0xffffffff,%eax
  jmp    L92
L104:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  sub    $0x46,%eax
  imul   $0x16d,%eax,%eax
  mov    %eax,%ecx
  mov    -0x18(%rbp),%rax
  mov    0x4(%rax),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  lea    D8(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x18(%rbp),%rax
  mov    0x8(%rax),%eax
  add    %edx,%eax
  sub    $0x1,%eax
  mov    %eax,-0x8(%rbp)
  movl   $0x46,-0x4(%rbp)
  jmp    L30
L90:
  mov    -0x4(%rbp),%eax
  add    $0x76c,%eax
  mov    %eax,%edi
  call   <is_leap_year@plt>
  add    %eax,-0x8(%rbp)
  addl   $0x1,-0x4(%rbp)
L30:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,-0x4(%rbp)
  jl     L90
  mov    -0x18(%rbp),%rax
  mov    0x4(%rax),%eax
  cmp    $0x1,%eax
  jle    L132
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  add    $0x76c,%eax
  mov    %eax,%edi
  call   <is_leap_year@plt>
  add    %eax,-0x8(%rbp)
L132:
  mov    -0x8(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  shl    $0x3,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0xc(%rax),%eax
  add    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  imul   $0x3c,%eax,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0x10(%rax),%eax
  add    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  imul   $0x3c,%eax,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    0x14(%rax),%eax
  add    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
L92:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D8
data_type: string

tool: 

assistant: ```c
time_t timegm(struct tm *tm) {
  static const unsigned ydays[12 + 1] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  if (tm->tm_year < 70 || tm->tm_mon < 0 || tm->tm_mon > 11 || tm->tm_mday < 1 || tm->tm_mday > 31 || tm->tm_hour < 0 || tm->tm_hour > 23 || tm->tm_min < 0 || tm->tm_min > 59 || tm->tm_sec < 0 || tm->tm_sec > 60)
    return -1;
  unsigned t = 365 * (tm->tm_year - 70) + ydays[tm->tm_mon] + (tm->tm_mday - 1);
  for (int i = 70; i < tm->tm_year; i++)
    t += is_leap_year(1900 + i);
  if (tm->tm_mon > 1)
    t += is_leap_year(1900 + tm->tm_year);
  t *= 24;
  t += tm->tm_hour;
  t *= 60;
  t += tm->tm_min;
  t *= 60;
  t += tm->tm_sec;
  return t;
}
```