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

```asm
<crypto_onetimeauth_poly1305_tinynacl>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x100,%rsp
  mov    %rdi,-0xe8(%rbp)
  mov    %rsi,-0xf0(%rbp)
  mov    %rdx,-0xf8(%rbp)
  mov    %rcx,-0x100(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x100(%rbp),%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  and    $0x3ffffff,%eax
  mov    %rax,-0xa8(%rbp)
  mov    -0x100(%rbp),%rax
  add    $0x3,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x2,%rax
  and    $0x3ffff03,%eax
  mov    %rax,-0xa0(%rbp)
  mov    -0x100(%rbp),%rax
  add    $0x6,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x4,%rax
  and    $0x3ffc0ff,%eax
  mov    %rax,-0x98(%rbp)
  mov    -0x100(%rbp),%rax
  add    $0x9,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x6,%rax
  and    $0x3f03fff,%eax
  mov    %rax,-0x90(%rbp)
  mov    -0x100(%rbp),%rax
  add    $0xc,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x8,%rax
  and    $0xfffff,%eax
  mov    %rax,-0x88(%rbp)
  mov    -0xa0(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  mov    %rax,-0x80(%rbp)
  mov    -0x98(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  mov    %rax,-0x78(%rbp)
  mov    -0x90(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  mov    %rax,-0x70(%rbp)
  mov    -0x88(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  mov    %rax,-0x68(%rbp)
  movq   $0x0,-0xb8(%rbp)
  mov    -0xb8(%rbp),%rax
  mov    %rax,-0xc0(%rbp)
  mov    -0xc0(%rbp),%rax
  mov    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  mov    %rax,-0xd0(%rbp)
  mov    -0xd0(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  jmp    L87
L8:
  cmpq   $0xf,-0xf8(%rbp)
  jbe    L27
  mov    -0xf0(%rbp),%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  and    $0x3ffffff,%eax
  add    %rax,-0xd8(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0x3,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x2,%rax
  and    $0x3ffffff,%eax
  add    %rax,-0xd0(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0x6,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x4,%rax
  and    $0x3ffffff,%eax
  add    %rax,-0xc8(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0x9,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x6,%rax
  and    $0x3ffffff,%eax
  add    %rax,-0xc0(%rbp)
  mov    -0xf0(%rbp),%rax
  add    $0xc,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x8,%rax
  or     $0x1000000,%rax
  add    %rax,-0xb8(%rbp)
  jmp    L55
L27:
  movq   $0x0,-0xb0(%rbp)
  jmp    L56
L63:
  lea    -0x20(%rbp),%rdx
  mov    -0xb0(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addq   $0x1,-0xb0(%rbp)
L56:
  cmpq   $0xf,-0xb0(%rbp)
  jle    L63
  movq   $0x0,-0xb0(%rbp)
  jmp    L53
L31:
  mov    -0xb0(%rbp),%rdx
  mov    -0xf0(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  lea    -0x20(%rbp),%rcx
  mov    -0xb0(%rbp),%rdx
  add    %rcx,%rdx
  mov    %al,(%rdx)
  addq   $0x1,-0xb0(%rbp)
L53:
  mov    -0xb0(%rbp),%rax
  cmp    %rax,-0xf8(%rbp)
  ja     L31
  lea    -0x20(%rbp),%rdx
  mov    -0xb0(%rbp),%rax
  add    %rdx,%rax
  movb   $0x1,(%rax)
  lea    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  and    $0x3ffffff,%eax
  add    %rax,-0xd8(%rbp)
  lea    -0x20(%rbp),%rax
  add    $0x3,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x2,%rax
  and    $0x3ffffff,%eax
  add    %rax,-0xd0(%rbp)
  lea    -0x20(%rbp),%rax
  add    $0x6,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x4,%rax
  and    $0x3ffffff,%eax
  add    %rax,-0xc8(%rbp)
  lea    -0x20(%rbp),%rax
  add    $0x9,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x6,%rax
  and    $0x3ffffff,%eax
  add    %rax,-0xc0(%rbp)
  lea    -0x20(%rbp),%rax
  add    $0xc,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  shr    $0x8,%rax
  add    %rax,-0xb8(%rbp)
L55:
  mov    -0xd8(%rbp),%rax
  imul   -0xa8(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xd0(%rbp),%rax
  imul   -0x68(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0xc0(%rbp),%rax
  imul   -0x78(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xc8(%rbp),%rax
  imul   -0x70(%rbp),%rax
  add    %rdx,%rax
  lea    (%rcx,%rax,1),%rdx
  mov    -0xb8(%rbp),%rax
  imul   -0x80(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x48(%rbp)
  mov    -0xd8(%rbp),%rax
  imul   -0xa0(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xd0(%rbp),%rax
  imul   -0xa8(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0xc0(%rbp),%rax
  imul   -0x70(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xc8(%rbp),%rax
  imul   -0x68(%rbp),%rax
  add    %rdx,%rax
  lea    (%rcx,%rax,1),%rdx
  mov    -0xb8(%rbp),%rax
  imul   -0x78(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x40(%rbp)
  mov    -0xd8(%rbp),%rax
  imul   -0x98(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xd0(%rbp),%rax
  imul   -0xa0(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0xc0(%rbp),%rax
  imul   -0x68(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xc8(%rbp),%rax
  imul   -0xa8(%rbp),%rax
  add    %rdx,%rax
  lea    (%rcx,%rax,1),%rdx
  mov    -0xb8(%rbp),%rax
  imul   -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x38(%rbp)
  mov    -0xd8(%rbp),%rax
  imul   -0x90(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xd0(%rbp),%rax
  imul   -0x98(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0xc0(%rbp),%rax
  imul   -0xa8(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xc8(%rbp),%rax
  imul   -0xa0(%rbp),%rax
  add    %rdx,%rax
  lea    (%rcx,%rax,1),%rdx
  mov    -0xb8(%rbp),%rax
  imul   -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x30(%rbp)
  mov    -0xd8(%rbp),%rax
  imul   -0x88(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xd0(%rbp),%rax
  imul   -0x90(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0xc0(%rbp),%rax
  imul   -0xa0(%rbp),%rax
  mov    %rax,%rdx
  mov    -0xc8(%rbp),%rax
  imul   -0x98(%rbp),%rax
  add    %rdx,%rax
  lea    (%rcx,%rax,1),%rdx
  mov    -0xb8(%rbp),%rax
  imul   -0xa8(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x48(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x48(%rbp),%rax
  and    $0x3ffffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0x60(%rbp),%rax
  add    %rax,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x40(%rbp),%rax
  and    $0x3ffffff,%eax
  mov    %rax,-0xd0(%rbp)
  mov    -0x60(%rbp),%rax
  add    %rax,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x38(%rbp),%rax
  and    $0x3ffffff,%eax
  mov    %rax,-0xc8(%rbp)
  mov    -0x60(%rbp),%rax
  add    %rax,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x30(%rbp),%rax
  and    $0x3ffffff,%eax
  mov    %rax,-0xc0(%rbp)
  mov    -0x60(%rbp),%rax
  add    %rax,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x28(%rbp),%rax
  and    $0x3ffffff,%eax
  mov    %rax,-0xb8(%rbp)
  mov    -0x60(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,-0xd8(%rbp)
  mov    -0xd8(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0xd8(%rbp)
  mov    -0x60(%rbp),%rax
  add    %rax,-0xd0(%rbp)
  addq   $0x10,-0xf0(%rbp)
  subq   $0x10,-0xf8(%rbp)
L87:
  mov    -0xf8(%rbp),%rax
  test   %rax,%rax
  jg     L8
  mov    -0xd0(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0xd0(%rbp)
  mov    -0x60(%rbp),%rax
  add    %rax,-0xc8(%rbp)
  mov    -0xc8(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0xc8(%rbp)
  mov    -0x60(%rbp),%rax
  add    %rax,-0xc0(%rbp)
  mov    -0xc0(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0xc0(%rbp)
  mov    -0x60(%rbp),%rax
  add    %rax,-0xb8(%rbp)
  mov    -0xb8(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0xb8(%rbp)
  mov    -0x60(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,-0xd8(%rbp)
  mov    -0xd8(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0xd8(%rbp)
  mov    -0x60(%rbp),%rax
  add    %rax,-0xd0(%rbp)
  mov    -0xd8(%rbp),%rax
  add    $0x5,%rax
  mov    %rax,-0xa8(%rbp)
  mov    -0xa8(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0xa8(%rbp)
  mov    -0xd0(%rbp),%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0xa0(%rbp)
  mov    -0xa0(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0xa0(%rbp)
  mov    -0xc8(%rbp),%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x98(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0x98(%rbp)
  mov    -0xc0(%rbp),%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x90(%rbp)
  mov    -0x90(%rbp),%rax
  shr    $0x1a,%rax
  mov    %rax,-0x60(%rbp)
  andq   $0x3ffffff,-0x90(%rbp)
  mov    -0xb8(%rbp),%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  sub    $0x4000000,%rax
  mov    %rax,-0x88(%rbp)
  mov    -0x88(%rbp),%rax
  shr    $0x3f,%rax
  sub    $0x1,%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x58(%rbp),%rax
  and    %rax,-0xa8(%rbp)
  mov    -0x58(%rbp),%rax
  and    %rax,-0xa0(%rbp)
  mov    -0x58(%rbp),%rax
  and    %rax,-0x98(%rbp)
  mov    -0x58(%rbp),%rax
  and    %rax,-0x90(%rbp)
  mov    -0x58(%rbp),%rax
  and    %rax,-0x88(%rbp)
  notq   -0x58(%rbp)
  mov    -0xd8(%rbp),%rax
  and    -0x58(%rbp),%rax
  or     -0xa8(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0xd0(%rbp),%rax
  and    -0x58(%rbp),%rax
  or     -0xa0(%rbp),%rax
  mov    %rax,-0xd0(%rbp)
  mov    -0xc8(%rbp),%rax
  and    -0x58(%rbp),%rax
  or     -0x98(%rbp),%rax
  mov    %rax,-0xc8(%rbp)
  mov    -0xc0(%rbp),%rax
  and    -0x58(%rbp),%rax
  or     -0x90(%rbp),%rax
  mov    %rax,-0xc0(%rbp)
  mov    -0xb8(%rbp),%rax
  and    -0x58(%rbp),%rax
  or     -0x88(%rbp),%rax
  mov    %rax,-0xb8(%rbp)
  mov    -0xd0(%rbp),%rax
  shl    $0x1a,%rax
  or     -0xd8(%rbp),%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xd8(%rbp)
  mov    -0xd0(%rbp),%rax
  shr    $0x6,%rax
  mov    %rax,%rdx
  mov    -0xc8(%rbp),%rax
  shl    $0x14,%rax
  or     %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xd0(%rbp)
  mov    -0xc8(%rbp),%rax
  shr    $0xc,%rax
  mov    %rax,%rdx
  mov    -0xc0(%rbp),%rax
  shl    $0xe,%rax
  or     %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xc8(%rbp)
  mov    -0xc0(%rbp),%rax
  shr    $0x12,%rax
  mov    %rax,%rdx
  mov    -0xb8(%rbp),%rax
  shl    $0x8,%rax
  or     %rdx,%rax
  and    $0xffffffff,%eax
  mov    %rax,-0xc0(%rbp)
  mov    -0x100(%rbp),%rax
  add    $0x10,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  mov    -0xd8(%rbp),%rdx
  add    %rdx,%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  mov    %rax,-0xd8(%rbp)
  mov    -0x100(%rbp),%rax
  add    $0x14,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  mov    -0xd0(%rbp),%rdx
  add    %rax,%rdx
  mov    -0x50(%rbp),%rax
  shr    $0x20,%rax
  add    %rdx,%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  mov    %rax,-0xd0(%rbp)
  mov    -0x100(%rbp),%rax
  add    $0x18,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  mov    -0xc8(%rbp),%rdx
  add    %rax,%rdx
  mov    -0x50(%rbp),%rax
  shr    $0x20,%rax
  add    %rdx,%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  mov    %rax,-0xc8(%rbp)
  mov    -0x100(%rbp),%rax
  add    $0x1c,%rax
  mov    %rax,%rdi
  call   <unpack@plt>
  mov    -0xc0(%rbp),%rdx
  add    %rax,%rdx
  mov    -0x50(%rbp),%rax
  shr    $0x20,%rax
  add    %rdx,%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  mov    %rax,-0xc0(%rbp)
  mov    -0xd8(%rbp),%rdx
  mov    -0xe8(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <pack@plt>
  mov    -0xe8(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0xd0(%rbp),%rax
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <pack@plt>
  mov    -0xe8(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0xc8(%rbp),%rax
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <pack@plt>
  mov    -0xe8(%rbp),%rax
  lea    0xc(%rax),%rdx
  mov    -0xc0(%rbp),%rax
  mov    %rax,%rsi
  mov    %rdx,%rdi
  call   <pack@plt>
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L15
  call   <__stack_chk_fail@plt>
L15:
  leave
  ret
```

