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

```asm
<unlzss>:
  endbr64
  push   %r15
  push   %r14
  mov    %esi,%r14d
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  mov    %edx,%edi
  push   %rbx
  mov    %edx,%ebx
  lea    0x1(%rbp),%r12
  sub    $0x28,%rsp
  call   <get_word@plt>
  lea    0x14(%rbx),%edi
  mov    %eax,0x18(%rsp)
  lea    0x3(%rbx),%eax
  mov    %eax,0x1c(%rsp)
  lea    0x15(%rbx),%eax
  mov    %eax,0x14(%rsp)
  call   <get_byte@plt>
  mov    %al,0x0(%rbp)
L138:
  mov    %r14d,%edi
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    $0x1f,%edi
  mov    %eax,%ebp
  lea    -0x1(%rdi),%r13d
  bt     %edi,%ebp
  jb     L43
  nopw   0x0(%rax,%rax,1)
L311:
  cmp    $0xffffffff,%r13d
  je     L294
  bt     %r13d,%ebp
  lea    -0x2(%rdi),%r15d
  jae    L77
  cmp    $0xffffffff,%r15d
  je     L244
  lea    -0x3(%rdi),%ebx
L270:
  mov    %ebp,%r8d
  mov    %r15d,%ecx
  sar    %cl,%r8d
  and    $0x1,%r8d
  mov    %r8d,%r13d
  jne    L260
  mov    $0x1,%r9d
  jmp    L222
  nopw   0x0(%rax,%rax,1)
L202:
  bt     %r15d,%ebp
  jb     L130
L222:
  mov    %r9d,%ebx
  lea    -0x1(%r15),%ecx
  add    %r9d,%r9d
  test   %r15d,%r15d
  je     L38
  mov    %ebp,%eax
  add    %r13d,%ebx
  sub    $0x2,%r15d
  sar    %cl,%eax
  test   $0x1,%al
  cmovne %ebx,%r13d
  cmp    $0xffffffff,%r15d
  jne    L202
  mov    %r14d,%edi
  mov    %r9d,0xc(%rsp)
  mov    $0x1f,%r15d
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    0xc(%rsp),%r9d
  mov    %eax,%ebp
  bt     %r15d,%ebp
  jae    L222
L130:
  add    %r9d,%r13d
  cmp    $0x10,%r13d
  je     L85
  lea    -0x1(%r15),%ebx
L260:
  mov    0x1c(%rsp),%eax
  lea    0x0(%r13,%rax,1),%edi
  call   <get_byte@plt>
  mov    0x18(%rsp),%esi
  mov    %r13d,%ecx
L90:
  sar    %cl,%esi
  mov    %eax,%edx
  mov    %esi,%ecx
  or     $0x1,%dh
  and    $0x1,%ecx
  cmove  %eax,%edx
  mov    %edx,%r13d
  cmp    $0xffffffff,%ebx
  je     L316
  lea    -0x1(%rbx),%edi
L6:
  mov    %ebp,%r8d
  mov    %ebx,%ecx
  movslq %r13d,%rax
  mov    %r12,%r15
  sar    %cl,%r8d
  sub    %rax,%r15
  and    $0x1,%r8d
  jne    L196
  mov    $0x1,%r13d
  jmp    L184
  nopl   0x0(%rax,%rax,1)
L241:
  lea    -0x1(%rbx),%edi
L299:
  bt     %ebx,%ebp
  jb     L140
L184:
  mov    %r13d,%edx
  lea    -0x1(%rbx),%ecx
  add    %r13d,%r13d
  test   %ebx,%ebx
  je     L167
  mov    %ebp,%eax
  add    %r8d,%edx
  sub    $0x2,%ebx
  sar    %cl,%eax
  test   $0x1,%al
  cmovne %edx,%r8d
  cmp    $0xffffffff,%ebx
  jne    L241
  mov    %r14d,%edi
  mov    %r8d,0xc(%rsp)
  mov    $0x1f,%ebx
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    0xc(%rsp),%r8d
  mov    $0x1e,%edi
  mov    %eax,%ebp
  bt     %ebx,%ebp
  jae    L184
L140:
  lea    0x1(%r8,%r13,1),%ecx
  test   %ecx,%ecx
  js     L68
L338:
  xor    %eax,%eax
L231:
  movzbl (%r15,%rax,1),%edx
  mov    %dl,(%r12,%rax,1)
  add    $0x1,%rax
  cmp    %eax,%ecx
  jns    L231
  movslq %ecx,%rcx
  lea    0x1(%r12,%rcx,1),%r12
L68:
  cmp    $0xffffffff,%edi
  je     L138
  bt     %edi,%ebp
  lea    -0x1(%rdi),%r13d
  jae    L311
L43:
  mov    0x14(%rsp),%edi
  add    $0x1,%r12
  lea    0x1(%rdi),%ebx
  call   <get_byte@plt>
  mov    %ebx,0x14(%rsp)
  mov    %r13d,%edi
  mov    %al,-0x1(%r12)
  jmp    L68
  nopl   (%rax)
L167:
  mov    %r14d,%edi
  mov    %r8d,0xc(%rsp)
  add    $0x4,%r14d
  mov    %edx,0x10(%rsp)
  call   <get_long@plt>
  mov    0xc(%rsp),%r8d
  test   %eax,%eax
  mov    %eax,%ebp
  jns    L318
  mov    0x10(%rsp),%edx
  mov    $0x1e,%ebx
  add    %edx,%r8d
  jmp    L241
  nopl   0x0(%rax)
L38:
  mov    %r14d,%edi
  mov    %r9d,0xc(%rsp)
  add    %r13d,%ebx
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    $0x1e,%r15d
  mov    0xc(%rsp),%r9d
  mov    %eax,%ebp
  mov    %r13d,%eax
  test   %ebp,%ebp
  cmovs  %ebx,%eax
  mov    %eax,%r13d
  jmp    L202
  nopl   0x0(%rax)
L318:
  mov    $0x1d,%edi
  mov    $0x1e,%ebx
  jmp    L299
  nop
L77:
  cmp    $0xffffffff,%r15d
  je     L59
  lea    -0x3(%rdi),%ebx
L305:
  mov    0x14(%rsp),%r13d
  mov    %r13d,%edi
  add    $0x1,%r13d
  call   <get_byte@plt>
  mov    %r13d,0x14(%rsp)
  mov    %ebp,%esi
  mov    %r15d,%ecx
  jmp    L90
  nopl   (%rax)
L294:
  mov    %r14d,%edi
  mov    $0x1d,%ebx
  add    $0x4,%r14d
  mov    $0x1e,%r15d
  call   <get_long@plt>
  mov    %eax,%ebp
  test   %eax,%eax
  js     L270
  jmp    L305
  nopl   0x0(%rax,%rax,1)
L316:
  mov    %r14d,%edi
  mov    $0x1f,%ebx
  add    $0x4,%r14d
  call   <get_long@plt>
  mov    $0x1e,%edi
  mov    %eax,%ebp
  jmp    L6
  nopl   (%rax)
L196:
  mov    $0x2,%ecx
  jmp    L338
  nopw   0x0(%rax,%rax,1)
L244:
  mov    %r14d,%edi
  mov    $0x1e,%ebx
  add    $0x4,%r14d
  mov    $0x1f,%r15d
  call   <get_long@plt>
  mov    %eax,%ebp
  jmp    L270
L85:
  add    $0x28,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L59:
  mov    %r14d,%edi
  mov    $0x1e,%ebx
  add    $0x4,%r14d
  mov    $0x1f,%r15d
  call   <get_long@plt>
  mov    %eax,%ebp
  jmp    L305
```

