
/* WARNING: Function: __x86.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */
/* WARNING: Unknown calling convention */

Bignum_conflict bignum_lshift(Bignum_conflict a,int shift)

{
  uint uVar1;
  sbyte sVar2;
  int iVar3;
  Bignum_conflict pBVar4;
  int iVar5;
  int iVar6;
  uint uVar7;
  byte local_24;
  
  if (shift < 0) {
                    /* WARNING: Subroutine does not return */
    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");
  }
  iVar3 = *a * 0x20;
  iVar5 = iVar3 + -1;
  if ((-1 < iVar5) && (-1 < (int)a[(iVar5 >> 5) + 1])) {
    do {
      iVar3 = iVar5;
      iVar5 = iVar3 + -1;
      if (iVar5 == -1) break;
    } while (a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f) == 0);
  }
  iVar6 = iVar3 + shift + 0x1f;
  iVar5 = iVar3 + shift + 0x3e;
  if (-1 < iVar6) {
    iVar5 = iVar6;
  }
  pBVar4 = newbn(iVar5 >> 5);
  iVar3 = shift >> 5;
  iVar5 = iVar3 + 1;
  if ((shift & 0x1fU) == 0) {
    memcpy(pBVar4 + iVar5,a + 1,*a << 2);
    return pBVar4;
  }
  if (0 < (int)*a) {
    sVar2 = (sbyte)(shift & 0x1fU);
    local_24 = 0x20 - sVar2;
    uVar7 = 0;
    do {
      uVar1 = a[iVar5 - iVar3];
      pBVar4[iVar5] = uVar7 | uVar1 << sVar2;
      iVar5 = iVar5 + 1;
      uVar7 = uVar1 >> (local_24 & 0x1f);
    } while (iVar5 <= (int)(iVar3 + *a));
    if (uVar7 != 0) {
      pBVar4[iVar5] = uVar7;
    }
  }
  return pBVar4;
}



/* WARNING: Function: __i686.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */

int FUN_00046450(int *param_1,uint param_2)

{
  uint uVar1;
  sbyte sVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  uint uVar6;
  byte local_24;
  
  if ((int)param_2 < 0) {
                    /* WARNING: Subroutine does not return */
    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");
  }
  iVar4 = *param_1 * 0x20 + -1;
  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {
    do {
      iVar4 = iVar4 + -1;
      if (iVar4 == -1) break;
    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);
  }
  iVar3 = FUN_00044e30();
  iVar5 = (int)param_2 >> 5;
  iVar4 = iVar5 + 1;
  if ((param_2 & 0x1f) != 0) {
    if (0 < *param_1) {
      sVar2 = (sbyte)(param_2 & 0x1f);
      local_24 = 0x20 - sVar2;
      uVar6 = 0;
      do {
        uVar1 = param_1[iVar4 - iVar5];
        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;
        iVar4 = iVar4 + 1;
        uVar6 = uVar1 >> (local_24 & 0x1f);
      } while (iVar4 <= iVar5 + *param_1);
      if (uVar6 != 0) {
        *(uint *)(iVar3 + iVar4 * 4) = uVar6;
      }
    }
    return iVar3;
  }
  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);
  return iVar3;
}


