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

```asm
<MD5Transform>:
  endbr64
  push   %r15
  mov    %rdi,%r9
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    (%rsi),%r14d
  mov    0x8(%rdi),%r15d
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  mov    (%rdi),%eax
  mov    0x4(%rdi),%r8d
  movdqu (%rsi),%xmm2
  mov    0x20(%rsi),%ebx
  lea    -0x28955b88(%rax,%r14,1),%edx
  mov    0xc(%rdi),%eax
  mov    0x10(%rsi),%r10d
  movaps %xmm2,0x10(%rsp)
  movdqu 0x10(%rsi),%xmm3
  movdqu 0x20(%rsi),%xmm4
  xor    %r15d,%eax
  movdqu 0x30(%rsi),%xmm5
  mov    0xc(%r9),%esi
  and    %r8d,%eax
  xor    0xc(%rdi),%eax
  mov    0x14(%rsp),%edi
  movaps %xmm3,0x20(%rsp)
  add    %edx,%eax
  mov    %r8d,%edx
  movaps %xmm5,0x40(%rsp)
  mov    0x40(%rsp),%ebp
  rol    $0x7,%eax
  xor    %r15d,%edx
  movaps %xmm4,0x30(%rsp)
  lea    -0x173848aa(%rdi,%rsi,1),%ecx
  add    %r8d,%eax
  mov    0x18(%rsp),%edi
  and    %eax,%edx
  xor    %r15d,%edx
  lea    0x242070db(%rdi,%r15,1),%esi
  mov    0x1c(%rsp),%edi
  add    %ecx,%edx
  mov    %r8d,%ecx
  rol    $0xc,%edx
  xor    %eax,%ecx
  lea    -0x3e423112(%rdi,%r8,1),%edi
  add    %eax,%edx
  and    %edx,%ecx
  xor    %r8d,%ecx
  add    %esi,%ecx
  mov    %eax,%esi
  ror    $0xf,%ecx
  xor    %edx,%esi
  add    %edx,%ecx
  and    %ecx,%esi
  xor    %eax,%esi
  add    %edi,%esi
  lea    -0xa83f051(%rax,%r10,1),%edi
  mov    %edx,%eax
  ror    $0xa,%esi
  xor    %ecx,%eax
  add    %ecx,%esi
  and    %esi,%eax
  xor    %edx,%eax
  add    %edi,%eax
  mov    0x24(%rsp),%edi
  rol    $0x7,%eax
  lea    0x4787c62a(%rdi,%rdx,1),%edi
  mov    %ecx,%edx
  add    %esi,%eax
  xor    %esi,%edx
  and    %eax,%edx
  xor    %ecx,%edx
  add    %edi,%edx
  mov    0x28(%rsp),%edi
  mov    0x2c(%rsp),%r13d
  rol    $0xc,%edx
  mov    0x48(%rsp),%r12d
  mov    0x4c(%rsp),%r11d
  lea    -0x57cfb9ed(%rdi,%rcx,1),%edi
  mov    %esi,%ecx
  add    %eax,%edx
  xor    %eax,%ecx
  and    %edx,%ecx
  xor    %esi,%ecx
  add    %edi,%ecx
  lea    -0x2b96aff(%r13,%rsi,1),%edi
  mov    %eax,%esi
  ror    $0xf,%ecx
  xor    %edx,%esi
  add    %edx,%ecx
  and    %ecx,%esi
  xor    %eax,%esi
  add    %edi,%esi
  lea    0x698098d8(%rax,%rbx,1),%edi
  mov    %edx,%eax
  ror    $0xa,%esi
  xor    %ecx,%eax
  add    %ecx,%esi
  and    %esi,%eax
  xor    %edx,%eax
  add    %edi,%eax
  mov    0x34(%rsp),%edi
  rol    $0x7,%eax
  lea    -0x74bb0851(%rdi,%rdx,1),%edi
  mov    %ecx,%edx
  add    %esi,%eax
  xor    %esi,%edx
  and    %eax,%edx
  xor    %ecx,%edx
  add    %edi,%edx
  mov    0x38(%rsp),%edi
  rol    $0xc,%edx
  lea    -0xa44f(%rdi,%rcx,1),%edi
  mov    %esi,%ecx
  add    %eax,%edx
  xor    %eax,%ecx
  and    %edx,%ecx
  xor    %esi,%ecx
  add    %edi,%ecx
  mov    0x3c(%rsp),%edi
  ror    $0xf,%ecx
  lea    -0x76a32842(%rdi,%rsi,1),%edi
  mov    %eax,%esi
  add    %edx,%ecx
  xor    %edx,%esi
  and    %ecx,%esi
  xor    %eax,%esi
  add    %edi,%esi
  lea    0x6b901122(%rax,%rbp,1),%edi
  mov    %edx,%eax
  ror    $0xa,%esi
  xor    %ecx,%eax
  add    %ecx,%esi
  and    %esi,%eax
  xor    %edx,%eax
  add    %edi,%eax
  mov    0x44(%rsp),%edi
  rol    $0x7,%eax
  lea    -0x2678e6d(%rdi,%rdx,1),%edi
  mov    %ecx,%edx
  add    %esi,%eax
  xor    %esi,%edx
  and    %eax,%edx
  xor    %ecx,%edx
  add    %edi,%edx
  lea    -0x5986bc72(%r12,%rcx,1),%edi
  mov    %esi,%ecx
  rol    $0xc,%edx
  xor    %eax,%ecx
  add    %eax,%edx
  and    %edx,%ecx
  xor    %esi,%ecx
  add    %edi,%ecx
  lea    0x49b40821(%r11,%rsi,1),%edi
  mov    %eax,%esi
  ror    $0xf,%ecx
  xor    %edx,%esi
  add    %edx,%ecx
  and    %ecx,%esi
  xor    %eax,%esi
  add    %edi,%esi
  mov    0x14(%rsp),%edi
  ror    $0xa,%esi
  add    %ecx,%esi
  lea    -0x9e1da9e(%rdi,%rax,1),%edi
  mov    %ecx,%eax
  xor    %esi,%eax
  and    %edx,%eax
  xor    %ecx,%eax
  add    %edi,%eax
  mov    0x28(%rsp),%edi
  rol    $0x5,%eax
  add    %esi,%eax
  lea    -0x3fbf4cc0(%rdi,%rdx,1),%edi
  mov    %esi,%edx
  xor    %eax,%edx
  and    %ecx,%edx
  xor    %esi,%edx
  add    %edi,%edx
  mov    0x3c(%rsp),%edi
  rol    $0x9,%edx
  add    %eax,%edx
  lea    0x265e5a51(%rdi,%rcx,1),%edi
  mov    %eax,%ecx
  xor    %edx,%ecx
  and    %esi,%ecx
  xor    %eax,%ecx
  add    %edi,%ecx
  lea    -0x16493856(%rsi,%r14,1),%edi
  mov    %edx,%esi
  rol    $0xe,%ecx
  add    %edx,%ecx
  xor    %ecx,%esi
  and    %eax,%esi
  xor    %edx,%esi
  add    %edi,%esi
  mov    0x24(%rsp),%edi
  ror    $0xc,%esi
  add    %ecx,%esi
  lea    -0x29d0efa3(%rdi,%rax,1),%edi
  mov    %ecx,%eax
  xor    %esi,%eax
  and    %edx,%eax
  xor    %ecx,%eax
  add    %edi,%eax
  mov    0x38(%rsp),%edi
  rol    $0x5,%eax
  add    %esi,%eax
  lea    0x2441453(%rdi,%rdx,1),%edi
  mov    %esi,%edx
  xor    %eax,%edx
  and    %ecx,%edx
  xor    %esi,%edx
  add    %edi,%edx
  lea    -0x275e197f(%r11,%rcx,1),%edi
  mov    %eax,%ecx
  rol    $0x9,%edx
  add    %eax,%edx
  xor    %edx,%ecx
  and    %esi,%ecx
  xor    %eax,%ecx
  add    %edi,%ecx
  lea    -0x182c0438(%rsi,%r10,1),%edi
  mov    %edx,%esi
  rol    $0xe,%ecx
  add    %edx,%ecx
  xor    %ecx,%esi
  and    %eax,%esi
  xor    %edx,%esi
  add    %edi,%esi
  mov    0x34(%rsp),%edi
  ror    $0xc,%esi
  add    %ecx,%esi
  lea    0x21e1cde6(%rdi,%rax,1),%edi
  mov    %ecx,%eax
  xor    %esi,%eax
  and    %edx,%eax
  xor    %ecx,%eax
  add    %edi,%eax
  lea    -0x3cc8f82a(%r12,%rdx,1),%edi
  mov    %esi,%edx
  rol    $0x5,%eax
  add    %esi,%eax
  xor    %eax,%edx
  and    %ecx,%edx
  xor    %esi,%edx
  add    %edi,%edx
  mov    0x1c(%rsp),%edi
  rol    $0x9,%edx
  add    %eax,%edx
  lea    -0xb2af279(%rdi,%rcx,1),%edi
  mov    %eax,%ecx
  xor    %edx,%ecx
  and    %esi,%ecx
  lea    0x455a14ed(%rsi,%rbx,1),%esi
  xor    %eax,%ecx
  add    %edi,%ecx
  mov    %edx,%edi
  rol    $0xe,%ecx
  add    %edx,%ecx
  xor    %ecx,%edi
  and    %eax,%edi
  xor    %edx,%edi
  add    %esi,%edi
  mov    0x44(%rsp),%esi
  ror    $0xc,%edi
  add    %ecx,%edi
  lea    -0x561c16fb(%rsi,%rax,1),%esi
  mov    %ecx,%eax
  xor    %edi,%eax
  and    %edx,%eax
  xor    %ecx,%eax
  add    %esi,%eax
  mov    0x18(%rsp),%esi
  rol    $0x5,%eax
  add    %edi,%eax
  lea    -0x3105c08(%rsi,%rdx,1),%esi
  mov    %edi,%edx
  xor    %eax,%edx
  and    %ecx,%edx
  lea    0x676f02d9(%r13,%rcx,1),%ecx
  xor    %edi,%edx
  add    %esi,%edx
  mov    %eax,%esi
  rol    $0x9,%edx
  add    %eax,%edx
  xor    %edx,%esi
  and    %edi,%esi
  lea    -0x72d5b376(%rdi,%rbp,1),%edi
  xor    %eax,%esi
  add    %ecx,%esi
  mov    %edx,%ecx
  rol    $0xe,%esi
  add    %edx,%esi
  xor    %esi,%ecx
  mov    %ecx,0xc(%rsp)
  mov    %edi,%ecx
  mov    0xc(%rsp),%edi
  and    %eax,%edi
  xor    %edx,%edi
  add    %ecx,%edi
  mov    0x24(%rsp),%ecx
  ror    $0xc,%edi
  lea    -0x5c6be(%rcx,%rax,1),%eax
  mov    0xc(%rsp),%ecx
  add    %esi,%edi
  xor    %edi,%ecx
  add    %eax,%ecx
  lea    -0x788e097f(%rdx,%rbx,1),%eax
  mov    %esi,%edx
  rol    $0x4,%ecx
  xor    %edi,%edx
  add    %edi,%ecx
  xor    %ecx,%edx
  add    %eax,%edx
  mov    0x3c(%rsp),%eax
  rol    $0xb,%edx
  lea    0x6d9d6122(%rax,%rsi,1),%eax
  mov    %edi,%esi
  add    %ecx,%edx
  xor    %ecx,%esi
  lea    -0x21ac7f4(%r12,%rdi,1),%edi
  xor    %edx,%esi
  add    %eax,%esi
  mov    %ecx,%eax
  rol    $0x10,%esi
  xor    %edx,%eax
  add    %edx,%esi
  xor    %esi,%eax
  add    %edi,%eax
  mov    0x14(%rsp),%edi
  ror    $0x9,%eax
  lea    -0x5b4115bc(%rdi,%rcx,1),%edi
  mov    %edx,%ecx
  add    %esi,%eax
  xor    %esi,%ecx
  lea    0x4bdecfa9(%rdx,%r10,1),%edx
  xor    %eax,%ecx
  add    %edi,%ecx
  mov    %esi,%edi
  lea    -0x944b4a0(%r13,%rsi,1),%esi
  rol    $0x4,%ecx
  xor    %eax,%edi
  add    %eax,%ecx
  xor    %ecx,%edi
  add    %edx,%edi
  mov    %eax,%edx
  rol    $0xb,%edi
  xor    %ecx,%edx
  add    %ecx,%edi
  xor    %edi,%edx
  add    %esi,%edx
  mov    0x38(%rsp),%esi
  rol    $0x10,%edx
  lea    -0x41404390(%rsi,%rax,1),%eax
  mov    %ecx,%esi
  add    %edi,%edx
  xor    %edi,%esi
  xor    %edx,%esi
  add    %eax,%esi
  mov    0x44(%rsp),%eax
  ror    $0x9,%esi
  lea    0x289b7ec6(%rax,%rcx,1),%eax
  mov    %edi,%ecx
  add    %edx,%esi
  xor    %edx,%ecx
  lea    -0x155ed806(%rdi,%r14,1),%edi
  xor    %esi,%ecx
  add    %eax,%ecx
  mov    %edx,%eax
  rol    $0x4,%ecx
  xor    %esi,%eax
  add    %esi,%ecx
  xor    %ecx,%eax
  add    %edi,%eax
  mov    0x1c(%rsp),%edi
  rol    $0xb,%eax
  lea    -0x2b10cf7b(%rdi,%rdx,1),%edx
  mov    %esi,%edi
  add    %ecx,%eax
  xor    %ecx,%edi
  xor    %eax,%edi
  add    %edx,%edi
  mov    0x28(%rsp),%edx
  rol    $0x10,%edi
  lea    0x4881d05(%rdx,%rsi,1),%edx
  mov    %ecx,%esi
  add    %eax,%edi
  xor    %eax,%esi
  xor    %edi,%esi
  add    %edx,%esi
  mov    0x34(%rsp),%edx
  ror    $0x9,%esi
  lea    -0x262b2fc7(%rdx,%rcx,1),%ecx
  mov    %eax,%edx
  add    %edi,%esi
  xor    %edi,%edx
  lea    -0x1924661b(%rax,%rbp,1),%eax
  xor    %esi,%edx
  add    %ecx,%edx
  mov    %edi,%ecx
  rol    $0x4,%edx
  xor    %esi,%ecx
  add    %esi,%edx
  xor    %edx,%ecx
  add    %eax,%ecx
  lea    0x1fa27cf8(%r11,%rdi,1),%eax
  mov    %esi,%edi
  rol    $0xb,%ecx
  xor    %edx,%edi
  add    %edx,%ecx
  xor    %ecx,%edi
  add    %eax,%edi
  mov    0x18(%rsp),%eax
  rol    $0x10,%edi
  lea    -0x3b53a99b(%rax,%rsi,1),%esi
  mov    %edx,%eax
  add    %ecx,%edi
  xor    %ecx,%eax
  xor    %edi,%eax
  add    %esi,%eax
  lea    -0xbd6ddbc(%rdx,%r14,1),%esi
  mov    %ecx,%edx
  ror    $0x9,%eax
  not    %edx
  add    %edi,%eax
  or     %eax,%edx
  xor    %edi,%edx
  add    %esi,%edx
  lea    0x432aff97(%r13,%rcx,1),%esi
  mov    %edi,%ecx
  rol    $0x6,%edx
  not    %ecx
  lea    -0x546bdc59(%r12,%rdi,1),%edi
  add    %eax,%edx
  or     %edx,%ecx
  xor    %eax,%ecx
  add    %esi,%ecx
  mov    %eax,%esi
  rol    $0xa,%ecx
  not    %esi
  add    %edx,%ecx
  or     %ecx,%esi
  xor    %edx,%esi
  add    %edi,%esi
  mov    0x24(%rsp),%edi
  rol    $0xf,%esi
  lea    -0x36c5fc7(%rdi,%rax,1),%edi
  mov    %edx,%eax
  add    %ecx,%esi
  not    %eax
  or     %esi,%eax
  xor    %ecx,%eax
  add    %edi,%eax
  lea    0x655b59c3(%rdx,%rbp,1),%edi
  mov    %ecx,%edx
  ror    $0xb,%eax
  not    %edx
  add    %esi,%eax
  or     %eax,%edx
  xor    %esi,%edx
  add    %edi,%edx
  mov    0x1c(%rsp),%edi
  rol    $0x6,%edx
  lea    -0x70f3336e(%rdi,%rcx,1),%edi
  mov    %esi,%ecx
  add    %eax,%edx
  not    %ecx
  or     %edx,%ecx
  xor    %eax,%ecx
  add    %edi,%ecx
  mov    0x38(%rsp),%edi
  rol    $0xa,%ecx
  lea    -0x100b83(%rdi,%rsi,1),%edi
  mov    %eax,%esi
  add    %edx,%ecx
  not    %esi
  or     %ecx,%esi
  xor    %edx,%esi
  add    %edi,%esi
  mov    0x14(%rsp),%edi
  rol    $0xf,%esi
  lea    -0x7a7ba22f(%rdi,%rax,1),%edi
  mov    %edx,%eax
  add    %ecx,%esi
  not    %eax
  or     %esi,%eax
  xor    %ecx,%eax
  add    %edi,%eax
  lea    0x6fa87e4f(%rdx,%rbx,1),%edi
  mov    %ecx,%edx
  mov    0x28(%rsp),%ebx
  ror    $0xb,%eax
  not    %edx
  add    %esi,%eax
  or     %eax,%edx
  xor    %esi,%edx
  add    %edi,%edx
  lea    -0x1d31920(%r11,%rcx,1),%edi
  mov    %esi,%ecx
  rol    $0x6,%edx
  not    %ecx
  add    %eax,%edx
  or     %edx,%ecx
  xor    %eax,%ecx
  add    %edi,%ecx
  lea    -0x5cfebcec(%rbx,%rsi,1),%edi
  mov    %eax,%esi
  mov    0x44(%rsp),%ebx
  rol    $0xa,%ecx
  not    %esi
  add    %edx,%ecx
  lea    0x4e0811a1(%rbx,%rax,1),%eax
  mov    0x3c(%rsp),%ebx
  or     %ecx,%esi
  xor    %edx,%esi
  add    %edi,%esi
  mov    %edx,%edi
  lea    -0x8ac817e(%rdx,%r10,1),%edx
  rol    $0xf,%esi
  not    %edi
  add    %ecx,%esi
  or     %esi,%edi
  xor    %ecx,%edi
  add    %eax,%edi
  mov    %ecx,%eax
  lea    -0x42c50dcb(%rbx,%rcx,1),%ecx
  mov    0x18(%rsp),%ebx
  ror    $0xb,%edi
  not    %eax
  add    %esi,%edi
  or     %edi,%eax
  xor    %esi,%eax
  add    %edx,%eax
  mov    %esi,%edx
  lea    0x2ad7d2bb(%rbx,%rsi,1),%esi
  mov    0x34(%rsp),%ebx
  rol    $0x6,%eax
  not    %edx
  add    %edi,%eax
  or     %eax,%edx
  xor    %edi,%edx
  add    %ecx,%edx
  mov    %edi,%ecx
  lea    -0x14792c6f(%rbx,%rdi,1),%edi
  rol    $0xa,%edx
  not    %ecx
  add    %eax,%edx
  or     %edx,%ecx
  xor    %eax,%ecx
  add    %esi,%ecx
  mov    %eax,%esi
  add    (%r9),%eax
  rol    $0xf,%ecx
  not    %esi
  movd   %eax,%xmm1
  add    %edx,%ecx
  or     %ecx,%esi
  lea    (%r15,%rcx,1),%ebx
  xor    %edx,%esi
  movd   %ebx,%xmm0
  add    %edi,%esi
  mov    %esi,%eax
  ror    $0xb,%eax
  add    %ecx,%r8d
  add    0xc(%r9),%edx
  add    %r8d,%eax
  movd   %edx,%xmm6
  movd   %eax,%xmm7
  punpckldq %xmm6,%xmm0
  punpckldq %xmm7,%xmm1
  punpcklqdq %xmm0,%xmm1
  movups %xmm1,(%r9)
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L6
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L6:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void MD5Transform(unsigned int state[4], const unsigned char block[64]) {
  unsigned int a = state[0], b = state[1], c = state[2], d = state[3], x[16];
  memcpy(x, block, 64);
  {
    (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (x[0]) + (unsigned int)(0xd76aa478);
    (a) = ((((a)) << ((7))) | (((a)) >> (32 - ((7)))));
    (a) += (b);
  };
  {
    (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (x[1]) + (unsigned int)(0xe8c7b756);
    (d) = ((((d)) << ((12))) | (((d)) >> (32 - ((12)))));
    (d) += (a);
  };
  {
    (c) += ((((d)) & ((a))) | ((~(d)) & ((b)))) + (x[2]) + (unsigned int)(0x242070db);
    (c) = ((((c)) << ((17))) | (((c)) >> (32 - ((17)))));
    (c) += (d);
  };
  {
    (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (x[3]) + (unsigned int)(0xc1bdceee);
    (b) = ((((b)) << ((22))) | (((b)) >> (32 - ((22)))));
    (b) += (c);
  };
  {
    (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (x[4]) + (unsigned int)(0xf57c0faf);
    (a) = ((((a)) << ((7))) | (((a)) >> (32 - ((7)))));
    (a) += (b);
  };
  {
    (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (x[5]) + (unsigned int)(0x4787c62a);
    (d) = ((((d)) << ((12))) | (((d)) >> (32 - ((12)))));
    (d) += (a);
  };
  {
    (c) += ((((d)) & ((a))) | ((~(d)) & ((b)))) + (x[6]) + (unsigned int)(0xa8304613);
    (c) = ((((c)) << ((17))) | (((c)) >> (32 - ((17)))));
    (c) += (d);
  };
  {
    (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (x[7]) + (unsigned int)(0xfd469501);
    (b) = ((((b)) << ((22))) | (((b)) >> (32 - ((22)))));
    (b) += (c);
  };
  {
    (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (x[8]) + (unsigned int)(0x698098d8);
    (a) = ((((a)) << ((7))) | (((a)) >> (32 - ((7)))));
    (a) += (b);
  };
  {
    (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (x[9]) + (unsigned int)(0x8b44f7af);
    (d) = ((((d)) << ((12))) | (((d)) >> (32 - ((12)))));
    (d) += (a);
  };
  {
    (c) += ((((d)) & ((a))) | ((~(d)) & ((b)))) + (x[10]) + (unsigned int)(0xffff5bb1);
    (c) = ((((c)) << ((17))) | (((c)) >> (32 - ((17)))));
    (c) += (d);
  };
  {
    (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (x[11]) + (unsigned int)(0x895cd7be);
    (b) = ((((b)) << ((22))) | (((b)) >> (32 - ((22)))));
    (b) += (c);
  };
  {
    (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (x[12]) + (unsigned int)(0x6b901122);
    (a) = ((((a)) << ((7))) | (((a)) >> (32 - ((7)))));
    (a) += (b);
  };
  {
    (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (x[13]) + (unsigned int)(0xfd987193);
    (d) = ((((d)) << ((12))) | (((d)) >> (32 - ((12)))));
    (d) += (a);
  };
  {
    (c) += ((((d)) & ((a))) | ((~(d)) & ((b)))) + (x[14]) + (unsigned int)(0xa679438e);
    (c) = ((((c)) << ((17))) | (((c)) >> (32 - ((17)))));
    (c) += (d);
  };
  {
    (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (x[15]) + (unsigned int)(0x49b40821);
    (b) = ((((b)) << ((22))) | (((b)) >> (32 - ((22)))));
    (b) += (c);
  };
  {
    (a) += ((((b)) & ((d))) | (((c)) & (~(d)))) + (x[1]) + (unsigned int)(0xf61e2562);
    (a) = ((((a)) << ((5))) | (((a)) >> (32 - ((5)))));
    (a) += (b);
  };
  {
    (d) += ((((a)) & ((c))) | (((b)) & (~(c)))) + (x[6]) + (unsigned int)(0xc040b340);
    (d) = ((((d)) << ((9))) | (((d)) >> (32 - ((9)))));
    (d) += (a);
  };
  {
    (c) += ((((d)) & ((b))) | (((a)) & (~(b)))) + (x[11]) + (unsigned int)(0x265e5a51);
    (c) = ((((c)) << ((14))) | (((c)) >> (32 - ((14)))));
    (c) += (d);
  };
  {
    (b) += ((((c)) & ((a))) | (((d)) & (~(a)))) + (x[0]) + (unsigned int)(0xe9b6c7aa);
    (b) = ((((b)) << ((20))) | (((b)) >> (32 - ((20)))));
    (b) += (c);
  };
  {
    (a) += ((((b)) & ((d))) | (((c)) & (~(d)))) + (x[5]) + (unsigned int)(0xd62f105d);
    (a) = ((((a)) << ((5))) | (((a)) >> (32 - ((5)))));
    (a) += (b);
  };
  {
    (d) += ((((a)) & ((c))) | (((b)) & (~(c)))) + (x[10]) + (unsigned int)(0x2441453);
    (d) = ((((d)) << ((9))) | (((d)) >> (32 - ((9)))));
    (d) += (a);
  };
  {
    (c) += ((((d)) & ((b))) | (((a)) & (~(b)))) + (x[15]) + (unsigned int)(0xd8a1e681);
    (c) = ((((c)) << ((14))) | (((c)) >> (32 - ((14)))));
    (c) += (d);
  };
  {
    (b) += ((((c)) & ((a))) | (((d)) & (~(a)))) + (x[4]) + (unsigned int)(0xe7d3fbc8);
    (b) = ((((b)) << ((20))) | (((b)) >> (32 - ((20)))));
    (b) += (c);
  };
  {
    (a) += ((((b)) & ((d))) | (((c)) & (~(d)))) + (x[9]) + (unsigned int)(0x21e1cde6);
    (a) = ((((a)) << ((5))) | (((a)) >> (32 - ((5)))));
    (a) += (b);
  };
  {
    (d) += ((((a)) & ((c))) | (((b)) & (~(c)))) + (x[14]) + (unsigned int)(0xc33707d6);
    (d) = ((((d)) << ((9))) | (((d)) >> (32 - ((9)))));
    (d) += (a);
  };
  {
    (c) += ((((d)) & ((b))) | (((a)) & (~(b)))) + (x[3]) + (unsigned int)(0xf4d50d87);
    (c) = ((((c)) << ((14))) | (((c)) >> (32 - ((14)))));
    (c) += (d);
  };
  {
    (b) += ((((c)) & ((a))) | (((d)) & (~(a)))) + (x[8]) + (unsigned int)(0x455a14ed);
    (b) = ((((b)) << ((20))) | (((b)) >> (32 - ((20)))));
    (b) += (c);
  };
  {
    (a) += ((((b)) & ((d))) | (((c)) & (~(d)))) + (x[13]) + (unsigned int)(0xa9e3e905);
    (a) = ((((a)) << ((5))) | (((a)) >> (32 - ((5)))));
    (a) += (b);
  };
  {
    (d) += ((((a)) & ((c))) | (((b)) & (~(c)))) + (x[2]) + (unsigned int)(0xfcefa3f8);
    (d) = ((((d)) << ((9))) | (((d)) >> (32 - ((9)))));
    (d) += (a);
  };
  {
    (c) += ((((d)) & ((b))) | (((a)) & (~(b)))) + (x[7]) + (unsigned int)(0x676f02d9);
    (c) = ((((c)) << ((14))) | (((c)) >> (32 - ((14)))));
    (c) += (d);
  };
  {
    (b) += ((((c)) & ((a))) | (((d)) & (~(a)))) + (x[12]) + (unsigned int)(0x8d2a4c8a);
    (b) = ((((b)) << ((20))) | (((b)) >> (32 - ((20)))));
    (b) += (c);
  };
  {
    (a) += (((b)) ^ ((c)) ^ ((d))) + (x[5]) + (unsigned int)(0xfffa3942);
    (a) = ((((a)) << ((4))) | (((a)) >> (32 - ((4)))));
    (a) += (b);
  };
  {
    (d) += (((a)) ^ ((b)) ^ ((c))) + (x[8]) + (unsigned int)(0x8771f681);
    (d) = ((((d)) << ((11))) | (((d)) >> (32 - ((11)))));
    (d) += (a);
  };
  {
    (c) += (((d)) ^ ((a)) ^ ((b))) + (x[11]) + (unsigned int)(0x6d9d6122);
    (c) = ((((c)) << ((16))) | (((c)) >> (32 - ((16)))));
    (c) += (d);
  };
  {
    (b) += (((c)) ^ ((d)) ^ ((a))) + (x[14]) + (unsigned int)(0xfde5380c);
    (b) = ((((b)) << ((23))) | (((b)) >> (32 - ((23)))));
    (b) += (c);
  };
  {
    (a) += (((b)) ^ ((c)) ^ ((d))) + (x[1]) + (unsigned int)(0xa4beea44);
    (a) = ((((a)) << ((4))) | (((a)) >> (32 - ((4)))));
    (a) += (b);
  };
  {
    (d) += (((a)) ^ ((b)) ^ ((c))) + (x[4]) + (unsigned int)(0x4bdecfa9);
    (d) = ((((d)) << ((11))) | (((d)) >> (32 - ((11)))));
    (d) += (a);
  };
  {
    (c) += (((d)) ^ ((a)) ^ ((b))) + (x[7]) + (unsigned int)(0xf6bb4b60);
    (c) = ((((c)) << ((16))) | (((c)) >> (32 - ((16)))));
    (c) += (d);
  };
  {
    (b) += (((c)) ^ ((d)) ^ ((a))) + (x[10]) + (unsigned int)(0xbebfbc70);
    (b) = ((((b)) << ((23))) | (((b)) >> (32 - ((23)))));
    (b) += (c);
  };
  {
    (a) += (((b)) ^ ((c)) ^ ((d))) + (x[13]) + (unsigned int)(0x289b7ec6);
    (a) = ((((a)) << ((4))) | (((a)) >> (32 - ((4)))));
    (a) += (b);
  };
  {
    (d) += (((a)) ^ ((b)) ^ ((c))) + (x[0]) + (unsigned int)(0xeaa127fa);
    (d) = ((((d)) << ((11))) | (((d)) >> (32 - ((11)))));
    (d) += (a);
  };
  {
    (c) += (((d)) ^ ((a)) ^ ((b))) + (x[3]) + (unsigned int)(0xd4ef3085);
    (c) = ((((c)) << ((16))) | (((c)) >> (32 - ((16)))));
    (c) += (d);
  };
  {
    (b) += (((c)) ^ ((d)) ^ ((a))) + (x[6]) + (unsigned int)(0x4881d05);
    (b) = ((((b)) << ((23))) | (((b)) >> (32 - ((23)))));
    (b) += (c);
  };
  {
    (a) += (((b)) ^ ((c)) ^ ((d))) + (x[9]) + (unsigned int)(0xd9d4d039);
    (a) = ((((a)) << ((4))) | (((a)) >> (32 - ((4)))));
    (a) += (b);
  };
  {
    (d) += (((a)) ^ ((b)) ^ ((c))) + (x[12]) + (unsigned int)(0xe6db99e5);
    (d) = ((((d)) << ((11))) | (((d)) >> (32 - ((11)))));
    (d) += (a);
  };
  {
    (c) += (((d)) ^ ((a)) ^ ((b))) + (x[15]) + (unsigned int)(0x1fa27cf8);
    (c) = ((((c)) << ((16))) | (((c)) >> (32 - ((16)))));
    (c) += (d);
  };
  {
    (b) += (((c)) ^ ((d)) ^ ((a))) + (x[2]) + (unsigned int)(0xc4ac5665);
    (b) = ((((b)) << ((23))) | (((b)) >> (32 - ((23)))));
    (b) += (c);
  };
  {
    (a) += (((c)) ^ (((b)) | (~(d)))) + (x[0]) + (unsigned int)(0xf4292244);
    (a) = ((((a)) << ((6))) | (((a)) >> (32 - ((6)))));
    (a) += (b);
  };
  {
    (d) += (((b)) ^ (((a)) | (~(c)))) + (x[7]) + (unsigned int)(0x432aff97);
    (d) = ((((d)) << ((10))) | (((d)) >> (32 - ((10)))));
    (d) += (a);
  };
  {
    (c) += (((a)) ^ (((d)) | (~(b)))) + (x[14]) + (unsigned int)(0xab9423a7);
    (c) = ((((c)) << ((15))) | (((c)) >> (32 - ((15)))));
    (c) += (d);
  };
  {
    (b) += (((d)) ^ (((c)) | (~(a)))) + (x[5]) + (unsigned int)(0xfc93a039);
    (b) = ((((b)) << ((21))) | (((b)) >> (32 - ((21)))));
    (b) += (c);
  };
  {
    (a) += (((c)) ^ (((b)) | (~(d)))) + (x[12]) + (unsigned int)(0x655b59c3);
    (a) = ((((a)) << ((6))) | (((a)) >> (32 - ((6)))));
    (a) += (b);
  };
  {
    (d) += (((b)) ^ (((a)) | (~(c)))) + (x[3]) + (unsigned int)(0x8f0ccc92);
    (d) = ((((d)) << ((10))) | (((d)) >> (32 - ((10)))));
    (d) += (a);
  };
  {
    (c) += (((a)) ^ (((d)) | (~(b)))) + (x[10]) + (unsigned int)(0xffeff47d);
    (c) = ((((c)) << ((15))) | (((c)) >> (32 - ((15)))));
    (c) += (d);
  };
  {
    (b) += (((d)) ^ (((c)) | (~(a)))) + (x[1]) + (unsigned int)(0x85845dd1);
    (b) = ((((b)) << ((21))) | (((b)) >> (32 - ((21)))));
    (b) += (c);
  };
  {
    (a) += (((c)) ^ (((b)) | (~(d)))) + (x[8]) + (unsigned int)(0x6fa87e4f);
    (a) = ((((a)) << ((6))) | (((a)) >> (32 - ((6)))));
    (a) += (b);
  };
  {
    (d) += (((b)) ^ (((a)) | (~(c)))) + (x[15]) + (unsigned int)(0xfe2ce6e0);
    (d) = ((((d)) << ((10))) | (((d)) >> (32 - ((10)))));
    (d) += (a);
  };
  {
    (c) += (((a)) ^ (((d)) | (~(b)))) + (x[6]) + (unsigned int)(0xa3014314);
    (c) = ((((c)) << ((15))) | (((c)) >> (32 - ((15)))));
    (c) += (d);
  };
  {
    (b) += (((d)) ^ (((c)) | (~(a)))) + (x[13]) + (unsigned int)(0x4e0811a1);
    (b) = ((((b)) << ((21))) | (((b)) >> (32 - ((21)))));
    (b) += (c);
  };
  {
    (a) += (((c)) ^ (((b)) | (~(d)))) + (x[4]) + (unsigned int)(0xf7537e82);
    (a) = ((((a)) << ((6))) | (((a)) >> (32 - ((6)))));
    (a) += (b);
  };
  {
    (d) += (((b)) ^ (((a)) | (~(c)))) + (x[11]) + (unsigned int)(0xbd3af235);
    (d) = ((((d)) << ((10))) | (((d)) >> (32 - ((10)))));
    (d) += (a);
  };
  {
    (c) += (((a)) ^ (((d)) | (~(b)))) + (x[2]) + (unsigned int)(0x2ad7d2bb);
    (c) = ((((c)) << ((15))) | (((c)) >> (32 - ((15)))));
    (c) += (d);
  };
  {
    (b) += (((d)) ^ (((c)) | (~(a)))) + (x[9]) + (unsigned int)(0xeb86d391);
    (b) = ((((b)) << ((21))) | (((b)) >> (32 - ((21)))));
    (b) += (c);
  };
  state[0] += a;
  state[1] += b;
  state[2] += c;
  state[3] += d;
  memset((void *)x, 0, sizeof(x));
}
```