UNPKG

ember-legacy-class-transform

Version:
227 lines (221 loc) 27.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.LabelOpcode = exports.DidModifyOpcode = exports.JumpIfNotModifiedOpcode = exports.Assert = exports.EnvironmentTest = exports.SimpleTest = exports.ConstTest = undefined; var _reference = require('@glimmer/reference'); var _util = require('@glimmer/util'); var _opcodes = require('../../opcodes'); var _references = require('../../references'); _opcodes.APPEND_OPCODES.add(20 /* ChildScope */, vm => vm.pushChildScope()); _opcodes.APPEND_OPCODES.add(21 /* PopScope */, vm => vm.popScope()); _opcodes.APPEND_OPCODES.add(39 /* PushDynamicScope */, vm => vm.pushDynamicScope()); _opcodes.APPEND_OPCODES.add(40 /* PopDynamicScope */, vm => vm.popDynamicScope()); _opcodes.APPEND_OPCODES.add(12 /* Immediate */, (vm, { op1: number }) => { vm.stack.push(number); }); _opcodes.APPEND_OPCODES.add(13 /* Constant */, (vm, { op1: other }) => { vm.stack.push(vm.constants.getOther(other)); }); _opcodes.APPEND_OPCODES.add(14 /* PrimitiveReference */, (vm, { op1: primitive }) => { let stack = vm.stack; let flag = (primitive & 3 << 30) >>> 30; let value = primitive & ~(3 << 30); switch (flag) { case 0: stack.push(_references.PrimitiveReference.create(value)); break; case 1: stack.push(_references.PrimitiveReference.create(vm.constants.getFloat(value))); break; case 2: stack.push(_references.PrimitiveReference.create(vm.constants.getString(value))); break; case 3: switch (value) { case 0: stack.push(_references.FALSE_REFERENCE); break; case 1: stack.push(_references.TRUE_REFERENCE); break; case 2: stack.push(_references.NULL_REFERENCE); break; case 3: stack.push(_references.UNDEFINED_REFERENCE); break; } break; } }); _opcodes.APPEND_OPCODES.add(15 /* Dup */, (vm, { op1: register, op2: offset }) => { let position = vm.fetchValue(register) - offset; vm.stack.dup(position); }); _opcodes.APPEND_OPCODES.add(16 /* Pop */, (vm, { op1: count }) => vm.stack.pop(count)); _opcodes.APPEND_OPCODES.add(17 /* Load */, (vm, { op1: register }) => vm.load(register)); _opcodes.APPEND_OPCODES.add(18 /* Fetch */, (vm, { op1: register }) => vm.fetch(register)); _opcodes.APPEND_OPCODES.add(38 /* BindDynamicScope */, (vm, { op1: _names }) => { let names = vm.constants.getArray(_names); vm.bindDynamicScope(names); }); _opcodes.APPEND_OPCODES.add(47 /* PushFrame */, vm => vm.pushFrame()); _opcodes.APPEND_OPCODES.add(48 /* PopFrame */, vm => vm.popFrame()); _opcodes.APPEND_OPCODES.add(49 /* Enter */, (vm, { op1: args }) => vm.enter(args)); _opcodes.APPEND_OPCODES.add(50 /* Exit */, vm => vm.exit()); _opcodes.APPEND_OPCODES.add(41 /* CompileDynamicBlock */, vm => { let stack = vm.stack; let block = stack.pop(); stack.push(block ? block.compileDynamic(vm.env) : null); }); _opcodes.APPEND_OPCODES.add(42 /* InvokeStatic */, (vm, { op1: _block }) => { let block = vm.constants.getBlock(_block); let compiled = block.compileStatic(vm.env); vm.call(compiled.handle); }); _opcodes.APPEND_OPCODES.add(43 /* InvokeDynamic */, (vm, { op1: _invoker }) => { let invoker = vm.constants.getOther(_invoker); let block = vm.stack.pop(); invoker.invoke(vm, block); }); _opcodes.APPEND_OPCODES.add(44 /* Jump */, (vm, { op1: target }) => vm.goto(target)); _opcodes.APPEND_OPCODES.add(45 /* JumpIf */, (vm, { op1: target }) => { let reference = vm.stack.pop(); if ((0, _reference.isConst)(reference)) { if (reference.value()) { vm.goto(target); } } else { let cache = new _reference.ReferenceCache(reference); if (cache.peek()) { vm.goto(target); } vm.updateWith(new Assert(cache)); } }); _opcodes.APPEND_OPCODES.add(46 /* JumpUnless */, (vm, { op1: target }) => { let reference = vm.stack.pop(); if ((0, _reference.isConst)(reference)) { if (!reference.value()) { vm.goto(target); } } else { let cache = new _reference.ReferenceCache(reference); if (!cache.peek()) { vm.goto(target); } vm.updateWith(new Assert(cache)); } }); _opcodes.APPEND_OPCODES.add(22 /* Return */, vm => vm.return()); _opcodes.APPEND_OPCODES.add(23 /* ReturnTo */, (vm, { op1: relative }) => { vm.returnTo(relative); }); const ConstTest = exports.ConstTest = function (ref, _env) { return new _reference.ConstReference(!!ref.value()); }; const SimpleTest = exports.SimpleTest = function (ref, _env) { return ref; }; const EnvironmentTest = exports.EnvironmentTest = function (ref, env) { return env.toConditionalReference(ref); }; _opcodes.APPEND_OPCODES.add(51 /* Test */, (vm, { op1: _func }) => { let stack = vm.stack; let operand = stack.pop(); let func = vm.constants.getFunction(_func); stack.push(func(operand, vm.env)); }); class Assert extends _opcodes.UpdatingOpcode { constructor(cache) { super(); this.type = 'assert'; this.tag = cache.tag; this.cache = cache; } evaluate(vm) { let { cache } = this; if ((0, _reference.isModified)(cache.revalidate())) { vm.throw(); } } toJSON() { let { type, _guid, cache } = this; let expected; try { expected = JSON.stringify(cache.peek()); } catch (e) { expected = String(cache.peek()); } return { args: [], details: { expected }, guid: _guid, type }; } } exports.Assert = Assert; class JumpIfNotModifiedOpcode extends _opcodes.UpdatingOpcode { constructor(tag, target) { super(); this.target = target; this.type = 'jump-if-not-modified'; this.tag = tag; this.lastRevision = tag.value(); } evaluate(vm) { let { tag, target, lastRevision } = this; if (!vm.alwaysRevalidate && tag.validate(lastRevision)) { vm.goto(target); } } didModify() { this.lastRevision = this.tag.value(); } toJSON() { return { args: [JSON.stringify(this.target.inspect())], guid: this._guid, type: this.type }; } } exports.JumpIfNotModifiedOpcode = JumpIfNotModifiedOpcode; class DidModifyOpcode extends _opcodes.UpdatingOpcode { constructor(target) { super(); this.target = target; this.type = 'did-modify'; this.tag = _reference.CONSTANT_TAG; } evaluate() { this.target.didModify(); } } exports.DidModifyOpcode = DidModifyOpcode; class LabelOpcode { constructor(label) { this.tag = _reference.CONSTANT_TAG; this.type = 'label'; this.label = null; this.prev = null; this.next = null; (0, _util.initializeGuid)(this); this.label = label; } evaluate() {} inspect() { return `${this.label} [${this._guid}]`; } toJSON() { return { args: [JSON.stringify(this.inspect())], guid: this._guid, type: this.type }; } } exports.LabelOpcode = LabelOpcode; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL3ZtLmpzIl0sIm5hbWVzIjpbImFkZCIsInZtIiwicHVzaENoaWxkU2NvcGUiLCJwb3BTY29wZSIsInB1c2hEeW5hbWljU2NvcGUiLCJwb3BEeW5hbWljU2NvcGUiLCJvcDEiLCJudW1iZXIiLCJzdGFjayIsInB1c2giLCJvdGhlciIsImNvbnN0YW50cyIsImdldE90aGVyIiwicHJpbWl0aXZlIiwiZmxhZyIsInZhbHVlIiwiY3JlYXRlIiwiZ2V0RmxvYXQiLCJnZXRTdHJpbmciLCJyZWdpc3RlciIsIm9wMiIsIm9mZnNldCIsInBvc2l0aW9uIiwiZmV0Y2hWYWx1ZSIsImR1cCIsImNvdW50IiwicG9wIiwibG9hZCIsImZldGNoIiwiX25hbWVzIiwibmFtZXMiLCJnZXRBcnJheSIsImJpbmREeW5hbWljU2NvcGUiLCJwdXNoRnJhbWUiLCJwb3BGcmFtZSIsImFyZ3MiLCJlbnRlciIsImV4aXQiLCJibG9jayIsImNvbXBpbGVEeW5hbWljIiwiZW52IiwiX2Jsb2NrIiwiZ2V0QmxvY2siLCJjb21waWxlZCIsImNvbXBpbGVTdGF0aWMiLCJjYWxsIiwiaGFuZGxlIiwiX2ludm9rZXIiLCJpbnZva2VyIiwiaW52b2tlIiwidGFyZ2V0IiwiZ290byIsInJlZmVyZW5jZSIsImNhY2hlIiwicGVlayIsInVwZGF0ZVdpdGgiLCJBc3NlcnQiLCJyZXR1cm4iLCJyZWxhdGl2ZSIsInJldHVyblRvIiwiQ29uc3RUZXN0IiwicmVmIiwiX2VudiIsIlNpbXBsZVRlc3QiLCJFbnZpcm9ubWVudFRlc3QiLCJ0b0NvbmRpdGlvbmFsUmVmZXJlbmNlIiwiX2Z1bmMiLCJvcGVyYW5kIiwiZnVuYyIsImdldEZ1bmN0aW9uIiwiY29uc3RydWN0b3IiLCJ0eXBlIiwidGFnIiwiZXZhbHVhdGUiLCJyZXZhbGlkYXRlIiwidGhyb3ciLCJ0b0pTT04iLCJfZ3VpZCIsImV4cGVjdGVkIiwiSlNPTiIsInN0cmluZ2lmeSIsImUiLCJTdHJpbmciLCJkZXRhaWxzIiwiZ3VpZCIsIkp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlIiwibGFzdFJldmlzaW9uIiwiYWx3YXlzUmV2YWxpZGF0ZSIsInZhbGlkYXRlIiwiZGlkTW9kaWZ5IiwiaW5zcGVjdCIsIkRpZE1vZGlmeU9wY29kZSIsIkxhYmVsT3Bjb2RlIiwibGFiZWwiLCJwcmV2IiwibmV4dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBLHdCQUFlQSxHQUFmLENBQW1CLEVBQW5CLENBQXNCLGdCQUF0QixFQUF3Q0MsTUFBTUEsR0FBR0MsY0FBSCxFQUE5QztBQUNBLHdCQUFlRixHQUFmLENBQW1CLEVBQW5CLENBQXNCLGNBQXRCLEVBQXNDQyxNQUFNQSxHQUFHRSxRQUFILEVBQTVDO0FBQ0Esd0JBQWVILEdBQWYsQ0FBbUIsRUFBbkIsQ0FBc0Isc0JBQXRCLEVBQThDQyxNQUFNQSxHQUFHRyxnQkFBSCxFQUFwRDtBQUNBLHdCQUFlSixHQUFmLENBQW1CLEVBQW5CLENBQXNCLHFCQUF0QixFQUE2Q0MsTUFBTUEsR0FBR0ksZUFBSCxFQUFuRDtBQUNBLHdCQUFlTCxHQUFmLENBQW1CLEVBQW5CLENBQXNCLGVBQXRCLEVBQXVDLENBQUNDLEVBQUQsRUFBSyxFQUFFSyxLQUFLQyxNQUFQLEVBQUwsS0FBeUI7QUFDNUROLE9BQUdPLEtBQUgsQ0FBU0MsSUFBVCxDQUFjRixNQUFkO0FBQ0gsQ0FGRDtBQUdBLHdCQUFlUCxHQUFmLENBQW1CLEVBQW5CLENBQXNCLGNBQXRCLEVBQXNDLENBQUNDLEVBQUQsRUFBSyxFQUFFSyxLQUFLSSxLQUFQLEVBQUwsS0FBd0I7QUFDMURULE9BQUdPLEtBQUgsQ0FBU0MsSUFBVCxDQUFjUixHQUFHVSxTQUFILENBQWFDLFFBQWIsQ0FBc0JGLEtBQXRCLENBQWQ7QUFDSCxDQUZEO0FBR0Esd0JBQWVWLEdBQWYsQ0FBbUIsRUFBbkIsQ0FBc0Isd0JBQXRCLEVBQWdELENBQUNDLEVBQUQsRUFBSyxFQUFFSyxLQUFLTyxTQUFQLEVBQUwsS0FBNEI7QUFDeEUsUUFBSUwsUUFBUVAsR0FBR08sS0FBZjtBQUNBLFFBQUlNLE9BQU8sQ0FBQ0QsWUFBWSxLQUFLLEVBQWxCLE1BQTBCLEVBQXJDO0FBQ0EsUUFBSUUsUUFBUUYsWUFBWSxFQUFFLEtBQUssRUFBUCxDQUF4QjtBQUNBLFlBQVFDLElBQVI7QUFDSSxhQUFLLENBQUw7QUFDSU4sa0JBQU1DLElBQU4sQ0FBVywrQkFBbUJPLE1BQW5CLENBQTBCRCxLQUExQixDQUFYO0FBQ0E7QUFDSixhQUFLLENBQUw7QUFDSVAsa0JBQU1DLElBQU4sQ0FBVywrQkFBbUJPLE1BQW5CLENBQTBCZixHQUFHVSxTQUFILENBQWFNLFFBQWIsQ0FBc0JGLEtBQXRCLENBQTFCLENBQVg7QUFDQTtBQUNKLGFBQUssQ0FBTDtBQUNJUCxrQkFBTUMsSUFBTixDQUFXLCtCQUFtQk8sTUFBbkIsQ0FBMEJmLEdBQUdVLFNBQUgsQ0FBYU8sU0FBYixDQUF1QkgsS0FBdkIsQ0FBMUIsQ0FBWDtBQUNBO0FBQ0osYUFBSyxDQUFMO0FBQ0ksb0JBQVFBLEtBQVI7QUFDSSxxQkFBSyxDQUFMO0FBQ0lQLDBCQUFNQyxJQUFOO0FBQ0E7QUFDSixxQkFBSyxDQUFMO0FBQ0lELDBCQUFNQyxJQUFOO0FBQ0E7QUFDSixxQkFBSyxDQUFMO0FBQ0lELDBCQUFNQyxJQUFOO0FBQ0E7QUFDSixxQkFBSyxDQUFMO0FBQ0lELDBCQUFNQyxJQUFOO0FBQ0E7QUFaUjtBQWNBO0FBekJSO0FBMkJILENBL0JEO0FBZ0NBLHdCQUFlVCxHQUFmLENBQW1CLEVBQW5CLENBQXNCLFNBQXRCLEVBQWlDLENBQUNDLEVBQUQsRUFBSyxFQUFFSyxLQUFLYSxRQUFQLEVBQWlCQyxLQUFLQyxNQUF0QixFQUFMLEtBQXdDO0FBQ3JFLFFBQUlDLFdBQVdyQixHQUFHc0IsVUFBSCxDQUFjSixRQUFkLElBQTBCRSxNQUF6QztBQUNBcEIsT0FBR08sS0FBSCxDQUFTZ0IsR0FBVCxDQUFhRixRQUFiO0FBQ0gsQ0FIRDtBQUlBLHdCQUFldEIsR0FBZixDQUFtQixFQUFuQixDQUFzQixTQUF0QixFQUFpQyxDQUFDQyxFQUFELEVBQUssRUFBRUssS0FBS21CLEtBQVAsRUFBTCxLQUF3QnhCLEdBQUdPLEtBQUgsQ0FBU2tCLEdBQVQsQ0FBYUQsS0FBYixDQUF6RDtBQUNBLHdCQUFlekIsR0FBZixDQUFtQixFQUFuQixDQUFzQixVQUF0QixFQUFrQyxDQUFDQyxFQUFELEVBQUssRUFBRUssS0FBS2EsUUFBUCxFQUFMLEtBQTJCbEIsR0FBRzBCLElBQUgsQ0FBUVIsUUFBUixDQUE3RDtBQUNBLHdCQUFlbkIsR0FBZixDQUFtQixFQUFuQixDQUFzQixXQUF0QixFQUFtQyxDQUFDQyxFQUFELEVBQUssRUFBRUssS0FBS2EsUUFBUCxFQUFMLEtBQTJCbEIsR0FBRzJCLEtBQUgsQ0FBU1QsUUFBVCxDQUE5RDtBQUNBLHdCQUFlbkIsR0FBZixDQUFtQixFQUFuQixDQUFzQixzQkFBdEIsRUFBOEMsQ0FBQ0MsRUFBRCxFQUFLLEVBQUVLLEtBQUt1QixNQUFQLEVBQUwsS0FBeUI7QUFDbkUsUUFBSUMsUUFBUTdCLEdBQUdVLFNBQUgsQ0FBYW9CLFFBQWIsQ0FBc0JGLE1BQXRCLENBQVo7QUFDQTVCLE9BQUcrQixnQkFBSCxDQUFvQkYsS0FBcEI7QUFDSCxDQUhEO0FBSUEsd0JBQWU5QixHQUFmLENBQW1CLEVBQW5CLENBQXNCLGVBQXRCLEVBQXVDQyxNQUFNQSxHQUFHZ0MsU0FBSCxFQUE3QztBQUNBLHdCQUFlakMsR0FBZixDQUFtQixFQUFuQixDQUFzQixjQUF0QixFQUFzQ0MsTUFBTUEsR0FBR2lDLFFBQUgsRUFBNUM7QUFDQSx3QkFBZWxDLEdBQWYsQ0FBbUIsRUFBbkIsQ0FBc0IsV0FBdEIsRUFBbUMsQ0FBQ0MsRUFBRCxFQUFLLEVBQUVLLEtBQUs2QixJQUFQLEVBQUwsS0FBdUJsQyxHQUFHbUMsS0FBSCxDQUFTRCxJQUFULENBQTFEO0FBQ0Esd0JBQWVuQyxHQUFmLENBQW1CLEVBQW5CLENBQXNCLFVBQXRCLEVBQWtDQyxNQUFNQSxHQUFHb0MsSUFBSCxFQUF4QztBQUNBLHdCQUFlckMsR0FBZixDQUFtQixFQUFuQixDQUFzQix5QkFBdEIsRUFBaURDLE1BQU07QUFDbkQsUUFBSU8sUUFBUVAsR0FBR08sS0FBZjtBQUNBLFFBQUk4QixRQUFROUIsTUFBTWtCLEdBQU4sRUFBWjtBQUNBbEIsVUFBTUMsSUFBTixDQUFXNkIsUUFBUUEsTUFBTUMsY0FBTixDQUFxQnRDLEdBQUd1QyxHQUF4QixDQUFSLEdBQXVDLElBQWxEO0FBQ0gsQ0FKRDtBQUtBLHdCQUFleEMsR0FBZixDQUFtQixFQUFuQixDQUFzQixrQkFBdEIsRUFBMEMsQ0FBQ0MsRUFBRCxFQUFLLEVBQUVLLEtBQUttQyxNQUFQLEVBQUwsS0FBeUI7QUFDL0QsUUFBSUgsUUFBUXJDLEdBQUdVLFNBQUgsQ0FBYStCLFFBQWIsQ0FBc0JELE1BQXRCLENBQVo7QUFDQSxRQUFJRSxXQUFXTCxNQUFNTSxhQUFOLENBQW9CM0MsR0FBR3VDLEdBQXZCLENBQWY7QUFDQXZDLE9BQUc0QyxJQUFILENBQVFGLFNBQVNHLE1BQWpCO0FBQ0gsQ0FKRDtBQUtBLHdCQUFlOUMsR0FBZixDQUFtQixFQUFuQixDQUFzQixtQkFBdEIsRUFBMkMsQ0FBQ0MsRUFBRCxFQUFLLEVBQUVLLEtBQUt5QyxRQUFQLEVBQUwsS0FBMkI7QUFDbEUsUUFBSUMsVUFBVS9DLEdBQUdVLFNBQUgsQ0FBYUMsUUFBYixDQUFzQm1DLFFBQXRCLENBQWQ7QUFDQSxRQUFJVCxRQUFRckMsR0FBR08sS0FBSCxDQUFTa0IsR0FBVCxFQUFaO0FBQ0FzQixZQUFRQyxNQUFSLENBQWVoRCxFQUFmLEVBQW1CcUMsS0FBbkI7QUFDSCxDQUpEO0FBS0Esd0JBQWV0QyxHQUFmLENBQW1CLEVBQW5CLENBQXNCLFVBQXRCLEVBQWtDLENBQUNDLEVBQUQsRUFBSyxFQUFFSyxLQUFLNEMsTUFBUCxFQUFMLEtBQXlCakQsR0FBR2tELElBQUgsQ0FBUUQsTUFBUixDQUEzRDtBQUNBLHdCQUFlbEQsR0FBZixDQUFtQixFQUFuQixDQUFzQixZQUF0QixFQUFvQyxDQUFDQyxFQUFELEVBQUssRUFBRUssS0FBSzRDLE1BQVAsRUFBTCxLQUF5QjtBQUN6RCxRQUFJRSxZQUFZbkQsR0FBR08sS0FBSCxDQUFTa0IsR0FBVCxFQUFoQjtBQUNBLFFBQUksd0JBQVEwQixTQUFSLENBQUosRUFBd0I7QUFDcEIsWUFBSUEsVUFBVXJDLEtBQVYsRUFBSixFQUF1QjtBQUNuQmQsZUFBR2tELElBQUgsQ0FBUUQsTUFBUjtBQUNIO0FBQ0osS0FKRCxNQUlPO0FBQ0gsWUFBSUcsUUFBUSw4QkFBbUJELFNBQW5CLENBQVo7QUFDQSxZQUFJQyxNQUFNQyxJQUFOLEVBQUosRUFBa0I7QUFDZHJELGVBQUdrRCxJQUFILENBQVFELE1BQVI7QUFDSDtBQUNEakQsV0FBR3NELFVBQUgsQ0FBYyxJQUFJQyxNQUFKLENBQVdILEtBQVgsQ0FBZDtBQUNIO0FBQ0osQ0FiRDtBQWNBLHdCQUFlckQsR0FBZixDQUFtQixFQUFuQixDQUFzQixnQkFBdEIsRUFBd0MsQ0FBQ0MsRUFBRCxFQUFLLEVBQUVLLEtBQUs0QyxNQUFQLEVBQUwsS0FBeUI7QUFDN0QsUUFBSUUsWUFBWW5ELEdBQUdPLEtBQUgsQ0FBU2tCLEdBQVQsRUFBaEI7QUFDQSxRQUFJLHdCQUFRMEIsU0FBUixDQUFKLEVBQXdCO0FBQ3BCLFlBQUksQ0FBQ0EsVUFBVXJDLEtBQVYsRUFBTCxFQUF3QjtBQUNwQmQsZUFBR2tELElBQUgsQ0FBUUQsTUFBUjtBQUNIO0FBQ0osS0FKRCxNQUlPO0FBQ0gsWUFBSUcsUUFBUSw4QkFBbUJELFNBQW5CLENBQVo7QUFDQSxZQUFJLENBQUNDLE1BQU1DLElBQU4sRUFBTCxFQUFtQjtBQUNmckQsZUFBR2tELElBQUgsQ0FBUUQsTUFBUjtBQUNIO0FBQ0RqRCxXQUFHc0QsVUFBSCxDQUFjLElBQUlDLE1BQUosQ0FBV0gsS0FBWCxDQUFkO0FBQ0g7QUFDSixDQWJEO0FBY0Esd0JBQWVyRCxHQUFmLENBQW1CLEVBQW5CLENBQXNCLFlBQXRCLEVBQW9DQyxNQUFNQSxHQUFHd0QsTUFBSCxFQUExQztBQUNBLHdCQUFlekQsR0FBZixDQUFtQixFQUFuQixDQUFzQixjQUF0QixFQUFzQyxDQUFDQyxFQUFELEVBQUssRUFBRUssS0FBS29ELFFBQVAsRUFBTCxLQUEyQjtBQUM3RHpELE9BQUcwRCxRQUFILENBQVlELFFBQVo7QUFDSCxDQUZEO0FBR08sTUFBTUUsZ0NBQVksVUFBVUMsR0FBVixFQUFlQyxJQUFmLEVBQXFCO0FBQzFDLFdBQU8sOEJBQW1CLENBQUMsQ0FBQ0QsSUFBSTlDLEtBQUosRUFBckIsQ0FBUDtBQUNILENBRk07QUFHQSxNQUFNZ0Qsa0NBQWEsVUFBVUYsR0FBVixFQUFlQyxJQUFmLEVBQXFCO0FBQzNDLFdBQU9ELEdBQVA7QUFDSCxDQUZNO0FBR0EsTUFBTUcsNENBQWtCLFVBQVVILEdBQVYsRUFBZXJCLEdBQWYsRUFBb0I7QUFDL0MsV0FBT0EsSUFBSXlCLHNCQUFKLENBQTJCSixHQUEzQixDQUFQO0FBQ0gsQ0FGTTtBQUdQLHdCQUFlN0QsR0FBZixDQUFtQixFQUFuQixDQUFzQixVQUF0QixFQUFrQyxDQUFDQyxFQUFELEVBQUssRUFBRUssS0FBSzRELEtBQVAsRUFBTCxLQUF3QjtBQUN0RCxRQUFJMUQsUUFBUVAsR0FBR08sS0FBZjtBQUNBLFFBQUkyRCxVQUFVM0QsTUFBTWtCLEdBQU4sRUFBZDtBQUNBLFFBQUkwQyxPQUFPbkUsR0FBR1UsU0FBSCxDQUFhMEQsV0FBYixDQUF5QkgsS0FBekIsQ0FBWDtBQUNBMUQsVUFBTUMsSUFBTixDQUFXMkQsS0FBS0QsT0FBTCxFQUFjbEUsR0FBR3VDLEdBQWpCLENBQVg7QUFDSCxDQUxEO0FBTU8sTUFBTWdCLE1BQU4saUNBQW9DO0FBQ3ZDYyxnQkFBWWpCLEtBQVosRUFBbUI7QUFDZjtBQUNBLGFBQUtrQixJQUFMLEdBQVksUUFBWjtBQUNBLGFBQUtDLEdBQUwsR0FBV25CLE1BQU1tQixHQUFqQjtBQUNBLGFBQUtuQixLQUFMLEdBQWFBLEtBQWI7QUFDSDtBQUNEb0IsYUFBU3hFLEVBQVQsRUFBYTtBQUNULFlBQUksRUFBRW9ELEtBQUYsS0FBWSxJQUFoQjtBQUNBLFlBQUksMkJBQVdBLE1BQU1xQixVQUFOLEVBQVgsQ0FBSixFQUFvQztBQUNoQ3pFLGVBQUcwRSxLQUFIO0FBQ0g7QUFDSjtBQUNEQyxhQUFTO0FBQ0wsWUFBSSxFQUFFTCxJQUFGLEVBQVFNLEtBQVIsRUFBZXhCLEtBQWYsS0FBeUIsSUFBN0I7QUFDQSxZQUFJeUIsUUFBSjtBQUNBLFlBQUk7QUFDQUEsdUJBQVdDLEtBQUtDLFNBQUwsQ0FBZTNCLE1BQU1DLElBQU4sRUFBZixDQUFYO0FBQ0gsU0FGRCxDQUVFLE9BQU8yQixDQUFQLEVBQVU7QUFDUkgsdUJBQVdJLE9BQU83QixNQUFNQyxJQUFOLEVBQVAsQ0FBWDtBQUNIO0FBQ0QsZUFBTztBQUNIbkIsa0JBQU0sRUFESDtBQUVIZ0QscUJBQVMsRUFBRUwsUUFBRixFQUZOO0FBR0hNLGtCQUFNUCxLQUhIO0FBSUhOO0FBSkcsU0FBUDtBQU1IO0FBM0JzQztRQUE5QmYsTSxHQUFBQSxNO0FBNkJOLE1BQU02Qix1QkFBTixpQ0FBcUQ7QUFDeERmLGdCQUFZRSxHQUFaLEVBQWlCdEIsTUFBakIsRUFBeUI7QUFDckI7QUFDQSxhQUFLQSxNQUFMLEdBQWNBLE1BQWQ7QUFDQSxhQUFLcUIsSUFBTCxHQUFZLHNCQUFaO0FBQ0EsYUFBS0MsR0FBTCxHQUFXQSxHQUFYO0FBQ0EsYUFBS2MsWUFBTCxHQUFvQmQsSUFBSXpELEtBQUosRUFBcEI7QUFDSDtBQUNEMEQsYUFBU3hFLEVBQVQsRUFBYTtBQUNULFlBQUksRUFBRXVFLEdBQUYsRUFBT3RCLE1BQVAsRUFBZW9DLFlBQWYsS0FBZ0MsSUFBcEM7QUFDQSxZQUFJLENBQUNyRixHQUFHc0YsZ0JBQUosSUFBd0JmLElBQUlnQixRQUFKLENBQWFGLFlBQWIsQ0FBNUIsRUFBd0Q7QUFDcERyRixlQUFHa0QsSUFBSCxDQUFRRCxNQUFSO0FBQ0g7QUFDSjtBQUNEdUMsZ0JBQVk7QUFDUixhQUFLSCxZQUFMLEdBQW9CLEtBQUtkLEdBQUwsQ0FBU3pELEtBQVQsRUFBcEI7QUFDSDtBQUNENkQsYUFBUztBQUNMLGVBQU87QUFDSHpDLGtCQUFNLENBQUM0QyxLQUFLQyxTQUFMLENBQWUsS0FBSzlCLE1BQUwsQ0FBWXdDLE9BQVosRUFBZixDQUFELENBREg7QUFFSE4sa0JBQU0sS0FBS1AsS0FGUjtBQUdITixrQkFBTSxLQUFLQTtBQUhSLFNBQVA7QUFLSDtBQXZCdUQ7UUFBL0NjLHVCLEdBQUFBLHVCO0FBeUJOLE1BQU1NLGVBQU4saUNBQTZDO0FBQ2hEckIsZ0JBQVlwQixNQUFaLEVBQW9CO0FBQ2hCO0FBQ0EsYUFBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0EsYUFBS3FCLElBQUwsR0FBWSxZQUFaO0FBQ0EsYUFBS0MsR0FBTDtBQUNIO0FBQ0RDLGVBQVc7QUFDUCxhQUFLdkIsTUFBTCxDQUFZdUMsU0FBWjtBQUNIO0FBVCtDO1FBQXZDRSxlLEdBQUFBLGU7QUFXTixNQUFNQyxXQUFOLENBQWtCO0FBQ3JCdEIsZ0JBQVl1QixLQUFaLEVBQW1CO0FBQ2YsYUFBS3JCLEdBQUw7QUFDQSxhQUFLRCxJQUFMLEdBQVksT0FBWjtBQUNBLGFBQUtzQixLQUFMLEdBQWEsSUFBYjtBQUNBLGFBQUtDLElBQUwsR0FBWSxJQUFaO0FBQ0EsYUFBS0MsSUFBTCxHQUFZLElBQVo7QUFDQSxrQ0FBZSxJQUFmO0FBQ0EsYUFBS0YsS0FBTCxHQUFhQSxLQUFiO0FBQ0g7QUFDRHBCLGVBQVcsQ0FBRTtBQUNiaUIsY0FBVTtBQUNOLGVBQVEsR0FBRSxLQUFLRyxLQUFNLEtBQUksS0FBS2hCLEtBQU0sR0FBcEM7QUFDSDtBQUNERCxhQUFTO0FBQ0wsZUFBTztBQUNIekMsa0JBQU0sQ0FBQzRDLEtBQUtDLFNBQUwsQ0FBZSxLQUFLVSxPQUFMLEVBQWYsQ0FBRCxDQURIO0FBRUhOLGtCQUFNLEtBQUtQLEtBRlI7QUFHSE4sa0JBQU0sS0FBS0E7QUFIUixTQUFQO0FBS0g7QUFwQm9CO1FBQVpxQixXLEdBQUFBLFciLCJmaWxlIjoibGliL2NvbXBpbGVkL29wY29kZXMvdm0uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT05TVEFOVF9UQUcsIGlzQ29uc3QsIGlzTW9kaWZpZWQsIFJlZmVyZW5jZUNhY2hlLCBDb25zdFJlZmVyZW5jZSB9IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQgeyBpbml0aWFsaXplR3VpZCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMsIFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnLi4vLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgeyBGQUxTRV9SRUZFUkVOQ0UsIE5VTExfUkVGRVJFTkNFLCBQcmltaXRpdmVSZWZlcmVuY2UsIFRSVUVfUkVGRVJFTkNFLCBVTkRFRklORURfUkVGRVJFTkNFIH0gZnJvbSAnLi4vLi4vcmVmZXJlbmNlcyc7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMjAgLyogQ2hpbGRTY29wZSAqLywgdm0gPT4gdm0ucHVzaENoaWxkU2NvcGUoKSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMjEgLyogUG9wU2NvcGUgKi8sIHZtID0+IHZtLnBvcFNjb3BlKCkpO1xuQVBQRU5EX09QQ09ERVMuYWRkKDM5IC8qIFB1c2hEeW5hbWljU2NvcGUgKi8sIHZtID0+IHZtLnB1c2hEeW5hbWljU2NvcGUoKSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoNDAgLyogUG9wRHluYW1pY1Njb3BlICovLCB2bSA9PiB2bS5wb3BEeW5hbWljU2NvcGUoKSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMTIgLyogSW1tZWRpYXRlICovLCAodm0sIHsgb3AxOiBudW1iZXIgfSkgPT4ge1xuICAgIHZtLnN0YWNrLnB1c2gobnVtYmVyKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDEzIC8qIENvbnN0YW50ICovLCAodm0sIHsgb3AxOiBvdGhlciB9KSA9PiB7XG4gICAgdm0uc3RhY2sucHVzaCh2bS5jb25zdGFudHMuZ2V0T3RoZXIob3RoZXIpKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDE0IC8qIFByaW1pdGl2ZVJlZmVyZW5jZSAqLywgKHZtLCB7IG9wMTogcHJpbWl0aXZlIH0pID0+IHtcbiAgICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgICBsZXQgZmxhZyA9IChwcmltaXRpdmUgJiAzIDw8IDMwKSA+Pj4gMzA7XG4gICAgbGV0IHZhbHVlID0gcHJpbWl0aXZlICYgfigzIDw8IDMwKTtcbiAgICBzd2l0Y2ggKGZsYWcpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgc3RhY2sucHVzaChQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZhbHVlKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgc3RhY2sucHVzaChQcmltaXRpdmVSZWZlcmVuY2UuY3JlYXRlKHZtLmNvbnN0YW50cy5nZXRGbG9hdCh2YWx1ZSkpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBzdGFjay5wdXNoKFByaW1pdGl2ZVJlZmVyZW5jZS5jcmVhdGUodm0uY29uc3RhbnRzLmdldFN0cmluZyh2YWx1ZSkpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKEZBTFNFX1JFRkVSRU5DRSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChUUlVFX1JFRkVSRU5DRSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChOVUxMX1JFRkVSRU5DRSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChVTkRFRklORURfUkVGRVJFTkNFKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCgxNSAvKiBEdXAgKi8sICh2bSwgeyBvcDE6IHJlZ2lzdGVyLCBvcDI6IG9mZnNldCB9KSA9PiB7XG4gICAgbGV0IHBvc2l0aW9uID0gdm0uZmV0Y2hWYWx1ZShyZWdpc3RlcikgLSBvZmZzZXQ7XG4gICAgdm0uc3RhY2suZHVwKHBvc2l0aW9uKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDE2IC8qIFBvcCAqLywgKHZtLCB7IG9wMTogY291bnQgfSkgPT4gdm0uc3RhY2sucG9wKGNvdW50KSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoMTcgLyogTG9hZCAqLywgKHZtLCB7IG9wMTogcmVnaXN0ZXIgfSkgPT4gdm0ubG9hZChyZWdpc3RlcikpO1xuQVBQRU5EX09QQ09ERVMuYWRkKDE4IC8qIEZldGNoICovLCAodm0sIHsgb3AxOiByZWdpc3RlciB9KSA9PiB2bS5mZXRjaChyZWdpc3RlcikpO1xuQVBQRU5EX09QQ09ERVMuYWRkKDM4IC8qIEJpbmREeW5hbWljU2NvcGUgKi8sICh2bSwgeyBvcDE6IF9uYW1lcyB9KSA9PiB7XG4gICAgbGV0IG5hbWVzID0gdm0uY29uc3RhbnRzLmdldEFycmF5KF9uYW1lcyk7XG4gICAgdm0uYmluZER5bmFtaWNTY29wZShuYW1lcyk7XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCg0NyAvKiBQdXNoRnJhbWUgKi8sIHZtID0+IHZtLnB1c2hGcmFtZSgpKTtcbkFQUEVORF9PUENPREVTLmFkZCg0OCAvKiBQb3BGcmFtZSAqLywgdm0gPT4gdm0ucG9wRnJhbWUoKSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoNDkgLyogRW50ZXIgKi8sICh2bSwgeyBvcDE6IGFyZ3MgfSkgPT4gdm0uZW50ZXIoYXJncykpO1xuQVBQRU5EX09QQ09ERVMuYWRkKDUwIC8qIEV4aXQgKi8sIHZtID0+IHZtLmV4aXQoKSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoNDEgLyogQ29tcGlsZUR5bmFtaWNCbG9jayAqLywgdm0gPT4ge1xuICAgIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICAgIGxldCBibG9jayA9IHN0YWNrLnBvcCgpO1xuICAgIHN0YWNrLnB1c2goYmxvY2sgPyBibG9jay5jb21waWxlRHluYW1pYyh2bS5lbnYpIDogbnVsbCk7XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCg0MiAvKiBJbnZva2VTdGF0aWMgKi8sICh2bSwgeyBvcDE6IF9ibG9jayB9KSA9PiB7XG4gICAgbGV0IGJsb2NrID0gdm0uY29uc3RhbnRzLmdldEJsb2NrKF9ibG9jayk7XG4gICAgbGV0IGNvbXBpbGVkID0gYmxvY2suY29tcGlsZVN0YXRpYyh2bS5lbnYpO1xuICAgIHZtLmNhbGwoY29tcGlsZWQuaGFuZGxlKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDQzIC8qIEludm9rZUR5bmFtaWMgKi8sICh2bSwgeyBvcDE6IF9pbnZva2VyIH0pID0+IHtcbiAgICBsZXQgaW52b2tlciA9IHZtLmNvbnN0YW50cy5nZXRPdGhlcihfaW52b2tlcik7XG4gICAgbGV0IGJsb2NrID0gdm0uc3RhY2sucG9wKCk7XG4gICAgaW52b2tlci5pbnZva2Uodm0sIGJsb2NrKTtcbn0pO1xuQVBQRU5EX09QQ09ERVMuYWRkKDQ0IC8qIEp1bXAgKi8sICh2bSwgeyBvcDE6IHRhcmdldCB9KSA9PiB2bS5nb3RvKHRhcmdldCkpO1xuQVBQRU5EX09QQ09ERVMuYWRkKDQ1IC8qIEp1bXBJZiAqLywgKHZtLCB7IG9wMTogdGFyZ2V0IH0pID0+IHtcbiAgICBsZXQgcmVmZXJlbmNlID0gdm0uc3RhY2sucG9wKCk7XG4gICAgaWYgKGlzQ29uc3QocmVmZXJlbmNlKSkge1xuICAgICAgICBpZiAocmVmZXJlbmNlLnZhbHVlKCkpIHtcbiAgICAgICAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjYWNoZSA9IG5ldyBSZWZlcmVuY2VDYWNoZShyZWZlcmVuY2UpO1xuICAgICAgICBpZiAoY2FjaGUucGVlaygpKSB7XG4gICAgICAgICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KGNhY2hlKSk7XG4gICAgfVxufSk7XG5BUFBFTkRfT1BDT0RFUy5hZGQoNDYgLyogSnVtcFVubGVzcyAqLywgKHZtLCB7IG9wMTogdGFyZ2V0IH0pID0+IHtcbiAgICBsZXQgcmVmZXJlbmNlID0gdm0uc3RhY2sucG9wKCk7XG4gICAgaWYgKGlzQ29uc3QocmVmZXJlbmNlKSkge1xuICAgICAgICBpZiAoIXJlZmVyZW5jZS52YWx1ZSgpKSB7XG4gICAgICAgICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY2FjaGUgPSBuZXcgUmVmZXJlbmNlQ2FjaGUocmVmZXJlbmNlKTtcbiAgICAgICAgaWYgKCFjYWNoZS5wZWVrKCkpIHtcbiAgICAgICAgICAgIHZtLmdvdG8odGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnQoY2FjaGUpKTtcbiAgICB9XG59KTtcbkFQUEVORF9PUENPREVTLmFkZCgyMiAvKiBSZXR1cm4gKi8sIHZtID0+IHZtLnJldHVybigpKTtcbkFQUEVORF9PUENPREVTLmFkZCgyMyAvKiBSZXR1cm5UbyAqLywgKHZtLCB7IG9wMTogcmVsYXRpdmUgfSkgPT4ge1xuICAgIHZtLnJldHVyblRvKHJlbGF0aXZlKTtcbn0pO1xuZXhwb3J0IGNvbnN0IENvbnN0VGVzdCA9IGZ1bmN0aW9uIChyZWYsIF9lbnYpIHtcbiAgICByZXR1cm4gbmV3IENvbnN0UmVmZXJlbmNlKCEhcmVmLnZhbHVlKCkpO1xufTtcbmV4cG9ydCBjb25zdCBTaW1wbGVUZXN0ID0gZnVuY3Rpb24gKHJlZiwgX2Vudikge1xuICAgIHJldHVybiByZWY7XG59O1xuZXhwb3J0IGNvbnN0IEVudmlyb25tZW50VGVzdCA9IGZ1bmN0aW9uIChyZWYsIGVudikge1xuICAgIHJldHVybiBlbnYudG9Db25kaXRpb25hbFJlZmVyZW5jZShyZWYpO1xufTtcbkFQUEVORF9PUENPREVTLmFkZCg1MSAvKiBUZXN0ICovLCAodm0sIHsgb3AxOiBfZnVuYyB9KSA9PiB7XG4gICAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG4gICAgbGV0IG9wZXJhbmQgPSBzdGFjay5wb3AoKTtcbiAgICBsZXQgZnVuYyA9IHZtLmNvbnN0YW50cy5nZXRGdW5jdGlvbihfZnVuYyk7XG4gICAgc3RhY2sucHVzaChmdW5jKG9wZXJhbmQsIHZtLmVudikpO1xufSk7XG5leHBvcnQgY2xhc3MgQXNzZXJ0IGV4dGVuZHMgVXBkYXRpbmdPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKGNhY2hlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdhc3NlcnQnO1xuICAgICAgICB0aGlzLnRhZyA9IGNhY2hlLnRhZztcbiAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgIH1cbiAgICBldmFsdWF0ZSh2bSkge1xuICAgICAgICBsZXQgeyBjYWNoZSB9ID0gdGhpcztcbiAgICAgICAgaWYgKGlzTW9kaWZpZWQoY2FjaGUucmV2YWxpZGF0ZSgpKSkge1xuICAgICAgICAgICAgdm0udGhyb3coKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCB7IHR5cGUsIF9ndWlkLCBjYWNoZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IGV4cGVjdGVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhwZWN0ZWQgPSBKU09OLnN0cmluZ2lmeShjYWNoZS5wZWVrKCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBleHBlY3RlZCA9IFN0cmluZyhjYWNoZS5wZWVrKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcmdzOiBbXSxcbiAgICAgICAgICAgIGRldGFpbHM6IHsgZXhwZWN0ZWQgfSxcbiAgICAgICAgICAgIGd1aWQ6IF9ndWlkLFxuICAgICAgICAgICAgdHlwZVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBKdW1wSWZOb3RNb2RpZmllZE9wY29kZSBleHRlbmRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3Rvcih0YWcsIHRhcmdldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy50eXBlID0gJ2p1bXAtaWYtbm90LW1vZGlmaWVkJztcbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgIHRoaXMubGFzdFJldmlzaW9uID0gdGFnLnZhbHVlKCk7XG4gICAgfVxuICAgIGV2YWx1YXRlKHZtKSB7XG4gICAgICAgIGxldCB7IHRhZywgdGFyZ2V0LCBsYXN0UmV2aXNpb24gfSA9IHRoaXM7XG4gICAgICAgIGlmICghdm0uYWx3YXlzUmV2YWxpZGF0ZSAmJiB0YWcudmFsaWRhdGUobGFzdFJldmlzaW9uKSkge1xuICAgICAgICAgICAgdm0uZ290byh0YXJnZXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpZE1vZGlmeSgpIHtcbiAgICAgICAgdGhpcy5sYXN0UmV2aXNpb24gPSB0aGlzLnRhZy52YWx1ZSgpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcmdzOiBbSlNPTi5zdHJpbmdpZnkodGhpcy50YXJnZXQuaW5zcGVjdCgpKV0sXG4gICAgICAgICAgICBndWlkOiB0aGlzLl9ndWlkLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIERpZE1vZGlmeU9wY29kZSBleHRlbmRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMudHlwZSA9ICdkaWQtbW9kaWZ5JztcbiAgICAgICAgdGhpcy50YWcgPSBDT05TVEFOVF9UQUc7XG4gICAgfVxuICAgIGV2YWx1YXRlKCkge1xuICAgICAgICB0aGlzLnRhcmdldC5kaWRNb2RpZnkoKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTGFiZWxPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKGxhYmVsKSB7XG4gICAgICAgIHRoaXMudGFnID0gQ09OU1RBTlRfVEFHO1xuICAgICAgICB0aGlzLnR5cGUgPSAnbGFiZWwnO1xuICAgICAgICB0aGlzLmxhYmVsID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgICAgICAgaW5pdGlhbGl6ZUd1aWQodGhpcyk7XG4gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgICB9XG4gICAgZXZhbHVhdGUoKSB7fVxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmxhYmVsfSBbJHt0aGlzLl9ndWlkfV1gO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcmdzOiBbSlNPTi5zdHJpbmdpZnkodGhpcy5pbnNwZWN0KCkpXSxcbiAgICAgICAgICAgIGd1aWQ6IHRoaXMuX2d1aWQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVcbiAgICAgICAgfTtcbiAgICB9XG59Il19