user: Converte this assembly snippet into its equivalent C code:

```asm
<print_pwd>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %esi,-0x4c(%rbp)
  mov    %edx,-0x50(%rbp)
  mov    %ecx,-0x54(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x6f696561,-0x26(%rbp)
  movw   $0x75,-0x22(%rbp)
  movabs $0x6b6a686766646362,%rax
  movabs $0x74737271706e6d6c,%rdx
  mov    %rax,-0x20(%rbp)
  mov    %rdx,-0x18(%rbp)
  movl   $0x7a787776,-0x10(%rbp)
  movb   $0x0,-0xc(%rbp)
  cmpl   $0x0,-0x4c(%rbp)
  jne    L195
  movl   $0x0,-0x38(%rbp)
  jmp    L161
L164:
  mov    -0x50(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    -0x38(%rbp),%eax
  cltq
  movzbl -0x26(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  mov    -0x50(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jge    L83
  mov    -0x50(%rbp),%eax
  lea    0x1(%rax),%esi
  mov    -0x54(%rbp),%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,%ecx
  mov    %esi,%edx
  mov    $0x1,%esi
  mov    %rax,%rdi
  call   <print_pwd>
  jmp    L184
L83:
  mov    -0x48(%rbp),%rax
  mov    %rax,%rsi
  lea    D18(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L184:
  addl   $0x1,-0x38(%rbp)
L161:
  cmpl   $0x4,-0x38(%rbp)
  jle    L164
  movl   $0x0,-0x34(%rbp)
  jmp    L160
L80:
  mov    -0x50(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    -0x34(%rbp),%eax
  cltq
  movzbl -0x20(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  mov    -0x50(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jge    L172
  mov    -0x50(%rbp),%eax
  lea    0x1(%rax),%esi
  mov    -0x54(%rbp),%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,%ecx
  mov    %esi,%edx
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <print_pwd>
  jmp    L86
L172:
  mov    -0x48(%rbp),%rax
  mov    %rax,%rsi
  lea    D18(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L86:
  addl   $0x1,-0x34(%rbp)
L160:
  cmpl   $0x13,-0x34(%rbp)
  jle    L80
  jmp    L144
L195:
  cmpl   $0x1,-0x4c(%rbp)
  jne    L116
  movl   $0x0,-0x30(%rbp)
  jmp    L39
L76:
  mov    -0x50(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    -0x30(%rbp),%eax
  cltq
  movzbl -0x20(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  mov    -0x50(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jge    L26
  mov    -0x50(%rbp),%eax
  lea    0x1(%rax),%esi
  mov    -0x54(%rbp),%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,%ecx
  mov    %esi,%edx
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <print_pwd>
  jmp    L63
L26:
  mov    -0x48(%rbp),%rax
  mov    %rax,%rsi
  lea    D18(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L63:
  addl   $0x1,-0x30(%rbp)
L39:
  cmpl   $0x13,-0x30(%rbp)
  jle    L76
  jmp    L144
L116:
  movl   $0x0,-0x2c(%rbp)
  jmp    L16
L59:
  mov    -0x50(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    -0x2c(%rbp),%eax
  cltq
  movzbl -0x26(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
  mov    -0x50(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jge    L143
  mov    -0x50(%rbp),%eax
  lea    0x1(%rax),%esi
  mov    -0x54(%rbp),%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,%ecx
  mov    %esi,%edx
  mov    $0x1,%esi
  mov    %rax,%rdi
  call   <print_pwd>
  jmp    L167
L143:
  mov    -0x48(%rbp),%rax
  mov    %rax,%rsi
  lea    D18(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L167:
  addl   $0x1,-0x2c(%rbp)
L16:
  cmpl   $0x4,-0x2c(%rbp)
  jle    L59
L144:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L150
  call   <__stack_chk_fail@plt>
L150:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D18
datatype: string

tool: D18: %s


assistant: ```c
void print_pwd(char *p, int flag, int pos, int last) {
  char v[] = "aeiou";
  char c[] = "bcdfghjklmnpqrstvwxz";
  if (0 == flag) {
    for (int i = 0; i < 5; i++) {
      p[pos] = v[i];
      if (pos < last) {
        print_pwd(p, 1, pos + 1, last);
      } else {
        printf("%s\n", p);
      }
    }
    for (int i = 0; i < 20; i++) {
      p[pos] = c[i];
      if (pos < last) {
        print_pwd(p, 2, pos + 1, last);
      } else {
        printf("%s\n", p);
      }
    }
  } else if (1 == flag) {
    for (int i = 0; i < 20; i++) {
      p[pos] = c[i];
      if (pos < last) {
        print_pwd(p, 2, pos + 1, last);
      } else {
        printf("%s\n", p);
      }
    }
  } else {
    for (int i = 0; i < 5; i++) {
      p[pos] = v[i];
      if (pos < last) {
        print_pwd(p, 1, pos + 1, last);
      } else {
        printf("%s\n", p);
      }
    }
  }
}
```