user: What would the C source look like for the assembly code provided here?

```asm
<base64Dup>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x50,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  call   <strlen@plt>
  mov    $0x1,%esi
  lea    0x2(%rax),%r12d
  mov    %eax,%ebp
  movslq %r12d,%rax
  mov    %r12d,%edx
  imul   $0x55555556,%rax,%rax
  sar    $0x1f,%edx
  shr    $0x20,%rax
  sub    %edx,%eax
  lea    0x1(,%rax,4),%edi
  call   <calloc@plt>
  movdqa D28(%rip),%xmm0
  xor    %ecx,%ecx
  mov    %rax,%r8
  mov    %rax,%rdx
  movaps %xmm0,(%rsp)
  movdqa D38(%rip),%xmm0
  movaps %xmm0,0x10(%rsp)
  movdqa D30(%rip),%xmm0
  movaps %xmm0,0x20(%rsp)
  movdqa D34(%rip),%xmm0
  movaps %xmm0,0x30(%rsp)
  test   %ebp,%ebp
  jle    L59
L2:
  movzbl (%rbx),%eax
  add    $0x4,%rdx
  add    $0x3,%ecx
  add    $0x3,%rbx
  sar    $0x2,%al
  movsbq %al,%rax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x4(%rdx)
  movsbl -0x3(%rbx),%eax
  movzbl -0x2(%rbx),%esi
  shl    $0x4,%eax
  sar    $0x4,%sil
  and    $0x30,%eax
  movsbl %sil,%esi
  add    %esi,%eax
  cltq
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x3(%rdx)
  movsbl -0x2(%rbx),%eax
  movzbl -0x1(%rbx),%esi
  shl    $0x2,%eax
  sar    $0x6,%sil
  and    $0x3c,%eax
  movsbl %sil,%esi
  add    %esi,%eax
  cltq
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x2(%rdx)
  movzbl -0x1(%rbx),%eax
  and    $0x3f,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x1(%rdx)
  cmp    %ecx,%ebp
  jg     L2
L59:
  add    $0x1,%ebp
  cmp    %ecx,%ebp
  je     L57
  cmp    %ecx,%r12d
  je     L58
L45:
  movb   $0x0,(%rdx)
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L17
  add    $0x50,%rsp
  mov    %r8,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax,%rax,1)
L58:
  movb   $0x3d,-0x2(%rdx)
L57:
  movb   $0x3d,-0x1(%rdx)
  jmp    L45
L17:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_label: D28
data_type: byte[16]
name: retrieve_data
arguments: data_label: D38
data_type: byte[16]
name: retrieve_data
arguments: data_label: D30
data_type: byte[16]
name: retrieve_data
arguments: data_label: D34
data_type: byte[16]

tool: {"D28": [0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50]}

tool: {"D38": [0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x61,0x62,0x63,0x64,0x65,0x66]}

tool: {"D30": [0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76]}

tool: {"D34": [0x77,0x78,0x79,0x7a,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2b,0x2f]}

assistant: ```c
char *base64Dup(char *s) {
  int i;
  int len = strlen(s);
  char *ret = calloc((4 * (((len) + 2) / 3)) + 1, 1);
  unsigned char *p = (unsigned char *)ret;
  char tbl[64] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
  for (i = 0; i < len; i += 3) {
    *p++ = tbl[s[0] >> 2];
    *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
    *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
    *p++ = tbl[s[2] & 0x3f];
    s += 3;
  }
  if (i == len + 1)
    *(p - 1) = '=';
  else if (i == len + 2)
    *(p - 1) = *(p - 2) = '=';
  *p = '\0';
  return ret;
}
```