PUSH EBP
PUSH EDI
PUSH ESI
PUSH EBX
CALL 0x00014980
ADD EBX,0x62917
SUB ESP,0x1c
MOV EBP,dword ptr [ESP + 0x34]
MOV ESI,dword ptr [ESP + 0x30]
TEST EBP,EBP
JS 0x0004656f
MOV EAX,dword ptr [ESI]
SHL EAX,0x5
MOV EDX,EAX
SUB EDX,0x1
JS 0x00046568
MOV ECX,EDX
SAR ECX,0x5
MOV EDI,dword ptr [ESI + ECX*0x4 + 0x4]
TEST EDI,EDI
JNS 0x000464a9
JMP 0x00046568
MOV EAX,ECX
SAR EAX,0x5
MOV EAX,dword ptr [ESI + EAX*0x4 + 0x4]
SHR EAX,CL
TEST EAX,EAX
JNZ 0x000464b1
MOV EDX,ECX
LEA ECX,[EDX + -0x1]
CMP ECX,-0x1
JNZ 0x00046498
ADD EDX,EBP
LEA EAX,[EDX + 0x3e]
ADD EDX,0x1f
CMOVNS EAX,EDX
SAR EAX,0x5
CALL 0x00044e30
MOV EDX,EBP
SAR EDX,0x5
AND EBP,0x1f
MOV EDI,EAX
MOV dword ptr [ESP],EBP
LEA EAX,[EDX + 0x1]
JZ 0x00046540
MOV ECX,dword ptr [ESI]
TEST ECX,ECX
JLE 0x00046531
MOV ECX,0x20
SUB ECX,dword ptr [ESP]
MOV EBX,ESI
MOV dword ptr [ESP + 0xc],EDX
MOV dword ptr [ESP + 0x8],ECX
LEA ECX,[EDX*0x4 + 0x0]
SUB EBX,ECX
MOV dword ptr [ESP + 0x4],EBX
XOR EBX,EBX
LEA ESI,[ESI]
MOV EDX,dword ptr [ESP + 0x4]
MOVZX ECX,byte ptr [ESP]
MOV EBP,dword ptr [EDX + EAX*0x4]
MOV EDX,EBP
SHL EDX,CL
MOVZX ECX,byte ptr [ESP + 0x8]
OR EBX,EDX
MOV dword ptr [EDI + EAX*0x4],EBX
MOV EBX,EBP
ADD EAX,0x1
SHR EBX,CL
MOV ECX,dword ptr [ESP + 0xc]
ADD ECX,dword ptr [ESI]
CMP ECX,EAX
JGE 0x00046500
TEST EBX,EBX
JZ 0x00046531
MOV dword ptr [EDI + EAX*0x4],EBX
ADD ESP,0x1c
MOV EAX,EDI
POP EBX
POP ESI
POP EDI
POP EBP
RET
LEA EDX,[EDI + EAX*0x4]
MOV EAX,dword ptr [ESI]
SUB ESP,0x4
ADD ESI,0x4
SHL EAX,0x2
PUSH EAX
PUSH ESI
PUSH EDX
CALL 0x00014130
ADD ESP,0x10
MOV EAX,EDI
ADD ESP,0x1c
POP EBX
POP ESI
POP EDI
POP EBP
RET
MOV EDX,EAX
JMP 0x000464b1
LEA EAX,[EBX + 0xfffd2b3c]
PUSH EAX
LEA EAX,[EBX + 0xfffd29f8]
PUSH 0x69b
PUSH EAX
LEA EAX,[EBX + 0xfffd2a92]
PUSH EAX
CALL 0x00014880
(translation_unit "/* WARNING: Function: __i686.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */\n\nint FUN_00046450(int *param_1,uint param_2)\n\n{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  int iVar4;\n  int iVar5;\n  uint uVar6;\n  byte local_24;\n  \n  if ((int)param_2 < 0) {\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar4 = *param_1 * 0x20 + -1;\n  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }\n  iVar3 = FUN_00044e30();\n  iVar5 = (int)param_2 >> 5;\n  iVar4 = iVar5 + 1;\n  if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }\n  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);\n  return iVar3;\n}\n\n" comment (function_definition "int FUN_00046450(int *param_1,uint param_2)\n\n{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  int iVar4;\n  int iVar5;\n  uint uVar6;\n  byte local_24;\n  \n  if ((int)param_2 < 0) {\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar4 = *param_1 * 0x20 + -1;\n  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }\n  iVar3 = FUN_00044e30();\n  iVar5 = (int)param_2 >> 5;\n  iVar4 = iVar5 + 1;\n  if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }\n  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);\n  return iVar3;\n}" primitive_type (function_declarator "FUN_00046450(int *param_1,uint param_2)" identifier (parameter_list "(int *param_1,uint param_2)" ( (parameter_declaration "int *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "uint param_2" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  int iVar4;\n  int iVar5;\n  uint uVar6;\n  byte local_24;\n  \n  if ((int)param_2 < 0) {\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar4 = *param_1 * 0x20 + -1;\n  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }\n  iVar3 = FUN_00044e30();\n  iVar5 = (int)param_2 >> 5;\n  iVar4 = iVar5 + 1;\n  if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }\n  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);\n  return iVar3;\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "sbyte sVar2;" type_identifier identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "int iVar4;" primitive_type identifier ;) (declaration "int iVar5;" primitive_type identifier ;) (declaration "uint uVar6;" type_identifier identifier ;) (declaration "byte local_24;" type_identifier identifier ;) (if_statement "if ((int)param_2 < 0) {\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }" if (parenthesized_expression "((int)param_2 < 0)" ( (binary_expression "(int)param_2 < 0" (cast_expression "(int)param_2" ( (type_descriptor "int" primitive_type) ) identifier) < number_literal) )) (compound_statement "{\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }" { comment (expression_statement "__assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");" (call_expression "__assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift")" identifier (argument_list "("shift >= 0","sshbn.c",0x69b,"bignum_lshift")" ( (string_literal ""shift >= 0"" " string_content ") , (string_literal ""sshbn.c"" " string_content ") , number_literal , (string_literal ""bignum_lshift"" " string_content ") ))) ;) })) (expression_statement "iVar4 = *param_1 * 0x20 + -1;" (assignment_expression "iVar4 = *param_1 * 0x20 + -1" identifier = (binary_expression "*param_1 * 0x20 + -1" (binary_expression "*param_1 * 0x20" (pointer_expression "*param_1" * identifier) * number_literal) + number_literal)) ;) (if_statement "if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }" if (parenthesized_expression "((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1]))" ( (binary_expression "(-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])" (parenthesized_expression "(-1 < iVar4)" ( (binary_expression "-1 < iVar4" number_literal < identifier) )) && (parenthesized_expression "(-1 < param_1[(iVar4 >> 5) + 1])" ( (binary_expression "-1 < param_1[(iVar4 >> 5) + 1]" number_literal < (subscript_expression "param_1[(iVar4 >> 5) + 1]" identifier [ (binary_expression "(iVar4 >> 5) + 1" (parenthesized_expression "(iVar4 >> 5)" ( (binary_expression "iVar4 >> 5" identifier >> number_literal) )) + number_literal) ])) ))) )) (compound_statement "{\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }" { (do_statement "do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);" do (compound_statement "{\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    }" { (expression_statement "iVar4 = iVar4 + -1;" (assignment_expression "iVar4 = iVar4 + -1" identifier = (binary_expression "iVar4 + -1" identifier + number_literal)) ;) (if_statement "if (iVar4 == -1) break;" if (parenthesized_expression "(iVar4 == -1)" ( (binary_expression "iVar4 == -1" identifier == number_literal) )) (break_statement "break;" break ;)) }) while (parenthesized_expression "((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0)" ( (binary_expression "(uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0" (binary_expression "(uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f)" (cast_expression "(uint)param_1[(iVar4 >> 5) + 1]" ( (type_descriptor "uint" type_identifier) ) (subscript_expression "param_1[(iVar4 >> 5) + 1]" identifier [ (binary_expression "(iVar4 >> 5) + 1" (parenthesized_expression "(iVar4 >> 5)" ( (binary_expression "iVar4 >> 5" identifier >> number_literal) )) + number_literal) ])) >> (parenthesized_expression "((byte)iVar4 & 0x1f)" ( (binary_expression "(byte)iVar4 & 0x1f" (cast_expression "(byte)iVar4" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) ))) == number_literal) )) ;) })) (expression_statement "iVar3 = FUN_00044e30();" (assignment_expression "iVar3 = FUN_00044e30()" identifier = (call_expression "FUN_00044e30()" identifier (argument_list "()" ( )))) ;) (expression_statement "iVar5 = (int)param_2 >> 5;" (assignment_expression "iVar5 = (int)param_2 >> 5" identifier = (binary_expression "(int)param_2 >> 5" (cast_expression "(int)param_2" ( (type_descriptor "int" primitive_type) ) identifier) >> number_literal)) ;) (expression_statement "iVar4 = iVar5 + 1;" (assignment_expression "iVar4 = iVar5 + 1" identifier = (binary_expression "iVar5 + 1" identifier + number_literal)) ;) (if_statement "if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }" if (parenthesized_expression "((param_2 & 0x1f) != 0)" ( (binary_expression "(param_2 & 0x1f) != 0" (parenthesized_expression "(param_2 & 0x1f)" ( (binary_expression "param_2 & 0x1f" identifier & number_literal) )) != number_literal) )) (compound_statement "{\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }" { (if_statement "if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }" if (parenthesized_expression "(0 < *param_1)" ( (binary_expression "0 < *param_1" number_literal < (pointer_expression "*param_1" * identifier)) )) (compound_statement "{\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }" { (expression_statement "sVar2 = (sbyte)(param_2 & 0x1f);" (assignment_expression "sVar2 = (sbyte)(param_2 & 0x1f)" identifier = (call_expression "(sbyte)(param_2 & 0x1f)" (parenthesized_expression "(sbyte)" ( identifier )) (argument_list "(param_2 & 0x1f)" ( (binary_expression "param_2 & 0x1f" identifier & number_literal) )))) ;) (expression_statement "local_24 = 0x20 - sVar2;" (assignment_expression "local_24 = 0x20 - sVar2" identifier = (binary_expression "0x20 - sVar2" number_literal - identifier)) ;) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" identifier = number_literal) ;) (do_statement "do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);" do (compound_statement "{\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      }" { (expression_statement "uVar1 = param_1[iVar4 - iVar5];" (assignment_expression "uVar1 = param_1[iVar4 - iVar5]" identifier = (subscript_expression "param_1[iVar4 - iVar5]" identifier [ (binary_expression "iVar4 - iVar5" identifier - identifier) ])) ;) (expression_statement "*(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;" (assignment_expression "*(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2" (pointer_expression "*(uint *)(iVar3 + iVar4 * 4)" * (cast_expression "(uint *)(iVar3 + iVar4 * 4)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar3 + iVar4 * 4)" ( (binary_expression "iVar3 + iVar4 * 4" identifier + (binary_expression "iVar4 * 4" identifier * number_literal)) )))) = (binary_expression "uVar6 | uVar1 << sVar2" identifier | (binary_expression "uVar1 << sVar2" identifier << identifier))) ;) (expression_statement "iVar4 = iVar4 + 1;" (assignment_expression "iVar4 = iVar4 + 1" identifier = (binary_expression "iVar4 + 1" identifier + number_literal)) ;) (expression_statement "uVar6 = uVar1 >> (local_24 & 0x1f);" (assignment_expression "uVar6 = uVar1 >> (local_24 & 0x1f)" identifier = (binary_expression "uVar1 >> (local_24 & 0x1f)" identifier >> (parenthesized_expression "(local_24 & 0x1f)" ( (binary_expression "local_24 & 0x1f" identifier & number_literal) )))) ;) }) while (parenthesized_expression "(iVar4 <= iVar5 + *param_1)" ( (binary_expression "iVar4 <= iVar5 + *param_1" identifier <= (binary_expression "iVar5 + *param_1" identifier + (pointer_expression "*param_1" * identifier))) )) ;) (if_statement "if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }" if (parenthesized_expression "(uVar6 != 0)" ( (binary_expression "uVar6 != 0" identifier != number_literal) )) (compound_statement "{\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }" { (expression_statement "*(uint *)(iVar3 + iVar4 * 4) = uVar6;" (assignment_expression "*(uint *)(iVar3 + iVar4 * 4) = uVar6" (pointer_expression "*(uint *)(iVar3 + iVar4 * 4)" * (cast_expression "(uint *)(iVar3 + iVar4 * 4)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar3 + iVar4 * 4)" ( (binary_expression "iVar3 + iVar4 * 4" identifier + (binary_expression "iVar4 * 4" identifier * number_literal)) )))) = identifier) ;) })) })) (return_statement "return iVar3;" return identifier ;) })) (expression_statement "memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);" (call_expression "memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2)" identifier (argument_list "((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2)" ( (cast_expression "(void *)(iVar3 + iVar4 * 4)" ( (type_descriptor "void *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar3 + iVar4 * 4)" ( (binary_expression "iVar3 + iVar4 * 4" identifier + (binary_expression "iVar4 * 4" identifier * number_literal)) ))) , (binary_expression "param_1 + 1" identifier + number_literal) , (binary_expression "*param_1 << 2" (pointer_expression "*param_1" * identifier) << number_literal) ))) ;) (return_statement "return iVar3;" return identifier ;) })))
(translation_unit "/* WARNING: Function: __x86.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */\n/* WARNING: Unknown calling convention */\n\nBignum_conflict bignum_lshift(Bignum_conflict a,int shift)\n\n{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  Bignum_conflict pBVar4;\n  int iVar5;\n  int iVar6;\n  uint uVar7;\n  byte local_24;\n  \n  if (shift < 0) {\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar3 = *a * 0x20;\n  iVar5 = iVar3 + -1;\n  if ((-1 < iVar5) && (-1 < (int)a[(iVar5 >> 5) + 1])) {\n    do {\n      iVar3 = iVar5;\n      iVar5 = iVar3 + -1;\n      if (iVar5 == -1) break;\n    } while (a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f) == 0);\n  }\n  iVar6 = iVar3 + shift + 0x1f;\n  iVar5 = iVar3 + shift + 0x3e;\n  if (-1 < iVar6) {\n    iVar5 = iVar6;\n  }\n  pBVar4 = newbn(iVar5 >> 5);\n  iVar3 = shift >> 5;\n  iVar5 = iVar3 + 1;\n  if ((shift & 0x1fU) == 0) {\n    memcpy(pBVar4 + iVar5,a + 1,*a << 2);\n    return pBVar4;\n  }\n  if (0 < (int)*a) {\n    sVar2 = (sbyte)(shift & 0x1fU);\n    local_24 = 0x20 - sVar2;\n    uVar7 = 0;\n    do {\n      uVar1 = a[iVar5 - iVar3];\n      pBVar4[iVar5] = uVar7 | uVar1 << sVar2;\n      iVar5 = iVar5 + 1;\n      uVar7 = uVar1 >> (local_24 & 0x1f);\n    } while (iVar5 <= (int)(iVar3 + *a));\n    if (uVar7 != 0) {\n      pBVar4[iVar5] = uVar7;\n    }\n  }\n  return pBVar4;\n}\n\n" comment comment (function_definition "Bignum_conflict bignum_lshift(Bignum_conflict a,int shift)\n\n{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  Bignum_conflict pBVar4;\n  int iVar5;\n  int iVar6;\n  uint uVar7;\n  byte local_24;\n  \n  if (shift < 0) {\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar3 = *a * 0x20;\n  iVar5 = iVar3 + -1;\n  if ((-1 < iVar5) && (-1 < (int)a[(iVar5 >> 5) + 1])) {\n    do {\n      iVar3 = iVar5;\n      iVar5 = iVar3 + -1;\n      if (iVar5 == -1) break;\n    } while (a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f) == 0);\n  }\n  iVar6 = iVar3 + shift + 0x1f;\n  iVar5 = iVar3 + shift + 0x3e;\n  if (-1 < iVar6) {\n    iVar5 = iVar6;\n  }\n  pBVar4 = newbn(iVar5 >> 5);\n  iVar3 = shift >> 5;\n  iVar5 = iVar3 + 1;\n  if ((shift & 0x1fU) == 0) {\n    memcpy(pBVar4 + iVar5,a + 1,*a << 2);\n    return pBVar4;\n  }\n  if (0 < (int)*a) {\n    sVar2 = (sbyte)(shift & 0x1fU);\n    local_24 = 0x20 - sVar2;\n    uVar7 = 0;\n    do {\n      uVar1 = a[iVar5 - iVar3];\n      pBVar4[iVar5] = uVar7 | uVar1 << sVar2;\n      iVar5 = iVar5 + 1;\n      uVar7 = uVar1 >> (local_24 & 0x1f);\n    } while (iVar5 <= (int)(iVar3 + *a));\n    if (uVar7 != 0) {\n      pBVar4[iVar5] = uVar7;\n    }\n  }\n  return pBVar4;\n}" type_identifier (function_declarator "bignum_lshift(Bignum_conflict a,int shift)" identifier (parameter_list "(Bignum_conflict a,int shift)" ( (parameter_declaration "Bignum_conflict a" type_identifier identifier) , (parameter_declaration "int shift" primitive_type identifier) ))) (compound_statement "{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  Bignum_conflict pBVar4;\n  int iVar5;\n  int iVar6;\n  uint uVar7;\n  byte local_24;\n  \n  if (shift < 0) {\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar3 = *a * 0x20;\n  iVar5 = iVar3 + -1;\n  if ((-1 < iVar5) && (-1 < (int)a[(iVar5 >> 5) + 1])) {\n    do {\n      iVar3 = iVar5;\n      iVar5 = iVar3 + -1;\n      if (iVar5 == -1) break;\n    } while (a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f) == 0);\n  }\n  iVar6 = iVar3 + shift + 0x1f;\n  iVar5 = iVar3 + shift + 0x3e;\n  if (-1 < iVar6) {\n    iVar5 = iVar6;\n  }\n  pBVar4 = newbn(iVar5 >> 5);\n  iVar3 = shift >> 5;\n  iVar5 = iVar3 + 1;\n  if ((shift & 0x1fU) == 0) {\n    memcpy(pBVar4 + iVar5,a + 1,*a << 2);\n    return pBVar4;\n  }\n  if (0 < (int)*a) {\n    sVar2 = (sbyte)(shift & 0x1fU);\n    local_24 = 0x20 - sVar2;\n    uVar7 = 0;\n    do {\n      uVar1 = a[iVar5 - iVar3];\n      pBVar4[iVar5] = uVar7 | uVar1 << sVar2;\n      iVar5 = iVar5 + 1;\n      uVar7 = uVar1 >> (local_24 & 0x1f);\n    } while (iVar5 <= (int)(iVar3 + *a));\n    if (uVar7 != 0) {\n      pBVar4[iVar5] = uVar7;\n    }\n  }\n  return pBVar4;\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "sbyte sVar2;" type_identifier identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "Bignum_conflict pBVar4;" type_identifier identifier ;) (declaration "int iVar5;" primitive_type identifier ;) (declaration "int iVar6;" primitive_type identifier ;) (declaration "uint uVar7;" type_identifier identifier ;) (declaration "byte local_24;" type_identifier identifier ;) (if_statement "if (shift < 0) {\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }" if (parenthesized_expression "(shift < 0)" ( (binary_expression "shift < 0" identifier < number_literal) )) (compound_statement "{\n                    /* WARNING: Subroutine does not return */\n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }" { comment (expression_statement "__assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");" (call_expression "__assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift")" identifier (argument_list "("shift >= 0","sshbn.c",0x69b,"bignum_lshift")" ( (string_literal ""shift >= 0"" " string_content ") , (string_literal ""sshbn.c"" " string_content ") , number_literal , (string_literal ""bignum_lshift"" " string_content ") ))) ;) })) (expression_statement "iVar3 = *a * 0x20;" (assignment_expression "iVar3 = *a * 0x20" identifier = (binary_expression "*a * 0x20" (pointer_expression "*a" * identifier) * number_literal)) ;) (expression_statement "iVar5 = iVar3 + -1;" (assignment_expression "iVar5 = iVar3 + -1" identifier = (binary_expression "iVar3 + -1" identifier + number_literal)) ;) (if_statement "if ((-1 < iVar5) && (-1 < (int)a[(iVar5 >> 5) + 1])) {\n    do {\n      iVar3 = iVar5;\n      iVar5 = iVar3 + -1;\n      if (iVar5 == -1) break;\n    } while (a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f) == 0);\n  }" if (parenthesized_expression "((-1 < iVar5) && (-1 < (int)a[(iVar5 >> 5) + 1]))" ( (binary_expression "(-1 < iVar5) && (-1 < (int)a[(iVar5 >> 5) + 1])" (parenthesized_expression "(-1 < iVar5)" ( (binary_expression "-1 < iVar5" number_literal < identifier) )) && (parenthesized_expression "(-1 < (int)a[(iVar5 >> 5) + 1])" ( (binary_expression "-1 < (int)a[(iVar5 >> 5) + 1]" number_literal < (cast_expression "(int)a[(iVar5 >> 5) + 1]" ( (type_descriptor "int" primitive_type) ) (subscript_expression "a[(iVar5 >> 5) + 1]" identifier [ (binary_expression "(iVar5 >> 5) + 1" (parenthesized_expression "(iVar5 >> 5)" ( (binary_expression "iVar5 >> 5" identifier >> number_literal) )) + number_literal) ]))) ))) )) (compound_statement "{\n    do {\n      iVar3 = iVar5;\n      iVar5 = iVar3 + -1;\n      if (iVar5 == -1) break;\n    } while (a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f) == 0);\n  }" { (do_statement "do {\n      iVar3 = iVar5;\n      iVar5 = iVar3 + -1;\n      if (iVar5 == -1) break;\n    } while (a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f) == 0);" do (compound_statement "{\n      iVar3 = iVar5;\n      iVar5 = iVar3 + -1;\n      if (iVar5 == -1) break;\n    }" { (expression_statement "iVar3 = iVar5;" (assignment_expression "iVar3 = iVar5" identifier = identifier) ;) (expression_statement "iVar5 = iVar3 + -1;" (assignment_expression "iVar5 = iVar3 + -1" identifier = (binary_expression "iVar3 + -1" identifier + number_literal)) ;) (if_statement "if (iVar5 == -1) break;" if (parenthesized_expression "(iVar5 == -1)" ( (binary_expression "iVar5 == -1" identifier == number_literal) )) (break_statement "break;" break ;)) }) while (parenthesized_expression "(a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f) == 0)" ( (binary_expression "a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f) == 0" (binary_expression "a[(iVar5 >> 5) + 1] >> ((byte)iVar5 & 0x1f)" (subscript_expression "a[(iVar5 >> 5) + 1]" identifier [ (binary_expression "(iVar5 >> 5) + 1" (parenthesized_expression "(iVar5 >> 5)" ( (binary_expression "iVar5 >> 5" identifier >> number_literal) )) + number_literal) ]) >> (parenthesized_expression "((byte)iVar5 & 0x1f)" ( (binary_expression "(byte)iVar5 & 0x1f" (cast_expression "(byte)iVar5" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) ))) == number_literal) )) ;) })) (expression_statement "iVar6 = iVar3 + shift + 0x1f;" (assignment_expression "iVar6 = iVar3 + shift + 0x1f" identifier = (binary_expression "iVar3 + shift + 0x1f" (binary_expression "iVar3 + shift" identifier + identifier) + number_literal)) ;) (expression_statement "iVar5 = iVar3 + shift + 0x3e;" (assignment_expression "iVar5 = iVar3 + shift + 0x3e" identifier = (binary_expression "iVar3 + shift + 0x3e" (binary_expression "iVar3 + shift" identifier + identifier) + number_literal)) ;) (if_statement "if (-1 < iVar6) {\n    iVar5 = iVar6;\n  }" if (parenthesized_expression "(-1 < iVar6)" ( (binary_expression "-1 < iVar6" number_literal < identifier) )) (compound_statement "{\n    iVar5 = iVar6;\n  }" { (expression_statement "iVar5 = iVar6;" (assignment_expression "iVar5 = iVar6" identifier = identifier) ;) })) (expression_statement "pBVar4 = newbn(iVar5 >> 5);" (assignment_expression "pBVar4 = newbn(iVar5 >> 5)" identifier = (call_expression "newbn(iVar5 >> 5)" identifier (argument_list "(iVar5 >> 5)" ( (binary_expression "iVar5 >> 5" identifier >> number_literal) )))) ;) (expression_statement "iVar3 = shift >> 5;" (assignment_expression "iVar3 = shift >> 5" identifier = (binary_expression "shift >> 5" identifier >> number_literal)) ;) (expression_statement "iVar5 = iVar3 + 1;" (assignment_expression "iVar5 = iVar3 + 1" identifier = (binary_expression "iVar3 + 1" identifier + number_literal)) ;) (if_statement "if ((shift & 0x1fU) == 0) {\n    memcpy(pBVar4 + iVar5,a + 1,*a << 2);\n    return pBVar4;\n  }" if (parenthesized_expression "((shift & 0x1fU) == 0)" ( (binary_expression "(shift & 0x1fU) == 0" (parenthesized_expression "(shift & 0x1fU)" ( (binary_expression "shift & 0x1fU" identifier & number_literal) )) == number_literal) )) (compound_statement "{\n    memcpy(pBVar4 + iVar5,a + 1,*a << 2);\n    return pBVar4;\n  }" { (expression_statement "memcpy(pBVar4 + iVar5,a + 1,*a << 2);" (call_expression "memcpy(pBVar4 + iVar5,a + 1,*a << 2)" identifier (argument_list "(pBVar4 + iVar5,a + 1,*a << 2)" ( (binary_expression "pBVar4 + iVar5" identifier + identifier) , (binary_expression "a + 1" identifier + number_literal) , (binary_expression "*a << 2" (pointer_expression "*a" * identifier) << number_literal) ))) ;) (return_statement "return pBVar4;" return identifier ;) })) (if_statement "if (0 < (int)*a) {\n    sVar2 = (sbyte)(shift & 0x1fU);\n    local_24 = 0x20 - sVar2;\n    uVar7 = 0;\n    do {\n      uVar1 = a[iVar5 - iVar3];\n      pBVar4[iVar5] = uVar7 | uVar1 << sVar2;\n      iVar5 = iVar5 + 1;\n      uVar7 = uVar1 >> (local_24 & 0x1f);\n    } while (iVar5 <= (int)(iVar3 + *a));\n    if (uVar7 != 0) {\n      pBVar4[iVar5] = uVar7;\n    }\n  }" if (parenthesized_expression "(0 < (int)*a)" ( (binary_expression "0 < (int)*a" number_literal < (cast_expression "(int)*a" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*a" * identifier))) )) (compound_statement "{\n    sVar2 = (sbyte)(shift & 0x1fU);\n    local_24 = 0x20 - sVar2;\n    uVar7 = 0;\n    do {\n      uVar1 = a[iVar5 - iVar3];\n      pBVar4[iVar5] = uVar7 | uVar1 << sVar2;\n      iVar5 = iVar5 + 1;\n      uVar7 = uVar1 >> (local_24 & 0x1f);\n    } while (iVar5 <= (int)(iVar3 + *a));\n    if (uVar7 != 0) {\n      pBVar4[iVar5] = uVar7;\n    }\n  }" { (expression_statement "sVar2 = (sbyte)(shift & 0x1fU);" (assignment_expression "sVar2 = (sbyte)(shift & 0x1fU)" identifier = (call_expression "(sbyte)(shift & 0x1fU)" (parenthesized_expression "(sbyte)" ( identifier )) (argument_list "(shift & 0x1fU)" ( (binary_expression "shift & 0x1fU" identifier & number_literal) )))) ;) (expression_statement "local_24 = 0x20 - sVar2;" (assignment_expression "local_24 = 0x20 - sVar2" identifier = (binary_expression "0x20 - sVar2" number_literal - identifier)) ;) (expression_statement "uVar7 = 0;" (assignment_expression "uVar7 = 0" identifier = number_literal) ;) (do_statement "do {\n      uVar1 = a[iVar5 - iVar3];\n      pBVar4[iVar5] = uVar7 | uVar1 << sVar2;\n      iVar5 = iVar5 + 1;\n      uVar7 = uVar1 >> (local_24 & 0x1f);\n    } while (iVar5 <= (int)(iVar3 + *a));" do (compound_statement "{\n      uVar1 = a[iVar5 - iVar3];\n      pBVar4[iVar5] = uVar7 | uVar1 << sVar2;\n      iVar5 = iVar5 + 1;\n      uVar7 = uVar1 >> (local_24 & 0x1f);\n    }" { (expression_statement "uVar1 = a[iVar5 - iVar3];" (assignment_expression "uVar1 = a[iVar5 - iVar3]" identifier = (subscript_expression "a[iVar5 - iVar3]" identifier [ (binary_expression "iVar5 - iVar3" identifier - identifier) ])) ;) (expression_statement "pBVar4[iVar5] = uVar7 | uVar1 << sVar2;" (assignment_expression "pBVar4[iVar5] = uVar7 | uVar1 << sVar2" (subscript_expression "pBVar4[iVar5]" identifier [ identifier ]) = (binary_expression "uVar7 | uVar1 << sVar2" identifier | (binary_expression "uVar1 << sVar2" identifier << identifier))) ;) (expression_statement "iVar5 = iVar5 + 1;" (assignment_expression "iVar5 = iVar5 + 1" identifier = (binary_expression "iVar5 + 1" identifier + number_literal)) ;) (expression_statement "uVar7 = uVar1 >> (local_24 & 0x1f);" (assignment_expression "uVar7 = uVar1 >> (local_24 & 0x1f)" identifier = (binary_expression "uVar1 >> (local_24 & 0x1f)" identifier >> (parenthesized_expression "(local_24 & 0x1f)" ( (binary_expression "local_24 & 0x1f" identifier & number_literal) )))) ;) }) while (parenthesized_expression "(iVar5 <= (int)(iVar3 + *a))" ( (binary_expression "iVar5 <= (int)(iVar3 + *a)" identifier <= (cast_expression "(int)(iVar3 + *a)" ( (type_descriptor "int" primitive_type) ) (parenthesized_expression "(iVar3 + *a)" ( (binary_expression "iVar3 + *a" identifier + (pointer_expression "*a" * identifier)) )))) )) ;) (if_statement "if (uVar7 != 0) {\n      pBVar4[iVar5] = uVar7;\n    }" if (parenthesized_expression "(uVar7 != 0)" ( (binary_expression "uVar7 != 0" identifier != number_literal) )) (compound_statement "{\n      pBVar4[iVar5] = uVar7;\n    }" { (expression_statement "pBVar4[iVar5] = uVar7;" (assignment_expression "pBVar4[iVar5] = uVar7" (subscript_expression "pBVar4[iVar5]" identifier [ identifier ]) = identifier) ;) })) })) (return_statement "return pBVar4;" return identifier ;) })))
(translation_unit "int FUN_00046450(int *param_1,uint param_2)\n\n{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  int iVar4;\n  int iVar5;\n  uint uVar6;\n  byte local_24;\n  \n  if ((int)param_2 < 0) {\n                    \n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar4 = *param_1 * 0x20 + -1;\n  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }\n  iVar3 = FUN_00044e30();\n  iVar5 = (int)param_2 >> 5;\n  iVar4 = iVar5 + 1;\n  if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }\n  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);\n  return iVar3;\n}\n\n" (function_definition "int FUN_00046450(int *param_1,uint param_2)\n\n{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  int iVar4;\n  int iVar5;\n  uint uVar6;\n  byte local_24;\n  \n  if ((int)param_2 < 0) {\n                    \n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar4 = *param_1 * 0x20 + -1;\n  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }\n  iVar3 = FUN_00044e30();\n  iVar5 = (int)param_2 >> 5;\n  iVar4 = iVar5 + 1;\n  if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }\n  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);\n  return iVar3;\n}" primitive_type (function_declarator "FUN_00046450(int *param_1,uint param_2)" identifier (parameter_list "(int *param_1,uint param_2)" ( (parameter_declaration "int *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "uint param_2" type_identifier identifier) ))) (compound_statement "{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  int iVar4;\n  int iVar5;\n  uint uVar6;\n  byte local_24;\n  \n  if ((int)param_2 < 0) {\n                    \n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar4 = *param_1 * 0x20 + -1;\n  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }\n  iVar3 = FUN_00044e30();\n  iVar5 = (int)param_2 >> 5;\n  iVar4 = iVar5 + 1;\n  if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }\n  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);\n  return iVar3;\n}" { (declaration "uint uVar1;" type_identifier identifier ;) (declaration "sbyte sVar2;" type_identifier identifier ;) (declaration "int iVar3;" primitive_type identifier ;) (declaration "int iVar4;" primitive_type identifier ;) (declaration "int iVar5;" primitive_type identifier ;) (declaration "uint uVar6;" type_identifier identifier ;) (declaration "byte local_24;" type_identifier identifier ;) (if_statement "if ((int)param_2 < 0) {\n                    \n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }" if (parenthesized_expression "((int)param_2 < 0)" ( (binary_expression "(int)param_2 < 0" (cast_expression "(int)param_2" ( (type_descriptor "int" primitive_type) ) identifier) < number_literal) )) (compound_statement "{\n                    \n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }" { (expression_statement "__assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");" (call_expression "__assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift")" identifier (argument_list "("shift >= 0","sshbn.c",0x69b,"bignum_lshift")" ( (string_literal ""shift >= 0"" " string_content ") , (string_literal ""sshbn.c"" " string_content ") , number_literal , (string_literal ""bignum_lshift"" " string_content ") ))) ;) })) (expression_statement "iVar4 = *param_1 * 0x20 + -1;" (assignment_expression "iVar4 = *param_1 * 0x20 + -1" identifier = (binary_expression "*param_1 * 0x20 + -1" (binary_expression "*param_1 * 0x20" (pointer_expression "*param_1" * identifier) * number_literal) + number_literal)) ;) (if_statement "if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }" if (parenthesized_expression "((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1]))" ( (binary_expression "(-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])" (parenthesized_expression "(-1 < iVar4)" ( (binary_expression "-1 < iVar4" number_literal < identifier) )) && (parenthesized_expression "(-1 < param_1[(iVar4 >> 5) + 1])" ( (binary_expression "-1 < param_1[(iVar4 >> 5) + 1]" number_literal < (subscript_expression "param_1[(iVar4 >> 5) + 1]" identifier [ (binary_expression "(iVar4 >> 5) + 1" (parenthesized_expression "(iVar4 >> 5)" ( (binary_expression "iVar4 >> 5" identifier >> number_literal) )) + number_literal) ])) ))) )) (compound_statement "{\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }" { (do_statement "do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);" do (compound_statement "{\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    }" { (expression_statement "iVar4 = iVar4 + -1;" (assignment_expression "iVar4 = iVar4 + -1" identifier = (binary_expression "iVar4 + -1" identifier + number_literal)) ;) (if_statement "if (iVar4 == -1) break;" if (parenthesized_expression "(iVar4 == -1)" ( (binary_expression "iVar4 == -1" identifier == number_literal) )) (break_statement "break;" break ;)) }) while (parenthesized_expression "((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0)" ( (binary_expression "(uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0" (binary_expression "(uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f)" (cast_expression "(uint)param_1[(iVar4 >> 5) + 1]" ( (type_descriptor "uint" type_identifier) ) (subscript_expression "param_1[(iVar4 >> 5) + 1]" identifier [ (binary_expression "(iVar4 >> 5) + 1" (parenthesized_expression "(iVar4 >> 5)" ( (binary_expression "iVar4 >> 5" identifier >> number_literal) )) + number_literal) ])) >> (parenthesized_expression "((byte)iVar4 & 0x1f)" ( (binary_expression "(byte)iVar4 & 0x1f" (cast_expression "(byte)iVar4" ( (type_descriptor "byte" type_identifier) ) identifier) & number_literal) ))) == number_literal) )) ;) })) (expression_statement "iVar3 = FUN_00044e30();" (assignment_expression "iVar3 = FUN_00044e30()" identifier = (call_expression "FUN_00044e30()" identifier (argument_list "()" ( )))) ;) (expression_statement "iVar5 = (int)param_2 >> 5;" (assignment_expression "iVar5 = (int)param_2 >> 5" identifier = (binary_expression "(int)param_2 >> 5" (cast_expression "(int)param_2" ( (type_descriptor "int" primitive_type) ) identifier) >> number_literal)) ;) (expression_statement "iVar4 = iVar5 + 1;" (assignment_expression "iVar4 = iVar5 + 1" identifier = (binary_expression "iVar5 + 1" identifier + number_literal)) ;) (if_statement "if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }" if (parenthesized_expression "((param_2 & 0x1f) != 0)" ( (binary_expression "(param_2 & 0x1f) != 0" (parenthesized_expression "(param_2 & 0x1f)" ( (binary_expression "param_2 & 0x1f" identifier & number_literal) )) != number_literal) )) (compound_statement "{\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }" { (if_statement "if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }" if (parenthesized_expression "(0 < *param_1)" ( (binary_expression "0 < *param_1" number_literal < (pointer_expression "*param_1" * identifier)) )) (compound_statement "{\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }" { (expression_statement "sVar2 = (sbyte)(param_2 & 0x1f);" (assignment_expression "sVar2 = (sbyte)(param_2 & 0x1f)" identifier = (call_expression "(sbyte)(param_2 & 0x1f)" (parenthesized_expression "(sbyte)" ( identifier )) (argument_list "(param_2 & 0x1f)" ( (binary_expression "param_2 & 0x1f" identifier & number_literal) )))) ;) (expression_statement "local_24 = 0x20 - sVar2;" (assignment_expression "local_24 = 0x20 - sVar2" identifier = (binary_expression "0x20 - sVar2" number_literal - identifier)) ;) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" identifier = number_literal) ;) (do_statement "do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);" do (compound_statement "{\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      }" { (expression_statement "uVar1 = param_1[iVar4 - iVar5];" (assignment_expression "uVar1 = param_1[iVar4 - iVar5]" identifier = (subscript_expression "param_1[iVar4 - iVar5]" identifier [ (binary_expression "iVar4 - iVar5" identifier - identifier) ])) ;) (expression_statement "*(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;" (assignment_expression "*(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2" (pointer_expression "*(uint *)(iVar3 + iVar4 * 4)" * (cast_expression "(uint *)(iVar3 + iVar4 * 4)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar3 + iVar4 * 4)" ( (binary_expression "iVar3 + iVar4 * 4" identifier + (binary_expression "iVar4 * 4" identifier * number_literal)) )))) = (binary_expression "uVar6 | uVar1 << sVar2" identifier | (binary_expression "uVar1 << sVar2" identifier << identifier))) ;) (expression_statement "iVar4 = iVar4 + 1;" (assignment_expression "iVar4 = iVar4 + 1" identifier = (binary_expression "iVar4 + 1" identifier + number_literal)) ;) (expression_statement "uVar6 = uVar1 >> (local_24 & 0x1f);" (assignment_expression "uVar6 = uVar1 >> (local_24 & 0x1f)" identifier = (binary_expression "uVar1 >> (local_24 & 0x1f)" identifier >> (parenthesized_expression "(local_24 & 0x1f)" ( (binary_expression "local_24 & 0x1f" identifier & number_literal) )))) ;) }) while (parenthesized_expression "(iVar4 <= iVar5 + *param_1)" ( (binary_expression "iVar4 <= iVar5 + *param_1" identifier <= (binary_expression "iVar5 + *param_1" identifier + (pointer_expression "*param_1" * identifier))) )) ;) (if_statement "if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }" if (parenthesized_expression "(uVar6 != 0)" ( (binary_expression "uVar6 != 0" identifier != number_literal) )) (compound_statement "{\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }" { (expression_statement "*(uint *)(iVar3 + iVar4 * 4) = uVar6;" (assignment_expression "*(uint *)(iVar3 + iVar4 * 4) = uVar6" (pointer_expression "*(uint *)(iVar3 + iVar4 * 4)" * (cast_expression "(uint *)(iVar3 + iVar4 * 4)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar3 + iVar4 * 4)" ( (binary_expression "iVar3 + iVar4 * 4" identifier + (binary_expression "iVar4 * 4" identifier * number_literal)) )))) = identifier) ;) })) })) (return_statement "return iVar3;" return identifier ;) })) (expression_statement "memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);" (call_expression "memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2)" identifier (argument_list "((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2)" ( (cast_expression "(void *)(iVar3 + iVar4 * 4)" ( (type_descriptor "void *" primitive_type (abstract_pointer_declarator "*" *)) ) (parenthesized_expression "(iVar3 + iVar4 * 4)" ( (binary_expression "iVar3 + iVar4 * 4" identifier + (binary_expression "iVar4 * 4" identifier * number_literal)) ))) , (binary_expression "param_1 + 1" identifier + number_literal) , (binary_expression "*param_1 << 2" (pointer_expression "*param_1" * identifier) << number_literal) ))) ;) (return_statement "return iVar3;" return identifier ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) ))) (compound_statement { (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (if_statement if (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) < LIT) )) (compound_statement { (expression_statement (call_expression IDENT (argument_list ( (string_literal " string_content ") , (string_literal " string_content ") , LIT , (string_literal " string_content ") ))) ;) })) (expression_statement (assignment_expression IDENT = (binary_expression (binary_expression (pointer_expression * IDENT) * LIT) + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression LIT < IDENT) )) && (parenthesized_expression ( (binary_expression LIT < (subscript_expression IDENT [ (binary_expression (parenthesized_expression ( (binary_expression IDENT >> LIT) )) + LIT) ])) ))) )) (compound_statement { (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT == LIT) )) (break_statement break ;)) }) while (parenthesized_expression ( (binary_expression (binary_expression (cast_expression ( (type_descriptor TYPE) ) (subscript_expression IDENT [ (binary_expression (parenthesized_expression ( (binary_expression IDENT >> LIT) )) + LIT) ])) >> (parenthesized_expression ( (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) & LIT) ))) == LIT) )) ;) })) (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( )))) ;) (expression_statement (assignment_expression IDENT = (binary_expression (cast_expression ( (type_descriptor TYPE) ) IDENT) >> LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT & LIT) )) != LIT) )) (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression LIT < (pointer_expression * IDENT)) )) (compound_statement { (expression_statement (assignment_expression IDENT = (call_expression (parenthesized_expression ( IDENT )) (argument_list ( (binary_expression IDENT & LIT) )))) ;) (expression_statement (assignment_expression IDENT = (binary_expression LIT - IDENT)) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (subscript_expression IDENT [ (binary_expression IDENT - IDENT) ])) ;) (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + (binary_expression IDENT * LIT)) )))) = (binary_expression IDENT | (binary_expression IDENT << IDENT))) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT >> (parenthesized_expression ( (binary_expression IDENT & LIT) )))) ;) }) while (parenthesized_expression ( (binary_expression IDENT <= (binary_expression IDENT + (pointer_expression * IDENT))) )) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT != LIT) )) (compound_statement { (expression_statement (assignment_expression (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + (binary_expression IDENT * LIT)) )))) = IDENT) ;) })) })) (return_statement return IDENT ;) })) (expression_statement (call_expression IDENT (argument_list ( (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (parenthesized_expression ( (binary_expression IDENT + (binary_expression IDENT * LIT)) ))) , (binary_expression IDENT + LIT) , (binary_expression (pointer_expression * IDENT) << LIT) ))) ;) (return_statement return IDENT ;) })))
(function_definition "int FUN_00046450(int *param_1,uint param_2)\n\n{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  int iVar4;\n  int iVar5;\n  uint uVar6;\n  byte local_24;\n  \n  if ((int)param_2 < 0) {\n                    \n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar4 = *param_1 * 0x20 + -1;\n  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }\n  iVar3 = FUN_00044e30();\n  iVar5 = (int)param_2 >> 5;\n  iVar4 = iVar5 + 1;\n  if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }\n  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);\n  return iVar3;\n}" (primitive_type "int") (function_declarator "FUN_00046450(int *param_1,uint param_2)" (identifier "FUN_00046450") (parameter_list "(int *param_1,uint param_2)" (( "(") (parameter_declaration "int *param_1" (primitive_type "int") (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "uint param_2" (type_identifier "uint") (identifier "param_2")) () ")"))) (compound_statement "{\n  uint uVar1;\n  sbyte sVar2;\n  int iVar3;\n  int iVar4;\n  int iVar5;\n  uint uVar6;\n  byte local_24;\n  \n  if ((int)param_2 < 0) {\n                    \n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }\n  iVar4 = *param_1 * 0x20 + -1;\n  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }\n  iVar3 = FUN_00044e30();\n  iVar5 = (int)param_2 >> 5;\n  iVar4 = iVar5 + 1;\n  if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }\n  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);\n  return iVar3;\n}" ({ "{") (declaration "uint uVar1;" (type_identifier "uint") (identifier "uVar1") (; ";")) (declaration "sbyte sVar2;" (type_identifier "sbyte") (identifier "sVar2") (; ";")) (declaration "int iVar3;" (primitive_type "int") (identifier "iVar3") (; ";")) (declaration "int iVar4;" (primitive_type "int") (identifier "iVar4") (; ";")) (declaration "int iVar5;" (primitive_type "int") (identifier "iVar5") (; ";")) (declaration "uint uVar6;" (type_identifier "uint") (identifier "uVar6") (; ";")) (declaration "byte local_24;" (type_identifier "byte") (identifier "local_24") (; ";")) (if_statement "if ((int)param_2 < 0) {\n                    \n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }" (if "if") (parenthesized_expression "((int)param_2 < 0)" (( "(") (binary_expression "(int)param_2 < 0" (cast_expression "(int)param_2" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "param_2")) (< "<") (number_literal "0")) () ")")) (compound_statement "{\n                    \n    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");\n  }" ({ "{") (expression_statement "__assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");" (call_expression "__assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift")" (identifier "__assert_fail") (argument_list "("shift >= 0","sshbn.c",0x69b,"bignum_lshift")" (( "(") (string_literal ""shift >= 0"" (" """) (string_content "shift >= 0") (" """)) (, ",") (string_literal ""sshbn.c"" (" """) (string_content "sshbn.c") (" """)) (, ",") (number_literal "0x69b") (, ",") (string_literal ""bignum_lshift"" (" """) (string_content "bignum_lshift") (" """)) () ")"))) (; ";")) (} "}"))) (expression_statement "iVar4 = *param_1 * 0x20 + -1;" (assignment_expression "iVar4 = *param_1 * 0x20 + -1" (identifier "iVar4") (= "=") (binary_expression "*param_1 * 0x20 + -1" (binary_expression "*param_1 * 0x20" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (* "*") (number_literal "0x20")) (+ "+") (number_literal "-1"))) (; ";")) (if_statement "if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }" (if "if") (parenthesized_expression "((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1]))" (( "(") (binary_expression "(-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])" (parenthesized_expression "(-1 < iVar4)" (( "(") (binary_expression "-1 < iVar4" (number_literal "-1") (< "<") (identifier "iVar4")) () ")")) (&& "&&") (parenthesized_expression "(-1 < param_1[(iVar4 >> 5) + 1])" (( "(") (binary_expression "-1 < param_1[(iVar4 >> 5) + 1]" (number_literal "-1") (< "<") (subscript_expression "param_1[(iVar4 >> 5) + 1]" (identifier "param_1") ([ "[") (binary_expression "(iVar4 >> 5) + 1" (parenthesized_expression "(iVar4 >> 5)" (( "(") (binary_expression "iVar4 >> 5" (identifier "iVar4") (>> ">>") (number_literal "5")) () ")")) (+ "+") (number_literal "1")) (] "]"))) () ")"))) () ")")) (compound_statement "{\n    do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);\n  }" ({ "{") (do_statement "do {\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);" (do "do") (compound_statement "{\n      iVar4 = iVar4 + -1;\n      if (iVar4 == -1) break;\n    }" ({ "{") (expression_statement "iVar4 = iVar4 + -1;" (assignment_expression "iVar4 = iVar4 + -1" (identifier "iVar4") (= "=") (binary_expression "iVar4 + -1" (identifier "iVar4") (+ "+") (number_literal "-1"))) (; ";")) (if_statement "if (iVar4 == -1) break;" (if "if") (parenthesized_expression "(iVar4 == -1)" (( "(") (binary_expression "iVar4 == -1" (identifier "iVar4") (== "==") (number_literal "-1")) () ")")) (break_statement "break;" (break "break") (; ";"))) (} "}")) (while "while") (parenthesized_expression "((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0)" (( "(") (binary_expression "(uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0" (binary_expression "(uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f)" (cast_expression "(uint)param_1[(iVar4 >> 5) + 1]" (( "(") (type_descriptor "uint" (type_identifier "uint")) () ")") (subscript_expression "param_1[(iVar4 >> 5) + 1]" (identifier "param_1") ([ "[") (binary_expression "(iVar4 >> 5) + 1" (parenthesized_expression "(iVar4 >> 5)" (( "(") (binary_expression "iVar4 >> 5" (identifier "iVar4") (>> ">>") (number_literal "5")) () ")")) (+ "+") (number_literal "1")) (] "]"))) (>> ">>") (parenthesized_expression "((byte)iVar4 & 0x1f)" (( "(") (binary_expression "(byte)iVar4 & 0x1f" (cast_expression "(byte)iVar4" (( "(") (type_descriptor "byte" (type_identifier "byte")) () ")") (identifier "iVar4")) (& "&") (number_literal "0x1f")) () ")"))) (== "==") (number_literal "0")) () ")")) (; ";")) (} "}"))) (expression_statement "iVar3 = FUN_00044e30();" (assignment_expression "iVar3 = FUN_00044e30()" (identifier "iVar3") (= "=") (call_expression "FUN_00044e30()" (identifier "FUN_00044e30") (argument_list "()" (( "(") () ")")))) (; ";")) (expression_statement "iVar5 = (int)param_2 >> 5;" (assignment_expression "iVar5 = (int)param_2 >> 5" (identifier "iVar5") (= "=") (binary_expression "(int)param_2 >> 5" (cast_expression "(int)param_2" (( "(") (type_descriptor "int" (primitive_type "int")) () ")") (identifier "param_2")) (>> ">>") (number_literal "5"))) (; ";")) (expression_statement "iVar4 = iVar5 + 1;" (assignment_expression "iVar4 = iVar5 + 1" (identifier "iVar4") (= "=") (binary_expression "iVar5 + 1" (identifier "iVar5") (+ "+") (number_literal "1"))) (; ";")) (if_statement "if ((param_2 & 0x1f) != 0) {\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }" (if "if") (parenthesized_expression "((param_2 & 0x1f) != 0)" (( "(") (binary_expression "(param_2 & 0x1f) != 0" (parenthesized_expression "(param_2 & 0x1f)" (( "(") (binary_expression "param_2 & 0x1f" (identifier "param_2") (& "&") (number_literal "0x1f")) () ")")) (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n    if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }\n    return iVar3;\n  }" ({ "{") (if_statement "if (0 < *param_1) {\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }" (if "if") (parenthesized_expression "(0 < *param_1)" (( "(") (binary_expression "0 < *param_1" (number_literal "0") (< "<") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) () ")")) (compound_statement "{\n      sVar2 = (sbyte)(param_2 & 0x1f);\n      local_24 = 0x20 - sVar2;\n      uVar6 = 0;\n      do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);\n      if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }\n    }" ({ "{") (expression_statement "sVar2 = (sbyte)(param_2 & 0x1f);" (assignment_expression "sVar2 = (sbyte)(param_2 & 0x1f)" (identifier "sVar2") (= "=") (call_expression "(sbyte)(param_2 & 0x1f)" (parenthesized_expression "(sbyte)" (( "(") (identifier "sbyte") () ")")) (argument_list "(param_2 & 0x1f)" (( "(") (binary_expression "param_2 & 0x1f" (identifier "param_2") (& "&") (number_literal "0x1f")) () ")")))) (; ";")) (expression_statement "local_24 = 0x20 - sVar2;" (assignment_expression "local_24 = 0x20 - sVar2" (identifier "local_24") (= "=") (binary_expression "0x20 - sVar2" (number_literal "0x20") (- "-") (identifier "sVar2"))) (; ";")) (expression_statement "uVar6 = 0;" (assignment_expression "uVar6 = 0" (identifier "uVar6") (= "=") (number_literal "0")) (; ";")) (do_statement "do {\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      } while (iVar4 <= iVar5 + *param_1);" (do "do") (compound_statement "{\n        uVar1 = param_1[iVar4 - iVar5];\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;\n        iVar4 = iVar4 + 1;\n        uVar6 = uVar1 >> (local_24 & 0x1f);\n      }" ({ "{") (expression_statement "uVar1 = param_1[iVar4 - iVar5];" (assignment_expression "uVar1 = param_1[iVar4 - iVar5]" (identifier "uVar1") (= "=") (subscript_expression "param_1[iVar4 - iVar5]" (identifier "param_1") ([ "[") (binary_expression "iVar4 - iVar5" (identifier "iVar4") (- "-") (identifier "iVar5")) (] "]"))) (; ";")) (expression_statement "*(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;" (assignment_expression "*(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2" (pointer_expression "*(uint *)(iVar3 + iVar4 * 4)" (* "*") (cast_expression "(uint *)(iVar3 + iVar4 * 4)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar3 + iVar4 * 4)" (( "(") (binary_expression "iVar3 + iVar4 * 4" (identifier "iVar3") (+ "+") (binary_expression "iVar4 * 4" (identifier "iVar4") (* "*") (number_literal "4"))) () ")")))) (= "=") (binary_expression "uVar6 | uVar1 << sVar2" (identifier "uVar6") (| "|") (binary_expression "uVar1 << sVar2" (identifier "uVar1") (<< "<<") (identifier "sVar2")))) (; ";")) (expression_statement "iVar4 = iVar4 + 1;" (assignment_expression "iVar4 = iVar4 + 1" (identifier "iVar4") (= "=") (binary_expression "iVar4 + 1" (identifier "iVar4") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "uVar6 = uVar1 >> (local_24 & 0x1f);" (assignment_expression "uVar6 = uVar1 >> (local_24 & 0x1f)" (identifier "uVar6") (= "=") (binary_expression "uVar1 >> (local_24 & 0x1f)" (identifier "uVar1") (>> ">>") (parenthesized_expression "(local_24 & 0x1f)" (( "(") (binary_expression "local_24 & 0x1f" (identifier "local_24") (& "&") (number_literal "0x1f")) () ")")))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(iVar4 <= iVar5 + *param_1)" (( "(") (binary_expression "iVar4 <= iVar5 + *param_1" (identifier "iVar4") (<= "<=") (binary_expression "iVar5 + *param_1" (identifier "iVar5") (+ "+") (pointer_expression "*param_1" (* "*") (identifier "param_1")))) () ")")) (; ";")) (if_statement "if (uVar6 != 0) {\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }" (if "if") (parenthesized_expression "(uVar6 != 0)" (( "(") (binary_expression "uVar6 != 0" (identifier "uVar6") (!= "!=") (number_literal "0")) () ")")) (compound_statement "{\n        *(uint *)(iVar3 + iVar4 * 4) = uVar6;\n      }" ({ "{") (expression_statement "*(uint *)(iVar3 + iVar4 * 4) = uVar6;" (assignment_expression "*(uint *)(iVar3 + iVar4 * 4) = uVar6" (pointer_expression "*(uint *)(iVar3 + iVar4 * 4)" (* "*") (cast_expression "(uint *)(iVar3 + iVar4 * 4)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar3 + iVar4 * 4)" (( "(") (binary_expression "iVar3 + iVar4 * 4" (identifier "iVar3") (+ "+") (binary_expression "iVar4 * 4" (identifier "iVar4") (* "*") (number_literal "4"))) () ")")))) (= "=") (identifier "uVar6")) (; ";")) (} "}"))) (} "}"))) (return_statement "return iVar3;" (return "return") (identifier "iVar3") (; ";")) (} "}"))) (expression_statement "memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);" (call_expression "memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2)" (identifier "memcpy") (argument_list "((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2)" (( "(") (cast_expression "(void *)(iVar3 + iVar4 * 4)" (( "(") (type_descriptor "void *" (primitive_type "void") (abstract_pointer_declarator "*" (* "*"))) () ")") (parenthesized_expression "(iVar3 + iVar4 * 4)" (( "(") (binary_expression "iVar3 + iVar4 * 4" (identifier "iVar3") (+ "+") (binary_expression "iVar4 * 4" (identifier "iVar4") (* "*") (number_literal "4"))) () ")"))) (, ",") (binary_expression "param_1 + 1" (identifier "param_1") (+ "+") (number_literal "1")) (, ",") (binary_expression "*param_1 << 2" (pointer_expression "*param_1" (* "*") (identifier "param_1")) (<< "<<") (number_literal "2")) () ")"))) (; ";")) (return_statement "return iVar3;" (return "return") (identifier "iVar3") (; ";")) (} "}")))

