main (int argc, char * * argv)
{
  unsigned char D.3349;
  int D.3350;
  unsigned char D.3351;
  int D.3352;
  int D.3353;
  int D.3354;
  unsigned char D.3355;
  int D.3356;
  int D.3357;
  int D.3358;
  unsigned char D.3359;
  int D.3360;
  int D.3361;
  int D.3362;
  long int pe_offset.0;
  int D.3367;
  execTypeEnum execType.1;
  unsigned char D.3373;
  signed short D.3374;
  unsigned char D.3375;
  int D.3376;
  int D.3377;
  signed short D.3378;
  signed short D.3379;
  signed int D.3382;
  unsigned int D.3383;
  unsigned int D.3384;
  unsigned char D.3386;
  int D.3387;
  unsigned char D.3388;
  int D.3389;
  int D.3390;
  int D.3391;
  unsigned char D.3392;
  int D.3393;
  int D.3394;
  int D.3395;
  int D.3396;
  int D.3397;
  unsigned int D.3400;
  long int rva.2;
  int D.3404;
  const char * filename;
  struct FILE * image;
  size_t read;

  if (argc <= 1) goto <D.3343>; else goto <D.3344>;
  <D.3343>:
  exit (1);
  <D.3344>:
  filename = MEM[(char * *)argv + 4B];
  image = fopen (filename, "r");
  if (image == 0B) goto <D.3345>; else goto <D.3346>;
  <D.3345>:
  exit (1);
  <D.3346>:
  {
    struct MSDOSHeader msdos_header;
    uint32_t pe_offset;

    try
      {
        read = fread (&msdos_header, 128, 1, image);
        if (read == 0) goto <D.3347>; else goto <D.3348>;
        <D.3347>:
        exit (1);
        <D.3348>:
        D.3349 = msdos_header.pe_offset[0];
        D.3350 = (int) D.3349;
        D.3351 = msdos_header.pe_offset[1];
        D.3352 = (int) D.3351;
        D.3353 = D.3352 << 8;
        D.3354 = D.3350 | D.3353;
        D.3355 = msdos_header.pe_offset[2];
        D.3356 = (int) D.3355;
        D.3357 = D.3356 << 16;
        D.3358 = D.3354 | D.3357;
        D.3359 = msdos_header.pe_offset[3];
        D.3360 = (int) D.3359;
        D.3361 = D.3360 << 24;
        D.3362 = D.3358 | D.3361;
        pe_offset = (uint32_t) D.3362;
        if (pe_offset == 0) goto <D.3363>; else goto <D.3365>;
        <D.3365>:
        pe_offset.0 = (long int) pe_offset;
        D.3367 = fseek (image, pe_offset.0, 0);
        if (D.3367 != 0) goto <D.3363>; else goto <D.3364>;
        <D.3363>:
        execType = 1;
        <D.3364>:
      }
    finally
      {
        msdos_header = {CLOBBER};
      }
  }
  execType.1 = execType;
  if (execType.1 == 0) goto <D.3369>; else goto <D.3370>;
  <D.3369>:
  {
    struct DotNetHeader dotnet_header;
    uint16_t pe_magic;
    uint32_t rva;

    try
      {
        read = fread (&dotnet_header, 248, 1, image);
        if (read == 0) goto <D.3371>; else goto <D.3372>;
        <D.3371>:
        exit (1);
        <D.3372>:
        D.3373 = dotnet_header.pe.pe_magic[0];
        D.3374 = (signed short) D.3373;
        D.3375 = dotnet_header.pe.pe_magic[1];
        D.3376 = (int) D.3375;
        D.3377 = D.3376 << 8;
        D.3378 = (signed short) D.3377;
        D.3379 = D.3374 | D.3378;
        pe_magic = (uint16_t) D.3379;
        D.3382 = BIT_FIELD_REF <dotnet_header, 32, 0>;
        D.3383 = (unsigned int) D.3382;
        D.3384 = D.3383 & 65535;
        if (D.3384 != 17744) goto <D.3380>; else goto <D.3385>;
        <D.3385>:
        if (pe_magic != 267) goto <D.3380>; else goto <D.3381>;
        <D.3380>:
        exit (1);
        <D.3381>:
        D.3386 = dotnet_header.datadir.pe_cli_header.rva[0];
        D.3387 = (int) D.3386;
        D.3388 = dotnet_header.datadir.pe_cli_header.rva[1];
        D.3389 = (int) D.3388;
        D.3390 = D.3389 << 8;
        D.3391 = D.3387 | D.3390;
        D.3392 = dotnet_header.datadir.pe_cli_header.rva[2];
        D.3393 = (int) D.3392;
        D.3394 = D.3393 << 16;
        D.3395 = D.3391 | D.3394;
        D.3388 = dotnet_header.datadir.pe_cli_header.rva[1];
        D.3389 = (int) D.3388;
        D.3396 = D.3389 << 24;
        D.3397 = D.3395 | D.3396;
        rva = (uint32_t) D.3397;
        D.3400 = dotnet_header.datadir.pe_cli_header.size;
        if (D.3400 != 0) goto <D.3401>; else goto <D.3398>;
        <D.3401>:
        if (rva != 0) goto <D.3402>; else goto <D.3398>;
        <D.3402>:
        rva.2 = (long int) rva;
        D.3404 = fseek (image, rva.2, 0);
        if (D.3404 == 0) goto <D.3405>; else goto <D.3398>;
        <D.3405>:
        execType = 3;
        goto <D.3399>;
        <D.3398>:
        execType = 2;
        <D.3399>:
      }
    finally
      {
        dotnet_header = {CLOBBER};
      }
  }
  <D.3370>:
  fclose (image);
  execType.1 = execType;
  if (execType.1 == 3) goto <D.3406>; else goto <D.3407>;
  <D.3406>:
  exit (0);
  <D.3407>:
  exit (1);
}


fread (void * restrict __ptr, size_t __size, size_t __n, struct FILE * restrict __stream)
{
  unsigned int D.3408;
  int D.3413;
  int D.3415;
  unsigned int D.3417;
  size_t D.3418;
  unsigned int D.3419;
  unsigned int D.3420;
  unsigned int D.3421;
  unsigned int D.3424;

  D.3408 = __builtin_object_size (__ptr, 0);
  if (D.3408 != 4294967295) goto <D.3409>; else goto <D.3410>;
  <D.3409>:
  D.3413 = __builtin_constant_p (__size);
  if (D.3413 == 0) goto <D.3411>; else goto <D.3414>;
  <D.3414>:
  D.3415 = __builtin_constant_p (__n);
  if (D.3415 == 0) goto <D.3411>; else goto <D.3416>;
  <D.3416>:
  D.3417 = __size | __n;
  if (D.3417 > 65535) goto <D.3411>; else goto <D.3412>;
  <D.3411>:
  D.3419 = __builtin_object_size (__ptr, 0);
  D.3418 = __fread_chk (__ptr, D.3419, __size, __n, __stream);
  return D.3418;
  <D.3412>:
  D.3420 = __size * __n;
  D.3421 = __builtin_object_size (__ptr, 0);
  if (D.3420 > D.3421) goto <D.3422>; else goto <D.3423>;
  <D.3422>:
  D.3424 = __builtin_object_size (__ptr, 0);
  D.3418 = __fread_chk_warn (__ptr, D.3424, __size, __n, __stream);
  return D.3418;
  <D.3423>:
  <D.3410>:
  D.3418 = __fread_alias (__ptr, __size, __n, __stream);
  return D.3418;
}


