user: Please show me the C implementation that matches the assembly code listed below:

```asm
<number>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xa0,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %edx,-0x84(%rbp)
  mov    %ecx,-0x88(%rbp)
  mov    %r8d,-0x8c(%rbp)
  mov    %r9d,-0x90(%rbp)
  mov    0x10(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D13(%rip),%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x90(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L100
  lea    D6(%rip),%rax
  mov    %rax,-0x60(%rbp)
L100:
  mov    -0x90(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L188
  andl   $0xfe,-0x90(%rbp)
L188:
  cmpl   $0x1,-0x84(%rbp)
  jle    L432
  cmpl   $0x24,-0x84(%rbp)
  jle    L214
L432:
  mov    $0x0,%eax
  jmp    L386
L214:
  mov    -0x90(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L290
  mov    $0x30,%eax
  jmp    L347
L290:
  mov    $0x20,%eax
L347:
  mov    %al,-0x65(%rbp)
  movb   $0x0,-0x66(%rbp)
  mov    -0x90(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L36
  cmpq   $0x0,-0x80(%rbp)
  jns    L444
  movb   $0x2d,-0x66(%rbp)
  negq   -0x80(%rbp)
  subl   $0x1,-0x88(%rbp)
  jmp    L36
L444:
  mov    -0x90(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L283
  movb   $0x2b,-0x66(%rbp)
  subl   $0x1,-0x88(%rbp)
  jmp    L36
L283:
  mov    -0x90(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L36
  movb   $0x20,-0x66(%rbp)
  subl   $0x1,-0x88(%rbp)
L36:
  mov    -0x90(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L247
  cmpl   $0x10,-0x84(%rbp)
  jne    L176
  subl   $0x2,-0x88(%rbp)
  jmp    L247
L176:
  cmpl   $0x8,-0x84(%rbp)
  jne    L247
  subl   $0x1,-0x88(%rbp)
L247:
  movl   $0x0,-0x64(%rbp)
  cmpq   $0x0,-0x80(%rbp)
  jne    L50
  mov    -0x64(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x64(%rbp)
  cltq
  movb   $0x30,-0x50(%rbp,%rax,1)
  jmp    L328
L73:
  mov    -0x80(%rbp),%rax
  mov    -0x84(%rbp),%edx
  mov    %edx,%ecx
  mov    $0x0,%edx
  div    %rcx
  mov    %rdx,-0x58(%rbp)
  mov    -0x80(%rbp),%rax
  mov    -0x84(%rbp),%edx
  mov    %edx,%esi
  mov    $0x0,%edx
  div    %rsi
  mov    %rax,-0x80(%rbp)
  mov    -0x60(%rbp),%rdx
  mov    -0x58(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x64(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x64(%rbp)
  movzbl (%rcx),%edx
  cltq
  mov    %dl,-0x50(%rbp,%rax,1)
L50:
  cmpq   $0x0,-0x80(%rbp)
  jne    L73
L328:
  mov    -0x64(%rbp),%eax
  cmp    -0x8c(%rbp),%eax
  jle    L464
  mov    -0x64(%rbp),%eax
  mov    %eax,-0x8c(%rbp)
L464:
  mov    -0x8c(%rbp),%eax
  sub    %eax,-0x88(%rbp)
  mov    -0x90(%rbp),%eax
  and    $0x11,%eax
  test   %eax,%eax
  jne    L422
  jmp    L316
L476:
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x98(%rbp),%rdx
  mov    %rcx,(%rdx)
  cmp    %rax,0x18(%rbp)
  jbe    L316
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x20,(%rax)
L316:
  mov    -0x88(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x88(%rbp)
  test   %eax,%eax
  jg     L476
L422:
  cmpb   $0x0,-0x66(%rbp)
  je     L468
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x98(%rbp),%rdx
  mov    %rcx,(%rdx)
  cmp    %rax,0x18(%rbp)
  jbe    L468
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl -0x66(%rbp),%edx
  mov    %dl,(%rax)
L468:
  mov    -0x90(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L475
  cmpl   $0x8,-0x84(%rbp)
  jne    L196
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x98(%rbp),%rdx
  mov    %rcx,(%rdx)
  cmp    %rax,0x18(%rbp)
  jbe    L475
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x30,(%rax)
  jmp    L475
L196:
  cmpl   $0x10,-0x84(%rbp)
  jne    L475
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x98(%rbp),%rdx
  mov    %rcx,(%rdx)
  cmp    %rax,0x18(%rbp)
  jbe    L472
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x30,(%rax)
L472:
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x98(%rbp),%rdx
  mov    %rcx,(%rdx)
  cmp    %rax,0x18(%rbp)
  jbe    L475
  mov    -0x60(%rbp),%rax
  lea    0x21(%rax),%rcx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rcx),%edx
  mov    %dl,(%rax)
L475:
  mov    -0x90(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  jne    L137
  jmp    L171
L153:
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x98(%rbp),%rdx
  mov    %rcx,(%rdx)
  cmp    %rax,0x18(%rbp)
  jbe    L171
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl -0x65(%rbp),%edx
  mov    %dl,(%rax)
L171:
  mov    -0x88(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x88(%rbp)
  test   %eax,%eax
  jg     L153
  jmp    L137
L327:
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x98(%rbp),%rdx
  mov    %rcx,(%rdx)
  cmp    %rax,0x18(%rbp)
  jbe    L137
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x30,(%rax)
L137:
  mov    -0x8c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x8c(%rbp)
  cmp    %eax,-0x64(%rbp)
  jl     L327
  jmp    L303
L217:
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x98(%rbp),%rdx
  mov    %rcx,(%rdx)
  cmp    %rax,0x18(%rbp)
  jbe    L303
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    -0x64(%rbp),%edx
  movslq %edx,%rdx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
L303:
  mov    -0x64(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x64(%rbp)
  test   %eax,%eax
  jg     L217
  jmp    L376
L21:
  mov    -0x98(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rcx
  mov    -0x98(%rbp),%rdx
  mov    %rcx,(%rdx)
  cmp    %rax,0x18(%rbp)
  jbe    L376
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x20,(%rax)
L376:
  mov    -0x88(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x88(%rbp)
  test   %eax,%eax
  jg     L21
  mov    -0x78(%rbp),%rax
L386:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L27
  call   <__stack_chk_fail@plt>
L27:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D13
datatype: string
name: extract_symbolic_data
arguments: tag: D6
datatype: string

tool: D13: 0123456789abcdefghijklmnopqrstuvwxyz

tool: D6: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

assistant: ```c
char *number(char *str, long long num, int base, int size, int precision, int type, size_t *osize, size_t n) {
  char c, sign, tmp[66];
  const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";
  int i;
  if (type & 0x40)
    digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  if (type & 0x10)
    type &= 0xFE;
  if ((base < 2) || (base > 36))
    return NULL;
  c = (type & 0x01) ? '0' : ' ';
  sign = 0;
  if (type & 0x02) {
    if (num < 0) {
      sign = '-';
      num = -num;
      size--;
    } else if (type & 0x04) {
      sign = '+';
      size--;
    } else if (type & 0x08) {
      sign = ' ';
      size--;
    }
  }
  if (type & 0x20) {
    if (base == 16)
      size -= 2;
    else if (base == 8)
      size--;
  }
  i = 0;
  if (num == 0)
    tmp[i++] = '0';
  else {
    while (num != 0) {
      unsigned long long __res;
      __res = ((unsigned long long)num) % (unsigned int)base;
      num = ((unsigned long long)num) / (unsigned int)base;
      tmp[i++] = digits[__res];
    }
  }
  if (i > precision)
    precision = i;
  size -= precision;
  if (!(type & 0x11))
    while (size-- > 0)
      if ((*osize)++ < n)
        *(str++) = ' ';
  if (sign)
    if ((*osize)++ < n)
      *(str++) = sign;
  if (type & 0x20) {
    if (base == 8) {
      if ((*osize)++ < n)
        *(str++) = '0';
    } else if (base == 16) {
      if ((*osize)++ < n)
        *(str++) = '0';
      if ((*osize)++ < n)
        *(str++) = digits[33];
    }
  }
  if (!(type & 0x10))
    while (size-- > 0)
      if ((*osize)++ < n)
        *(str++) = c;
  while (i < precision--)
    if ((*osize)++ < n)
      *(str++) = '0';
  while (i-- > 0)
    if ((*osize)++ < n)
      *(str++) = tmp[i];
  while (size-- > 0)
    if ((*osize)++ < n)
      *(str++) = ' ';
  return str;
}
```