void FUN_004739e0(uint *param_1,char *param_2)

{
  char cVar1;
  uint *puVar2;
  int iVar3;
  uint **ppuVar4;
  int iVar5;
  int *piVar6;
  uint uVar7;
  undefined4 *puVar8;
  char *pcVar9;
  undefined *puVar10;
  uint uVar11;
  uint **ppuVar12;
  uint uVar13;
  code *pcVar14;
  uint uVar15;
  uint *puVar16;
  uint **ppuVar17;
  uint *puVar18;
  uint **ppuVar19;
  code *pcVar20;
  uint *local_88;
  uint *local_84;
  uint local_80;
  uint *local_7c;
  int local_78;
  uint local_74;
  uint *local_70 [2];
  uint *local_68 [14];
  uint **local_30;
  
  if ((uint *)param_2 == (uint *)0x0) {
switchD_00473a68_caseD_2e:
    goto switchD_00473a68_default;
  }
  if (param_1[0x47] != 0) {
    return;
  }
  uVar7 = *(uint *)param_2;
  switch(uVar7) {
  case 0:
    uVar7 = *(uint *)((int)param_2 + 8);
    param_2 = *(char **)((int)param_2 + 4);
    if ((*param_1 & 4) != 0) {
      puVar16 = (uint *)((int)param_2 + uVar7);
      do {
        if (puVar16 <= param_2) {
          return;
        }
        if (((3 < (int)puVar16 - (int)param_2) && ((char)*(uint *)param_2 == '_')) &&
           ((*(char *)((int)param_2 + 1) == '_' &&
            (puVar18 = (uint *)((int)param_2 + 3), *(char *)((int)param_2 + 2) == 'U')))) {
          uVar7 = 0;
          for (; puVar18 < puVar16; puVar18 = (uint *)((int)puVar18 + 1)) {
            cVar1 = (char)*puVar18;
            iVar3 = (int)cVar1;
            iVar5 = iVar3 + -0x30;
            if (((9 < (byte)(cVar1 - 0x30U)) && (iVar5 = iVar3 + -0x37, 5 < (byte)(cVar1 + 0xbfU)))
               && (iVar5 = iVar3 + -0x57, 5 < (byte)(cVar1 + 0x9fU))) {
              if ((iVar3 == 0x5f) && (uVar7 < 0x100)) {
                FUN_004736cc(param_1,(int)(char)uVar7);
                goto LAB_00473b90;
              }
              break;
            }
            uVar7 = iVar5 + uVar7 * 0x10;
          }
        }
        FUN_004736cc(param_1,(int)(char)*(uint *)param_2);
        puVar18 = (uint *)param_2;
LAB_00473b90:
        param_2 = (char *)((int)puVar18 + 1);
      } while( true );
    }
    goto LAB_00474508;
  case 1:
  case 2:
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 4));
    if ((*param_1 & 4) != 0) {
      pcVar9 = (char *)0x2e;
      goto LAB_00473be4;
    }
    pcVar9 = "::";
    goto LAB_00474530;
  case 3:
    uVar13 = param_1[0x46];
    puVar16 = *(uint **)((int)param_2 + 4);
    ppuVar4 = local_70;
    uVar7 = 0;
    while( true ) {
      if (puVar16 == (uint *)0x0) {
        param_1[0x47] = 1;
        return;
      }
      if (uVar7 == 4) goto switchD_00473a68_default;
      uVar11 = *puVar16;
      puVar18 = (uint *)param_1[0x45];
      *ppuVar4 = (uint *)param_1[0x46];
      ppuVar4[1] = puVar16;
      param_1[0x46] = (uint)ppuVar4;
      ppuVar4[2] = (uint *)0x0;
      ppuVar4[3] = puVar18;
      uVar15 = uVar7 + 1;
      ppuVar4 = ppuVar4 + 4;
      if (2 < uVar11 - 0x19) break;
      puVar16 = (uint *)puVar16[1];
      uVar7 = uVar15;
    }
    if (uVar11 == 4) {
      param_1[0x45] = (uint)&local_88;
      local_88 = puVar18;
      local_84 = puVar16;
    }
    if (*puVar16 == 2) {
      ppuVar19 = local_70 + uVar15 * 4;
      ppuVar17 = local_70 + (1 - uVar15) * -4;
      ppuVar4 = local_70 + uVar7 * 4;
      for (puVar18 = (uint *)puVar16[2]; *puVar18 - 0x19 < 3; puVar18 = (uint *)puVar18[1]) {
        ppuVar12 = ppuVar4 + 4;
        if (3 < uVar15) goto switchD_00473a68_caseD_2e;
        FUN_00483c90(ppuVar12,ppuVar4,0x10);
        puVar2 = (uint *)param_1[0x45];
        *ppuVar12 = (uint *)ppuVar17;
        ppuVar4[3] = puVar2;
        param_1[0x46] = (uint)ppuVar19;
        ppuVar4[1] = puVar18;
        ppuVar4[2] = (uint *)0x0;
        uVar15 = uVar15 + 1;
        ppuVar17 = ppuVar17 + 4;
        ppuVar19 = ppuVar19 + 4;
        ppuVar4 = ppuVar12;
      }
    }
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 8));
    if (*puVar16 == 4) {
      param_1[0x45] = (uint)local_88;
    }
    for (ppuVar4 = local_70 + (uVar15 + 0xfffffff) * 4 + 1; ppuVar4 != &local_7c;
        ppuVar4 = ppuVar4 + -4) {
      if (ppuVar4[1] == (uint *)0x0) {
        FUN_004736cc(param_1,0x20);
        FUN_00473830(param_1,*ppuVar4);
      }
    }
    param_1[0x46] = uVar13;
    return;
  case 4:
    uVar7 = param_1[0x46];
    param_1[0x46] = 0;
    piVar6 = *(int **)((int)param_2 + 4);
    if (((((*param_1 & 4) == 0) || (*piVar6 != 0)) || (piVar6[2] != 6)) ||
       (iVar5 = FUN_00483ec0(piVar6[1],"JArray",6), iVar5 != 0)) {
      FUN_004739e0(param_1,piVar6);
      if ((char)param_1[0x42] == '<') {
        FUN_004736cc(param_1,0x20);
      }
      FUN_004736cc(param_1,0x3c);
      FUN_004739e0(param_1,*(uint *)((int)param_2 + 8));
      if ((char)param_1[0x42] == '>') {
        FUN_004736cc(param_1,0x20);
      }
      puVar10 = (undefined *)0x3e;
      pcVar14 = FUN_004736cc;
    }
    else {
      FUN_004739e0(param_1,*(uint *)((int)param_2 + 8));
      puVar10 = &DAT_00497c5c;
      pcVar14 = FUN_004737d0;
    }
    (*pcVar14)(param_1,puVar10);
    param_1[0x46] = uVar7;
    return;
  case 5:
    puVar16 = (uint *)param_1[0x45];
    if (puVar16 != (uint *)0x0) {
      uVar7 = *(uint *)((int)param_2 + 4);
      for (piVar6 = *(int **)(puVar16[1] + 8); piVar6 != (int *)0x0; piVar6 = (int *)piVar6[2]) {
        if (*piVar6 != 0x28) goto switchD_00473a68_default;
        if ((int)uVar7 < 1) break;
        uVar7 = uVar7 - 1;
      }
      if ((uVar7 == 0) && (piVar6 != (int *)0x0)) {
        param_1[0x45] = *puVar16;
        FUN_004739e0(param_1,piVar6[1]);
        param_1[0x45] = (uint)puVar16;
        return;
      }
    }
  default:
switchD_00473a68_default:
    param_1[0x47] = 1;
    return;
  case 6:
    goto switchD_00473a68_caseD_6;
  case 7:
    pcVar9 = (char *)0x7e;
LAB_00473be4:
    pcVar14 = FUN_004736cc;
    goto LAB_00473bf0;
  case 8:
    pcVar9 = "vtable for ";
    break;
  case 9:
    pcVar9 = "VTT for ";
    break;
  case 10:
    pcVar14 = FUN_004737d0;
    FUN_004737d0(param_1,"construction vtable for ");
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 4));
    puVar10 = &DAT_00497c94;
    goto LAB_00474484;
  case 0xb:
    pcVar9 = "typeinfo for ";
    break;
  case 0xc:
    pcVar9 = "typeinfo name for ";
    break;
  case 0xd:
    pcVar9 = "typeinfo fn for ";
    break;
  case 0xe:
    pcVar9 = "non-virtual thunk to ";
    break;
  case 0xf:
    pcVar9 = "virtual thunk to ";
    break;
  case 0x10:
    pcVar9 = "covariant return thunk to ";
    break;
  case 0x11:
    pcVar9 = "java Class for ";
    break;
  case 0x12:
    pcVar9 = "guard variable for ";
    break;
  case 0x13:
    pcVar9 = "reference temporary for ";
    break;
  case 0x14:
    pcVar9 = "hidden alias for ";
    break;
  case 0x15:
    uVar7 = *(uint *)((int)param_2 + 8);
    param_2 = *(char **)((int)param_2 + 4);
    goto LAB_00474508;
  case 0x16:
  case 0x17:
  case 0x18:
    for (puVar16 = (uint *)param_1[0x46]; puVar16 != (uint *)0x0; puVar16 = (uint *)*puVar16) {
      if (puVar16[2] == 0) {
        if (2 < *(uint *)puVar16[1] - 0x16) break;
        if (*(uint *)puVar16[1] == uVar7) goto switchD_00473a68_caseD_23;
      }
    }
  case 0x19:
  case 0x1a:
  case 0x1b:
  case 0x1c:
  case 0x1d:
  case 0x1e:
  case 0x1f:
  case 0x20:
  case 0x21:
    local_80 = param_1[0x46];
    param_1[0x46] = (uint)&local_80;
    local_74 = param_1[0x45];
    local_78 = 0;
    local_7c = (uint *)param_2;
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 4));
    if (local_78 == 0) {
      pcVar14 = FUN_00473830;
LAB_00474434:
      (*pcVar14)(param_1,param_2);
    }
LAB_00474440:
    param_1[0x46] = local_80;
    return;
  case 0x22:
    puVar8 = *(undefined4 **)((int)param_2 + 4);
    pcVar14 = FUN_00473740;
    if ((*param_1 & 4) == 0) {
      uVar7 = puVar8[1];
      param_2 = (char *)*puVar8;
    }
    else {
      uVar7 = puVar8[3];
      param_2 = (char *)puVar8[2];
    }
    goto LAB_00474514;
  case 0x23:
    goto switchD_00473a68_caseD_23;
  case 0x24:
    if ((*param_1 & 0x20) != 0) {
      FUN_00474bcc(param_1,param_2,param_1[0x46]);
    }
    if (*(uint *)((int)param_2 + 4) != 0) {
      local_80 = param_1[0x46];
      param_1[0x46] = (uint)&local_80;
      local_74 = param_1[0x45];
      local_78 = 0;
      local_7c = (uint *)param_2;
      FUN_004739e0(param_1,*(uint *)((int)param_2 + 4));
      param_1[0x46] = local_80;
      if (local_78 != 0) {
        return;
      }
      if ((*param_1 & 0x20) == 0) {
        FUN_004736cc(param_1,0x20);
      }
    }
    if ((*param_1 & 0x20) != 0) {
      return;
    }
    uVar7 = param_1[0x46];
    pcVar14 = FUN_00474bcc;
    goto LAB_00474514;
  case 0x25:
    puVar18 = (uint *)param_1[0x46];
    local_68[1] = (uint *)param_1[0x45];
    local_30 = local_70;
    param_1[0x46] = (uint)local_30;
    local_68[0] = (uint *)0x0;
    uVar7 = 1;
    puVar16 = puVar18;
    local_70[0] = puVar18;
    local_70[1] = (uint *)param_2;
    while ((puVar16 != (uint *)0x0 && (*(int *)puVar16[1] - 0x16U < 3))) {
      if (puVar16[2] == 0) {
        if (3 < uVar7) goto switchD_00473a68_default;
        FUN_00483c90(local_70 + uVar7 * 4,puVar16,0x10);
        local_70[uVar7 * 4] = (uint *)param_1[0x46];
        puVar16[2] = 1;
        param_1[0x46] = (uint)(local_30 + uVar7 * 4);
        uVar7 = uVar7 + 1;
      }
      puVar16 = (uint *)*puVar16;
    }
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 8));
    param_1[0x46] = (uint)puVar18;
    if (local_68[0] != (uint *)0x0) {
      return;
    }
    ppuVar4 = local_70 + (uVar7 + 0xfffffff) * 4 + 1;
    for (; 1 < uVar7; uVar7 = uVar7 - 1) {
      FUN_00473830(param_1,*ppuVar4);
      ppuVar4 = ppuVar4 + -4;
    }
    uVar7 = param_1[0x46];
    pcVar14 = FUN_0047501c;
    goto LAB_00474514;
  case 0x26:
    local_80 = param_1[0x46];
    param_1[0x46] = (uint)&local_80;
    local_74 = param_1[0x45];
    local_78 = 0;
    local_7c = (uint *)param_2;
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 8));
    if (local_78 != 0) goto LAB_00474440;
    FUN_004736cc(param_1,0x20);
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 4));
    param_2 = &DAT_00497c4c;
    pcVar14 = FUN_004737d0;
    goto LAB_00474434;
  case 0x27:
  case 0x28:
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 4));
    if (*(uint *)((int)param_2 + 8) == 0) {
      return;
    }
    puVar10 = &DAT_00497d5c;
    pcVar14 = FUN_004737d0;
    goto LAB_00474484;
  case 0x29:
    FUN_004737d0(param_1,"operator");
    if ((byte)(**(char **)(*(uint *)((int)param_2 + 4) + 4) + 0x9fU) < 0x1a) {
      FUN_004736cc(param_1,0x20);
    }
    uVar7 = *(uint *)(*(uint *)((int)param_2 + 4) + 8);
    param_2 = *(char **)(*(uint *)((int)param_2 + 4) + 4);