/* WARNING: Function: __x86.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */
/* WARNING: Unknown calling convention */

type_1 function_1(type_1 var_9,int var_1)

{
  type_2 var_12;
  type_3 var_10;
  int var_3;
  type_1 var_8;
  int var_4;
  int var_5;
  type_2 var_11;
  type_4 var_13;
  
  if (var_1 < 0) {
                    /* WARNING: Subroutine does not return */
    var_2("shift >= 0","sshbn.c",0x69b,"bignum_lshift");
  }
  var_3 = *var_9 * 0x20;
  var_4 = var_3 + -1;
  if ((-1 < var_4) && (-1 < (int)var_9[(var_4 >> 5) + 1])) {
    do {
      var_3 = var_4;
      var_4 = var_3 + -1;
      if (var_4 == -1) break;
    } while (var_9[(var_4 >> 5) + 1] >> ((type_4)var_4 & 0x1f) == 0);
  }
  var_5 = var_3 + var_1 + 0x1f;
  var_4 = var_3 + var_1 + 0x3e;
  if (-1 < var_5) {
    var_4 = var_5;
  }
  var_8 = var_6(var_4 >> 5);
  var_3 = var_1 >> 5;
  var_4 = var_3 + 1;
  if ((var_1 & 0x1fU) == 0) {
    var_7(var_8 + var_4,var_9 + 1,*var_9 << 2);
    return var_8;
  }
  if (0 < (int)*var_9) {
    var_10 = (type_3)(var_1 & 0x1fU);
    var_13 = 0x20 - var_10;
    var_11 = 0;
    do {
      var_12 = var_9[var_4 - var_3];
      var_8[var_4] = var_11 | var_12 << var_10;
      var_4 = var_4 + 1;
      var_11 = var_12 >> (var_13 & 0x1f);
    } while (var_4 <= (int)(var_3 + *var_9));
    if (var_11 != 0) {
      var_8[var_4] = var_11;
    }
  }
  return var_8;
}


