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

```asm
<cherry8x16_remap_fn_keys>:
  endbr64
  mov    (%rdi),%rax
  test   $0x1,%al
  je     L106
  and    $0xfffffffffffffffe,%rax
  or     $0x10,%rax
  mov    %rax,(%rdi)
L106:
  cmp    $0x2,%rsi
  jbe    L119
  lea    0x10(%rdi),%rax
  lea    (%rdi,%rsi,8),%rsi
  lea    D7(%rip),%rcx
  nopl   0x0(%rax,%rax,1)
L25:
  mov    (%rax),%rdi
  lea    -0xc(%rdi),%rdx
  cmp    $0x2f,%rdx
  ja     L48
  movslq (%rcx,%rdx,4),%rdx
  add    %rcx,%rdx
  notrack jmp *%rdx
  nopw   0x0(%rax,%rax,1)
  movq   $0x62,(%rax)
  nopw   0x0(%rax,%rax,1)
L48:
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
L119:
  ret
  nopw   0x0(%rax,%rax,1)
  movq   $0x45,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopw   0x0(%rax,%rax,1)
  movq   $0x44,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopw   0x0(%rax,%rax,1)
  movq   $0x54,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopw   0x0(%rax,%rax,1)
  movq   $0x63,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  xchg   %ax,%ax
  movq   $0x57,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  cs nopw 0x0(%rax,%rax,1)
  movq   $0x58,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x55,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x61,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x60,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x5f,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x5c,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x56,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x5e,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x5b,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x5a,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x59,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
  nopl   0x0(%rax)
  movq   $0x5d,(%rax)
  add    $0x8,%rax
  cmp    %rsi,%rax
  jne    L25
  jmp    L119
```

assistant: ```c
void cherry8x16_remap_fn_keys(uint8_t *keys, uint8_t number_of_keys) {
  if (keys[0] & (1UL << (0xE0 - 0xE0))) {
    keys[0] &= ~(1UL << (0xE0 - 0xE0));
    keys[0] |= (1UL << (0xE4 - 0xE0));
  }
  for (uint_fast8_t i = 2; i < number_of_keys; i++) {
    switch (keys[i]) {
    case 0x10:
      keys[i] = 0x62;
      break;
    case 0x37:
      keys[i] = 0x63;
      break;
    case 0x38:
      keys[i] = 0x54;
      break;
    case 0x0D:
      keys[i] = 0x59;
      break;
    case 0x0E:
      keys[i] = 0x5A;
      break;
    case 0x0F:
      keys[i] = 0x5B;
      break;
    case 0x33:
      keys[i] = 0x57;
      break;
    case 0x28:
      keys[i] = 0x58;
      break;
    case 0x18:
      keys[i] = 0x5C;
      break;
    case 0x0C:
      keys[i] = 0x5D;
      break;
    case 0x12:
      keys[i] = 0x5E;
      break;
    case 0x13:
      keys[i] = 0x56;
      break;
    case 0x24:
      keys[i] = 0x5F;
      break;
    case 0x25:
      keys[i] = 0x60;
      break;
    case 0x26:
      keys[i] = 0x61;
      break;
    case 0x27:
      keys[i] = 0x55;
      break;
    case 0x3A:
      keys[i] = 0x44;
      break;
    case 0x3B:
      keys[i] = 0x45;
      break;
    default:
      break;
    }
  }
}
```