//-------------------------------------------------------------------------------------------------------
// 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 = 17529;
b = 64429;
c = -15327;
d = -12216;
e = 52807;
f = 52320;
g = 30757;
h = 35613;
obj0.a = 42687;
obj0.b = -60195;
obj0.c = 40233;
obj0.d = -15587;
obj0.e = 5280;
ary[0] = -34418;
ary[1] = 43673;
ary[100] = -39970;
h = obj0.b;
if((((+ (62725 - obj0.a)) & (b * c)) == ((53490 & (obj0.b++ )) - ((19897 + 46484) | obj0.d)))) {
  if(((((obj0.d * 21169) ^ g) - ((obj0.a | 30674) ^ (- -53007))) == (((a <= 36190) ? -56153 : 39309) & obj0.d))) {
  } else {
    if((((-46872 - -11964) - ((obj0.c * obj0.c) + (! -6453))) > (((60349 <= e) ? d : (obj0.c ? -41170 : obj0.e)) ^ ((+ 54759) ^ c)))) {
    } else {
      obj0.e = h;
    }
  }
  if(((((d ? d : b) | 50129) ^ ((-19637 ^ 20988) ^ (- c))) >= (((-20154 + obj0.d) >= (a ^ g)) - b))) {
    if(((13826 - 33020) != ((-64080 > f) ^ (e < f)))) {
      obj0.a = ((obj0.e ^ a) * (h ^ obj0.a));
      obj0.a = ((((g ^ -43022) * (obj0.c >= -51266)) | ((52048 | obj0.b) * (g - 19056))) ? (c * ((-49997 & h) - -35603)) : ((b - (obj0.b ^ a)) | (obj0.a * f)));
    } else {
    }
    if((((h - (22343 + f)) ^ ((-41088 >= -54368) ? 2055 : 36724)) >= (obj0.b * (+ (-27257 - 14991))))) {
      obj0.e = h;
      obj0.d = obj0.b;
      obj0.a = obj0.c;
    } else {
    }
    e = h;
  } else {
  }
} else {
  c = g;
  if(((((a < g) ? obj0.c : 26473) ^ obj0.d) == ((e | (+ obj0.a)) | ((h < -25664) ? (a | -49541) : obj0.b)))) {
    h = obj0.b;
    if(((obj0.c + f) <= ((obj0.a - -6147) ^ ((60633 + b) * (obj0.b + 28860))))) {
      f = ((g ^ (obj0.d & -22137)) * (c + e));
      obj0.e = ((obj0.d | (e | (obj0.d ? b : 55532))) * (((obj0.d < -10331) ? (-2126 < -12574) : (45884 ? 6714 : 26526)) | a));
    } else {
      d = ((f ^ obj0.c) > ((d++ ) | ((-55321 + -16516) != (h + f))));
      obj0.e = (((e == (32594 ? -29558 : a)) + (- (f + obj0.b))) | ((b * 15930) ^ a));
      d = ((((-16241 * 17836) - (- c)) + (e * (-51949 + -12171))) & (((51723 <= obj0.e) ? (-9679 ? -17413 : f) : (22709 + 23722)) | (e ^ -18282)));
    }
    if((((obj0.c | (-55605 - a)) - (++ obj0.c)) >= (obj0.d | obj0.b))) {
    } else {
      h = e;
      b = (((obj0.e - b) | ((c ^ 1883) ^ (64971 | -34912))) - (((52743 ^ obj0.b) * f) ^ ((61225 - -1529) - (15371 ^ -47576))));
      f = ((((-9678 | obj0.b) | (-41100 ? obj0.b : a)) + e) * ((! (57380 - h)) & (b & (b - -58847))));
    }
  } else {
    if(((((d * 17002) & d) | ((1698 > -14040) - h)) < (obj0.c | ((! 28285) <= obj0.a)))) {
      h = obj0.a;
    } else {
      obj0.c = ((((++ obj0.a) & e) * (++ obj0.e)) | (g | (e > c)));
      obj0.d = obj0.a;
      b = ((-24080 & a) ? (obj0.e ^ a) : (((-3991 < d) - obj0.b) * a));
    }
    obj0.e = 21794;
  }
}
if(((((52173 >= 31116) - (c | 61262)) ^ h) >= (d & c))) {
  if(((c - f) >= (((+ 48216) ^ b) & (++ e)))) {
    if(((obj0.b + (e - obj0.b)) == (obj0.b * ((56982 != -27081) ? (+ a) : (d * 49508))))) {
    } else {
      obj0.a = ((e - ((-55374 > c) ? h : (++ c))) ^ (f - a));
    }
  } else {
    if(((((63964 ? obj0.b : obj0.d) + (e ? -15192 : b)) * ((30442 <= c) | (d & f))) <= (b - g))) {
      c = -31287;
    } else {
      obj0.d = obj0.c;
      b = ((d - obj0.b) ? (((obj0.e > 5459) & obj0.c) - ((3721 >= e) ? (- 14470) : obj0.d)) : (b & ((14412 - 18696) & (obj0.e * obj0.e))));
    }
    obj0.a = ((((36660 + -17258) & (d | b)) | h) * (-21681 | -34199));
  }
  obj0.d = (((c ^ (- c)) | ((46577 >= -47539) ? (++ obj0.e) : obj0.a)) ? (d | 45819) : (obj0.b | d));
  if(((((33732 <= 45806) | b) | ((12035 ? obj0.c : 64581) * a)) <= ((+ -32320) | (! (++ f))))) {
    b = (+ (((-34029 ^ 5977) == (a * b)) | -20001));
    if(((c + h) == (((-32212 | 42591) & obj0.e) & (c != d)))) {
    } else {
    }
  } else {
  }
} else {
}
b = e;
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');
})();
