function __isPropertyOfType() {
}
function __getProperties(obj) {
  let properties = [];
  for (let name of Object.getOwnPropertyNames(obj)) {
 properties.push();
  }
}
function* __getObjects() {
  let obj_names = __getProperties( 'object');
}
function __getRandomObject() {
  for (let obj of __getObjects()) {
  }
}
function __getRandomProperty() {
}
(function () {
  __callGC = function () {
      gc();
  };
})();
  Array.prototype[2] = undefined;
__getRandomObject(), {
      get: function () {
      }
    };
    var __v_18 = Function();
  delete __v_18[__getRandomProperty()], __callGC();
  for (var __v_26 = 0; __v_26 < 10; ++__v_26) {
      Object.defineProperty(Array.prototype, __v_26, {
      });
  }