UNPKG

ember-legacy-class-transform

Version:
295 lines (291 loc) 34.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Template = exports.ComponentBlock = exports.TemplateBlock = exports.InlineBlock = exports.Block = undefined; var _util = require("@glimmer/util"); var _wireFormat = require("@glimmer/wire-format"); class Block { constructor() { this.statements = []; } push(statement) { this.statements.push(statement); } } exports.Block = Block; class InlineBlock extends Block { constructor(table) { super(); this.table = table; } toJSON() { return { statements: this.statements, parameters: this.table.slots }; } } exports.InlineBlock = InlineBlock; class TemplateBlock extends Block { constructor(symbolTable) { super(); this.symbolTable = symbolTable; this.type = "template"; this.yields = new _util.DictSet(); this.named = new _util.DictSet(); this.blocks = []; this.hasEval = false; } push(statement) { this.statements.push(statement); } toJSON() { return { symbols: this.symbolTable.symbols, statements: this.statements, hasEval: this.hasEval }; } } exports.TemplateBlock = TemplateBlock; class ComponentBlock extends Block { constructor(table) { super(); this.table = table; this.attributes = []; this.arguments = []; this.inParams = true; this.positionals = []; } push(statement) { if (this.inParams) { if (_wireFormat.Statements.isFlushElement(statement)) { this.inParams = false; } else if (_wireFormat.Statements.isArgument(statement)) { this.arguments.push(statement); } else if (_wireFormat.Statements.isAttribute(statement)) { this.attributes.push(statement); } else if (_wireFormat.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); } } toJSON() { let args = this.arguments; let keys = args.map(arg => arg[1]); let values = args.map(arg => arg[2]); return [this.attributes, [keys, values], { statements: this.statements, parameters: this.table.slots }]; } } exports.ComponentBlock = ComponentBlock; class Template { constructor(symbols, meta) { this.meta = meta; this.block = new TemplateBlock(symbols); } toJSON() { return { block: this.block.toJSON(), meta: this.meta }; } } exports.Template = Template; class JavaScriptCompiler { constructor(opcodes, symbols, meta) { this.blocks = new _util.Stack(); this.values = []; this.opcodes = opcodes; this.template = new Template(symbols, meta); } static process(opcodes, symbols, meta) { let compiler = new JavaScriptCompiler(opcodes, symbols, meta); return compiler.process(); } get currentBlock() { return (0, _util.expect)(this.blocks.current, 'Expected a block on the stack'); } process() { this.opcodes.forEach(([opcode, ...args]) => { if (!this[opcode]) { throw new Error(`unimplemented ${opcode} on JavaScriptCompiler`); } this[opcode](...args); }); return this.template; } /// Nesting startBlock([program]) { let block = new InlineBlock(program['symbols']); this.blocks.push(block); } endBlock() { let { template, blocks } = this; let block = blocks.pop(); template.block.blocks.push(block.toJSON()); } startProgram() { this.blocks.push(this.template.block); } endProgram() {} /// Statements text(content) { this.push([_wireFormat.Ops.Text, content]); } append(trusted) { this.push([_wireFormat.Ops.Append, this.popValue(), trusted]); } comment(value) { this.push([_wireFormat.Ops.Comment, value]); } modifier(name) { let params = this.popValue(); let hash = this.popValue(); this.push([_wireFormat.Ops.Modifier, name, params, hash]); } block(name, template, inverse) { let params = this.popValue(); let hash = this.popValue(); let blocks = this.template.block.blocks; (0, _util.assert)(typeof template !== 'number' || blocks[template] !== null, 'missing block in the compiler'); (0, _util.assert)(typeof inverse !== 'number' || blocks[inverse] !== null, 'missing block in the compiler'); this.push([_wireFormat.Ops.Block, name, params, hash, blocks[template], blocks[inverse]]); } openElement(element) { let 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([_wireFormat.Ops.OpenElement, tag]); } } flushElement() { this.push([_wireFormat.Ops.FlushElement]); } closeElement(element) { let tag = element.tag; if (tag.indexOf('-') !== -1) { let [attrs, args, block] = this.endComponent(); this.push([_wireFormat.Ops.Component, tag, attrs, args, block]); } else { this.push([_wireFormat.Ops.CloseElement]); } } staticAttr(name, namespace) { let value = this.popValue(); this.push([_wireFormat.Ops.StaticAttr, name, value, namespace]); } dynamicAttr(name, namespace) { let value = this.popValue(); this.push([_wireFormat.Ops.DynamicAttr, name, value, namespace]); } trustingAttr(name, namespace) { let value = this.popValue(); this.push([_wireFormat.Ops.TrustingAttr, name, value, namespace]); } staticArg(name) { let value = this.popValue(); this.push([_wireFormat.Ops.StaticArg, name, value]); } dynamicArg(name) { let value = this.popValue(); this.push([_wireFormat.Ops.DynamicArg, name, value]); } yield(to) { let params = this.popValue(); this.push([_wireFormat.Ops.Yield, to, params]); } debugger(evalInfo) { this.push([_wireFormat.Ops.Debugger, evalInfo]); this.template.block.hasEval = true; } hasBlock(name) { this.pushValue([_wireFormat.Ops.HasBlock, name]); } hasBlockParams(name) { this.pushValue([_wireFormat.Ops.HasBlockParams, name]); } partial(evalInfo) { let params = this.popValue(); this.push([_wireFormat.Ops.Partial, params[0], evalInfo]); this.template.block.hasEval = true; } /// Expressions literal(value) { if (value === undefined) { this.pushValue([_wireFormat.Ops.Undefined]); } else { this.pushValue(value); } } unknown(name) { this.pushValue([_wireFormat.Ops.Unknown, name]); } get(head, path) { this.pushValue([_wireFormat.Ops.Get, head, path]); } maybeLocal(path) { this.pushValue([_wireFormat.Ops.MaybeLocal, path]); } concat() { this.pushValue([_wireFormat.Ops.Concat, this.popValue()]); } helper(name) { let params = this.popValue(); let hash = this.popValue(); this.pushValue([_wireFormat.Ops.Helper, name, params, hash]); } /// Stack Management Opcodes startComponent(element) { let component = new ComponentBlock(element['symbols']); this.blocks.push(component); } endComponent() { let component = this.blocks.pop(); (0, _util.assert)(component instanceof ComponentBlock, "Compiler bug: endComponent() should end a component"); return component.toJSON(); } prepareArray(size) { let values = []; for (let i = 0; i < size; i++) { values.push(this.popValue()); } this.pushValue(values); } prepareObject(size) { (0, _util.assert)(this.values.length >= size, `Expected ${size} values on the stack, found ${this.values.length}`); let keys = new Array(size); let values = new Array(size); for (let i = 0; i < size; i++) { keys[i] = this.popValue(); values[i] = this.popValue(); } this.pushValue([keys, values]); } /// Utilities push(args) { while (args[args.length - 1] === null) { args.pop(); } this.currentBlock.push(args); } pushValue(val) { this.values.push(val); } popValue() { (0, _util.assert)(this.values.length, "No expression found on stack"); return this.values.pop(); } } exports.default = JavaScriptCompiler; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9qYXZhc2NyaXB0LWNvbXBpbGVyLmpzIl0sIm5hbWVzIjpbIkJsb2NrIiwiY29uc3RydWN0b3IiLCJzdGF0ZW1lbnRzIiwicHVzaCIsInN0YXRlbWVudCIsIklubGluZUJsb2NrIiwidGFibGUiLCJ0b0pTT04iLCJwYXJhbWV0ZXJzIiwic2xvdHMiLCJUZW1wbGF0ZUJsb2NrIiwic3ltYm9sVGFibGUiLCJ0eXBlIiwieWllbGRzIiwibmFtZWQiLCJibG9ja3MiLCJoYXNFdmFsIiwic3ltYm9scyIsIkNvbXBvbmVudEJsb2NrIiwiYXR0cmlidXRlcyIsImFyZ3VtZW50cyIsImluUGFyYW1zIiwicG9zaXRpb25hbHMiLCJpc0ZsdXNoRWxlbWVudCIsImlzQXJndW1lbnQiLCJpc0F0dHJpYnV0ZSIsImlzTW9kaWZpZXIiLCJFcnJvciIsImFyZ3MiLCJrZXlzIiwibWFwIiwiYXJnIiwidmFsdWVzIiwiVGVtcGxhdGUiLCJtZXRhIiwiYmxvY2siLCJKYXZhU2NyaXB0Q29tcGlsZXIiLCJvcGNvZGVzIiwidGVtcGxhdGUiLCJwcm9jZXNzIiwiY29tcGlsZXIiLCJjdXJyZW50QmxvY2siLCJjdXJyZW50IiwiZm9yRWFjaCIsIm9wY29kZSIsInN0YXJ0QmxvY2siLCJwcm9ncmFtIiwiZW5kQmxvY2siLCJwb3AiLCJzdGFydFByb2dyYW0iLCJlbmRQcm9ncmFtIiwidGV4dCIsImNvbnRlbnQiLCJUZXh0IiwiYXBwZW5kIiwidHJ1c3RlZCIsIkFwcGVuZCIsInBvcFZhbHVlIiwiY29tbWVudCIsInZhbHVlIiwiQ29tbWVudCIsIm1vZGlmaWVyIiwibmFtZSIsInBhcmFtcyIsImhhc2giLCJNb2RpZmllciIsImludmVyc2UiLCJvcGVuRWxlbWVudCIsImVsZW1lbnQiLCJ0YWciLCJpbmRleE9mIiwic3RhcnRDb21wb25lbnQiLCJibG9ja1BhcmFtcyIsImxlbmd0aCIsIk9wZW5FbGVtZW50IiwiZmx1c2hFbGVtZW50IiwiRmx1c2hFbGVtZW50IiwiY2xvc2VFbGVtZW50IiwiYXR0cnMiLCJlbmRDb21wb25lbnQiLCJDb21wb25lbnQiLCJDbG9zZUVsZW1lbnQiLCJzdGF0aWNBdHRyIiwibmFtZXNwYWNlIiwiU3RhdGljQXR0ciIsImR5bmFtaWNBdHRyIiwiRHluYW1pY0F0dHIiLCJ0cnVzdGluZ0F0dHIiLCJUcnVzdGluZ0F0dHIiLCJzdGF0aWNBcmciLCJTdGF0aWNBcmciLCJkeW5hbWljQXJnIiwiRHluYW1pY0FyZyIsInlpZWxkIiwidG8iLCJZaWVsZCIsImRlYnVnZ2VyIiwiZXZhbEluZm8iLCJEZWJ1Z2dlciIsImhhc0Jsb2NrIiwicHVzaFZhbHVlIiwiSGFzQmxvY2siLCJoYXNCbG9ja1BhcmFtcyIsIkhhc0Jsb2NrUGFyYW1zIiwicGFydGlhbCIsIlBhcnRpYWwiLCJsaXRlcmFsIiwidW5kZWZpbmVkIiwiVW5kZWZpbmVkIiwidW5rbm93biIsIlVua25vd24iLCJnZXQiLCJoZWFkIiwicGF0aCIsIkdldCIsIm1heWJlTG9jYWwiLCJNYXliZUxvY2FsIiwiY29uY2F0IiwiQ29uY2F0IiwiaGVscGVyIiwiSGVscGVyIiwiY29tcG9uZW50IiwicHJlcGFyZUFycmF5Iiwic2l6ZSIsImkiLCJwcmVwYXJlT2JqZWN0IiwiQXJyYXkiLCJ2YWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQTs7QUFDTyxNQUFNQSxLQUFOLENBQVk7QUFDZkMsa0JBQWM7QUFDVixhQUFLQyxVQUFMLEdBQWtCLEVBQWxCO0FBQ0g7QUFDREMsU0FBS0MsU0FBTCxFQUFnQjtBQUNaLGFBQUtGLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCQyxTQUFyQjtBQUNIO0FBTmM7UUFBTkosSyxHQUFBQSxLO0FBUU4sTUFBTUssV0FBTixTQUEwQkwsS0FBMUIsQ0FBZ0M7QUFDbkNDLGdCQUFZSyxLQUFaLEVBQW1CO0FBQ2Y7QUFDQSxhQUFLQSxLQUFMLEdBQWFBLEtBQWI7QUFDSDtBQUNEQyxhQUFTO0FBQ0wsZUFBTztBQUNITCx3QkFBWSxLQUFLQSxVQURkO0FBRUhNLHdCQUFZLEtBQUtG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Q0g7QUFDRCxhQUFLMkMsU0FBTCxDQUFlcEUsTUFBZjtBQUNIO0FBQ0Q2RixrQkFBY0YsSUFBZCxFQUFvQjtBQUNoQiwwQkFBTyxLQUFLM0YsTUFBTCxDQUFZeUMsTUFBWixJQUFzQmtELElBQTdCLEVBQW9DLFlBQVdBLElBQUssK0JBQThCLEtBQUszRixNQUFMLENBQVl5QyxNQUFPLEVBQXJHO0FBQ0EsWUFBSTVDLE9BQU8sSUFBSWlHLEtBQUosQ0FBVUgsSUFBVixDQUFYO0FBQ0EsWUFBSTNGLFNBQVMsSUFBSThGLEtBQUosQ0FBVUgsSUFBVixDQUFiO0FBQ0EsYUFBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlELElBQXBCLEVBQTBCQyxHQUExQixFQUErQjtBQUMzQi9GLGlCQUFLK0YsQ0FBTCxJQUFVLEtBQUtuRSxRQUFMLEVBQVY7QUFDQXpCLG1CQUFPNEYsQ0FBUCxJQUFZLEtBQUtuRSxRQUFMLEVBQVo7QUFDSDtBQUNELGFBQUsyQyxTQUFMLENBQWUsQ0FBQ3ZFLElBQUQsRUFBT0csTUFBUCxDQUFmO0FBQ0g7QUFDRDtBQUNBN0IsU0FBS3lCLElBQUwsRUFBVztBQUNQLGVBQU9BLEtBQUtBLEtBQUs2QyxNQUFMLEdBQWMsQ0FBbkIsTUFBMEIsSUFBakMsRUFBdUM7QUFDbkM3QyxpQkFBS29CLEdBQUw7QUFDSDtBQUNELGFBQUtQLFlBQUwsQ0FBa0J0QyxJQUFsQixDQUF1QnlCLElBQXZCO0FBQ0g7QUFDRHdFLGNBQVUyQixHQUFWLEVBQWU7QUFDWCxhQUFLL0YsTUFBTCxDQUFZN0IsSUFBWixDQUFpQjRILEdBQWpCO0FBQ0g7QUFDRHRFLGVBQVc7QUFDUCwwQkFBTyxLQUFLekIsTUFBTCxDQUFZeUMsTUFBbkIsRUFBMkIsOEJBQTNCO0FBQ0EsZUFBTyxLQUFLekMsTUFBTCxDQUFZZ0IsR0FBWixFQUFQO0FBQ0g7QUExTG1DO2tCQUFuQlosa0IiLCJmaWxlIjoibGliL2phdmFzY3JpcHQtY29tcGlsZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tIFwiQGdsaW1tZXIvdXRpbFwiO1xuaW1wb3J0IHsgU3RhY2ssIERpY3RTZXQsIGV4cGVjdCB9IGZyb20gXCJAZ2xpbW1lci91dGlsXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnRzLCBPcHMgfSBmcm9tICdAZ2xpbW1lci93aXJlLWZvcm1hdCc7XG5leHBvcnQgY2xhc3MgQmxvY2sge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMgPSBbXTtcbiAgICB9XG4gICAgcHVzaChzdGF0ZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgSW5saW5lQmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiB0aGlzLnN0YXRlbWVudHMsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLnRhYmxlLnNsb3RzXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3Ioc3ltYm9sVGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zeW1ib2xUYWJsZSA9IHN5bWJvbFRhYmxlO1xuICAgICAgICB0aGlzLnR5cGUgPSBcInRlbXBsYXRlXCI7XG4gICAgICAgIHRoaXMueWllbGRzID0gbmV3IERpY3RTZXQoKTtcbiAgICAgICAgdGhpcy5uYW1lZCA9IG5ldyBEaWN0U2V0KCk7XG4gICAgICAgIHRoaXMuYmxvY2tzID0gW107XG4gICAgICAgIHRoaXMuaGFzRXZhbCA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoKHN0YXRlbWVudCkge1xuICAgICAgICB0aGlzLnN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzeW1ib2xzOiB0aGlzLnN5bWJvbFRhYmxlLnN5bWJvbHMsXG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiB0aGlzLnN0YXRlbWVudHMsXG4gICAgICAgICAgICBoYXNFdmFsOiB0aGlzLmhhc0V2YWxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29tcG9uZW50QmxvY2sgZXh0ZW5kcyBCbG9jayB7XG4gICAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5pblBhcmFtcyA9IHRydWU7XG4gICAgICAgIHRoaXMucG9zaXRpb25hbHMgPSBbXTtcbiAgICB9XG4gICAgcHVzaChzdGF0ZW1lbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5QYXJhbXMpIHtcbiAgICAgICAgICAgIGlmIChTdGF0ZW1lbnRzLmlzRmx1c2hFbGVtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluUGFyYW1zID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFN0YXRlbWVudHMuaXNBcmd1bWVudChzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmd1bWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChTdGF0ZW1lbnRzLmlzQXR0cmlidXRlKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChTdGF0ZW1lbnRzLmlzTW9kaWZpZXIoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcGlsZSBFcnJvcjogRWxlbWVudCBtb2RpZmllcnMgYXJlIG5vdCBhbGxvd2VkIGluIGNvbXBvbmVudHMnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21waWxlIEVycm9yOiBvbmx5IHBhcmFtZXRlcnMgYWxsb3dlZCBiZWZvcmUgZmx1c2gtZWxlbWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGxldCBhcmdzID0gdGhpcy5hcmd1bWVudHM7XG4gICAgICAgIGxldCBrZXlzID0gYXJncy5tYXAoYXJnID0+IGFyZ1sxXSk7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBhcmdzLm1hcChhcmcgPT4gYXJnWzJdKTtcbiAgICAgICAgcmV0dXJuIFt0aGlzLmF0dHJpYnV0ZXMsIFtrZXlzLCB2YWx1ZXNdLCB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiB0aGlzLnN0YXRlbWVudHMsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLnRhYmxlLnNsb3RzXG4gICAgICAgIH1dO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XG4gICAgY29uc3RydWN0b3Ioc3ltYm9scywgbWV0YSkge1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgICAgICB0aGlzLmJsb2NrID0gbmV3IFRlbXBsYXRlQmxvY2soc3ltYm9scyk7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJsb2NrOiB0aGlzLmJsb2NrLnRvSlNPTigpLFxuICAgICAgICAgICAgbWV0YTogdGhpcy5tZXRhXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSmF2YVNjcmlwdENvbXBpbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcGNvZGVzLCBzeW1ib2xzLCBtZXRhKSB7XG4gICAgICAgIHRoaXMuYmxvY2tzID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMudmFsdWVzID0gW107XG4gICAgICAgIHRoaXMub3Bjb2RlcyA9IG9wY29kZXM7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoc3ltYm9scywgbWV0YSk7XG4gICAgfVxuICAgIHN0YXRpYyBwcm9jZXNzKG9wY29kZXMsIHN5bWJvbHMsIG1ldGEpIHtcbiAgICAgICAgbGV0IGNvbXBpbGVyID0gbmV3IEphdmFTY3JpcHRDb21waWxlcihvcGNvZGVzLCBzeW1ib2xzLCBtZXRhKTtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVyLnByb2Nlc3MoKTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRCbG9jaygpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdCh0aGlzLmJsb2Nrcy5jdXJyZW50LCAnRXhwZWN0ZWQgYSBibG9jayBvbiB0aGUgc3RhY2snKTtcbiAgICB9XG4gICAgcHJvY2VzcygpIHtcbiAgICAgICAgdGhpcy5vcGNvZGVzLmZvckVhY2goKFtvcGNvZGUsIC4uLmFyZ3NdKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXNbb3Bjb2RlXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5pbXBsZW1lbnRlZCAke29wY29kZX0gb24gSmF2YVNjcmlwdENvbXBpbGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzW29wY29kZV0oLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZTtcbiAgICB9XG4gICAgLy8vIE5lc3RpbmdcbiAgICBzdGFydEJsb2NrKFtwcm9ncmFtXSkge1xuICAgICAgICBsZXQgYmxvY2sgPSBuZXcgSW5saW5lQmxvY2socHJvZ3JhbVsnc3ltYm9scyddKTtcbiAgICAgICAgdGhpcy5ibG9ja3MucHVzaChibG9jayk7XG4gICAgfVxuICAgIGVuZEJsb2NrKCkge1xuICAgICAgICBsZXQgeyB0ZW1wbGF0ZSwgYmxvY2tzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgYmxvY2sgPSBibG9ja3MucG9wKCk7XG4gICAgICAgIHRlbXBsYXRlLmJsb2NrLmJsb2Nrcy5wdXNoKGJsb2NrLnRvSlNPTigpKTtcbiAgICB9XG4gICAgc3RhcnRQcm9ncmFtKCkge1xuICAgICAgICB0aGlzLmJsb2Nrcy5wdXNoKHRoaXMudGVtcGxhdGUuYmxvY2spO1xuICAgIH1cbiAgICBlbmRQcm9ncmFtKCkge31cbiAgICAvLy8gU3RhdGVtZW50c1xuICAgIHRleHQoY29udGVudCkge1xuICAgICAgICB0aGlzLnB1c2goW09wcy5UZXh0LCBjb250ZW50XSk7XG4gICAgfVxuICAgIGFwcGVuZCh0cnVzdGVkKSB7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLkFwcGVuZCwgdGhpcy5wb3BWYWx1ZSgpLCB0cnVzdGVkXSk7XG4gICAgfVxuICAgIGNvbW1lbnQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuQ29tbWVudCwgdmFsdWVdKTtcbiAgICB9XG4gICAgbW9kaWZpZXIobmFtZSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuTW9kaWZpZXIsIG5hbWUsIHBhcmFtcywgaGFzaF0pO1xuICAgIH1cbiAgICBibG9jayhuYW1lLCB0ZW1wbGF0ZSwgaW52ZXJzZSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgbGV0IGJsb2NrcyA9IHRoaXMudGVtcGxhdGUuYmxvY2suYmxvY2tzO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHRlbXBsYXRlICE9PSAnbnVtYmVyJyB8fCBibG9ja3NbdGVtcGxhdGVdICE9PSBudWxsLCAnbWlzc2luZyBibG9jayBpbiB0aGUgY29tcGlsZXInKTtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiBpbnZlcnNlICE9PSAnbnVtYmVyJyB8fCBibG9ja3NbaW52ZXJzZV0gIT09IG51bGwsICdtaXNzaW5nIGJsb2NrIGluIHRoZSBjb21waWxlcicpO1xuICAgICAgICB0aGlzLnB1c2goW09wcy5CbG9jaywgbmFtZSwgcGFyYW1zLCBoYXNoLCBibG9ja3NbdGVtcGxhdGVdLCBibG9ja3NbaW52ZXJzZV1dKTtcbiAgICB9XG4gICAgb3BlbkVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgdGFnID0gZWxlbWVudC50YWc7XG4gICAgICAgIGlmICh0YWcuaW5kZXhPZignLScpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydENvbXBvbmVudChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmJsb2NrUGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcGlsZSBFcnJvcjogPCR7ZWxlbWVudC50YWd9PiBpcyBub3QgYSBjb21wb25lbnQgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBibG9jayBwYXJhbWV0ZXJzYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goW09wcy5PcGVuRWxlbWVudCwgdGFnXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmx1c2hFbGVtZW50KCkge1xuICAgICAgICB0aGlzLnB1c2goW09wcy5GbHVzaEVsZW1lbnRdKTtcbiAgICB9XG4gICAgY2xvc2VFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHRhZyA9IGVsZW1lbnQudGFnO1xuICAgICAgICBpZiAodGFnLmluZGV4T2YoJy0nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBbYXR0cnMsIGFyZ3MsIGJsb2NrXSA9IHRoaXMuZW5kQ29tcG9uZW50KCk7XG4gICAgICAgICAgICB0aGlzLnB1c2goW09wcy5Db21wb25lbnQsIHRhZywgYXR0cnMsIGFyZ3MsIGJsb2NrXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goW09wcy5DbG9zZUVsZW1lbnRdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWNBdHRyKG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLlN0YXRpY0F0dHIsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2VdKTtcbiAgICB9XG4gICAgZHluYW1pY0F0dHIobmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRHluYW1pY0F0dHIsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2VdKTtcbiAgICB9XG4gICAgdHJ1c3RpbmdBdHRyKG5hbWUsIG5hbWVzcGFjZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLlRydXN0aW5nQXR0ciwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZV0pO1xuICAgIH1cbiAgICBzdGF0aWNBcmcobmFtZSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBvcFZhbHVlKCk7XG4gICAgICAgIHRoaXMucHVzaChbT3BzLlN0YXRpY0FyZywgbmFtZSwgdmFsdWVdKTtcbiAgICB9XG4gICAgZHluYW1pY0FyZyhuYW1lKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRHluYW1pY0FyZywgbmFtZSwgdmFsdWVdKTtcbiAgICB9XG4gICAgeWllbGQodG8pIHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuWWllbGQsIHRvLCBwYXJhbXNdKTtcbiAgICB9XG4gICAgZGVidWdnZXIoZXZhbEluZm8pIHtcbiAgICAgICAgdGhpcy5wdXNoKFtPcHMuRGVidWdnZXIsIGV2YWxJbmZvXSk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUuYmxvY2suaGFzRXZhbCA9IHRydWU7XG4gICAgfVxuICAgIGhhc0Jsb2NrKG5hbWUpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5IYXNCbG9jaywgbmFtZV0pO1xuICAgIH1cbiAgICBoYXNCbG9ja1BhcmFtcyhuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuSGFzQmxvY2tQYXJhbXMsIG5hbWVdKTtcbiAgICB9XG4gICAgcGFydGlhbChldmFsSW5mbykge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICB0aGlzLnB1c2goW09wcy5QYXJ0aWFsLCBwYXJhbXNbMF0sIGV2YWxJbmZvXSk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUuYmxvY2suaGFzRXZhbCA9IHRydWU7XG4gICAgfVxuICAgIC8vLyBFeHByZXNzaW9uc1xuICAgIGxpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuVW5kZWZpbmVkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdW5rbm93bihuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaFZhbHVlKFtPcHMuVW5rbm93biwgbmFtZV0pO1xuICAgIH1cbiAgICBnZXQoaGVhZCwgcGF0aCkge1xuICAgICAgICB0aGlzLnB1c2hWYWx1ZShbT3BzLkdldCwgaGVhZCwgcGF0aF0pO1xuICAgIH1cbiAgICBtYXliZUxvY2FsKHBhdGgpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5NYXliZUxvY2FsLCBwYXRoXSk7XG4gICAgfVxuICAgIGNvbmNhdCgpIHtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5Db25jYXQsIHRoaXMucG9wVmFsdWUoKV0pO1xuICAgIH1cbiAgICBoZWxwZXIobmFtZSkge1xuICAgICAgICBsZXQgcGFyYW1zID0gdGhpcy5wb3BWYWx1ZSgpO1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgdGhpcy5wdXNoVmFsdWUoW09wcy5IZWxwZXIsIG5hbWUsIHBhcmFtcywgaGFzaF0pO1xuICAgIH1cbiAgICAvLy8gU3RhY2sgTWFuYWdlbWVudCBPcGNvZGVzXG4gICAgc3RhcnRDb21wb25lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudEJsb2NrKGVsZW1lbnRbJ3N5bWJvbHMnXSk7XG4gICAgICAgIHRoaXMuYmxvY2tzLnB1c2goY29tcG9uZW50KTtcbiAgICB9XG4gICAgZW5kQ29tcG9uZW50KCkge1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5ibG9ja3MucG9wKCk7XG4gICAgICAgIGFzc2VydChjb21wb25lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRCbG9jaywgXCJDb21waWxlciBidWc6IGVuZENvbXBvbmVudCgpIHNob3VsZCBlbmQgYSBjb21wb25lbnRcIik7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudG9KU09OKCk7XG4gICAgfVxuICAgIHByZXBhcmVBcnJheShzaXplKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHRoaXMucG9wVmFsdWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoVmFsdWUodmFsdWVzKTtcbiAgICB9XG4gICAgcHJlcGFyZU9iamVjdChzaXplKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLnZhbHVlcy5sZW5ndGggPj0gc2l6ZSwgYEV4cGVjdGVkICR7c2l6ZX0gdmFsdWVzIG9uIHRoZSBzdGFjaywgZm91bmQgJHt0aGlzLnZhbHVlcy5sZW5ndGh9YCk7XG4gICAgICAgIGxldCBrZXlzID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgICBsZXQgdmFsdWVzID0gbmV3IEFycmF5KHNpemUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAga2V5c1tpXSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHRoaXMucG9wVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hWYWx1ZShba2V5cywgdmFsdWVzXSk7XG4gICAgfVxuICAgIC8vLyBVdGlsaXRpZXNcbiAgICBwdXNoKGFyZ3MpIHtcbiAgICAgICAgd2hpbGUgKGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgYXJncy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRCbG9jay5wdXNoKGFyZ3MpO1xuICAgIH1cbiAgICBwdXNoVmFsdWUodmFsKSB7XG4gICAgICAgIHRoaXMudmFsdWVzLnB1c2godmFsKTtcbiAgICB9XG4gICAgcG9wVmFsdWUoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLnZhbHVlcy5sZW5ndGgsIFwiTm8gZXhwcmVzc2lvbiBmb3VuZCBvbiBzdGFja1wiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzLnBvcCgpO1xuICAgIH1cbn0iXX0=