main (int argc, char * * argv)
{
  unsigned char D.4193;
  int D.4194;
  unsigned char D.4195;
  int D.4196;
  int D.4197;
  int D.4198;
  unsigned char D.4199;
  int D.4200;
  int D.4201;
  int D.4202;
  unsigned char D.4203;
  int D.4204;
  int D.4205;
  int D.4206;
  long int D.4210;
  int D.4211;
  execTypeEnum execType.0;
  unsigned char D.4217;
  signed short D.4218;
  unsigned char D.4219;
  int D.4220;
  int D.4221;
  signed short D.4222;
  signed short D.4223;
  unsigned int D.4226;
  unsigned int D.4227;
  unsigned char D.4229;
  int D.4230;
  unsigned char D.4231;
  int D.4232;
  int D.4233;
  int D.4234;
  unsigned char D.4235;
  int D.4236;
  int D.4237;
  int D.4238;
  int D.4239;
  int D.4240;
  unsigned int D.4243;
  long int D.4246;
  int D.4247;
  const char * filename;
  struct FILE * image;
  size_t read;

  if (argc <= 1) goto <D.4187>; else goto <D.4188>;
  <D.4187>:
  exit (1);
  <D.4188>:
  filename = MEM[(char * *)argv + 8B];
  image = fopen (filename, "r");
  if (image == 0B) goto <D.4189>; else goto <D.4190>;
  <D.4189>:
  exit (1);
  <D.4190>:
  {
    struct MSDOSHeader msdos_header;
    uint32_t pe_offset;

    try
      {
        read = fread (&msdos_header, 128, 1, image);
        if (read == 0) goto <D.4191>; else goto <D.4192>;
        <D.4191>:
        exit (1);
        <D.4192>:
        D.4193 = msdos_header.pe_offset[0];
        D.4194 = (int) D.4193;
        D.4195 = msdos_header.pe_offset[1];
        D.4196 = (int) D.4195;
        D.4197 = D.4196 << 8;
        D.4198 = D.4194 | D.4197;
        D.4199 = msdos_header.pe_offset[2];
        D.4200 = (int) D.4199;
        D.4201 = D.4200 << 16;
        D.4202 = D.4198 | D.4201;
        D.4203 = msdos_header.pe_offset[3];
        D.4204 = (int) D.4203;
        D.4205 = D.4204 << 24;
        D.4206 = D.4202 | D.4205;
        pe_offset = (uint32_t) D.4206;
        if (pe_offset == 0) goto <D.4207>; else goto <D.4209>;
        <D.4209>:
        D.4210 = (long int) pe_offset;
        D.4211 = fseek (image, D.4210, 0);
        if (D.4211 != 0) goto <D.4207>; else goto <D.4208>;
        <D.4207>:
        execType = 1;
        <D.4208>:
      }
    finally
      {
        msdos_header = {CLOBBER};
      }
  }
  execType.0 = execType;
  if (execType.0 == 0) goto <D.4213>; else goto <D.4214>;
  <D.4213>:
  {
    struct DotNetHeader dotnet_header;
    uint16_t pe_magic;
    uint32_t rva;

    try
      {
        read = fread (&dotnet_header, 248, 1, image);
        if (read == 0) goto <D.4215>; else goto <D.4216>;
        <D.4215>:
        exit (1);
        <D.4216>:
        D.4217 = dotnet_header.pe.pe_magic[0];
        D.4218 = (signed short) D.4217;
        D.4219 = dotnet_header.pe.pe_magic[1];
        D.4220 = (int) D.4219;
        D.4221 = D.4220 << 8;
        D.4222 = (signed short) D.4221;
        D.4223 = D.4218 | D.4222;
        pe_magic = (uint16_t) D.4223;
        D.4226 = BIT_FIELD_REF <dotnet_header, 32, 0>;
        D.4227 = D.4226 & 65535;
        if (D.4227 != 17744) goto <D.4224>; else goto <D.4228>;
        <D.4228>:
        if (pe_magic != 267) goto <D.4224>; else goto <D.4225>;
        <D.4224>:
        exit (1);
        <D.4225>:
        D.4229 = dotnet_header.datadir.pe_cli_header.rva[0];
        D.4230 = (int) D.4229;
        D.4231 = dotnet_header.datadir.pe_cli_header.rva[1];
        D.4232 = (int) D.4231;
        D.4233 = D.4232 << 8;
        D.4234 = D.4230 | D.4233;
        D.4235 = dotnet_header.datadir.pe_cli_header.rva[2];
        D.4236 = (int) D.4235;
        D.4237 = D.4236 << 16;
        D.4238 = D.4234 | D.4237;
        D.4231 = dotnet_header.datadir.pe_cli_header.rva[1];
        D.4232 = (int) D.4231;
        D.4239 = D.4232 << 24;
        D.4240 = D.4238 | D.4239;
        rva = (uint32_t) D.4240;
        D.4243 = dotnet_header.datadir.pe_cli_header.size;
        if (D.4243 != 0) goto <D.4244>; else goto <D.4241>;
        <D.4244>:
        if (rva != 0) goto <D.4245>; else goto <D.4241>;
        <D.4245>:
        D.4246 = (long int) rva;
        D.4247 = fseek (image, D.4246, 0);
        if (D.4247 == 0) goto <D.4248>; else goto <D.4241>;
        <D.4248>:
        execType = 3;
        goto <D.4242>;
        <D.4241>:
        execType = 2;
        <D.4242>:
      }
    finally
      {
        dotnet_header = {CLOBBER};
      }
  }
  <D.4214>:
  fclose (image);
  execType.0 = execType;
  if (execType.0 == 3) goto <D.4249>; else goto <D.4250>;
  <D.4249>:
  exit (0);
  <D.4250>:
  exit (1);
}


fread (void * restrict __ptr, size_t __size, size_t __n, struct FILE * restrict __stream)
{
  long unsigned int D.4251;
  int D.4256;
  int D.4258;
  long unsigned int D.4260;
  size_t D.4261;
  long unsigned int D.4262;
  long unsigned int D.4263;
  long unsigned int D.4264;
  long unsigned int D.4267;

  D.4251 = __builtin_object_size (__ptr, 0);
  if (D.4251 != 18446744073709551615) goto <D.4252>; else goto <D.4253>;
  <D.4252>:
  D.4256 = __builtin_constant_p (__size);
  if (D.4256 == 0) goto <D.4254>; else goto <D.4257>;
  <D.4257>:
  D.4258 = __builtin_constant_p (__n);
  if (D.4258 == 0) goto <D.4254>; else goto <D.4259>;
  <D.4259>:
  D.4260 = __size | __n;
  if (D.4260 > 4294967295) goto <D.4254>; else goto <D.4255>;
  <D.4254>:
  D.4262 = __builtin_object_size (__ptr, 0);
  D.4261 = __fread_chk (__ptr, D.4262, __size, __n, __stream);
  return D.4261;
  <D.4255>:
  D.4263 = __size * __n;
  D.4264 = __builtin_object_size (__ptr, 0);
  if (D.4263 > D.4264) goto <D.4265>; else goto <D.4266>;
  <D.4265>:
  D.4267 = __builtin_object_size (__ptr, 0);
  D.4261 = __fread_chk_warn (__ptr, D.4267, __size, __n, __stream);
  return D.4261;
  <D.4266>:
  <D.4253>:
  D.4261 = __fread_alias (__ptr, __size, __n, __stream);
  return D.4261;
}


