UNPKG

ember-legacy-class-transform

Version:
400 lines (320 loc) 39.5 kB
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 _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; } 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"); } } import { assert } from "@glimmer/util"; import { Stack, DictSet } from "@glimmer/util"; import { Statements, Ops } from '@glimmer/wire-format'; export var Block = function () { function Block() { _classCallCheck(this, Block); this.statements = []; } Block.prototype.push = function push(statement) { this.statements.push(statement); }; return Block; }(); export var InlineBlock = function (_Block) { _inherits(InlineBlock, _Block); function InlineBlock(table) { _classCallCheck(this, InlineBlock); var _this = _possibleConstructorReturn(this, _Block.call(this)); _this.table = table; return _this; } InlineBlock.prototype.toJSON = function toJSON() { return { statements: this.statements, parameters: this.table.slots }; }; return InlineBlock; }(Block); export var TemplateBlock = function (_Block2) { _inherits(TemplateBlock, _Block2); function TemplateBlock(symbolTable) { _classCallCheck(this, TemplateBlock); var _this2 = _possibleConstructorReturn(this, _Block2.call(this)); _this2.symbolTable = symbolTable; _this2.type = "template"; _this2.yields = new DictSet(); _this2.named = new DictSet(); _this2.blocks = []; _this2.hasEval = false; return _this2; } TemplateBlock.prototype.push = function push(statement) { this.statements.push(statement); }; TemplateBlock.prototype.toJSON = function toJSON() { return { symbols: this.symbolTable.symbols, statements: this.statements, hasEval: this.hasEval }; }; return TemplateBlock; }(Block); export var ComponentBlock = function (_Block3) { _inherits(ComponentBlock, _Block3); function ComponentBlock(table) { _classCallCheck(this, ComponentBlock); var _this3 = _possibleConstructorReturn(this, _Block3.call(this)); _this3.table = table; _this3.attributes = []; _this3.arguments = []; _this3.inParams = true; _this3.positionals = []; return _this3; } ComponentBlock.prototype.push = function push(statement) { if (this.inParams) { if (Statements.isFlushElement(statement)) { this.inParams = false; } else if (Statements.isArgument(statement)) { this.arguments.push(statement); } else if (Statements.isAttribute(statement)) { this.attributes.push(statement); } else if (Statements.isModifier(statement)) { throw new Error('Compile Error: Element modifiers are not allowed in components'); } else { throw new Error('Compile Error: only parameters allowed before flush-element'); } } else { this.statements.push(statement); } }; ComponentBlock.prototype.toJSON = function toJSON() { var args = this.arguments; var keys = args.map(function (arg) { return arg[1]; }); var values = args.map(function (arg) { return arg[2]; }); return [this.attributes, [keys, values], { statements: this.statements, parameters: this.table.slots }]; }; return ComponentBlock; }(Block); export var Template = function () { function Template(symbols, meta) { _classCallCheck(this, Template); this.meta = meta; this.block = new TemplateBlock(symbols); } Template.prototype.toJSON = function toJSON() { return { block: this.block.toJSON(), meta: this.meta }; }; return Template; }(); var JavaScriptCompiler = function () { function JavaScriptCompiler(opcodes, symbols, meta) { _classCallCheck(this, JavaScriptCompiler); this.blocks = new Stack(); this.values = []; this.opcodes = opcodes; this.template = new Template(symbols, meta); } JavaScriptCompiler.process = function process(opcodes, symbols, meta) { var compiler = new JavaScriptCompiler(opcodes, symbols, meta); return compiler.process(); }; JavaScriptCompiler.prototype.process = function process() { var _this4 = this; this.opcodes.forEach(function (_ref) { var opcode = _ref[0], args = _ref.slice(1); if (!_this4[opcode]) { throw new Error("unimplemented " + opcode + " on JavaScriptCompiler"); } _this4[opcode].apply(_this4, args); }); return this.template; }; /// Nesting JavaScriptCompiler.prototype.startBlock = function startBlock(_ref2) { var program = _ref2[0]; var block = new InlineBlock(program['symbols']); this.blocks.push(block); }; JavaScriptCompiler.prototype.endBlock = function endBlock() { var template = this.template, blocks = this.blocks; var block = blocks.pop(); template.block.blocks.push(block.toJSON()); }; JavaScriptCompiler.prototype.startProgram = function startProgram() { this.blocks.push(this.template.block); }; JavaScriptCompiler.prototype.endProgram = function endProgram() {}; /// Statements JavaScriptCompiler.prototype.text = function text(content) { this.push([Ops.Text, content]); }; JavaScriptCompiler.prototype.append = function append(trusted) { this.push([Ops.Append, this.popValue(), trusted]); }; JavaScriptCompiler.prototype.comment = function comment(value) { this.push([Ops.Comment, value]); }; JavaScriptCompiler.prototype.modifier = function modifier(name) { var params = this.popValue(); var hash = this.popValue(); this.push([Ops.Modifier, name, params, hash]); }; JavaScriptCompiler.prototype.block = function block(name, template, inverse) { var params = this.popValue(); var hash = this.popValue(); var blocks = this.template.block.blocks; assert(typeof template !== 'number' || blocks[template] !== null, 'missing block in the compiler'); assert(typeof inverse !== 'number' || blocks[inverse] !== null, 'missing block in the compiler'); this.push([Ops.Block, name, params, hash, blocks[template], blocks[inverse]]); }; JavaScriptCompiler.prototype.openElement = function openElement(element) { var tag = element.tag; if (tag.indexOf('-') !== -1) { this.startComponent(element); } else if (element.blockParams.length > 0) { throw new Error("Compile Error: <" + element.tag + "> is not a component and doesn't support block parameters"); } else { this.push([Ops.OpenElement, tag]); } }; JavaScriptCompiler.prototype.flushElement = function flushElement() { this.push([Ops.FlushElement]); }; JavaScriptCompiler.prototype.closeElement = function closeElement(element) { var tag = element.tag; if (tag.indexOf('-') !== -1) { var _endComponent = this.endComponent(), attrs = _endComponent[0], args = _endComponent[1], block = _endComponent[2]; this.push([Ops.Component, tag, attrs, args, block]); } else { this.push([Ops.CloseElement]); } }; JavaScriptCompiler.prototype.staticAttr = function staticAttr(name, namespace) { var value = this.popValue(); this.push([Ops.StaticAttr, name, value, namespace]); }; JavaScriptCompiler.prototype.dynamicAttr = function dynamicAttr(name, namespace) { var value = this.popValue(); this.push([Ops.DynamicAttr, name, value, namespace]); }; JavaScriptCompiler.prototype.trustingAttr = function trustingAttr(name, namespace) { var value = this.popValue(); this.push([Ops.TrustingAttr, name, value, namespace]); }; JavaScriptCompiler.prototype.staticArg = function staticArg(name) { var value = this.popValue(); this.push([Ops.StaticArg, name, value]); }; JavaScriptCompiler.prototype.dynamicArg = function dynamicArg(name) { var value = this.popValue(); this.push([Ops.DynamicArg, name, value]); }; JavaScriptCompiler.prototype.yield = function _yield(to) { var params = this.popValue(); this.push([Ops.Yield, to, params]); }; JavaScriptCompiler.prototype.debugger = function _debugger(evalInfo) { this.push([Ops.Debugger, evalInfo]); this.template.block.hasEval = true; }; JavaScriptCompiler.prototype.hasBlock = function hasBlock(name) { this.pushValue([Ops.HasBlock, name]); }; JavaScriptCompiler.prototype.hasBlockParams = function hasBlockParams(name) { this.pushValue([Ops.HasBlockParams, name]); }; JavaScriptCompiler.prototype.partial = function partial(evalInfo) { var params = this.popValue(); this.push([Ops.Partial, params[0], evalInfo]); this.template.block.hasEval = true; }; /// Expressions JavaScriptCompiler.prototype.literal = function literal(value) { if (value === undefined) { this.pushValue([Ops.Undefined]); } else { this.pushValue(value); } }; JavaScriptCompiler.prototype.unknown = function unknown(name) { this.pushValue([Ops.Unknown, name]); }; JavaScriptCompiler.prototype.get = function get(head, path) { this.pushValue([Ops.Get, head, path]); }; JavaScriptCompiler.prototype.maybeLocal = function maybeLocal(path) { this.pushValue([Ops.MaybeLocal, path]); }; JavaScriptCompiler.prototype.concat = function concat() { this.pushValue([Ops.Concat, this.popValue()]); }; JavaScriptCompiler.prototype.helper = function helper(name) { var params = this.popValue(); var hash = this.popValue(); this.pushValue([Ops.Helper, name, params, hash]); }; /// Stack Management Opcodes JavaScriptCompiler.prototype.startComponent = function startComponent(element) { var component = new ComponentBlock(element['symbols']); this.blocks.push(component); }; JavaScriptCompiler.prototype.endComponent = function endComponent() { var component = this.blocks.pop(); assert(component instanceof ComponentBlock, "Compiler bug: endComponent() should end a component"); return component.toJSON(); }; JavaScriptCompiler.prototype.prepareArray = function prepareArray(size) { var values = []; for (var i = 0; i < size; i++) { values.push(this.popValue()); } this.pushValue(values); }; JavaScriptCompiler.prototype.prepareObject = function prepareObject(size) { assert(this.values.length >= size, "Expected " + size + " values on the stack, found " + this.values.length); var keys = new Array(size); var values = new Array(size); for (var i = 0; i < size; i++) { keys[i] = this.popValue(); values[i] = this.popValue(); } this.pushValue([keys, values]); }; /// Utilities JavaScriptCompiler.prototype.push = function push(args) { while (args[args.length - 1] === null) { args.pop(); } this.currentBlock.push(args); }; JavaScriptCompiler.prototype.pushValue = function pushValue(val) { this.values.push(val); }; JavaScriptCompiler.prototype.popValue = function popValue() { assert(this.values.length, "No expression found on stack"); return this.values.pop(); }; _createClass(JavaScriptCompiler, [{ key: "currentBlock", get: function () { return this.blocks.current; } }]); return JavaScriptCompiler; }(); export default JavaScriptCompiler; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9qYXZhc2NyaXB0LWNvbXBpbGVyLmpzIl0sIm5hbWVzIjpbImFzc2VydCIsIlN0YWNrIiwiRGljdFNldCIsIlN0YXRlbWVudHMiLCJPcHMiLCJCbG9jayIsInN0YXRlbWVudHMiLCJwdXNoIiwic3RhdGVtZW50IiwiSW5saW5lQmxvY2siLCJ0YWJsZSIsInRvSlNPTiIsInBhcmFtZXRlcnMiLCJzbG90cyIsIlRlbXBsYXRlQmxvY2siLCJzeW1ib2xUYWJsZSIsInR5cGUiLCJ5aWVsZHMiLCJuYW1lZCIsImJsb2NrcyIsImhhc0V2YWwiLCJzeW1ib2xzIiwiQ29tcG9uZW50QmxvY2siLCJhdHRyaWJ1dGVzIiwiYXJndW1lbnRzIiwiaW5QYXJhbXMiLCJwb3NpdGlvbmFscyIsImlzRmx1c2hFbGVtZW50IiwiaXNBcmd1bWVudCIsImlzQXR0cmlidXRlIiwiaXNNb2RpZmllciIsIkVycm9yIiwiYXJncyIsImtleXMiLCJtYXAiLCJhcmciLCJ2YWx1ZXMiLCJUZW1wbGF0ZSIsIm1ldGEiLCJibG9jayIsIkphdmFTY3JpcHRDb21waWxlciIsIm9wY29kZXMiLCJ0ZW1wbGF0ZSIsInByb2Nlc3MiLCJjb21waWxlciIsImZvckVhY2giLCJvcGNvZGUiLCJzdGFydEJsb2NrIiwicHJvZ3JhbSIsImVuZEJsb2NrIiwicG9wIiwic3RhcnRQcm9ncmFtIiwiZW5kUHJvZ3JhbSIsInRleHQiLCJjb250ZW50IiwiVGV4dCIsImFwcGVuZCIsInRydXN0ZWQiLCJBcHBlbmQiLCJwb3BWYWx1ZSIsImNvbW1lbnQiLCJ2YWx1ZSIsIkNvbW1lbnQiLCJtb2RpZmllciIsIm5hbWUiLCJwYXJhbXMiLCJoYXNoIiwiTW9kaWZpZXIiLCJpbnZlcnNlIiwib3BlbkVsZW1lbnQiLCJlbGVtZW50IiwidGFnIiwiaW5kZXhPZiIsInN0YXJ0Q29tcG9uZW50IiwiYmxvY2tQYXJhbXMiLCJsZW5ndGgiLCJPcGVuRWxlbWVudCIsImZsdXNoRWxlbWVudCIsIkZsdXNoRWxlbWVudCIsImNsb3NlRWxlbWVudCIsImVuZENvbXBvbmVudCIsImF0dHJzIiwiQ29tcG9uZW50IiwiQ2xvc2VFbGVtZW50Iiwic3RhdGljQXR0ciIsIm5hbWVzcGFjZSIsIlN0YXRpY0F0dHIiLCJkeW5hbWljQXR0ciIsIkR5bmFtaWNBdHRyIiwidHJ1c3RpbmdBdHRyIiwiVHJ1c3RpbmdBdHRyIiwic3RhdGljQXJnIiwiU3RhdGljQXJnIiwiZHluYW1pY0FyZyIsIkR5bmFtaWNBcmciLCJ5aWVsZCIsInRvIiwiWWllbGQiLCJkZWJ1Z2dlciIsImV2YWxJbmZvIiwiRGVidWdnZXIiLCJoYXNCbG9jayIsInB1c2hWYWx1ZSIsIkhhc0Jsb2NrIiwiaGFzQmxvY2tQYXJhbXMiLCJIYXNCbG9ja1BhcmFtcyIsInBhcnRpYWwiLCJQYXJ0aWFsIiwibGl0ZXJhbCIsInVuZGVmaW5lZCIsIlVuZGVmaW5lZCIsInVua25vd24iLCJVbmtub3duIiwiZ2V0IiwiaGVhZCIsInBhdGgiLCJHZXQiLCJtYXliZUxvY2FsIiwiTWF5YmVMb2NhbCIsImNvbmNhdCIsIkNvbmNhdCIsImhlbHBlciIsIkhlbHBlciIsImNvbXBvbmVudCIsInByZXBhcmVBcnJheSIsInNpemUiLCJpIiwicHJlcGFyZU9iamVjdCIsIkFycmF5IiwiY3VycmVudEJsb2NrIiwidmFsIiwiY3VycmVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLFNBQVNBLE1BQVQsUUFBdUIsZUFBdkI7QUFDQSxTQUFTQyxLQUFULEVBQWdCQyxPQUFoQixRQUF1QyxlQUF2QztBQUNBLFNBQVNDLFVBQVQsRUFBcUJDLEdBQXJCLFFBQWdDLHNCQUFoQztBQUNBLFdBQWFDLEtBQWI7QUFDSSxxQkFBYztBQUFBOztBQUNWLGFBQUtDLFVBQUwsR0FBa0IsRUFBbEI7QUFDSDs7QUFITCxvQkFJSUMsSUFKSixpQkFJU0MsU0FKVCxFQUlvQjtBQUNaLGFBQUtGLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCQyxTQUFyQjtBQUNILEtBTkw7O0FBQUE7QUFBQTtBQVFBLFdBQWFDLFdBQWI7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Q0FBbkIsTUFBMEIsSUFBakMsRUFBdUM7QUFDbkMzQyxpQkFBS2tCLEdBQUw7QUFDSDtBQUNELGFBQUsrRSxZQUFMLENBQWtCMUgsSUFBbEIsQ0FBdUJ5QixJQUF2QjtBQUNILEs7O2lDQUNEc0UsUyxzQkFBVTRCLEcsRUFBSztBQUNYLGFBQUs5RixNQUFMLENBQVk3QixJQUFaLENBQWlCMkgsR0FBakI7QUFDSCxLOztpQ0FDRHZFLFEsdUJBQVc7QUFDUDNELGVBQU8sS0FBS29DLE1BQUwsQ0FBWXVDLE1BQW5CLEVBQTJCLDhCQUEzQjtBQUNBLGVBQU8sS0FBS3ZDLE1BQUwsQ0FBWWMsR0FBWixFQUFQO0FBQ0gsSzs7Ozt5QkEvS2tCO0FBQ2YsbUJBQWMsS0FBSy9CLE1BQUwsQ0FBWWdILE9BQTFCO0FBQ0g7Ozs7OztlQWJnQjNGLGtCIiwiZmlsZSI6ImxpYi9qYXZhc2NyaXB0LWNvbXBpbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIkBnbGltbWVyL3V0aWxcIjtcbmltcG9ydCB7IFN0YWNrLCBEaWN0U2V0LCBleHBlY3QgfSBmcm9tIFwiQGdsaW1tZXIvdXRpbFwiO1xuaW1wb3J0IHsgU3RhdGVtZW50cywgT3BzIH0gZnJvbSAnQGdsaW1tZXIvd2lyZS1mb3JtYXQnO1xuZXhwb3J0IGNsYXNzIEJsb2NrIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzID0gW107XG4gICAgfVxuICAgIHB1c2goc3RhdGVtZW50KSB7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIElubGluZUJsb2NrIGV4dGVuZHMgQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKHRhYmxlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdGVtZW50czogdGhpcy5zdGF0ZW1lbnRzLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogdGhpcy50YWJsZS5zbG90c1xuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUJsb2NrIGV4dGVuZHMgQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKHN5bWJvbFRhYmxlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc3ltYm9sVGFibGUgPSBzeW1ib2xUYWJsZTtcbiAgICAgICAgdGhpcy50eXBlID0gXCJ0ZW1wbGF0ZVwiO1xuICAgICAgICB0aGlzLnlpZWxkcyA9IG5ldyBEaWN0U2V0KCk7XG4gICAgICAgIHRoaXMubmFtZWQgPSBuZXcgRGljdFNldCgpO1xuICAgICAgICB0aGlzLmJsb2NrcyA9IFtdO1xuICAgICAgICB0aGlzLmhhc0V2YWwgPSBmYWxzZTtcbiAgICB9XG4gICAgcHVzaChzdGF0ZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3ltYm9sczogdGhpcy5zeW1ib2xUYWJsZS5zeW1ib2xzLFxuICAgICAgICAgICAgc3RhdGVtZW50czogdGhpcy5zdGF0ZW1lbnRzLFxuICAgICAgICAgICAgaGFzRXZhbDogdGhpcy5oYXNFdmFsXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEJsb2NrIGV4dGVuZHMgQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKHRhYmxlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gW107XG4gICAgICAgIHRoaXMuYXJndW1lbnRzID0gW107XG4gICAgICAgIHRoaXMuaW5QYXJhbXMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBvc2l0aW9uYWxzID0gW107XG4gICAgfVxuICAgIHB1c2goc3RhdGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmluUGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAoU3RhdGVtZW50cy5pc0ZsdXNoRWxlbWVudChzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pblBhcmFtcyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChTdGF0ZW1lbnRzLmlzQXJndW1lbnQoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJndW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoU3RhdGVtZW50cy5pc0F0dHJpYnV0ZShzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnB1c2goc3RhdGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoU3RhdGVtZW50cy5pc01vZGlmaWVyKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBpbGUgRXJyb3I6IEVsZW1lbnQgbW9kaWZpZXJzIGFyZSBub3QgYWxsb3dlZCBpbiBjb21wb25lbnRzJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcGlsZSBFcnJvcjogb25seSBwYXJhbWV0ZXJzIGFsbG93ZWQgYmVmb3JlIGZsdXNoLWVsZW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBsZXQgYXJncyA9IHRoaXMuYXJndW1lbnRzO1xuICAgICAgICBsZXQga2V5cyA9IGFyZ3MubWFwKGFyZyA9PiBhcmdbMV0pO1xuICAgICAgICBsZXQgdmFsdWVzID0gYXJncy5tYXAoYXJnID0+IGFyZ1syXSk7XG4gICAgICAgIHJldHVybiBbdGhpcy5hdHRyaWJ1dGVzLCBba2V5cywgdmFsdWVzXSwge1xuICAgICAgICAgICAgc3RhdGVtZW50czogdGhpcy5zdGF0ZW1lbnRzLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogdGhpcy50YWJsZS5zbG90c1xuICAgICAgICB9XTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVGVtcGxhdGUge1xuICAgIGNvbnN0cnVjdG9yKHN5bWJvbHMsIG1ldGEpIHtcbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgICAgICAgdGhpcy5ibG9jayA9IG5ldyBUZW1wbGF0ZUJsb2NrKHN5bWJvbHMpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBibG9jazogdGhpcy5ibG9jay50b0pTT04oKSxcbiAgICAgICAgICAgIG1ldGE6IHRoaXMubWV0YVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEphdmFTY3JpcHRDb21waWxlciB7XG4gICAgY29uc3RydWN0b3Iob3Bjb2Rlcywgc3ltYm9scywgbWV0YSkge1xuICAgICAgICB0aGlzLmJsb2NrcyA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IFtdO1xuICAgICAgICB0aGlzLm9wY29kZXMgPSBvcGNvZGVzO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHN5bWJvbHMsIG1ldGEpO1xuICAgIH1cbiAgICBzdGF0aWMgcHJvY2VzcyhvcGNvZGVzLCBzeW1ib2xzLCBtZXRhKSB7XG4gICAgICAgIGxldCBjb21waWxlciA9IG5ldyBKYXZhU2NyaXB0Q29tcGlsZXIob3Bjb2Rlcywgc3ltYm9scywgbWV0YSk7XG4gICAgICAgIHJldHVybiBjb21waWxlci5wcm9jZXNzKCk7XG4gICAgfVxuICAgIGdldCBjdXJyZW50QmxvY2soKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja3MuY3VycmVudCwgJ0V4cGVjdGVkIGEgYmxvY2sgb24gdGhlIHN0YWNrJyk7XG4gICAgfVxuICAgIHByb2Nlc3MoKSB7XG4gICAgICAgIHRoaXMub3Bjb2Rlcy5mb3JFYWNoKChbb3Bjb2RlLCAuLi5hcmdzXSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzW29wY29kZV0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaW1wbGVtZW50ZWQgJHtvcGNvZGV9IG9uIEphdmFTY3JpcHRDb21waWxlcmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1tvcGNvZGVdKC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGU7XG4gICAgfVxuICAgIC8vLyBOZXN0aW5nXG4gICAgc3RhcnRCbG9jayhbcHJvZ3JhbV0pIHtcbiAgICAgICAgbGV0IGJsb2NrID0gbmV3IElubGluZUJsb2NrKHByb2dyYW1bJ3N5bWJvbHMnXSk7XG4gICAgICAgIHRoaXMuYmxvY2tzLnB1c2goYmxvY2spO1xuICAgIH1cbiAgICBlbmRCbG9jaygpIHtcbiAgICAgICAgbGV0IHsgdGVtcGxhdGUsIGJsb2NrcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGJsb2NrID0gYmxvY2tzLnBvcCgpO1xuICAgICAgICB0ZW1wbGF0ZS5ibG9jay5ibG9ja3MucHVzaChibG9jay50b0pTT04oKSk7XG4gICAgfVxuICAgIHN0YXJ0UHJvZ3JhbSgpIHtcbiAgICAgICAgdGhpcy5ibG9ja3MucHVzaCh0aGlzLnRlbXBsYXRlLmJsb2NrKTtcbiAgICB9XG4gICAgZW5kUHJvZ3JhbSgpIHt9XG4gICAgLy8vIFN0YXRlbWVudHNcbiAgICB0ZXh0KGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuVGV4dCwgY29udGVudF0pO1xuICAgIH1cbiAgICBhcHBlbmQodHJ1c3RlZCkge1xuICAgICAgICB0aGlzLnB1c2goW09wcy5BcHBlbmQsIHRoaXMucG9wVmFsdWUoKSwgdHJ1c3RlZF0pO1xuICAgIH1cbiAgICBjb21tZW50KHZhbHVlKSB7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLkNvbW1lbnQsIHZhbHVlXSk7XG4gICAgfVxuICAgIG1vZGlmaWVyKG5hbWUpIHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgbGV0IGhhc2ggPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLk1vZGlmaWVyLCBuYW1lLCBwYXJhbXMsIGhhc2hdKTtcbiAgICB9XG4gICAgYmxvY2sobmFtZSwgdGVtcGxhdGUsIGludmVyc2UpIHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgbGV0IGhhc2ggPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIGxldCBibG9ja3MgPSB0aGlzLnRlbXBsYXRlLmJsb2NrLmJsb2NrcztcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB0ZW1wbGF0ZSAhPT0gJ251bWJlcicgfHwgYmxvY2tzW3RlbXBsYXRlXSAhPT0gbnVsbCwgJ21pc3NpbmcgYmxvY2sgaW4gdGhlIGNvbXBpbGVyJyk7XG4gICAgICAgIGFzc2VydCh0eXBlb2YgaW52ZXJzZSAhPT0gJ251bWJlcicgfHwgYmxvY2tzW2ludmVyc2VdICE9PSBudWxsLCAnbWlzc2luZyBibG9jayBpbiB0aGUgY29tcGlsZXInKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuQmxvY2ssIG5hbWUsIHBhcmFtcywgaGFzaCwgYmxvY2tzW3RlbXBsYXRlXSwgYmxvY2tzW2ludmVyc2VdXSk7XG4gICAgfVxuICAgIG9wZW5FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHRhZyA9IGVsZW1lbnQudGFnO1xuICAgICAgICBpZiAodGFnLmluZGV4T2YoJy0nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRDb21wb25lbnQoZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ibG9ja1BhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbXBpbGUgRXJyb3I6IDwke2VsZW1lbnQudGFnfT4gaXMgbm90IGEgY29tcG9uZW50IGFuZCBkb2Vzbid0IHN1cHBvcnQgYmxvY2sgcGFyYW1ldGVyc2ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wdXNoKFtPcHMuT3BlbkVsZW1lbnQsIHRhZ10pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZsdXNoRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRmx1c2hFbGVtZW50XSk7XG4gICAgfVxuICAgIGNsb3NlRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0YWcgPSBlbGVtZW50LnRhZztcbiAgICAgICAgaWYgKHRhZy5pbmRleE9mKCctJykgIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgW2F0dHJzLCBhcmdzLCBibG9ja10gPSB0aGlzLmVuZENvbXBvbmVudCgpO1xuICAgICAgICAgICAgdGhpcy5wdXNoKFtPcHMuQ29tcG9uZW50LCB0YWcsIGF0dHJzLCBhcmdzLCBibG9ja10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wdXNoKFtPcHMuQ2xvc2VFbGVtZW50XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljQXR0cihuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICB0aGlzLnB1c2goW09wcy5TdGF0aWNBdHRyLCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlXSk7XG4gICAgfVxuICAgIGR5bmFtaWNBdHRyKG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLkR5bmFtaWNBdHRyLCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlXSk7XG4gICAgfVxuICAgIHRydXN0aW5nQXR0cihuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICB0aGlzLnB1c2goW09wcy5UcnVzdGluZ0F0dHIsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2VdKTtcbiAgICB9XG4gICAgc3RhdGljQXJnKG5hbWUpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICB0aGlzLnB1c2goW09wcy5TdGF0aWNBcmcsIG5hbWUsIHZhbHVlXSk7XG4gICAgfVxuICAgIGR5bmFtaWNBcmcobmFtZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLkR5bmFtaWNBcmcsIG5hbWUsIHZhbHVlXSk7XG4gICAgfVxuICAgIHlpZWxkKHRvKSB7XG4gICAgICAgIGxldCBwYXJhbXMgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLllpZWxkLCB0bywgcGFyYW1zXSk7XG4gICAgfVxuICAgIGRlYnVnZ2VyKGV2YWxJbmZvKSB7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLkRlYnVnZ2VyLCBldmFsSW5mb10pO1xuICAgICAgICB0aGlzLnRlbXBsYXRlLmJsb2NrLmhhc0V2YWwgPSB0cnVlO1xuICAgIH1cbiAgICBoYXNCbG9jayhuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuSGFzQmxvY2ssIG5hbWVdKTtcbiAgICB9XG4gICAgaGFzQmxvY2tQYXJhbXMobmFtZSkge1xuICAgICAgICB0aGlzLnB1c2hWYWx1ZShbT3BzLkhhc0Jsb2NrUGFyYW1zLCBuYW1lXSk7XG4gICAgfVxuICAgIHBhcnRpYWwoZXZhbEluZm8pIHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuUGFydGlhbCwgcGFyYW1zWzBdLCBldmFsSW5mb10pO1xuICAgICAgICB0aGlzLnRlbXBsYXRlLmJsb2NrLmhhc0V2YWwgPSB0cnVlO1xuICAgIH1cbiAgICAvLy8gRXhwcmVzc2lvbnNcbiAgICBsaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hWYWx1ZShbT3BzLlVuZGVmaW5lZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wdXNoVmFsdWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVua25vd24obmFtZSkge1xuICAgICAgICB0aGlzLnB1c2hWYWx1ZShbT3BzLlVua25vd24sIG5hbWVdKTtcbiAgICB9XG4gICAgZ2V0KGhlYWQsIHBhdGgpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5HZXQsIGhlYWQsIHBhdGhdKTtcbiAgICB9XG4gICAgbWF5YmVMb2NhbChwYXRoKSB7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuTWF5YmVMb2NhbCwgcGF0aF0pO1xuICAgIH1cbiAgICBjb25jYXQoKSB7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuQ29uY2F0LCB0aGlzLnBvcFZhbHVlKCldKTtcbiAgICB9XG4gICAgaGVscGVyKG5hbWUpIHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgbGV0IGhhc2ggPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuSGVscGVyLCBuYW1lLCBwYXJhbXMsIGhhc2hdKTtcbiAgICB9XG4gICAgLy8vIFN0YWNrIE1hbmFnZW1lbnQgT3Bjb2Rlc1xuICAgIHN0YXJ0Q29tcG9uZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRCbG9jayhlbGVtZW50WydzeW1ib2xzJ10pO1xuICAgICAgICB0aGlzLmJsb2Nrcy5wdXNoKGNvbXBvbmVudCk7XG4gICAgfVxuICAgIGVuZENvbXBvbmVudCgpIHtcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IHRoaXMuYmxvY2tzLnBvcCgpO1xuICAgICAgICBhc3NlcnQoY29tcG9uZW50IGluc3RhbmNlb2YgQ29tcG9uZW50QmxvY2ssIFwiQ29tcGlsZXIgYnVnOiBlbmRDb21wb25lbnQoKSBzaG91bGQgZW5kIGEgY29tcG9uZW50XCIpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnRvSlNPTigpO1xuICAgIH1cbiAgICBwcmVwYXJlQXJyYXkoc2l6ZSkge1xuICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh0aGlzLnBvcFZhbHVlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKHZhbHVlcyk7XG4gICAgfVxuICAgIHByZXBhcmVPYmplY3Qoc2l6ZSkge1xuICAgICAgICBhc3NlcnQodGhpcy52YWx1ZXMubGVuZ3RoID49IHNpemUsIGBFeHBlY3RlZCAke3NpemV9IHZhbHVlcyBvbiB0aGUgc3RhY2ssIGZvdW5kICR7dGhpcy52YWx1ZXMubGVuZ3RofWApO1xuICAgICAgICBsZXQga2V5cyA9IG5ldyBBcnJheShzaXplKTtcbiAgICAgICAgbGV0IHZhbHVlcyA9IG5ldyBBcnJheShzaXplKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIGtleXNbaV0gPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZXNbaV0gPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW2tleXMsIHZhbHVlc10pO1xuICAgIH1cbiAgICAvLy8gVXRpbGl0aWVzXG4gICAgcHVzaChhcmdzKSB7XG4gICAgICAgIHdoaWxlIChhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGFyZ3MucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50QmxvY2sucHVzaChhcmdzKTtcbiAgICB9XG4gICAgcHVzaFZhbHVlKHZhbCkge1xuICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKHZhbCk7XG4gICAgfVxuICAgIHBvcFZhbHVlKCkge1xuICAgICAgICBhc3NlcnQodGhpcy52YWx1ZXMubGVuZ3RoLCBcIk5vIGV4cHJlc3Npb24gZm91bmQgb24gc3RhY2tcIik7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5wb3AoKTtcbiAgICB9XG59Il19