(translation_unit (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (identifier)))) body: (compound_statement (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (if_statement condition: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier)) right: (number_literal))) consequence: (compound_statement (expression_statement (call_expression function: (identifier) arguments: (argument_list (string_literal (string_content)) (string_literal (string_content)) (number_literal) (string_literal (string_content))))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (binary_expression left: (pointer_expression argument: (identifier)) right: (number_literal)) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) right: (parenthesized_expression (binary_expression left: (number_literal) right: (subscript_expression argument: (identifier) index: (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal))))))) consequence: (compound_statement (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (break_statement))) condition: (parenthesized_expression (binary_expression left: (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (subscript_expression argument: (identifier) index: (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal)))) right: (parenthesized_expression (binary_expression left: (cast_expression type: (type_descriptor type: (type_identifier)) value: (identifier)) right: (number_literal)))) right: (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (cast_expression type: (type_descriptor type: (primitive_type)) value: (identifier)) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (number_literal))) consequence: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (pointer_expression argument: (identifier)))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (parenthesized_expression (identifier)) arguments: (argument_list (binary_expression left: (identifier) right: (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (number_literal) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (subscript_expression argument: (identifier) index: (binary_expression left: (identifier) right: (identifier))))) (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))))) right: (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))))) condition: (parenthesized_expression (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (pointer_expression argument: (identifier)))))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))))) right: (identifier))))))) (return_statement (identifier)))) (expression_statement (call_expression function: (identifier) arguments: (argument_list (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (parenthesized_expression (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) (binary_expression left: (identifier) right: (number_literal)) (binary_expression left: (pointer_expression argument: (identifier)) right: (number_literal))))) (return_statement (identifier)))))

