UNPKG

ember-legacy-class-transform

Version:
419 lines (339 loc) 37.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ListBlockOpcode = exports.TryOpcode = exports.BlockOpcode = undefined; var _bounds = require("../bounds"); var _builder = require("../builder"); var _util = require("@glimmer/util"); var _reference = require("@glimmer/reference"); var _opcodes = require("../opcodes"); var _append = require("./append"); var _append2 = _interopRequireDefault(_append); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) { var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } }return obj; } var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor); } }return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor; }; }(); function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); }return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var UpdatingVM = function () { function UpdatingVM(env, _ref) { var _ref$alwaysRevalidate = _ref.alwaysRevalidate, alwaysRevalidate = _ref$alwaysRevalidate === undefined ? false : _ref$alwaysRevalidate; _classCallCheck(this, UpdatingVM); this.frameStack = new _util.Stack(); this.env = env; this.constants = env.program.constants; this.dom = env.getDOM(); this.alwaysRevalidate = alwaysRevalidate; } UpdatingVM.prototype.execute = function execute(opcodes, handler) { var frameStack = this.frameStack; this.try(opcodes, handler); while (true) { if (frameStack.isEmpty()) break; var opcode = this.frame.nextStatement(); if (opcode === null) { this.frameStack.pop(); continue; } opcode.evaluate(this); } }; UpdatingVM.prototype.goto = function goto(op) { this.frame.goto(op); }; UpdatingVM.prototype.try = function _try(ops, handler) { this.frameStack.push(new UpdatingVMFrame(this, ops, handler)); }; UpdatingVM.prototype.throw = function _throw() { this.frame.handleException(); this.frameStack.pop(); }; UpdatingVM.prototype.evaluateOpcode = function evaluateOpcode(opcode) { opcode.evaluate(this); }; _createClass(UpdatingVM, [{ key: 'frame', get: function () { return this.frameStack.current; } }]); return UpdatingVM; }(); exports.default = UpdatingVM; var BlockOpcode = exports.BlockOpcode = function (_UpdatingOpcode) { _inherits(BlockOpcode, _UpdatingOpcode); function BlockOpcode(start, state, bounds, children) { _classCallCheck(this, BlockOpcode); var _this = _possibleConstructorReturn(this, _UpdatingOpcode.call(this)); _this.start = start; _this.type = "block"; _this.next = null; _this.prev = null; var env = state.env, scope = state.scope, dynamicScope = state.dynamicScope, stack = state.stack; _this.children = children; _this.env = env; _this.scope = scope; _this.dynamicScope = dynamicScope; _this.stack = stack; _this.bounds = bounds; return _this; } BlockOpcode.prototype.parentElement = function parentElement() { return this.bounds.parentElement(); }; BlockOpcode.prototype.firstNode = function firstNode() { return this.bounds.firstNode(); }; BlockOpcode.prototype.lastNode = function lastNode() { return this.bounds.lastNode(); }; BlockOpcode.prototype.evaluate = function evaluate(vm) { vm.try(this.children, null); }; BlockOpcode.prototype.destroy = function destroy() { this.bounds.destroy(); }; BlockOpcode.prototype.didDestroy = function didDestroy() { this.env.didDestroy(this.bounds); }; BlockOpcode.prototype.toJSON = function toJSON() { var details = (0, _util.dict)(); details["guid"] = '' + this._guid; return { guid: this._guid, type: this.type, details: details, children: this.children.toArray().map(function (op) { return op.toJSON(); }) }; }; return BlockOpcode; }(_opcodes.UpdatingOpcode); var TryOpcode = exports.TryOpcode = function (_BlockOpcode) { _inherits(TryOpcode, _BlockOpcode); function TryOpcode(start, state, bounds, children) { _classCallCheck(this, TryOpcode); var _this2 = _possibleConstructorReturn(this, _BlockOpcode.call(this, start, state, bounds, children)); _this2.type = "try"; _this2.tag = _this2._tag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG); return _this2; } TryOpcode.prototype.didInitializeChildren = function didInitializeChildren() { this._tag.inner.update((0, _reference.combineSlice)(this.children)); }; TryOpcode.prototype.evaluate = function evaluate(vm) { vm.try(this.children, this); }; TryOpcode.prototype.handleException = function handleException() { var _this3 = this; var env = this.env, bounds = this.bounds, children = this.children, scope = this.scope, dynamicScope = this.dynamicScope, start = this.start, stack = this.stack, prev = this.prev, next = this.next; children.clear(); var elementStack = _builder.ElementStack.resume(env, bounds, bounds.reset(env)); var vm = new _append2.default(env, scope, dynamicScope, elementStack); var updating = new _util.LinkedList(); vm.execute(start, function (vm) { vm.stack = _append.EvaluationStack.restore(stack); vm.updatingOpcodeStack.push(updating); vm.updateWith(_this3); vm.updatingOpcodeStack.push(children); }); this.prev = prev; this.next = next; }; TryOpcode.prototype.toJSON = function toJSON() { var json = _BlockOpcode.prototype.toJSON.call(this); var details = json["details"]; if (!details) { details = json["details"] = {}; } return _BlockOpcode.prototype.toJSON.call(this); }; return TryOpcode; }(BlockOpcode); var ListRevalidationDelegate = function () { function ListRevalidationDelegate(opcode, marker) { _classCallCheck(this, ListRevalidationDelegate); this.opcode = opcode; this.marker = marker; this.didInsert = false; this.didDelete = false; this.map = opcode.map; this.updating = opcode['children']; } ListRevalidationDelegate.prototype.insert = function insert(key, item, memo, before) { var map = this.map, opcode = this.opcode, updating = this.updating; var nextSibling = null; var reference = null; if (before) { reference = map[before]; nextSibling = reference['bounds'].firstNode(); } else { nextSibling = this.marker; } var vm = opcode.vmForInsertion(nextSibling); var tryOpcode = null; var start = opcode.start; vm.execute(start, function (vm) { map[key] = tryOpcode = vm.iterate(memo, item); vm.updatingOpcodeStack.push(new _util.LinkedList()); vm.updateWith(tryOpcode); vm.updatingOpcodeStack.push(tryOpcode.children); }); updating.insertBefore(tryOpcode, reference); this.didInsert = true; }; ListRevalidationDelegate.prototype.retain = function retain(_key, _item, _memo) {}; ListRevalidationDelegate.prototype.move = function move(key, _item, _memo, before) { var map = this.map, updating = this.updating; var entry = map[key]; var reference = map[before] || null; if (before) { (0, _bounds.move)(entry, reference.firstNode()); } else { (0, _bounds.move)(entry, this.marker); } updating.remove(entry); updating.insertBefore(entry, reference); }; ListRevalidationDelegate.prototype.delete = function _delete(key) { var map = this.map; var opcode = map[key]; opcode.didDestroy(); (0, _bounds.clear)(opcode); this.updating.remove(opcode); delete map[key]; this.didDelete = true; }; ListRevalidationDelegate.prototype.done = function done() { this.opcode.didInitializeChildren(this.didInsert || this.didDelete); }; return ListRevalidationDelegate; }(); var ListBlockOpcode = exports.ListBlockOpcode = function (_BlockOpcode2) { _inherits(ListBlockOpcode, _BlockOpcode2); function ListBlockOpcode(start, state, bounds, children, artifacts) { _classCallCheck(this, ListBlockOpcode); var _this4 = _possibleConstructorReturn(this, _BlockOpcode2.call(this, start, state, bounds, children)); _this4.type = "list-block"; _this4.map = (0, _util.dict)(); _this4.lastIterated = _reference.INITIAL; _this4.artifacts = artifacts; var _tag = _this4._tag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG); _this4.tag = (0, _reference.combine)([artifacts.tag, _tag]); return _this4; } ListBlockOpcode.prototype.didInitializeChildren = function didInitializeChildren() { var listDidChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; this.lastIterated = this.artifacts.tag.value(); if (listDidChange) { this._tag.inner.update((0, _reference.combineSlice)(this.children)); } }; ListBlockOpcode.prototype.evaluate = function evaluate(vm) { var artifacts = this.artifacts, lastIterated = this.lastIterated; if (!artifacts.tag.validate(lastIterated)) { var bounds = this.bounds; var dom = vm.dom; var marker = dom.createComment(''); dom.insertAfter(bounds.parentElement(), marker, bounds.lastNode()); var target = new ListRevalidationDelegate(this, marker); var synchronizer = new _reference.IteratorSynchronizer({ target: target, artifacts: artifacts }); synchronizer.sync(); this.parentElement().removeChild(marker); } // Run now-updated updating opcodes _BlockOpcode2.prototype.evaluate.call(this, vm); }; ListBlockOpcode.prototype.vmForInsertion = function vmForInsertion(nextSibling) { var env = this.env, scope = this.scope, dynamicScope = this.dynamicScope; var elementStack = _builder.ElementStack.forInitialRender(this.env, this.bounds.parentElement(), nextSibling); return new _append2.default(env, scope, dynamicScope, elementStack); }; ListBlockOpcode.prototype.toJSON = function toJSON() { var json = _BlockOpcode2.prototype.toJSON.call(this); var map = this.map; var inner = Object.keys(map).map(function (key) { return JSON.stringify(key) + ': ' + map[key]._guid; }).join(", "); var details = json["details"]; if (!details) { details = json["details"] = {}; } details["map"] = '{' + inner + '}'; return json; }; return ListBlockOpcode; }(BlockOpcode); var UpdatingVMFrame = function () { function UpdatingVMFrame(vm, ops, exceptionHandler) { _classCallCheck(this, UpdatingVMFrame); this.vm = vm; this.ops = ops; this.exceptionHandler = exceptionHandler; this.vm = vm; this.ops = ops; this.current = ops.head(); } UpdatingVMFrame.prototype.goto = function goto(op) { this.current = op; }; UpdatingVMFrame.prototype.nextStatement = function nextStatement() { var current = this.current, ops = this.ops; if (current) this.current = ops.nextNode(current); return current; }; UpdatingVMFrame.prototype.handleException = function handleException() { if (this.exceptionHandler) { this.exceptionHandler.handleException(); } }; return UpdatingVMFrame; }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi92bS91cGRhdGUuanMiXSwibmFtZXMiOlsiY2xlYXIiLCJtb3ZlIiwibW92ZUJvdW5kcyIsIkVsZW1lbnRTdGFjayIsIlN0YWNrIiwiTGlua2VkTGlzdCIsImRpY3QiLCJJdGVyYXRvclN5bmNocm9uaXplciIsImNvbWJpbmUiLCJVcGRhdGFibGVUYWciLCJjb21iaW5lU2xpY2UiLCJDT05TVEFOVF9UQUciLCJJTklUSUFMIiwiVXBkYXRpbmdPcGNvZGUiLCJWTSIsIkV2YWx1YXRpb25TdGFjayIsIlVwZGF0aW5nVk0iLCJlbnYiLCJhbHdheXNSZXZhbGlkYXRlIiwiZnJhbWVTdGFjayIsImNvbnN0YW50cyIsInByb2dyYW0iLCJkb20iLCJnZXRET00iLCJleGVjdXRlIiwib3Bjb2RlcyIsImhhbmRsZXIiLCJ0cnkiLCJpc0VtcHR5Iiwib3Bjb2RlIiwiZnJhbWUiLCJuZXh0U3RhdGVtZW50IiwicG9wIiwiZXZhbHVhdGUiLCJnb3RvIiwib3AiLCJvcHMiLCJwdXNoIiwiVXBkYXRpbmdWTUZyYW1lIiwidGhyb3ciLCJoYW5kbGVFeGNlcHRpb24iLCJldmFsdWF0ZU9wY29kZSIsImN1cnJlbnQiLCJCbG9ja09wY29kZSIsInN0YXJ0Iiwic3RhdGUiLCJib3VuZHMiLCJjaGlsZHJlbiIsInR5cGUiLCJuZXh0IiwicHJldiIsInNjb3BlIiwiZHluYW1pY1Njb3BlIiwic3RhY2siLCJwYXJlbnRFbGVtZW50IiwiZmlyc3ROb2RlIiwibGFzdE5vZGUiLCJ2bSIsImRlc3Ryb3kiLCJkaWREZXN0cm95IiwidG9KU09OIiwiZGV0YWlscyIsIl9ndWlkIiwiZ3VpZCIsInRvQXJyYXkiLCJtYXAiLCJUcnlPcGNvZGUiLCJ0YWciLCJfdGFnIiwiY3JlYXRlIiwiZGlkSW5pdGlhbGl6ZUNoaWxkcmVuIiwiaW5uZXIiLCJ1cGRhdGUiLCJlbGVtZW50U3RhY2siLCJyZXN1bWUiLCJyZXNldCIsInVwZGF0aW5nIiwicmVzdG9yZSIsInVwZGF0aW5nT3Bjb2RlU3RhY2siLCJ1cGRhdGVXaXRoIiwianNvbiIsIkxpc3RSZXZhbGlkYXRpb25EZWxlZ2F0ZSIsIm1hcmtlciIsImRpZEluc2VydCIsImRpZERlbGV0ZSIsImluc2VydCIsImtleSIsIml0ZW0iLCJtZW1vIiwiYmVmb3JlIiwibmV4dFNpYmxpbmciLCJyZWZlcmVuY2UiLCJ2bUZvckluc2VydGlvbiIsInRyeU9wY29kZSIsIml0ZXJhdGUiLCJpbnNlcnRCZWZvcmUiLCJyZXRhaW4iLCJfa2V5IiwiX2l0ZW0iLCJfbWVtbyIsImVudHJ5IiwicmVtb3ZlIiwiZGVsZXRlIiwiZG9uZSIsIkxpc3RCbG9ja09wY29kZSIsImFydGlmYWN0cyIsImxhc3RJdGVyYXRlZCIsImxpc3REaWRDaGFuZ2UiLCJ2YWx1ZSIsInZhbGlkYXRlIiwiY3JlYXRlQ29tbWVudCIsImluc2VydEFmdGVyIiwidGFyZ2V0Iiwic3luY2hyb25pemVyIiwic3luYyIsInJlbW92ZUNoaWxkIiwiZm9ySW5pdGlhbFJlbmRlciIsIk9iamVjdCIsImtleXMiLCJKU09OIiwic3RyaW5naWZ5Iiwiam9pbiIsImV4Y2VwdGlvbkhhbmRsZXIiLCJoZWFkIiwibmV4dE5vZGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxBQUFTLEFBQU8sQUFBUSxBQUFrQjs7QUFDMUMsQUFBUyxBQUFvQjs7QUFDN0IsQUFBUyxBQUFPLEFBQVksQUFBb0I7O0FBQ2hELEFBQVMsQUFDVCxBQUNBLEFBQVMsQUFBYyxBQUFjLEFBQWMsQUFBZTs7QUFDbEUsQUFBUyxBQUFzQjs7QUFDL0IsQUFBTyxBQUFNLEFBQXVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFDZixBLHlCQUNqQjt3QkFBQSxBQUFZLFdBQW1DO3lDQUE1QixBQUE0QjtZQUE1QixBQUE0Qix5REFBVCxBQUFTLFFBQUE7OzhCQUMzQzs7YUFBQSxBQUFLLGFBQUwsQUFBa0IsQUFBSSxBQUN0QjthQUFBLEFBQUssTUFBTCxBQUFXLEFBQ1g7YUFBQSxBQUFLLFlBQVksSUFBQSxBQUFJ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QUFDTjtZQURNLEFBQ0csTUFESCxBQUNXLEtBRFgsQUFDRyxBQUNmOztZQUFBLEFBQUksU0FBUyxLQUFBLEFBQUssVUFBVSxJQUFBLEFBQUksU0FBbkIsQUFBZSxBQUFhLEFBQ3pDO2VBQUEsQUFBTyxBQUNWO0E7OzhCQUNELEEsNkNBQWtCLEFBQ2Q7WUFBSSxLQUFKLEFBQVMsa0JBQWtCLEFBQ3ZCO2lCQUFBLEFBQUssaUJBQUwsQUFBc0IsQUFDekI7QUFDSjtBIiwiZmlsZSI6ImxpYi92bS91cGRhdGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGVhciwgbW92ZSBhcyBtb3ZlQm91bmRzIH0gZnJvbSAnLi4vYm91bmRzJztcbmltcG9ydCB7IEVsZW1lbnRTdGFjayB9IGZyb20gJy4uL2J1aWxkZXInO1xuaW1wb3J0IHsgU3RhY2ssIExpbmtlZExpc3QsIGRpY3QsIGV4cGVjdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgSXRlcmF0b3JTeW5jaHJvbml6ZXIsXG4vLyBUYWdzXG5jb21iaW5lLCBVcGRhdGFibGVUYWcsIGNvbWJpbmVTbGljZSwgQ09OU1RBTlRfVEFHLCBJTklUSUFMIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IFVwZGF0aW5nT3Bjb2RlIH0gZnJvbSAnLi4vb3Bjb2Rlcyc7XG5pbXBvcnQgVk0sIHsgRXZhbHVhdGlvblN0YWNrIH0gZnJvbSAnLi9hcHBlbmQnO1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBkYXRpbmdWTSB7XG4gICAgY29uc3RydWN0b3IoZW52LCB7IGFsd2F5c1JldmFsaWRhdGUgPSBmYWxzZSB9KSB7XG4gICAgICAgIHRoaXMuZnJhbWVTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLmVudiA9IGVudjtcbiAgICAgICAgdGhpcy5jb25zdGFudHMgPSBlbnYucHJvZ3JhbS5jb25zdGFudHM7XG4gICAgICAgIHRoaXMuZG9tID0gZW52LmdldERPTSgpO1xuICAgICAgICB0aGlzLmFsd2F5c1JldmFsaWRhdGUgPSBhbHdheXNSZXZhbGlkYXRlO1xuICAgIH1cbiAgICBleGVjdXRlKG9wY29kZXMsIGhhbmRsZXIpIHtcbiAgICAgICAgbGV0IHsgZnJhbWVTdGFjayB9ID0gdGhpcztcbiAgICAgICAgdGhpcy50cnkob3Bjb2RlcywgaGFuZGxlcik7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAoZnJhbWVTdGFjay5pc0VtcHR5KCkpIGJyZWFrO1xuICAgICAgICAgICAgbGV0IG9wY29kZSA9IHRoaXMuZnJhbWUubmV4dFN0YXRlbWVudCgpO1xuICAgICAgICAgICAgaWYgKG9wY29kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVTdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wY29kZS5ldmFsdWF0ZSh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZnJhbWUoKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5mcmFtZVN0YWNrLmN1cnJlbnQsICdidWc6IGV4cGVjdGVkIGEgZnJhbWUnKTtcbiAgICB9XG4gICAgZ290byhvcCkge1xuICAgICAgICB0aGlzLmZyYW1lLmdvdG8ob3ApO1xuICAgIH1cbiAgICB0cnkob3BzLCBoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuZnJhbWVTdGFjay5wdXNoKG5ldyBVcGRhdGluZ1ZNRnJhbWUodGhpcywgb3BzLCBoYW5kbGVyKSk7XG4gICAgfVxuICAgIHRocm93KCkge1xuICAgICAgICB0aGlzLmZyYW1lLmhhbmRsZUV4Y2VwdGlvbigpO1xuICAgICAgICB0aGlzLmZyYW1lU3RhY2sucG9wKCk7XG4gICAgfVxuICAgIGV2YWx1YXRlT3Bjb2RlKG9wY29kZSkge1xuICAgICAgICBvcGNvZGUuZXZhbHVhdGUodGhpcyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEJsb2NrT3Bjb2RlIGV4dGVuZHMgVXBkYXRpbmdPcGNvZGUge1xuICAgIGNvbnN0cnVjdG9yKHN0YXJ0LCBzdGF0ZSwgYm91bmRzLCBjaGlsZHJlbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMudHlwZSA9IFwiYmxvY2tcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgICAgICAgbGV0IHsgZW52LCBzY29wZSwgZHluYW1pY1Njb3BlLCBzdGFjayB9ID0gc3RhdGU7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICAgICAgdGhpcy5keW5hbWljU2NvcGUgPSBkeW5hbWljU2NvcGU7XG4gICAgICAgIHRoaXMuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxuICAgIHBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gICAgfVxuICAgIGZpcnN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmZpcnN0Tm9kZSgpO1xuICAgIH1cbiAgICBsYXN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmxhc3ROb2RlKCk7XG4gICAgfVxuICAgIGV2YWx1YXRlKHZtKSB7XG4gICAgICAgIHZtLnRyeSh0aGlzLmNoaWxkcmVuLCBudWxsKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMuZGVzdHJveSgpO1xuICAgIH1cbiAgICBkaWREZXN0cm95KCkge1xuICAgICAgICB0aGlzLmVudi5kaWREZXN0cm95KHRoaXMuYm91bmRzKTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgZGV0YWlscyA9IGRpY3QoKTtcbiAgICAgICAgZGV0YWlsc1tcImd1aWRcIl0gPSBgJHt0aGlzLl9ndWlkfWA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBndWlkOiB0aGlzLl9ndWlkLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgZGV0YWlscyxcbiAgICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLmNoaWxkcmVuLnRvQXJyYXkoKS5tYXAob3AgPT4gb3AudG9KU09OKCkpXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRyeU9wY29kZSBleHRlbmRzIEJsb2NrT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihzdGFydCwgc3RhdGUsIGJvdW5kcywgY2hpbGRyZW4pIHtcbiAgICAgICAgc3VwZXIoc3RhcnQsIHN0YXRlLCBib3VuZHMsIGNoaWxkcmVuKTtcbiAgICAgICAgdGhpcy50eXBlID0gXCJ0cnlcIjtcbiAgICAgICAgdGhpcy50YWcgPSB0aGlzLl90YWcgPSBVcGRhdGFibGVUYWcuY3JlYXRlKENPTlNUQU5UX1RBRyk7XG4gICAgfVxuICAgIGRpZEluaXRpYWxpemVDaGlsZHJlbigpIHtcbiAgICAgICAgdGhpcy5fdGFnLmlubmVyLnVwZGF0ZShjb21iaW5lU2xpY2UodGhpcy5jaGlsZHJlbikpO1xuICAgIH1cbiAgICBldmFsdWF0ZSh2bSkge1xuICAgICAgICB2bS50cnkodGhpcy5jaGlsZHJlbiwgdGhpcyk7XG4gICAgfVxuICAgIGhhbmRsZUV4Y2VwdGlvbigpIHtcbiAgICAgICAgbGV0IHsgZW52LCBib3VuZHMsIGNoaWxkcmVuLCBzY29wZSwgZHluYW1pY1Njb3BlLCBzdGFydCwgc3RhY2ssIHByZXYsIG5leHQgfSA9IHRoaXM7XG4gICAgICAgIGNoaWxkcmVuLmNsZWFyKCk7XG4gICAgICAgIGxldCBlbGVtZW50U3RhY2sgPSBFbGVtZW50U3RhY2sucmVzdW1lKGVudiwgYm91bmRzLCBib3VuZHMucmVzZXQoZW52KSk7XG4gICAgICAgIGxldCB2bSA9IG5ldyBWTShlbnYsIHNjb3BlLCBkeW5hbWljU2NvcGUsIGVsZW1lbnRTdGFjayk7XG4gICAgICAgIGxldCB1cGRhdGluZyA9IG5ldyBMaW5rZWRMaXN0KCk7XG4gICAgICAgIHZtLmV4ZWN1dGUoc3RhcnQsIHZtID0+IHtcbiAgICAgICAgICAgIHZtLnN0YWNrID0gRXZhbHVhdGlvblN0YWNrLnJlc3RvcmUoc3RhY2spO1xuICAgICAgICAgICAgdm0udXBkYXRpbmdPcGNvZGVTdGFjay5wdXNoKHVwZGF0aW5nKTtcbiAgICAgICAgICAgIHZtLnVwZGF0ZVdpdGgodGhpcyk7XG4gICAgICAgICAgICB2bS51cGRhdGluZ09wY29kZVN0YWNrLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcmV2ID0gcHJldjtcbiAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQganNvbiA9IHN1cGVyLnRvSlNPTigpO1xuICAgICAgICBsZXQgZGV0YWlscyA9IGpzb25bXCJkZXRhaWxzXCJdO1xuICAgICAgICBpZiAoIWRldGFpbHMpIHtcbiAgICAgICAgICAgIGRldGFpbHMgPSBqc29uW1wiZGV0YWlsc1wiXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci50b0pTT04oKTtcbiAgICB9XG59XG5jbGFzcyBMaXN0UmV2YWxpZGF0aW9uRGVsZWdhdGUge1xuICAgIGNvbnN0cnVjdG9yKG9wY29kZSwgbWFya2VyKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlID0gb3Bjb2RlO1xuICAgICAgICB0aGlzLm1hcmtlciA9IG1hcmtlcjtcbiAgICAgICAgdGhpcy5kaWRJbnNlcnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaWREZWxldGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXAgPSBvcGNvZGUubWFwO1xuICAgICAgICB0aGlzLnVwZGF0aW5nID0gb3Bjb2RlWydjaGlsZHJlbiddO1xuICAgIH1cbiAgICBpbnNlcnQoa2V5LCBpdGVtLCBtZW1vLCBiZWZvcmUpIHtcbiAgICAgICAgbGV0IHsgbWFwLCBvcGNvZGUsIHVwZGF0aW5nIH0gPSB0aGlzO1xuICAgICAgICBsZXQgbmV4dFNpYmxpbmcgPSBudWxsO1xuICAgICAgICBsZXQgcmVmZXJlbmNlID0gbnVsbDtcbiAgICAgICAgaWYgKGJlZm9yZSkge1xuICAgICAgICAgICAgcmVmZXJlbmNlID0gbWFwW2JlZm9yZV07XG4gICAgICAgICAgICBuZXh0U2libGluZyA9IHJlZmVyZW5jZVsnYm91bmRzJ10uZmlyc3ROb2RlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0U2libGluZyA9IHRoaXMubWFya2VyO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2bSA9IG9wY29kZS52bUZvckluc2VydGlvbihuZXh0U2libGluZyk7XG4gICAgICAgIGxldCB0cnlPcGNvZGUgPSBudWxsO1xuICAgICAgICBsZXQgeyBzdGFydCB9ID0gb3Bjb2RlO1xuICAgICAgICB2bS5leGVjdXRlKHN0YXJ0LCB2bSA9PiB7XG4gICAgICAgICAgICBtYXBba2V5XSA9IHRyeU9wY29kZSA9IHZtLml0ZXJhdGUobWVtbywgaXRlbSk7XG4gICAgICAgICAgICB2bS51cGRhdGluZ09wY29kZVN0YWNrLnB1c2gobmV3IExpbmtlZExpc3QoKSk7XG4gICAgICAgICAgICB2bS51cGRhdGVXaXRoKHRyeU9wY29kZSk7XG4gICAgICAgICAgICB2bS51cGRhdGluZ09wY29kZVN0YWNrLnB1c2godHJ5T3Bjb2RlLmNoaWxkcmVuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0aW5nLmluc2VydEJlZm9yZSh0cnlPcGNvZGUsIHJlZmVyZW5jZSk7XG4gICAgICAgIHRoaXMuZGlkSW5zZXJ0ID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0YWluKF9rZXksIF9pdGVtLCBfbWVtbykge31cbiAgICBtb3ZlKGtleSwgX2l0ZW0sIF9tZW1vLCBiZWZvcmUpIHtcbiAgICAgICAgbGV0IHsgbWFwLCB1cGRhdGluZyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGVudHJ5ID0gbWFwW2tleV07XG4gICAgICAgIGxldCByZWZlcmVuY2UgPSBtYXBbYmVmb3JlXSB8fCBudWxsO1xuICAgICAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgICAgICBtb3ZlQm91bmRzKGVudHJ5LCByZWZlcmVuY2UuZmlyc3ROb2RlKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW92ZUJvdW5kcyhlbnRyeSwgdGhpcy5tYXJrZXIpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0aW5nLnJlbW92ZShlbnRyeSk7XG4gICAgICAgIHVwZGF0aW5nLmluc2VydEJlZm9yZShlbnRyeSwgcmVmZXJlbmNlKTtcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICBsZXQgeyBtYXAgfSA9IHRoaXM7XG4gICAgICAgIGxldCBvcGNvZGUgPSBtYXBba2V5XTtcbiAgICAgICAgb3Bjb2RlLmRpZERlc3Ryb3koKTtcbiAgICAgICAgY2xlYXIob3Bjb2RlKTtcbiAgICAgICAgdGhpcy51cGRhdGluZy5yZW1vdmUob3Bjb2RlKTtcbiAgICAgICAgZGVsZXRlIG1hcFtrZXldO1xuICAgICAgICB0aGlzLmRpZERlbGV0ZSA9IHRydWU7XG4gICAgfVxuICAgIGRvbmUoKSB7XG4gICAgICAgIHRoaXMub3Bjb2RlLmRpZEluaXRpYWxpemVDaGlsZHJlbih0aGlzLmRpZEluc2VydCB8fCB0aGlzLmRpZERlbGV0ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIExpc3RCbG9ja09wY29kZSBleHRlbmRzIEJsb2NrT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihzdGFydCwgc3RhdGUsIGJvdW5kcywgY2hpbGRyZW4sIGFydGlmYWN0cykge1xuICAgICAgICBzdXBlcihzdGFydCwgc3RhdGUsIGJvdW5kcywgY2hpbGRyZW4pO1xuICAgICAgICB0aGlzLnR5cGUgPSBcImxpc3QtYmxvY2tcIjtcbiAgICAgICAgdGhpcy5tYXAgPSBkaWN0KCk7XG4gICAgICAgIHRoaXMubGFzdEl0ZXJhdGVkID0gSU5JVElBTDtcbiAgICAgICAgdGhpcy5hcnRpZmFjdHMgPSBhcnRpZmFjdHM7XG4gICAgICAgIGxldCBfdGFnID0gdGhpcy5fdGFnID0gVXBkYXRhYmxlVGFnLmNyZWF0ZShDT05TVEFOVF9UQUcpO1xuICAgICAgICB0aGlzLnRhZyA9IGNvbWJpbmUoW2FydGlmYWN0cy50YWcsIF90YWddKTtcbiAgICB9XG4gICAgZGlkSW5pdGlhbGl6ZUNoaWxkcmVuKGxpc3REaWRDaGFuZ2UgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMubGFzdEl0ZXJhdGVkID0gdGhpcy5hcnRpZmFjdHMudGFnLnZhbHVlKCk7XG4gICAgICAgIGlmIChsaXN0RGlkQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl90YWcuaW5uZXIudXBkYXRlKGNvbWJpbmVTbGljZSh0aGlzLmNoaWxkcmVuKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXZhbHVhdGUodm0pIHtcbiAgICAgICAgbGV0IHsgYXJ0aWZhY3RzLCBsYXN0SXRlcmF0ZWQgfSA9IHRoaXM7XG4gICAgICAgIGlmICghYXJ0aWZhY3RzLnRhZy52YWxpZGF0ZShsYXN0SXRlcmF0ZWQpKSB7XG4gICAgICAgICAgICBsZXQgeyBib3VuZHMgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgeyBkb20gfSA9IHZtO1xuICAgICAgICAgICAgbGV0IG1hcmtlciA9IGRvbS5jcmVhdGVDb21tZW50KCcnKTtcbiAgICAgICAgICAgIGRvbS5pbnNlcnRBZnRlcihib3VuZHMucGFyZW50RWxlbWVudCgpLCBtYXJrZXIsIGV4cGVjdChib3VuZHMubGFzdE5vZGUoKSwgXCJjYW4ndCBpbnNlcnQgYWZ0ZXIgYW4gZW1wdHkgYm91bmRzXCIpKTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBuZXcgTGlzdFJldmFsaWRhdGlvbkRlbGVnYXRlKHRoaXMsIG1hcmtlcik7XG4gICAgICAgICAgICBsZXQgc3luY2hyb25pemVyID0gbmV3IEl0ZXJhdG9yU3luY2hyb25pemVyKHsgdGFyZ2V0LCBhcnRpZmFjdHMgfSk7XG4gICAgICAgICAgICBzeW5jaHJvbml6ZXIuc3luYygpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50KCkucmVtb3ZlQ2hpbGQobWFya2VyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSdW4gbm93LXVwZGF0ZWQgdXBkYXRpbmcgb3Bjb2Rlc1xuICAgICAgICBzdXBlci5ldmFsdWF0ZSh2bSk7XG4gICAgfVxuICAgIHZtRm9ySW5zZXJ0aW9uKG5leHRTaWJsaW5nKSB7XG4gICAgICAgIGxldCB7IGVudiwgc2NvcGUsIGR5bmFtaWNTY29wZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IGVsZW1lbnRTdGFjayA9IEVsZW1lbnRTdGFjay5mb3JJbml0aWFsUmVuZGVyKHRoaXMuZW52LCB0aGlzLmJvdW5kcy5wYXJlbnRFbGVtZW50KCksIG5leHRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBWTShlbnYsIHNjb3BlLCBkeW5hbWljU2NvcGUsIGVsZW1lbnRTdGFjayk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IGpzb24gPSBzdXBlci50b0pTT04oKTtcbiAgICAgICAgbGV0IG1hcCA9IHRoaXMubWFwO1xuICAgICAgICBsZXQgaW5uZXIgPSBPYmplY3Qua2V5cyhtYXApLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke0pTT04uc3RyaW5naWZ5KGtleSl9OiAke21hcFtrZXldLl9ndWlkfWA7XG4gICAgICAgIH0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgbGV0IGRldGFpbHMgPSBqc29uW1wiZGV0YWlsc1wiXTtcbiAgICAgICAgaWYgKCFkZXRhaWxzKSB7XG4gICAgICAgICAgICBkZXRhaWxzID0ganNvbltcImRldGFpbHNcIl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBkZXRhaWxzW1wibWFwXCJdID0gYHske2lubmVyfX1gO1xuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG59XG5jbGFzcyBVcGRhdGluZ1ZNRnJhbWUge1xuICAgIGNvbnN0cnVjdG9yKHZtLCBvcHMsIGV4Y2VwdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy52bSA9IHZtO1xuICAgICAgICB0aGlzLm9wcyA9IG9wcztcbiAgICAgICAgdGhpcy5leGNlcHRpb25IYW5kbGVyID0gZXhjZXB0aW9uSGFuZGxlcjtcbiAgICAgICAgdGhpcy52bSA9IHZtO1xuICAgICAgICB0aGlzLm9wcyA9IG9wcztcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gb3BzLmhlYWQoKTtcbiAgICB9XG4gICAgZ290byhvcCkge1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBvcDtcbiAgICB9XG4gICAgbmV4dFN0YXRlbWVudCgpIHtcbiAgICAgICAgbGV0IHsgY3VycmVudCwgb3BzIH0gPSB0aGlzO1xuICAgICAgICBpZiAoY3VycmVudCkgdGhpcy5jdXJyZW50ID0gb3BzLm5leHROb2RlKGN1cnJlbnQpO1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgaGFuZGxlRXhjZXB0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5leGNlcHRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXhjZXB0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG59Il19