UNPKG

@glimmer/compiler

Version:
445 lines (408 loc) 50.3 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import { dict, assertNever, assert, values } from '@glimmer/util'; import { normalizeStatement, VariableKind } from './builder-interface'; export var ProgramSymbols = function () { function ProgramSymbols() { _classCallCheck(this, ProgramSymbols); this._freeVariables = []; this._symbols = ['this']; this.top = this; } ProgramSymbols.prototype.toSymbols = function toSymbols() { return this._symbols.slice(1); }; ProgramSymbols.prototype.toUpvars = function toUpvars() { return this._freeVariables; }; ProgramSymbols.prototype.freeVar = function freeVar(name) { return addString(this._freeVariables, name); }; ProgramSymbols.prototype.block = function block(name) { return this.symbol(name); }; ProgramSymbols.prototype.arg = function arg(name) { return addString(this._symbols, name); }; ProgramSymbols.prototype.local = function local(name) { throw new Error('No local ' + name + ' was found. Maybe you meant ^' + name + '?'); }; ProgramSymbols.prototype.this = function _this() { return 0; }; ProgramSymbols.prototype.hasLocal = function hasLocal(_name) { return false; }; // any symbol ProgramSymbols.prototype.symbol = function symbol(name) { return addString(this._symbols, name); }; ProgramSymbols.prototype.child = function child(locals) { return new LocalSymbols(this, locals); }; return ProgramSymbols; }(); var LocalSymbols = function () { function LocalSymbols(parent, locals) { _classCallCheck(this, LocalSymbols); this.parent = parent; this.locals = dict(); for (var _iterator = locals, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var local = _ref; this.locals[local] = parent.top.symbol(local); } } LocalSymbols.prototype.freeVar = function freeVar(name) { return this.parent.freeVar(name); }; LocalSymbols.prototype.arg = function arg(name) { return this.parent.arg(name); }; LocalSymbols.prototype.block = function block(name) { return this.parent.block(name); }; LocalSymbols.prototype.local = function local(name) { if (name in this.locals) { return this.locals[name]; } else { return this.parent.local(name); } }; LocalSymbols.prototype.this = function _this() { return this.parent.this(); }; LocalSymbols.prototype.hasLocal = function hasLocal(name) { if (name in this.locals) { return true; } else { return this.parent.hasLocal(name); } }; LocalSymbols.prototype.child = function child(locals) { return new LocalSymbols(this, locals); }; _createClass(LocalSymbols, [{ key: 'paramSymbols', get: function get() { return values(this.locals); } }, { key: 'top', get: function get() { return this.parent.top; } }]); return LocalSymbols; }(); function addString(array, item) { var index = array.indexOf(item); if (index === -1) { index = array.length; array.push(item); return index; } else { return index; } } function unimpl(message) { return new Error('unimplemented ' + message); } export function buildStatements(statements, symbols) { var out = []; statements.forEach(function (s) { return out.push.apply(out, buildStatement(normalizeStatement(s), symbols)); }); return out; } export function buildNormalizedStatements(statements, symbols) { var out = []; statements.forEach(function (s) { return out.push.apply(out, buildStatement(s, symbols)); }); return out; } export function buildStatement(normalized) { var symbols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new ProgramSymbols(); switch (normalized.kind) { case "AppendPath" /* AppendPath */: { return [[1 /* Append */ , +normalized.trusted, 0, 0, buildPath(normalized.path, "AppendSingleId" /* AppendSingleId */, symbols)]]; } case "AppendExpr" /* AppendExpr */: { return [[1 /* Append */ , +normalized.trusted, 0, 0, buildExpression(normalized.expr, "Expression" /* Expression */, symbols)]]; } case "Call" /* Call */: { var path = normalized.path, params = normalized.params, hash = normalized.hash, trusted = normalized.trusted; var builtParams = params ? buildParams(params, symbols) : []; var builtHash = hash ? buildHash(hash, symbols) : null; var builtExpr = buildPath(path, "CallHead" /* CallHead */, symbols); return [[1 /* Append */, +trusted, 0, 0, [31 /* Call */, 0, 0, builtExpr, builtParams, builtHash]]]; } case "Literal" /* Literal */: { return [[1 /* Append */, 1, 0, 0, normalized.value]]; } case "Comment" /* Comment */: { return [[2 /* Comment */, normalized.value]]; } case "Block" /* Block */: { var blocks = buildBlocks(normalized.blocks, normalized.blockParams, symbols); var _hash = buildHash(normalized.hash, symbols); var _params = buildParams(normalized.params, symbols); var _path = buildPath(normalized.path, "BlockHead" /* BlockHead */, symbols); return [[5 /* Block */, _path, _params, _hash, blocks]]; } case "Element" /* Element */: return buildElement(normalized, symbols); case "Modifier" /* Modifier */: throw unimpl('modifier'); case "DynamicComponent" /* DynamicComponent */: throw unimpl('dynamic component'); default: throw assertNever(normalized); } } export function s(arr) { for (var _len = arguments.length, interpolated = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { interpolated[_key - 1] = arguments[_key]; } var result = arr.reduce(function (result, string, i) { return result + ('' + string + (interpolated[i] ? interpolated[i] : '')); }, ''); return [0 /* Literal */, result]; } export function c(arr) { for (var _len2 = arguments.length, interpolated = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { interpolated[_key2 - 1] = arguments[_key2]; } var result = arr.reduce(function (result, string, i) { return result + ('' + string + (interpolated[i] ? interpolated[i] : '')); }, ''); return [1 /* Comment */, result]; } export function unicode(charCode) { return String.fromCharCode(parseInt(charCode, 16)); } export var NEWLINE = '\n'; function buildElement(_ref2, symbols) { var name = _ref2.name, attrs = _ref2.attrs, block = _ref2.block; var out = [[9 /* OpenElement */, name, !hasSplat(attrs)]]; if (attrs) { var _buildAttrs = buildAttrs(attrs, symbols), attributes = _buildAttrs.attributes, args = _buildAttrs.args; out.push.apply(out, attributes); false && assert(args === null, 'Can\'t pass args to a simple element'); } out.push([10 /* FlushElement */]); if (Array.isArray(block)) { block.forEach(function (s) { return out.push.apply(out, buildStatement(s, symbols)); }); } else if (block === null) { // do nothing } else { throw assertNever(block); } out.push([11 /* CloseElement */]); return out; } function hasSplat(attrs) { if (attrs === null) return false; return Object.keys(attrs).some(function (a) { return attrs[a] === "Splat"; } /* Splat */); } export function buildAngleInvocation(_ref3, symbols) { var attrs = _ref3.attrs, block = _ref3.block, head = _ref3.head; var attrList = []; var args = null; var blockList = []; if (attrs) { var built = buildAttrs(attrs, symbols); attrList = built.attributes; args = built.args; } if (block) blockList = buildNormalizedStatements(block, symbols); return [7 /* Component */ , buildExpression(head, "CallHead" /* CallHead */, symbols), attrList, args, [['default'], [{ parameters: [], statements: blockList }]]]; } export function buildAttrs(attrs, symbols) { var attributes = []; var keys = []; var values = []; Object.keys(attrs).forEach(function (key) { var value = attrs[key]; if (value === "Splat" /* Splat */) { attributes.push([15 /* AttrSplat */, symbols.block('&attrs')]); } else if (key[0] === '@') { keys.push(key); values.push(buildExpression(value, "Expression" /* Expression */, symbols)); } else { attributes.push.apply(attributes, buildAttributeValue(key, value, // TODO: extract namespace from key extractNamespace(key), symbols)); } }); return { attributes: attributes, args: keys.length === 0 ? null : [keys, values] }; } export function extractNamespace(name) { if (name === 'xmlns') { return "http://www.w3.org/2000/xmlns/" /* XMLNS */; } var match = name.match(/^([^:]*):([^:]*)$/); if (match === null) { return null; } var namespace = match[1]; switch (namespace) { case 'xlink': return "http://www.w3.org/1999/xlink" /* XLink */; case 'xml': return "http://www.w3.org/XML/1998/namespace" /* XML */; case 'xmlns': return "http://www.w3.org/2000/xmlns/" /* XMLNS */; } return null; } export function buildAttributeValue(name, value, namespace, symbols) { switch (value.type) { case "Literal" /* Literal */: { var val = value.value; if (val === false) { return []; } else if (val === true) { return [[12 /* StaticAttr */, name, '', namespace]]; } else if (typeof val === 'string') { return [[12 /* StaticAttr */, name, val, namespace]]; } else { throw new Error('Unexpected/unimplemented literal attribute ' + JSON.stringify(val)); } } default: return [[13 /* DynamicAttr */ , name, buildExpression(value, "AppendSingleId" /* AppendSingleId */, symbols), namespace]]; } } export function buildExpression(expr, context, symbols) { switch (expr.type) { case "Get" /* Get */: { return buildPath(expr.path, context, symbols); } case "Concat" /* Concat */: { return [32 /* Concat */, buildConcat(expr.params, symbols)]; } case "Call" /* Call */: { var builtParams = buildParams(expr.params, symbols); var builtHash = buildHash(expr.hash, symbols); var builtExpr = buildPath(expr.path, "CallHead" /* CallHead */, symbols); return [31 /* Call */, 0, 0, builtExpr, builtParams, builtHash]; } case "HasBlock" /* HasBlock */: { return [28 /* HasBlock */ , buildVar({ kind: VariableKind.Block, name: expr.name }, "Expression" /* Expression */, symbols)]; } case "HasBlockParams" /* HasBlockParams */: { return [29 /* HasBlockParams */ , buildVar({ kind: VariableKind.Block, name: expr.name }, "Expression" /* Expression */, symbols)]; } case "Literal" /* Literal */: { if (expr.value === undefined) { return [30 /* Undefined */]; } else { return expr.value; } } } } export function buildPath(path, context, symbols) { if (path.tail.length === 0) { return [27 /* GetPath */, buildVar(path.variable, context, symbols), path.tail]; } else { return [27 /* GetPath */, buildVar(path.variable, "Expression" /* Expression */, symbols), path.tail]; } } export function buildVar(head, context, symbols) { switch (head.kind) { case VariableKind.Free: return [26 /* GetContextualFree */, symbols.freeVar(head.name), context]; case VariableKind.Arg: return [24 /* GetSymbol */, symbols.arg(head.name)]; case VariableKind.Block: return [24 /* GetSymbol */, symbols.block(head.name)]; case VariableKind.Local: return [24 /* GetSymbol */, symbols.local(head.name)]; case VariableKind.This: return [24 /* GetSymbol */, symbols.this()]; } } export function buildParams(exprs, symbols) { if (exprs === null) return null; return exprs.map(function (e) { return buildExpression(e, "Expression" /* Expression */, symbols); }); } export function buildConcat(exprs, symbols) { return exprs.map(function (e) { return buildExpression(e, "AppendSingleId" /* AppendSingleId */, symbols); }); } export function buildHash(exprs, symbols) { if (exprs === null) return null; var out = [[], []]; Object.keys(exprs).forEach(function (key) { out[0].push(key); out[1].push(buildExpression(exprs[key], "Expression" /* Expression */, symbols)); }); return out; } export function buildBlocks(blocks, blockParams, parent) { var keys = []; var values = []; Object.keys(blocks).forEach(function (name) { keys.push(name); if (name === 'default') { var symbols = parent.child(blockParams || []); values.push({ parameters: symbols.paramSymbols, statements: buildNormalizedStatements(blocks[name], symbols) }); } else { values.push({ parameters: [], statements: buildNormalizedStatements(blocks[name], parent) }); } }); return [keys, values]; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFHQSxTQUFBLElBQUEsRUFBQSxXQUFBLEVBQUEsTUFBQSxFQUFBLE1BQUEsUUFBQSxlQUFBO0FBQ0EsU0FBQSxrQkFBQSxFQUFBLFlBQUEsUUFBQSxxQkFBQTtBQWtDQSxXQUFNLGNBQU47QUFBQSw4QkFBQTtBQUFBOztBQUNFLGFBQUEsY0FBQSxHQUFBLEVBQUE7QUFDQSxhQUFBLFFBQUEsR0FBcUIsQ0FBckIsTUFBcUIsQ0FBckI7QUFFQSxhQUFBLEdBQUEsR0FBQSxJQUFBO0FBMENEOztBQTlDRCw2QkFNRSxTQU5GLHdCQU1XO0FBQ1AsZUFBTyxLQUFBLFFBQUEsQ0FBQSxLQUFBLENBQVAsQ0FBTyxDQUFQO0FBQ0QsS0FSSDs7QUFBQSw2QkFVRSxRQVZGLHVCQVVVO0FBQ04sZUFBTyxLQUFQLGNBQUE7QUFDRCxLQVpIOztBQUFBLDZCQWNFLE9BZEYsb0JBY0UsSUFkRixFQWNzQjtBQUNsQixlQUFPLFVBQVUsS0FBVixjQUFBLEVBQVAsSUFBTyxDQUFQO0FBQ0QsS0FoQkg7O0FBQUEsNkJBa0JFLEtBbEJGLGtCQWtCRSxJQWxCRixFQWtCb0I7QUFDaEIsZUFBTyxLQUFBLE1BQUEsQ0FBUCxJQUFPLENBQVA7QUFDRCxLQXBCSDs7QUFBQSw2QkFzQkUsR0F0QkYsZ0JBc0JFLElBdEJGLEVBc0JrQjtBQUNkLGVBQU8sVUFBVSxLQUFWLFFBQUEsRUFBUCxJQUFPLENBQVA7QUFDRCxLQXhCSDs7QUFBQSw2QkEwQkUsS0ExQkYsa0JBMEJFLElBMUJGLEVBMEJvQjtBQUNoQixjQUFNLElBQUEsS0FBQSxlQUFzQixJQUF0QixxQ0FBTixJQUFNLE9BQU47QUFDRCxLQTVCSDs7QUFBQSw2QkE4QkUsSUE5QkYsb0JBOEJNO0FBQ0YsZUFBQSxDQUFBO0FBQ0QsS0FoQ0g7O0FBQUEsNkJBa0NFLFFBbENGLHFCQWtDRSxL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QUEsRUFBQSxFQUEvQyxFQUErQyxDQUEvQztBQUVBLFdBQUEsSUFBQSxDQUFBLEtBQUEsRUFBQSxPQUFBLENBQTJCLGVBQU07QUFDL0IsWUFBQSxDQUFBLEVBQUEsSUFBQSxDQUFBLEdBQUE7QUFDQSxZQUFBLENBQUEsRUFBQSxJQUFBLENBQVksZ0JBQWdCLE1BQWhCLEdBQWdCLENBQWhCLEVBQUEsWUFBQSxDQUFBLGdCQUFBLEVBQVosT0FBWSxDQUFaO0FBRkYsS0FBQTtBQUtBLFdBQUEsR0FBQTtBQUNEO0FBRUQsT0FBTSxTQUFBLFdBQUEsQ0FBQSxNQUFBLEVBQUEsV0FBQSxFQUFBLE1BQUEsRUFHVztBQUVmLFFBQUksT0FBSixFQUFBO0FBQ0EsUUFBSSxTQUFKLEVBQUE7QUFFQSxXQUFBLElBQUEsQ0FBQSxNQUFBLEVBQUEsT0FBQSxDQUE0QixnQkFBTztBQUNqQyxhQUFBLElBQUEsQ0FBQSxJQUFBO0FBRUEsWUFBSSxTQUFKLFNBQUEsRUFBd0I7QUFDdEIsZ0JBQUksVUFBVSxPQUFBLEtBQUEsQ0FBYSxlQUEzQixFQUFjLENBQWQ7QUFFQSxtQkFBQSxJQUFBLENBQVk7QUFDViw0QkFBWSxRQURGLFlBQUE7QUFFViw0QkFBWSwwQkFBMEIsT0FBMUIsSUFBMEIsQ0FBMUIsRUFBQSxPQUFBO0FBRkYsYUFBWjtBQUhGLFNBQUEsTUFPTztBQUNMLG1CQUFBLElBQUEsQ0FBWTtBQUNWLDRCQURVLEVBQUE7QUFFViw0QkFBWSwwQkFBMEIsT0FBMUIsSUFBMEIsQ0FBMUIsRUFBQSxNQUFBO0FBRkYsYUFBWjtBQUlEO0FBZkgsS0FBQTtBQWtCQSxXQUFPLENBQUEsSUFBQSxFQUFQLE1BQU8sQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2lyZUZvcm1hdCwgT3B0aW9uLCBEaWN0LCBFeHByZXNzaW9ucywgRXhwcmVzc2lvbkNvbnRleHQgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcblxuaW1wb3J0IE9wID0gV2lyZUZvcm1hdC5TZXhwT3Bjb2RlcztcbmltcG9ydCB7IGRpY3QsIGFzc2VydE5ldmVyLCBhc3NlcnQsIHZhbHVlcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHtcbiAgQnVpbGRlclN0YXRlbWVudCxcbiAgQnVpbGRlckNvbW1lbnQsXG4gIG5vcm1hbGl6ZVN0YXRlbWVudCxcbiAgSGVhZEtpbmQsXG4gIFBhdGgsXG4gIFZhcmlhYmxlLFxuICBWYXJpYWJsZUtpbmQsXG4gIEJ1aWxkZXIsXG4gIE5vcm1hbGl6ZWRFeHByZXNzaW9uLFxuICBFeHByZXNzaW9uS2luZCxcbiAgTm9ybWFsaXplZFBhcmFtcyxcbiAgTm9ybWFsaXplZEhhc2gsXG4gIE5vcm1hbGl6ZWRBdHRycyxcbiAgTm9ybWFsaXplZEVsZW1lbnQsXG4gIE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIE5vcm1hbGl6ZWRBbmdsZUludm9jYXRpb24sXG4gIE5vcm1hbGl6ZWRCbG9ja3MsXG59IGZyb20gJy4vYnVpbGRlci1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQXR0ck5hbWVzcGFjZSwgTmFtZXNwYWNlIH0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcblxuaW50ZXJmYWNlIFN5bWJvbHMge1xuICB0b3A6IFByb2dyYW1TeW1ib2xzO1xuICBmcmVlVmFyKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYXJnKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYmxvY2sobmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICBsb2NhbChuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHRoaXMoKTogbnVtYmVyO1xuXG4gIGhhc0xvY2FsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgY2hpbGQocGFyYW1zOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scztcbn1cblxuZXhwb3J0IGNsYXNzIFByb2dyYW1TeW1ib2xzIGltcGxlbWVudHMgU3ltYm9scyB7XG4gIF9mcmVlVmFyaWFibGVzOiBzdHJpbmdbXSA9IFtdO1xuICBfc3ltYm9sczogc3RyaW5nW10gPSBbJ3RoaXMnXTtcblxuICB0b3AgPSB0aGlzO1xuXG4gIHRvU3ltYm9scygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N5bWJvbHMuc2xpY2UoMSk7XG4gIH1cblxuICB0b1VwdmFycygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZWVWYXJpYWJsZXM7XG4gIH1cblxuICBmcmVlVmFyKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFkZFN0cmluZyh0aGlzLl9mcmVlVmFyaWFibGVzLCBuYW1lKTtcbiAgfVxuXG4gIGJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sKG5hbWUpO1xuICB9XG5cbiAgYXJnKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFkZFN0cmluZyh0aGlzLl9zeW1ib2xzLCBuYW1lKTtcbiAgfVxuXG4gIGxvY2FsKG5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGxvY2FsICR7bmFtZX0gd2FzIGZvdW5kLiBNYXliZSB5b3UgbWVhbnQgXiR7bmFtZX0/YCk7XG4gIH1cblxuICB0aGlzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBoYXNMb2NhbChfbmFtZTogc3RyaW5nKTogZmFsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGFueSBzeW1ib2xcbiAgc3ltYm9sKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFkZFN0cmluZyh0aGlzLl9zeW1ib2xzLCBuYW1lKTtcbiAgfVxuXG4gIGNoaWxkKGxvY2Fsczogc3RyaW5nW10pOiBMb2NhbFN5bWJvbHMge1xuICAgIHJldHVybiBuZXcgTG9jYWxTeW1ib2xzKHRoaXMsIGxvY2Fscyk7XG4gIH1cbn1cblxuY2xhc3MgTG9jYWxTeW1ib2xzIGltcGxlbWVudHMgU3ltYm9scyB7XG4gIHByaXZhdGUgbG9jYWxzOiBEaWN0PG51bWJlcj4gPSBkaWN0KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYXJlbnQ6IFN5bWJvbHMsIGxvY2Fsczogc3RyaW5nW10pIHtcbiAgICBmb3IgKGxldCBsb2NhbCBvZiBsb2NhbHMpIHtcbiAgICAgIHRoaXMubG9jYWxzW2xvY2FsXSA9IHBhcmVudC50b3Auc3ltYm9sKGxvY2FsKTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFyYW1TeW1ib2xzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdmFsdWVzKHRoaXMubG9jYWxzKTtcbiAgfVxuXG4gIGdldCB0b3AoKTogUHJvZ3JhbVN5bWJvbHMge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC50b3A7XG4gIH1cblxuICBmcmVlVmFyKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmZyZWVWYXIobmFtZSk7XG4gIH1cblxuICBhcmcobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYXJnKG5hbWUpO1xuICB9XG5cbiAgYmxvY2sobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYmxvY2sobmFtZSk7XG4gIH1cblxuICBsb2NhbChuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmIChuYW1lIGluIHRoaXMubG9jYWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbHNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudC5sb2NhbChuYW1lKTtcbiAgICB9XG4gIH1cblxuICB0aGlzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LnRoaXMoKTtcbiAgfVxuXG4gIGhhc0xvY2FsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChuYW1lIGluIHRoaXMubG9jYWxzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50Lmhhc0xvY2FsKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGNoaWxkKGxvY2Fsczogc3RyaW5nW10pOiBMb2NhbFN5bWJvbHMge1xuICAgIHJldHVybiBuZXcgTG9jYWxTeW1ib2xzKHRoaXMsIGxvY2Fscyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkU3RyaW5nKGFycmF5OiBzdHJpbmdbXSwgaXRlbTogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gYXJyYXkuaW5kZXhPZihpdGVtKTtcblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgaW5kZXggPSBhcnJheS5sZW5ndGg7XG4gICAgYXJyYXkucHVzaChpdGVtKTtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRlckdldEZyZWUge1xuICB0eXBlOiAnR2V0RnJlZSc7XG4gIGhlYWQ6IHN0cmluZztcbiAgdGFpbDogc3RyaW5nW107XG59XG5cbmZ1bmN0aW9uIHVuaW1wbChtZXNzYWdlOiBzdHJpbmcpOiBFcnJvciB7XG4gIHJldHVybiBuZXcgRXJyb3IoYHVuaW1wbGVtZW50ZWQgJHttZXNzYWdlfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnRzKFxuICBzdGF0ZW1lbnRzOiBCdWlsZGVyU3RhdGVtZW50W10sXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10ge1xuICBsZXQgb3V0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgc3RhdGVtZW50cy5mb3JFYWNoKHMgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQobm9ybWFsaXplU3RhdGVtZW50KHMpLCBzeW1ib2xzKSkpO1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRTdGF0ZW1lbnRzKFxuICBzdGF0ZW1lbnRzOiBOb3JtYWxpemVkU3RhdGVtZW50W10sXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10ge1xuICBsZXQgb3V0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgc3RhdGVtZW50cy5mb3JFYWNoKHMgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQocywgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnQoXG4gIG5vcm1hbGl6ZWQ6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIHN5bWJvbHM6IFN5bWJvbHMgPSBuZXcgUHJvZ3JhbVN5bWJvbHMoKVxuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIHN3aXRjaCAobm9ybWFsaXplZC5raW5kKSB7XG4gICAgY2FzZSBIZWFkS2luZC5BcHBlbmRQYXRoOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAgT3AuQXBwZW5kLFxuICAgICAgICAgICtub3JtYWxpemVkLnRydXN0ZWQsXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIGJ1aWxkUGF0aChub3JtYWxpemVkLnBhdGgsIEV4cHJlc3Npb25Db250ZXh0LkFwcGVuZFNpbmdsZUlkLCBzeW1ib2xzKSxcbiAgICAgICAgXSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5BcHBlbmRFeHByOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAgT3AuQXBwZW5kLFxuICAgICAgICAgICtub3JtYWxpemVkLnRydXN0ZWQsXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbihub3JtYWxpemVkLmV4cHIsIEV4cHJlc3Npb25Db250ZXh0LkV4cHJlc3Npb24sIHN5bWJvbHMpLFxuICAgICAgICBdLFxuICAgICAgXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkNhbGw6IHtcbiAgICAgIGxldCB7IHBhdGgsIHBhcmFtcywgaGFzaCwgdHJ1c3RlZCB9ID0gbm9ybWFsaXplZDtcbiAgICAgIGxldCBidWlsdFBhcmFtczogT3B0aW9uPFdpcmVGb3JtYXQuQ29yZS5QYXJhbXM+ID0gcGFyYW1zID8gYnVpbGRQYXJhbXMocGFyYW1zLCBzeW1ib2xzKSA6IFtdO1xuICAgICAgbGV0IGJ1aWx0SGFzaDogV2lyZUZvcm1hdC5Db3JlLkhhc2ggPSBoYXNoID8gYnVpbGRIYXNoKGhhc2gsIHN5bWJvbHMpIDogbnVsbDtcbiAgICAgIGxldCBidWlsdEV4cHI6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbiA9IGJ1aWxkUGF0aChwYXRoLCBFeHByZXNzaW9uQ29udGV4dC5DYWxsSGVhZCwgc3ltYm9scyk7XG5cbiAgICAgIHJldHVybiBbW09wLkFwcGVuZCwgK3RydXN0ZWQsIDAsIDAsIFtPcC5DYWxsLCAwLCAwLCBidWlsdEV4cHIsIGJ1aWx0UGFyYW1zLCBidWlsdEhhc2hdXV07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5MaXRlcmFsOiB7XG4gICAgICByZXR1cm4gW1tPcC5BcHBlbmQsIDEsIDAsIDAsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkNvbW1lbnQ6IHtcbiAgICAgIHJldHVybiBbW09wLkNvbW1lbnQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkJsb2NrOiB7XG4gICAgICBsZXQgYmxvY2tzID0gYnVpbGRCbG9ja3Mobm9ybWFsaXplZC5ibG9ja3MsIG5vcm1hbGl6ZWQuYmxvY2tQYXJhbXMsIHN5bWJvbHMpO1xuICAgICAgbGV0IGhhc2ggPSBidWlsZEhhc2gobm9ybWFsaXplZC5oYXNoLCBzeW1ib2xzKTtcbiAgICAgIGxldCBwYXJhbXMgPSBidWlsZFBhcmFtcyhub3JtYWxpemVkLnBhcmFtcywgc3ltYm9scyk7XG4gICAgICBsZXQgcGF0aCA9IGJ1aWxkUGF0aChub3JtYWxpemVkLnBhdGgsIEV4cHJlc3Npb25Db250ZXh0LkJsb2NrSGVhZCwgc3ltYm9scyk7XG5cbiAgICAgIHJldHVybiBbW09wLkJsb2NrLCBwYXRoLCBwYXJhbXMsIGhhc2gsIGJsb2Nrc11dO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuRWxlbWVudDpcbiAgICAgIHJldHVybiBidWlsZEVsZW1lbnQobm9ybWFsaXplZCwgc3ltYm9scyk7XG5cbiAgICBjYXNlIEhlYWRLaW5kLk1vZGlmaWVyOlxuICAgICAgdGhyb3cgdW5pbXBsKCdtb2RpZmllcicpO1xuXG4gICAgY2FzZSBIZWFkS2luZC5EeW5hbWljQ29tcG9uZW50OlxuICAgICAgdGhyb3cgdW5pbXBsKCdkeW5hbWljIGNvbXBvbmVudCcpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IGFzc2VydE5ldmVyKG5vcm1hbGl6ZWQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzKFxuICBhcnI6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi5pbnRlcnBvbGF0ZWQ6IHVua25vd25bXVxuKTogW0J1aWxkZXIuTGl0ZXJhbCwgc3RyaW5nXSB7XG4gIGxldCByZXN1bHQgPSBhcnIucmVkdWNlKFxuICAgIChyZXN1bHQsIHN0cmluZywgaSkgPT4gcmVzdWx0ICsgYCR7c3RyaW5nfSR7aW50ZXJwb2xhdGVkW2ldID8gaW50ZXJwb2xhdGVkW2ldIDogJyd9YCxcbiAgICAnJ1xuICApIGFzIHN0cmluZztcblxuICByZXR1cm4gW0J1aWxkZXIuTGl0ZXJhbCwgcmVzdWx0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGMoYXJyOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSwgLi4uaW50ZXJwb2xhdGVkOiB1bmtub3duW10pOiBCdWlsZGVyQ29tbWVudCB7XG4gIGxldCByZXN1bHQgPSBhcnIucmVkdWNlKFxuICAgIChyZXN1bHQsIHN0cmluZywgaSkgPT4gcmVzdWx0ICsgYCR7c3RyaW5nfSR7aW50ZXJwb2xhdGVkW2ldID8gaW50ZXJwb2xhdGVkW2ldIDogJyd9YCxcbiAgICAnJ1xuICApIGFzIHN0cmluZztcblxuICByZXR1cm4gW0J1aWxkZXIuQ29tbWVudCwgcmVzdWx0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaWNvZGUoY2hhckNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGNoYXJDb2RlLCAxNikpO1xufVxuXG5leHBvcnQgY29uc3QgTkVXTElORSA9ICdcXG4nO1xuXG5mdW5jdGlvbiBidWlsZEVsZW1lbnQoXG4gIHsgbmFtZSwgYXR0cnMsIGJsb2NrIH06IE5vcm1hbGl6ZWRFbGVtZW50LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgbGV0IG91dDogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSA9IFtbT3AuT3BlbkVsZW1lbnQsIG5hbWUsICFoYXNTcGxhdChhdHRycyldXTtcbiAgaWYgKGF0dHJzKSB7XG4gICAgbGV0IHsgYXR0cmlidXRlcywgYXJncyB9ID0gYnVpbGRBdHRycyhhdHRycywgc3ltYm9scyk7XG4gICAgb3V0LnB1c2goLi4uYXR0cmlidXRlcyk7XG4gICAgYXNzZXJ0KGFyZ3MgPT09IG51bGwsIGBDYW4ndCBwYXNzIGFyZ3MgdG8gYSBzaW1wbGUgZWxlbWVudGApO1xuICB9XG4gIG91dC5wdXNoKFtPcC5GbHVzaEVsZW1lbnRdKTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShibG9jaykpIHtcbiAgICBibG9jay5mb3JFYWNoKHMgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQocywgc3ltYm9scykpKTtcbiAgfSBlbHNlIGlmIChibG9jayA9PT0gbnVsbCkge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBhc3NlcnROZXZlcihibG9jayk7XG4gIH1cblxuICBvdXQucHVzaChbT3AuQ2xvc2VFbGVtZW50XSk7XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gaGFzU3BsYXQoYXR0cnM6IE9wdGlvbjxOb3JtYWxpemVkQXR0cnM+KTogYm9vbGVhbiB7XG4gIGlmIChhdHRycyA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhhdHRycykuc29tZShhID0+IGF0dHJzW2FdID09PSBIZWFkS2luZC5TcGxhdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFuZ2xlSW52b2NhdGlvbihcbiAgeyBhdHRycywgYmxvY2ssIGhlYWQgfTogTm9ybWFsaXplZEFuZ2xlSW52b2NhdGlvbixcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLkNvbXBvbmVudCB7XG4gIGxldCBhdHRyTGlzdDogV2lyZUZvcm1hdC5BdHRyaWJ1dGVbXSA9IFtdO1xuICBsZXQgYXJnczogV2lyZUZvcm1hdC5Db3JlLkhhc2ggPSBudWxsO1xuICBsZXQgYmxvY2tMaXN0OiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdID0gW107XG5cbiAgaWYgKGF0dHJzKSB7XG4gICAgbGV0IGJ1aWx0ID0gYnVpbGRBdHRycyhhdHRycywgc3ltYm9scyk7XG4gICAgYXR0ckxpc3QgPSBidWlsdC5hdHRyaWJ1dGVzO1xuICAgIGFyZ3MgPSBidWlsdC5hcmdzO1xuICB9XG5cbiAgaWYgKGJsb2NrKSBibG9ja0xpc3QgPSBidWlsZE5vcm1hbGl6ZWRTdGF0ZW1lbnRzKGJsb2NrLCBzeW1ib2xzKTtcblxuICByZXR1cm4gW1xuICAgIE9wLkNvbXBvbmVudCxcbiAgICBidWlsZEV4cHJlc3Npb24oaGVhZCwgRXhwcmVzc2lvbkNvbnRleHQuQ2FsbEhlYWQsIHN5bWJvbHMpLFxuICAgIGF0dHJMaXN0LFxuICAgIGFyZ3MsXG4gICAgW1snZGVmYXVsdCddLCBbeyBwYXJhbWV0ZXJzOiBbXSwgc3RhdGVtZW50czogYmxvY2tMaXN0IH1dXSxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXR0cnMoXG4gIGF0dHJzOiBOb3JtYWxpemVkQXR0cnMsXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IHsgYXR0cmlidXRlczogV2lyZUZvcm1hdC5BdHRyaWJ1dGVbXTsgYXJnczogV2lyZUZvcm1hdC5Db3JlLkhhc2ggfSB7XG4gIGxldCBhdHRyaWJ1dGVzOiBXaXJlRm9ybWF0LkF0dHJpYnV0ZVtdID0gW107XG4gIGxldCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgdmFsdWVzOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25bXSA9IFtdO1xuXG4gIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgbGV0IHZhbHVlID0gYXR0cnNba2V5XTtcblxuICAgIGlmICh2YWx1ZSA9PT0gSGVhZEtpbmQuU3BsYXQpIHtcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChbT3AuQXR0clNwbGF0LCBzeW1ib2xzLmJsb2NrKCcmYXR0cnMnKV0pO1xuICAgIH0gZWxzZSBpZiAoa2V5WzBdID09PSAnQCcpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgdmFsdWVzLnB1c2goYnVpbGRFeHByZXNzaW9uKHZhbHVlLCBFeHByZXNzaW9uQ29udGV4dC5FeHByZXNzaW9uLCBzeW1ib2xzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgLi4uYnVpbGRBdHRyaWJ1dGVWYWx1ZShcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgLy8gVE9ETzogZXh0cmFjdCBuYW1lc3BhY2UgZnJvbSBrZXlcbiAgICAgICAgICBleHRyYWN0TmFtZXNwYWNlKGtleSksXG4gICAgICAgICAgc3ltYm9sc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHsgYXR0cmlidXRlcywgYXJnczoga2V5cy5sZW5ndGggPT09IDAgPyBudWxsIDogW2tleXMsIHZhbHVlc10gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3ROYW1lc3BhY2UobmFtZTogc3RyaW5nKTogT3B0aW9uPEF0dHJOYW1lc3BhY2U+IHtcbiAgaWYgKG5hbWUgPT09ICd4bWxucycpIHtcbiAgICByZXR1cm4gTmFtZXNwYWNlLlhNTE5TO1xuICB9XG5cbiAgbGV0IG1hdGNoID0gbmFtZS5tYXRjaCgvXihbXjpdKik6KFteOl0qKSQvKTtcblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuYW1lc3BhY2UgPSBtYXRjaFsxXTtcblxuICBzd2l0Y2ggKG5hbWVzcGFjZSkge1xuICAgIGNhc2UgJ3hsaW5rJzpcbiAgICAgIHJldHVybiBOYW1lc3BhY2UuWExpbms7XG4gICAgY2FzZSAneG1sJzpcbiAgICAgIHJldHVybiBOYW1lc3BhY2UuWE1MO1xuICAgIGNhc2UgJ3htbG5zJzpcbiAgICAgIHJldHVybiBOYW1lc3BhY2UuWE1MTlM7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXR0cmlidXRlVmFsdWUoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IE5vcm1hbGl6ZWRFeHByZXNzaW9uLFxuICBuYW1lc3BhY2U6IE9wdGlvbjxBdHRyTmFtZXNwYWNlPixcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5BdHRyaWJ1dGVbXSB7XG4gIHN3aXRjaCAodmFsdWUudHlwZSkge1xuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuTGl0ZXJhbDoge1xuICAgICAgbGV0IHZhbCA9IHZhbHVlLnZhbHVlO1xuXG4gICAgICBpZiAodmFsID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9IGVsc2UgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gW1tPcC5TdGF0aWNBdHRyLCBuYW1lLCAnJywgbmFtZXNwYWNlXV07XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbW09wLlN0YXRpY0F0dHIsIG5hbWUsIHZhbCwgbmFtZXNwYWNlXV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQvdW5pbXBsZW1lbnRlZCBsaXRlcmFsIGF0dHJpYnV0ZSAke0pTT04uc3RyaW5naWZ5KHZhbCl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFtcbiAgICAgICAgICBPcC5EeW5hbWljQXR0cixcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbih2YWx1ZSwgRXhwcmVzc2lvbkNvbnRleHQuQXBwZW5kU2luZ2xlSWQsIHN5bWJvbHMpLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgXSxcbiAgICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwcmVzc2lvbihcbiAgZXhwcjogTm9ybWFsaXplZEV4cHJlc3Npb24sXG4gIGNvbnRleHQ6IEV4cHJlc3Npb25Db250ZXh0LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LkV4cHJlc3Npb24ge1xuICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuR2V0OiB7XG4gICAgICByZXR1cm4gYnVpbGRQYXRoKGV4cHIucGF0aCwgY29udGV4dCwgc3ltYm9scyk7XG4gICAgfVxuXG4gICAgY2FzZSBFeHByZXNzaW9uS2luZC5Db25jYXQ6IHtcbiAgICAgIHJldHVybiBbT3AuQ29uY2F0LCBidWlsZENvbmNhdChleHByLnBhcmFtcywgc3ltYm9scyldO1xuICAgIH1cblxuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuQ2FsbDoge1xuICAgICAgbGV0IGJ1aWx0UGFyYW1zID0gYnVpbGRQYXJhbXMoZXhwci5wYXJhbXMsIHN5bWJvbHMpO1xuICAgICAgbGV0IGJ1aWx0SGFzaCA9IGJ1aWxkSGFzaChleHByLmhhc2gsIHN5bWJvbHMpO1xuICAgICAgbGV0IGJ1aWx0RXhwciA9IGJ1aWxkUGF0aChleHByLnBhdGgsIEV4cHJlc3Npb25Db250ZXh0LkNhbGxIZWFkLCBzeW1ib2xzKTtcblxuICAgICAgcmV0dXJuIFtPcC5DYWxsLCAwLCAwLCBidWlsdEV4cHIsIGJ1aWx0UGFyYW1zLCBidWlsdEhhc2hdO1xuICAgIH1cblxuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuSGFzQmxvY2s6IHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIE9wLkhhc0Jsb2NrLFxuICAgICAgICBidWlsZFZhcihcbiAgICAgICAgICB7IGtpbmQ6IFZhcmlhYmxlS2luZC5CbG9jaywgbmFtZTogZXhwci5uYW1lIH0sXG4gICAgICAgICAgRXhwcmVzc2lvbkNvbnRleHQuRXhwcmVzc2lvbixcbiAgICAgICAgICBzeW1ib2xzXG4gICAgICAgICksXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuSGFzQmxvY2tQYXJhbXM6IHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIE9wLkhhc0Jsb2NrUGFyYW1zLFxuICAgICAgICBidWlsZFZhcihcbiAgICAgICAgICB7IGtpbmQ6IFZhcmlhYmxlS2luZC5CbG9jaywgbmFtZTogZXhwci5uYW1lIH0sXG4gICAgICAgICAgRXhwcmVzc2lvbkNvbnRleHQuRXhwcmVzc2lvbixcbiAgICAgICAgICBzeW1ib2xzXG4gICAgICAgICksXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgRXhwcmVzc2lvbktpbmQuTGl0ZXJhbDoge1xuICAgICAgaWYgKGV4cHIudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW09wLlVuZGVmaW5lZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZXhwci52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBhdGgoXG4gIHBhdGg6IFBhdGgsXG4gIGNvbnRleHQ6IEV4cHJlc3Npb25Db250ZXh0LFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBFeHByZXNzaW9ucy5HZXRQYXRoIHtcbiAgaWYgKHBhdGgudGFpbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW09wLkdldFBhdGgsIGJ1aWxkVmFyKHBhdGgudmFyaWFibGUsIGNvbnRleHQsIHN5bWJvbHMpLCBwYXRoLnRhaWxdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbT3AuR2V0UGF0aCwgYnVpbGRWYXIocGF0aC52YXJpYWJsZSwgRXhwcmVzc2lvbkNvbnRleHQuRXhwcmVzc2lvbiwgc3ltYm9scyksIHBhdGgudGFpbF07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVmFyKFxuICBoZWFkOiBWYXJpYWJsZSxcbiAgY29udGV4dDogRXhwcmVzc2lvbkNvbnRleHQsXG4gIHN5bWJvbHM6IFN5bWJvbHNcbik6IEV4cHJlc3Npb25zLkdldFN5bWJvbCB8IEV4cHJlc3Npb25zLkdldEZyZWUgfCBFeHByZXNzaW9ucy5HZXRDb250ZXh0dWFsRnJlZSB7XG4gIHN3aXRjaCAoaGVhZC5raW5kKSB7XG4gICAgY2FzZSBWYXJpYWJsZUtpbmQuRnJlZTpcbiAgICAgIHJldHVybiBbT3AuR2V0Q29udGV4dHVhbEZyZWUsIHN5bWJvbHMuZnJlZVZhcihoZWFkLm5hbWUpLCBjb250ZXh0XTtcbiAgICBjYXNlIFZhcmlhYmxlS2luZC5Bcmc6XG4gICAgICByZXR1cm4gW09wLkdldFN5bWJvbCwgc3ltYm9scy5hcmcoaGVhZC5uYW1lKV07XG4gICAgY2FzZSBWYXJpYWJsZUtpbmQuQmxvY2s6XG4gICAgICByZXR1cm4gW09wLkdldFN5bWJvbCwgc3ltYm9scy5ibG9jayhoZWFkLm5hbWUpXTtcbiAgICBjYXNlIFZhcmlhYmxlS2luZC5Mb2NhbDpcbiAgICAgIHJldHVybiBbT3AuR2V0U3ltYm9sLCBzeW1ib2xzLmxvY2FsKGhlYWQubmFtZSldO1xuICAgIGNhc2UgVmFyaWFibGVLaW5kLlRoaXM6XG4gICAgICByZXR1cm4gW09wLkdldFN5bWJvbCwgc3ltYm9scy50aGlzKCldO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBhcmFtcyhcbiAgZXhwcnM6IE9wdGlvbjxOb3JtYWxpemVkUGFyYW1zPixcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogT3B0aW9uPFdpcmVGb3JtYXQuQ29yZS5QYXJhbXM+IHtcbiAgaWYgKGV4cHJzID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gZXhwcnMubWFwKGUgPT4gYnVpbGRFeHByZXNzaW9uKGUsIEV4cHJlc3Npb25Db250ZXh0LkV4cHJlc3Npb24sIHN5bWJvbHMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29uY2F0KFxuICBleHByczogW05vcm1hbGl6ZWRFeHByZXNzaW9uLCAuLi5Ob3JtYWxpemVkRXhwcmVzc2lvbltdXSxcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5Db3JlLkNvbmNhdFBhcmFtcyB7XG4gIHJldHVybiBleHBycy5tYXAoZSA9PlxuICAgIGJ1aWxkRXhwcmVzc2lvbihlLCBFeHByZXNzaW9uQ29udGV4dC5BcHBlbmRTaW5nbGVJZCwgc3ltYm9scylcbiAgKSBhcyBXaXJlRm9ybWF0LkNvcmUuQ29uY2F0UGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIYXNoKGV4cHJzOiBPcHRpb248Tm9ybWFsaXplZEhhc2g+LCBzeW1ib2xzOiBTeW1ib2xzKTogV2lyZUZvcm1hdC5Db3JlLkhhc2gge1xuICBpZiAoZXhwcnMgPT09IG51bGwpIHJldHVybiBudWxsO1xuXG4gIGxldCBvdXQ6IFtzdHJpbmdbXSwgV2lyZUZvcm1hdC5FeHByZXNzaW9uW11dID0gW1tdLCBbXV07XG5cbiAgT2JqZWN0LmtleXMoZXhwcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICBvdXRbMF0ucHVzaChrZXkpO1xuICAgIG91dFsxXS5wdXNoKGJ1aWxkRXhwcmVzc2lvbihleHByc1trZXldLCBFeHByZXNzaW9uQ29udGV4dC5FeHByZXNzaW9uLCBzeW1ib2xzKSk7XG4gIH0pO1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEJsb2NrcyhcbiAgYmxvY2tzOiBOb3JtYWxpemVkQmxvY2tzLFxuICBibG9ja1BhcmFtczogT3B0aW9uPHN0cmluZ1tdPixcbiAgcGFyZW50OiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LkNvcmUuQmxvY2tzIHtcbiAgbGV0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGxldCB2YWx1ZXM6IFdpcmVGb3JtYXQuU2VyaWFsaXplZElubGluZUJsb2NrW10gPSBbXTtcblxuICBPYmplY3Qua2V5cyhibG9ja3MpLmZvckVhY2gobmFtZSA9PiB7XG4gICAga2V5cy5wdXNoKG5hbWUpO1xuXG4gICAgaWYgKG5hbWUgPT09ICdkZWZhdWx0Jykge1xuICAgICAgbGV0IHN5bWJvbHMgPSBwYXJlbnQuY2hpbGQoYmxvY2tQYXJhbXMgfHwgW10pO1xuXG4gICAgICB2YWx1ZXMucHVzaCh7XG4gICAgICAgIHBhcmFtZXRlcnM6IHN5bWJvbHMucGFyYW1TeW1ib2xzLFxuICAgICAgICBzdGF0ZW1lbnRzOiBidWlsZE5vcm1hbGl6ZWRTdGF0ZW1lbnRzKGJsb2Nrc1tuYW1lXSwgc3ltYm9scyksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICA