ulonglong FUN_0048a700(byte *param_1,undefined4 *param_2,uint param_3,uint param_4)

{
  bool bVar1;
  ulonglong uVar2;
  longlong lVar3;
  undefined4 *puVar4;
  byte bVar5;
  int iVar6;
  uint uVar7;
  uint uVar8;
  byte *pbVar9;
  byte *pbVar10;
  uint uVar11;
  uint uVar12;
  
  pbVar9 = param_1;
  while (iVar6 = (int)(char)*pbVar9, (*(ushort *)(PTR_DAT_004b7614 + iVar6 * 2) & 0x20) != 0) {
    pbVar9 = pbVar9 + 1;
  }
  if (iVar6 == 0x2b) {
    uVar12 = 0;
  }
  else {
    uVar12 = 0;
    if (iVar6 != 0x2d) goto LAB_0048a794;
    uVar12 = 1;
  }
  pbVar9 = pbVar9 + 1;
LAB_0048a794:
  pbVar10 = pbVar9;
  if ((param_3 & 0xffffffef) == 0) {
    uVar7 = param_3 + 10;
    if (*pbVar9 == 0x30) {
      param_1 = pbVar9 + 1;
      uVar7 = param_3 + 8;
      pbVar10 = param_1;
      if ((*param_1 | 0x20) == 0x78) {
        pbVar10 = pbVar9 + 2;
        uVar7 = (param_3 + 8) * 2;
      }
    }
    param_3 = uVar7;
    if (0x10 < (int)param_3) {
      param_3 = 0x10;
    }
  }
  uVar2 = 0;
  if (param_3 - 2 < 0x23) {
    uVar2 = 0;
    while( true ) {
      lVar3 = (uVar2 >> 8) * (longlong)(int)param_3;
      uVar7 = (int)(char)*pbVar10 - 0x30U & 0xff;
      bVar5 = *pbVar10 | 0x20;
      bVar1 = 0x3ffffffffffffff < uVar2;
      if (9 < uVar7) {
        uVar7 = 0x28;
        if (0x60 < bVar5) {
          uVar7 = (uint)(byte)(bVar5 + 0xa9);
        }
      }
      uVar8 = ((uint)uVar2 & 0xff) * param_3 + uVar7;
      if ((int)param_3 <= (int)uVar7) break;
      param_1 = pbVar10 + 1;
      pbVar10 = param_1;
      uVar2 = (uVar2 & 0xffffffff) * (ulonglong)param_3 +
              CONCAT44(param_3 * (int)(uVar2 >> 0x20) + ((int)param_3 >> 0x1f) * (uint)uVar2,uVar7);
      if ((bVar1) &&
         (uVar7 = uVar8 + (uint)lVar3 * 0x100,
         uVar2 = CONCAT44((uint)(uVar7 < uVar8) +
                          ((uint)lVar3 >> 0x18 | (int)((ulonglong)lVar3 >> 0x20) * 0x100),uVar7),
         0xffffffffffffff < lVar3 + (ulonglong)(uVar8 >> 8))) {
        uVar12 = uVar12 & param_4;
        puVar4 = (undefined4 *)FUN_0047f6f0();
        *puVar4 = 0x22;
        uVar2 = 0xffffffffffffffff;
      }
    }
  }
  uVar7 = (uint)(uVar2 >> 0x20);
  if (param_2 != (undefined4 *)0x0) {
    *param_2 = param_1;
  }
  uVar8 = 0xffffffff;
  uVar11 = 0x7fffffff;
  if (uVar12 != 0) {
    uVar8 = 0;
    uVar11 = 0x80000000;
  }
  if ((param_4 != 0) && ((uVar11 < uVar7 || ((uVar7 == uVar11 && (uVar8 < (uint)uVar2)))))) {
    puVar4 = (undefined4 *)FUN_0047f6f0();
    *puVar4 = 0x22;
    uVar2 = CONCAT44(uVar11,uVar8);
  }
  if (uVar12 != 0) {
    uVar2 = CONCAT44(-(uint)(-(int)uVar2 != 0) - (int)(uVar2 >> 0x20),-(int)uVar2);
  }
  return uVar2;
}