assistant: ```c
int crypto_onetimeauth_poly1305_tinynacl(unsigned char *o, const unsigned char *m, unsigned long long n, const unsigned char *k) {
  unsigned long h0, h1, h2, h3, h4;
  unsigned long r0, r1, r2, r3, r4;
  unsigned long s1, s2, s3, s4;
  unsigned long long d0, d1, d2, d3, d4;
  unsigned long c, mask;
  unsigned long long f;
  long long i;
  r0 = (unpack(k + 0)) & 0x3ffffff;
  r1 = (unpack(k + 3) >> 2) & 0x3ffff03;
  r2 = (unpack(k + 6) >> 4) & 0x3ffc0ff;
  r3 = (unpack(k + 9) >> 6) & 0x3f03fff;
  r4 = (unpack(k + 12) >> 8) & 0x00fffff;
  s1 = r1 * 5;
  s2 = r2 * 5;
  s3 = r3 * 5;
  s4 = r4 * 5;
  h0 = h1 = h2 = h3 = h4 = 0;
  while ((long long)n > 0) {
    if (n >= 16) {
      h0 += (unpack(m)) & 0x3ffffff;
      h1 += (unpack(m + 3) >> 2) & 0x3ffffff;
      h2 += (unpack(m + 6) >> 4) & 0x3ffffff;
      h3 += (unpack(m + 9) >> 6) & 0x3ffffff;
      h4 += (unpack(m + 12) >> 8) | 16777216;
    } else {
      unsigned char mm[16];
      for (i = 0; i < 16; ++i)
        mm[i] = 0;
      for (i = 0; i < n; ++i)
        mm[i] = m[i];
      mm[i] = 1;
      h0 += (unpack(mm)) & 0x3ffffff;
      h1 += (unpack(mm + 3) >> 2) & 0x3ffffff;
      h2 += (unpack(mm + 6) >> 4) & 0x3ffffff;
      h3 += (unpack(mm + 9) >> 6) & 0x3ffffff;
      h4 += (unpack(mm + 12) >> 8);
    }
    d0 = ((unsigned long long)h0 * r0) + ((unsigned long long)h1 * s4) + ((unsigned long long)h2 * s3) + ((unsigned long long)h3 * s2) + ((unsigned long long)h4 * s1);
    d1 = ((unsigned long long)h0 * r1) + ((unsigned long long)h1 * r0) + ((unsigned long long)h2 * s4) + ((unsigned long long)h3 * s3) + ((unsigned long long)h4 * s2);
    d2 = ((unsigned long long)h0 * r2) + ((unsigned long long)h1 * r1) + ((unsigned long long)h2 * r0) + ((unsigned long long)h3 * s4) + ((unsigned long long)h4 * s3);
    d3 = ((unsigned long long)h0 * r3) + ((unsigned long long)h1 * r2) + ((unsigned long long)h2 * r1) + ((unsigned long long)h3 * r0) + ((unsigned long long)h4 * s4);
    d4 = ((unsigned long long)h0 * r4) + ((unsigned long long)h1 * r3) + ((unsigned long long)h2 * r2) + ((unsigned long long)h3 * r1) + ((unsigned long long)h4 * r0);
    c = (unsigned long)(d0 >> 26);
    h0 = (unsigned long)d0 & 0x3ffffff;
    d1 += c;
    c = (unsigned long)(d1 >> 26);
    h1 = (unsigned long)d1 & 0x3ffffff;
    d2 += c;
    c = (unsigned long)(d2 >> 26);
    h2 = (unsigned long)d2 & 0x3ffffff;
    d3 += c;
    c = (unsigned long)(d3 >> 26);
    h3 = (unsigned long)d3 & 0x3ffffff;
    d4 += c;
    c = (unsigned long)(d4 >> 26);
    h4 = (unsigned long)d4 & 0x3ffffff;
    h0 += c * 5;
    c = (h0 >> 26);
    h0 = h0 & 0x3ffffff;
    h1 += c;
    m += 16;
    n -= 16;
  }
  c = h1 >> 26;
  h1 = h1 & 0x3ffffff;
  h2 += c;
  c = h2 >> 26;
  h2 = h2 & 0x3ffffff;
  h3 += c;
  c = h3 >> 26;
  h3 = h3 & 0x3ffffff;
  h4 += c;
  c = h4 >> 26;
  h4 = h4 & 0x3ffffff;
  h0 += c * 5;
  c = h0 >> 26;
  h0 = h0 & 0x3ffffff;
  h1 += c;
  r0 = h0 + 5;
  c = r0 >> 26;
  r0 &= 0x3ffffff;
  r1 = h1 + c;
  c = r1 >> 26;
  r1 &= 0x3ffffff;
  r2 = h2 + c;
  c = r2 >> 26;
  r2 &= 0x3ffffff;
  r3 = h3 + c;
  c = r3 >> 26;
  r3 &= 0x3ffffff;
  r4 = h4 + c - (1 << 26);
  mask = (r4 >> ((sizeof(unsigned long) * 8) - 1)) - 1;
  r0 &= mask;
  r1 &= mask;
  r2 &= mask;
  r3 &= mask;
  r4 &= mask;
  mask = ~mask;
  h0 = (h0 & mask) | r0;
  h1 = (h1 & mask) | r1;
  h2 = (h2 & mask) | r2;
  h3 = (h3 & mask) | r3;
  h4 = (h4 & mask) | r4;
  h0 = ((h0) | (h1 << 26)) & 0xffffffff;
  h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff;
  h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;
  h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff;
  f = (unsigned long long)h0 + unpack(k + 16);
  h0 = (unsigned long)f;
  f = (unsigned long long)h1 + unpack(k + 20) + (f >> 32);
  h1 = (unsigned long)f;
  f = (unsigned long long)h2 + unpack(k + 24) + (f >> 32);
  h2 = (unsigned long)f;
  f = (unsigned long long)h3 + unpack(k + 28) + (f >> 32);
  h3 = (unsigned long)f;
  pack(o + 0, h0);
  pack(o + 4, h1);
  pack(o + 8, h2);
  pack(o + 12, h3);
  return 0;
}
```