LAB_00474508:
    pcVar14 = FUN_00473740;
LAB_00474514:
    (*pcVar14)(param_1,param_2,uVar7);
    return;
  case 0x2a:
    pcVar9 = "operator ";
LAB_00474530:
    pcVar14 = FUN_004737d0;
LAB_00473bf0:
    (*pcVar14)(param_1,pcVar9);
switchD_00473a68_caseD_6:
    param_2 = *(char **)((int)param_2 + 8);
    goto LAB_00473c00;
  case 0x2b:
    FUN_004737d0(param_1,"operator ");
    pcVar20 = FUN_00475198;
    goto LAB_00474b80;
  case 0x2c:
    piVar6 = *(int **)((int)param_2 + 4);
    if (*piVar6 == 0x2b) {
      pcVar14 = FUN_004736cc;
      FUN_004736cc(param_1,0x28);
      FUN_00475198(param_1,*(uint *)((int)param_2 + 4));
      piVar6 = (int *)0x29;
    }
    else {
      pcVar14 = FUN_004752e8;
    }
    (*pcVar14)(param_1,piVar6);
    pcVar20 = FUN_004736cc;
    FUN_004736cc(param_1,0x28);
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 8));
    param_2 = (char *)0x29;
    goto LAB_00474b80;
  case 0x2d:
    if (**(int **)((int)param_2 + 8) != 0x2e) goto switchD_00473a68_default;
    if (((**(int **)((int)param_2 + 4) == 0x29) &&
        (iVar5 = (*(int **)((int)param_2 + 4))[1], *(int *)(iVar5 + 8) == 1)) &&
       (**(char **)(iVar5 + 4) == '>')) {
      FUN_004736cc(param_1,0x28);
    }
    pcVar20 = FUN_004736cc;
    FUN_004736cc(param_1,0x28);
    FUN_004739e0(param_1,*(undefined4 *)(*(uint *)((int)param_2 + 8) + 4));
    FUN_004737d0(param_1,&DAT_00497d78);
    FUN_004752e8(param_1,*(uint *)((int)param_2 + 4));
    FUN_004737d0(param_1,&DAT_00497d7c);
    FUN_004739e0(param_1,*(undefined4 *)(*(uint *)((int)param_2 + 8) + 8));
    FUN_004736cc(param_1,0x29);
    if (**(int **)((int)param_2 + 4) != 0x29) {
      return;
    }
    iVar5 = (*(int **)((int)param_2 + 4))[1];
    if (*(int *)(iVar5 + 8) != 1) {
      return;
    }
    if (**(char **)(iVar5 + 4) != '>') {
      return;
    }
    param_2 = (char *)0x29;
    goto LAB_00474b80;
  case 0x2e:
  case 0x30:
  case 0x31:
    goto switchD_00473a68_caseD_2e;
  case 0x2f:
    if ((**(int **)((int)param_2 + 8) != 0x30) || (*(int *)(*(int **)((int)param_2 + 8))[2] != 0x31)
       ) goto switchD_00473a68_default;
    pcVar20 = FUN_004736cc;
    FUN_004736cc(param_1,0x28);
    FUN_004739e0(param_1,*(undefined4 *)(*(uint *)((int)param_2 + 8) + 4));
    FUN_004737d0(param_1,&DAT_00497d78);
    FUN_004752e8(param_1,*(uint *)((int)param_2 + 4));
    FUN_004737d0(param_1,&DAT_00497d7c);
    FUN_004739e0(param_1,*(undefined4 *)(*(int *)(*(uint *)((int)param_2 + 8) + 8) + 4));
    FUN_004737d0(param_1,") : (");
    FUN_004739e0(param_1,*(undefined4 *)(*(int *)(*(uint *)((int)param_2 + 8) + 8) + 8));
    param_2 = (char *)0x29;
    goto LAB_00474b80;
  case 0x32:
  case 0x33:
    uVar13 = 0;
    if (**(int **)((int)param_2 + 4) != 0x22) {
LAB_00474a6c:
      FUN_004736cc(param_1,0x28);
      FUN_004739e0(param_1,*(uint *)((int)param_2 + 4));
      FUN_004736cc(param_1,0x29);
      if (*(uint *)param_2 == 0x33) {
        FUN_004736cc(param_1,0x2d);
      }
      if (uVar13 == 8) {
        FUN_004736cc(param_1,0x5b);
      }
      FUN_004739e0(param_1,*(uint *)((int)param_2 + 8));
      if (uVar13 != 8) {
        return;
      }
      param_2 = (char *)0x5d;
      goto LAB_00474b74;
    }
    uVar13 = *(uint *)((*(int **)((int)param_2 + 4))[1] + 0x10);
    if (uVar13 == 0) goto LAB_00474a6c;
    if (6 < uVar13) {
      if ((((uVar13 == 7) && (piVar6 = *(int **)((int)param_2 + 8), *piVar6 == 0)) &&
          (piVar6[2] == 1)) && (uVar7 == 0x32)) {
        if (*(char *)piVar6[1] == '0') {
          param_2 = "false";
        }
        else {
          if (*(char *)piVar6[1] != '1') goto LAB_00474a6c;
          param_2 = &DAT_00497d9c;
        }
        goto LAB_00474a60;
      }
      goto LAB_00474a6c;
    }
    if (**(int **)((int)param_2 + 8) != 0) goto LAB_00474a6c;
    if (uVar7 == 0x33) {
      FUN_004736cc(param_1,0x2d);
    }
    FUN_004739e0(param_1,*(uint *)((int)param_2 + 8));
    switch(uVar13) {
    case 2:
      param_2 = (char *)0x75;
      goto LAB_00474b74;
    case 3:
      param_2 = (char *)0x6c;
LAB_00474b74:
      pcVar20 = FUN_004736cc;
      goto LAB_00474b80;
    case 4:
      param_2 = &UNK_00497d88;
      break;
    case 5:
      param_2 = &UNK_00497d8c;
      break;
    case 6:
      param_2 = &UNK_00497d90;
      break;
    default:
      goto switchD_0047499c_default;
    }
LAB_00474a60:
    pcVar20 = FUN_004737d0;
    goto LAB_00474b80;
  case 0x34:
    pcVar9 = "java resource ";
    break;
  case 0x35:
    puVar10 = *(undefined **)((int)param_2 + 4);
    pcVar14 = FUN_004739e0;
LAB_00474484:
    pcVar20 = FUN_004739e0;
    (*pcVar14)(param_1,puVar10);
    param_2 = *(char **)((int)param_2 + 8);
    goto LAB_00474b80;
  case 0x36:
    param_2 = (char *)(int)(char)*(uint *)((int)param_2 + 4);
    goto LAB_00474b74;
  }
  FUN_004737d0(param_1,pcVar9);
switchD_00473a68_caseD_23:
  param_2 = *(char **)((int)param_2 + 4);
LAB_00473c00:
  pcVar20 = FUN_004739e0;
LAB_00474b80:
  (*pcVar20)(param_1,param_2);
switchD_0047499c_default:
  return;
}