//-------------------------------------------------------------------------------------------------------
// 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 = 60446;
b = -58665;
c = -53088;
d = 17061;
e = -60416;
f = -29039;
g = 62592;
h = 19204;
obj0.a = -62099;
obj0.b = 32765;
obj0.c = -60475;
obj0.d = 54120;
obj0.e = 24562;
ary[0] = -47353;
ary[1] = 2381;
ary[100] = 63522;
c = c;
if(((g & (-22232 != (21642 - -26140))) != (a * obj0.d))) {
  c = ((((c ? 24877 : b) - (g & -55553)) & ((obj0.e < obj0.c) ? (29988 < d) : (56237 ? -22630 : -2681))) ^ (((obj0.b == f) ? (4984 ^ 6125) : obj0.c) * b));
  if((((f - a) * ((obj0.a & 16375) | (-8766 - 13250))) == (obj0.d - (a + d)))) {
    if(((-43792 | obj0.e) > (((-16820 - obj0.b) ^ (+ 40504)) ^ -13517))) {
      c = a;
    } else {
      b = (! (((obj0.d++ ) != (++ obj0.e)) - (e | (c - 49352))));
    }
  } else {
    obj0.a = e;
    e = ((((e * obj0.a) * (-64231 ^ c)) & obj0.b) * (e | (h & (a & obj0.c))));
  }
} else {
}
if((((a++ ) ^ ((b < -57461) ? (-18517 <= 4947) : 36737)) >= (a | (f - (! -34325))))) {
} else {
  if((((+ (b ? e : 10962)) + ((obj0.b > 55896) ? c : obj0.c)) <= (obj0.c & f))) {
    d = ((b | (obj0.b & obj0.a)) & (h ^ ((h & a) - obj0.b)));
    if(((57903 & (g + (b ? 38966 : 18974))) <= (h ^ ((-21994 | f) + (h + -24317))))) {
      g = -37305;
      e = (((b + (b & d)) + obj0.d) < (21624 * ((obj0.a > c) * obj0.d)));
    } else {
    }
    obj0.b = g;
  } else {
    c = c;
    g = (((d - (obj0.e ? -32530 : obj0.d)) + ((34651 + -59341) ^ (-2721 ^ -27963))) ^ ((f * (a | e)) | (obj0.b | (obj0.c * 59925))));
    c = ((obj0.d * ((h + h) + obj0.b)) | ((h & (8779 <= f)) - 34708));
  }
  if((((-18843 * e) ^ ((g | a) + d)) == (obj0.c + g))) {
    if(((((b + 10058) - (+ 39024)) * obj0.c) >= (g - (++ h)))) {
      c = ((((+ g) < (f ^ d)) - ((f + -41140) & (+ obj0.a))) - (c - (c++ )));
      obj0.a = obj0.c;
    } else {
    }
  } else {
    if((((b * (-5882 - 63814)) | ((-56372 != d) ? (21503 >= d) : (a * 11303))) > (obj0.e & (d * g)))) {
      obj0.e = ((((obj0.d + e) | c) & ((obj0.c & obj0.b) - obj0.d)) + (a & (obj0.c & (55951 < 23150))));
    } else {
    }
    d = ((obj0.c * d) + (-4250 + ((-41509 ^ -42013) * b)));
  }
  e = (((e & c) ^ ((obj0.c <= obj0.d) & (f ? -59805 : -65452))) ^ (((-60714 >= 16013) ? (-34424 & b) : (+ h)) - obj0.a));
}
if(((h | obj0.e) == (obj0.a - obj0.e))) {
  c = e;
  if(((a - e) >= (d ^ (obj0.c | obj0.e)))) {
    if((((-5461 * (c ? c : 50392)) - a) >= (obj0.a - obj0.b))) {
      obj0.a = a;
      e = obj0.c;
      obj0.e = ((-13974 - ((b * -65095) <= (48021 - 36345))) ^ (obj0.c | c));
    } else {
      obj0.a = e;
      d = ((42482 & obj0.b) - (b + obj0.c));
    }
    e = g;
  } else {
    if(((((obj0.e ? 18949 : f) < (10510 | e)) | 20475) == ((e == (g - a)) + (obj0.a + a)))) {
    } else {
      obj0.b = ((((45869 + -8156) | (41993 >= e)) & f) - (g * e));
      obj0.e = h;
      e = (((! obj0.d) ^ (-1678 != (-61199 & h))) ? (e - 1964) : (obj0.d & (d + (c ? c : -35477))));
    }
    g = f;
  }
  if(((((45962 * obj0.a) | (-24944 | obj0.e)) | ((obj0.d >= d) & d)) <= (((-33172 ? h : b) - (33388 != 43806)) & h))) {
    obj0.b = ((obj0.a - obj0.c) * (((21960 >= -25759) ? (-906 ? b : 30122) : (65078 != d)) | ((d & d) * obj0.b)));
  } else {
  }
} else {
  if(((c | h) > (g + ((33801 - 2383) ^ (b + obj0.d))))) {
  } else {
    if(((((g < 59800) ? obj0.e : (-10569 + 17106)) + (d >= (27855 + -39309))) <= (h | (! (h++ ))))) {
      obj0.a = ((((50187 < e) ? f : (b ? e : h)) & obj0.d) | (obj0.d - g));
      h = obj0.b;
    } else {
    }
    d = (((c + (obj0.b * g)) & ((e != obj0.a) * (56359 ? c : f))) & (((-51406 < -16477) * (-37892 | 1031)) + ((8226 - obj0.e) | obj0.a)));
  }
  b = g;
  h = (- (((-15817 != h) != f) | ((-19022 <= -9333) ? (obj0.b & -37348) : (-3610 > f))));
}
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');
})();