/* WARNING: Function: __i686.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */

int MASKED(int *param_1,uint param_2)

{
  uint uVar1;
  sbyte sVar2;
  int iVar3;
  int iVar4;
  int iVar5;
  uint uVar6;
  byte local_24;
  
  if ((int)param_2 < 0) {
                    /* WARNING: Subroutine does not return */
    __assert_fail("shift >= 0","sshbn.c",0x69b,"bignum_lshift");
  }
  iVar4 = *param_1 * 0x20 + -1;
  if ((-1 < iVar4) && (-1 < param_1[(iVar4 >> 5) + 1])) {
    do {
      iVar4 = iVar4 + -1;
      if (iVar4 == -1) break;
    } while ((uint)param_1[(iVar4 >> 5) + 1] >> ((byte)iVar4 & 0x1f) == 0);
  }
  iVar3 = FUN_00044e30();
  iVar5 = (int)param_2 >> 5;
  iVar4 = iVar5 + 1;
  if ((param_2 & 0x1f) != 0) {
    if (0 < *param_1) {
      sVar2 = (sbyte)(param_2 & 0x1f);
      local_24 = 0x20 - sVar2;
      uVar6 = 0;
      do {
        uVar1 = param_1[iVar4 - iVar5];
        *(uint *)(iVar3 + iVar4 * 4) = uVar6 | uVar1 << sVar2;
        iVar4 = iVar4 + 1;
        uVar6 = uVar1 >> (local_24 & 0x1f);
      } while (iVar4 <= iVar5 + *param_1);
      if (uVar6 != 0) {
        *(uint *)(iVar3 + iVar4 * 4) = uVar6;
      }
    }
    return iVar3;
  }
  memcpy((void *)(iVar3 + iVar4 * 4),param_1 + 1,*param_1 << 2);
  return iVar3;
}

