//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------

(function() {
var ary = new Array(10);
var obj0 = new Object();
var a;
var b;
var c;
var d;
var e;
var f;
var g;
var h;
a = 25188;
b = 48340;
c = 48155;
d = 23284;
e = 45565;
f = -12805;
g = 11634;
h = -52903;
obj0.a = 60964;
obj0.b = 60005;
obj0.c = -58298;
obj0.d = 7502;
obj0.e = -63106;
ary[0] = -35693;
ary[1] = -46224;
ary[100] = -35085;
a = ((((44781 - h) * g) - (h != (-35630 * e))) - (((31910 ? -59 : h) ^ obj0.b) - obj0.b));
if(((obj0.d ^ b) >= (obj0.b * f))) {
  if(((((47611 - obj0.e) == (22098 ? b : obj0.c)) & b) == (13720 | 1446))) {
    if(((((-31319 >= obj0.e) ? (e & -40229) : 31788) + obj0.d) == (((c < -26239) ? g : a) & h))) {
      b = (((38017 * (13683 - obj0.c)) - (d > (c & obj0.d))) == (((-589 & -25820) & (a++ )) + obj0.c));
      obj0.e = obj0.b;
      obj0.c = ((obj0.b + ((obj0.e & h) + (-50541 | obj0.b))) + (((c >= obj0.b) ? 51117 : a) ^ (! (+ 27347))));
    } else {
    }
    f = e;
  } else {
    f = (((obj0.d * (-49767 - obj0.b)) & obj0.d) & (obj0.c | 23214));
    obj0.e = ((b - c) + (((obj0.e * -28701) & (26988 >= -3492)) & (obj0.c & (-49695 <= f))));
  }
  if((((+ b) * (+ b)) >= (((obj0.c * g) | (a * b)) * obj0.c))) {
    obj0.a = h;
    if(((((a == c) ? a : f) + obj0.b) == (obj0.c * (obj0.d == obj0.d)))) {
      obj0.d = obj0.c;
    } else {
      f = ((((c - f) & (-57239 + obj0.e)) * (++ g)) - ((obj0.d > (-47318 * 46826)) | ((obj0.e | e) - (++ obj0.b))));
      f = h;
    }
  } else {
    obj0.c = ((a ^ b) + ((d - (-14693 == 40722)) - b));
  }
} else {
}
f = ((obj0.c & (- c)) | (48908 ^ obj0.c));
if(((((g ? 3546 : -27640) ^ a) & f) != (((g & e) * obj0.c) + obj0.a))) {
  if((((d & (c - b)) & 3786) >= (((c | -40659) >= (17425 ^ obj0.b)) ^ obj0.b))) {
  } else {
    if((((obj0.a * (obj0.d - g)) ^ -34033) >= ((obj0.c == obj0.c) + g))) {
      g = ((f + (obj0.c * d)) * (((++ a) & (f - -23655)) * (e | f)));
      obj0.a = c;
    } else {
      d = 11865;
      a = (((obj0.b & (++ obj0.b)) | c) == ((d & (e | 63146)) & b));
    }
    g = obj0.a;
    a = obj0.c;
  }
  obj0.c = obj0.d;
} else {
  if(((((f < 56221) ? (11569 | -29007) : (-35989 ? 5841 : obj0.e)) ^ ((27605 ? b : e) | obj0.c)) <= (((+ obj0.e) & (b + -62657)) - -55049))) {
    obj0.c = ((e + obj0.c) + (h & (obj0.e ^ (-55717 | obj0.b))));
  } else {
    obj0.b = (++ a);
    b = obj0.a;
    if((((! (obj0.b | d)) + obj0.c) >= (((b ^ -36712) - e) - d))) {
      d = (! (f + ((c & 36460) + -1090)));
      g = b;
      h = ((((-17372 ^ -34637) + (- f)) + g) == ((a <= (-15815 | 26337)) & g));
    } else {
      a = ((((obj0.a ^ g) >= (48639 + -7174)) ^ d) | (g ^ ((f ? d : -16622) * obj0.e)));
      b = (((obj0.e * (e ? a : 26003)) | ((19432 ^ g) - 34323)) - ((c + e) + (obj0.e++ )));
      obj0.e = (((-35412 + (d ^ a)) ^ ((obj0.a + e) & a)) - (obj0.a | ((31433 >= d) ? (c != f) : b)));
    }
  }
  if((((obj0.e & g) | ((c | obj0.c) == obj0.c)) <= (((25970 - obj0.d) * (a ? -46441 : 54305)) | obj0.a))) {
    if(((((h ? a : e) | (-31934 ^ 51267)) ^ -12374) <= (((- d) - b) | ((obj0.a & h) ^ -31862)))) {
      g = (! (-30994 + 54217));
      c = obj0.b;
      obj0.d = obj0.b;
    } else {
      obj0.d = ((g | obj0.c) ^ (f ^ ((obj0.c - obj0.b) - obj0.b)));
      obj0.c = obj0.b;
      obj0.b = obj0.e;
    }
    if((((c != (-48016 - obj0.b)) - (-27327 >= (-26484 - 51069))) != (((a ? a : a) + (10616 * 2407)) * 33526))) {
      f = (((++ a) + ((41664 ^ c) + (-37561 - 39993))) | (((c & 28641) & -39080) & ((obj0.b - obj0.d) & (-26878 | h))));
      obj0.a = (- ((++ h) | a));
    } else {
      obj0.c = ((-60357 | (obj0.e ^ (obj0.b++ ))) | (-43820 | (obj0.e & c)));
      obj0.a = (((d++ ) & ((e * obj0.a) + (c | obj0.e))) | (((-57518 >= 33271) | (obj0.a * h)) + (9027 ^ obj0.c)));
    }
    obj0.e = b;
  } else {
    a = ((obj0.b | 36705) & (obj0.a | e));
    e = g;
  }
}
WScript.Echo("a = " + (a>>3));
WScript.Echo("b = " + (b>>3));
WScript.Echo("c = " + (c>>3));
WScript.Echo("d = " + (d>>3));
WScript.Echo("e = " + (e>>3));
WScript.Echo("f = " + (f>>3));
WScript.Echo("g = " + (g>>3));
WScript.Echo("h = " + (h>>3));
WScript.Echo("obj0.a = " + (obj0.a>>3));
WScript.Echo("obj0.b = " + (obj0.b>>3));
WScript.Echo("obj0.c = " + (obj0.c>>3));
WScript.Echo("obj0.d = " + (obj0.d>>3));
WScript.Echo("obj0.e = " + (obj0.e>>3));
WScript.Echo("ary[0] = " + (ary[0]>>3));
WScript.Echo("ary[1] = " + (ary[1]>>3));
WScript.Echo("ary[100] = " + (ary[100]>>3));
WScript.Echo('done');
})();