assistant: ```c
int unlzss(unsigned char *out, int a2, int a3) {
  int a1;
  int d0, d1, d2, d3, d4, d6;
  int common_distances;
  unsigned char *copy_from;
  a1 = a3 + 20;
  d4 = get_word(a3);
  a3 = a3 + 3;
  common_distances = a3;
  *out++ = get_byte(a1++);
loc_cf6e:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cf7a;
loc_cf74:
  *out++ = get_byte(a1++);
loc_cf76:
  d1--;
  if (d1 < 0) {
    goto loc_cf6e;
  }
loc_cf7a:
  if (d0 & (1 << d1)) {
    goto loc_cf74;
  }
  d1--;
  if (d1 < 0) {
    goto loc_cf98;
  }
loc_cf82:
  if (d0 & (1 << d1)) {
    goto loc_cfa4;
  }
  d1--;
  if (d1 < 0) {
    goto loc_cf9e;
  }
loc_cf8a:
  d3 = get_byte(a1);
  a1++;
  if ((d0 & (1 << d1)) == 0) {
    goto loc_cfe6;
  }
  d3 = d3 | 0x100;
  goto loc_cfe6;
loc_cf98:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cf82;
loc_cf9e:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cf8a;
loc_cfa4:
  d1--;
  if (d1 < 0) {
    goto loc_cfcc;
  }
loc_cfa8:
  d2 = 0;
  d6 = 1;
loc_cfac:
  if (d0 & (1 << d1)) {
    goto loc_cfd2;
  }
  d1--;
  if (d1 < 0) {
    goto loc_cfc6;
  }
loc_cfb4:
  if ((d0 & (1 << d1)) == 0) {
    goto loc_cfba;
  }
  d2 = d2 + d6;
loc_cfba:
  d6 = d6 << 1;
  d1--;
  if (d1 >= 0) {
    goto loc_cfac;
  }
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfac;
loc_cfc6:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfb4;
loc_cfcc:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfa8;
loc_cfd2:
  d2 = d2 + d6;
  if (d2 == 16) {
    goto loc_d026;
  }
  d3 = get_byte(common_distances + d2);
  if (d4 & (1 << d2)) {
    d3 = d3 | 0x100;
  }
loc_cfe6:
  d1--;
  if (d1 < 0) {
    goto loc_d00e;
  }
loc_cfea:
  d2 = 0;
  d6 = 1;
loc_cfee:
  if (d0 & (1 << d1)) {
    goto loc_d014;
  }
  d1 = d1 - 1;
  if (d1 < 0) {
    goto loc_d008;
  }
loc_cff6:
  if ((d0 & (1 << d1))) {
    d2 = d2 + d6;
  }
  d6 = d6 << 1;
  d1--;
  if (d1 >= 0) {
    goto loc_cfee;
  }
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfee;
loc_d008:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cff6;
loc_d00e:
  d0 = get_long(a2);
  a2 = a2 + 4;
  d1 = 0x1f;
  goto loc_cfea;
loc_d014:
  d2 = d2 + d6 + 1;
  copy_from = out - d3;
  while (d2 >= 0) {
    *out++ = *copy_from++;
    d2--;
  }
  goto loc_cf76;
loc_d026:
  return 0;
}
```