UNPKG

@glimmer/compiler

Version:
784 lines (677 loc) 67.1 kB
function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } import { assert, assertNever, dict, exhausted, isPresent, values } from '@glimmer/util'; import { normalizeStatement, VariableKind } from './builder-interface'; export var ProgramSymbols = /*#__PURE__*/function () { function ProgramSymbols() { this._freeVariables = []; this._symbols = ['this']; this.top = this; } var _proto = ProgramSymbols.prototype; _proto.toSymbols = function toSymbols() { return this._symbols.slice(1); }; _proto.toUpvars = function toUpvars() { return this._freeVariables; }; _proto.freeVar = function freeVar(name) { return addString(this._freeVariables, name); }; _proto.block = function block(name) { return this.symbol(name); }; _proto.arg = function arg(name) { return addString(this._symbols, name); }; _proto.local = function local(name) { throw new Error("No local " + name + " was found. Maybe you meant ^" + name + " for upvar, or !" + name + " for keyword?"); }; _proto["this"] = function _this() { return 0; }; _proto.hasLocal = function hasLocal(_name) { return false; } // any symbol ; _proto.symbol = function symbol(name) { return addString(this._symbols, name); }; _proto.child = function child(locals) { return new LocalSymbols(this, locals); }; return ProgramSymbols; }(); var LocalSymbols = /*#__PURE__*/function () { function LocalSymbols(parent, locals) { this.parent = parent; this.locals = dict(); for (var _iterator = _createForOfIteratorHelperLoose(locals), _step; !(_step = _iterator()).done;) { var local = _step.value; this.locals[local] = parent.top.symbol(local); } } var _proto2 = LocalSymbols.prototype; _proto2.freeVar = function freeVar(name) { return this.parent.freeVar(name); }; _proto2.arg = function arg(name) { return this.parent.arg(name); }; _proto2.block = function block(name) { return this.parent.block(name); }; _proto2.local = function local(name) { if (name in this.locals) { return this.locals[name]; } else { return this.parent.local(name); } }; _proto2["this"] = function _this() { return this.parent["this"](); }; _proto2.hasLocal = function hasLocal(name) { if (name in this.locals) { return true; } else { return this.parent.hasLocal(name); } }; _proto2.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, symbols) { if (symbols === void 0) { symbols = new ProgramSymbols(); } switch (normalized.kind) { case "AppendPath" /* AppendPath */ : { return [[normalized.trusted ? 2 /* TrustingAppend */ : 1 /* Append */ , buildGetPath(normalized.path, symbols)]]; } case "AppendExpr" /* AppendExpr */ : { return [[normalized.trusted ? 2 /* TrustingAppend */ : 1 /* Append */ , buildExpression(normalized.expr, normalized.trusted ? 'TrustedAppend' : 'Append', symbols)]]; } case "Call" /* Call */ : { var path = normalized.head, params = normalized.params, hash = normalized.hash, trusted = normalized.trusted; var builtParams = params ? buildParams(params, symbols) : null; var builtHash = hash ? buildHash(hash, symbols) : null; var builtExpr = buildCallHead(path, trusted ? 3 /* AmbiguousInvoke */ : 2 /* AmbiguousAppendInvoke */ , symbols); return [[trusted ? 2 /* TrustingAppend */ : 1 /* Append */ , [28 /* Call */ , builtExpr, builtParams, builtHash]]]; } case "Literal" /* Literal */ : { return [[1 /* Append */ , normalized.value]]; } case "Comment" /* Comment */ : { return [[3 /* 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 = buildCallHead(normalized.head, 7 /* ResolveAsComponentHead */ , symbols); return [[6 /* Block */ , _path, _params, _hash, blocks]]; } case "Keyword" /* Keyword */ : { return [buildKeyword(normalized, symbols)]; } 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 = new 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] ? String(interpolated[i]) : '')); }, ''); return [0 /* Literal */ , result]; } export function c(arr) { for (var _len2 = arguments.length, interpolated = new 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] ? String(interpolated[i]) : '')); }, ''); return [1 /* Comment */ , result]; } export function unicode(charCode) { return String.fromCharCode(parseInt(charCode, 16)); } export var NEWLINE = '\n'; function buildKeyword(normalized, symbols) { var name = normalized.name; var params = buildParams(normalized.params, symbols); var childSymbols = symbols.child(normalized.blockParams || []); var block = buildBlock(normalized.blocks["default"], childSymbols, childSymbols.paramSymbols); var inverse = normalized.blocks["else"] ? buildBlock(normalized.blocks["else"], symbols, []) : null; switch (name) { case 'with': return [43 /* With */ , params[0], block, inverse]; case 'if': return [41 /* If */ , params[0], block, inverse]; case 'each': var keyExpr = normalized.hash ? normalized.hash['key'] : null; var key = keyExpr ? buildExpression(keyExpr, 'Strict', symbols) : null; return [42 /* Each */ , params[0], key, block, inverse]; default: throw new Error('unimplemented keyword'); } } function buildElement(_ref, symbols) { var name = _ref.name, attrs = _ref.attrs, block = _ref.block; var out = [hasSplat(attrs) ? [11 /* OpenElementWithSplat */ , name] : [10 /* OpenElement */ , name]]; if (attrs) { var _buildElementParams = buildElementParams(attrs, symbols), params = _buildElementParams.params, args = _buildElementParams.args; out.push.apply(out, params); false && assert(args === null, "Can't pass args to a simple element"); } out.push([12 /* 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([13 /* 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(_ref2, symbols) { var attrs = _ref2.attrs, block = _ref2.block, head = _ref2.head; var paramList = []; var args = null; var blockList = []; if (attrs) { var built = buildElementParams(attrs, symbols); paramList = built.params; args = built.args; } if (block) blockList = buildNormalizedStatements(block, symbols); return [8 /* Component */ , buildExpression(head, 7 /* ResolveAsComponentHead */ , symbols), isPresent(paramList) ? paramList : null, args, [['default'], [[blockList, []]]]]; } export function buildElementParams(attrs, symbols) { var params = []; var keys = []; var values = []; Object.keys(attrs).forEach(function (key) { var value = attrs[key]; if (value === "Splat" /* Splat */ ) { params.push([17 /* AttrSplat */ , symbols.block('&attrs')]); } else if (key[0] === '@') { keys.push(key); values.push(buildExpression(value, 'Strict', symbols)); } else { params.push.apply(params, buildAttributeValue(key, value, // TODO: extract namespace from key extractNamespace(key), symbols)); } }); return { params: params, args: isPresent(keys) && isPresent(values) ? [keys, values] : null }; } export function extractNamespace(name) { if (name === 'xmlns') { return "http://www.w3.org/2000/xmlns/" /* XMLNS */ ; } var match = /^([^:]*):([^:]*)$/.exec(name); 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 [[14 /* StaticAttr */ , name, '', namespace !== null && namespace !== void 0 ? namespace : undefined]]; } else if (typeof val === 'string') { return [[14 /* StaticAttr */ , name, val, namespace !== null && namespace !== void 0 ? namespace : undefined]]; } else { throw new Error("Unexpected/unimplemented literal attribute " + JSON.stringify(val)); } } default: return [[15 /* DynamicAttr */ , name, buildExpression(value, 'AttrValue', symbols), namespace !== null && namespace !== void 0 ? namespace : undefined]]; } } function varContext(context, bare) { switch (context) { case 'Append': return bare ? 'AppendBare' : 'AppendInvoke'; case 'TrustedAppend': return bare ? 'TrustedAppendBare' : 'TrustedAppendInvoke'; case 'AttrValue': return bare ? 'AttrValueBare' : 'AttrValueInvoke'; default: return context; } } export function buildExpression(expr, context, symbols) { switch (expr.type) { case "GetPath" /* GetPath */ : { return buildGetPath(expr, symbols); } case "GetVar" /* GetVar */ : { return buildVar(expr.variable, varContext(context, true), symbols); } case "Concat" /* Concat */ : { return [29 /* Concat */ , buildConcat(expr.params, symbols)]; } case "Call" /* Call */ : { var builtParams = buildParams(expr.params, symbols); var builtHash = buildHash(expr.hash, symbols); var builtExpr = buildCallHead(expr.head, context === 'Strict' ? 'SubExpression' : varContext(context, false), symbols); return [28 /* Call */ , builtExpr, builtParams, builtHash]; } case "HasBlock" /* HasBlock */ : { return [48 /* HasBlock */ , buildVar({ kind: VariableKind.Block, name: expr.name, mode: 'loose' }, 0 /* Strict */ , symbols)]; } case "HasBlockParams" /* HasBlockParams */ : { return [49 /* HasBlockParams */ , buildVar({ kind: VariableKind.Block, name: expr.name, mode: 'loose' }, 0 /* Strict */ , symbols)]; } case "Literal" /* Literal */ : { if (expr.value === undefined) { return [27 /* Undefined */ ]; } else { return expr.value; } } default: assertNever(expr); } } export function buildCallHead(callHead, context, symbols) { if (callHead.type === "GetVar" /* GetVar */ ) { return buildVar(callHead.variable, context, symbols); } else { return buildGetPath(callHead, symbols); } } export function buildGetPath(head, symbols) { return buildVar(head.path.head, 0 /* Strict */ , symbols, head.path.tail); } export function buildVar(head, context, symbols, path) { var op = 30 /* GetSymbol */ ; var sym; switch (head.kind) { case VariableKind.Free: if (context === 'Strict') { op = 31 /* GetStrictFree */ ; } else if (context === 'AppendBare') { op = 34 /* GetFreeAsComponentOrHelperHeadOrThisFallback */ ; } else if (context === 'AppendInvoke') { op = 35 /* GetFreeAsComponentOrHelperHead */ ; } else if (context === 'TrustedAppendBare') { op = 36 /* GetFreeAsHelperHeadOrThisFallback */ ; } else if (context === 'TrustedAppendInvoke') { op = 37 /* GetFreeAsHelperHead */ ; } else if (context === 'AttrValueBare') { op = 36 /* GetFreeAsHelperHeadOrThisFallback */ ; } else if (context === 'AttrValueInvoke') { op = 37 /* GetFreeAsHelperHead */ ; } else if (context === 'SubExpression') { op = 37 /* GetFreeAsHelperHead */ ; } else { op = expressionContextOp(context); } sym = symbols.freeVar(head.name); break; default: op = 30 /* GetSymbol */ ; sym = getSymbolForVar(head.kind, symbols, head.name); } if (path === undefined || path.length === 0) { return [op, sym]; } else { return [op, sym, path]; } } function getSymbolForVar(kind, symbols, name) { switch (kind) { case VariableKind.Arg: return symbols.arg(name); case VariableKind.Block: return symbols.block(name); case VariableKind.Local: return symbols.local(name); case VariableKind.This: return symbols["this"](); default: return exhausted(kind); } } export function expressionContextOp(context) { switch (context) { case 0 /* Strict */ : return 31 /* GetStrictFree */ ; case 1 /* AmbiguousAppend */ : return 34 /* GetFreeAsComponentOrHelperHeadOrThisFallback */ ; case 2 /* AmbiguousAppendInvoke */ : return 35 /* GetFreeAsComponentOrHelperHead */ ; case 3 /* AmbiguousInvoke */ : return 36 /* GetFreeAsHelperHeadOrThisFallback */ ; case 5 /* ResolveAsCallHead */ : return 37 /* GetFreeAsHelperHead */ ; case 6 /* ResolveAsModifierHead */ : return 38 /* GetFreeAsModifierHead */ ; case 7 /* ResolveAsComponentHead */ : return 39 /* GetFreeAsComponentHead */ ; default: return exhausted(context); } } export function buildParams(exprs, symbols) { if (exprs === null || !isPresent(exprs)) return null; return exprs.map(function (e) { return buildExpression(e, 'Strict', symbols); }); } export function buildConcat(exprs, symbols) { return exprs.map(function (e) { return buildExpression(e, 'AttrValue', 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], 'Strict', 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(buildBlock(blocks[name], symbols, symbols.paramSymbols)); } else { values.push(buildBlock(blocks[name], parent, [])); } }); return [keys, values]; } function buildBlock(block, symbols, locals) { if (locals === void 0) { locals = []; } return [buildNormalizedStatements(block, symbols), locals]; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9idWlsZGVyL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQVVBLFNBQUEsTUFBQSxFQUFBLFdBQUEsRUFBQSxJQUFBLEVBQUEsU0FBQSxFQUFBLFNBQUEsRUFBQSxNQUFBLFFBQUEsZUFBQTtBQUdBLFNBQUEsa0JBQUEsRUFBQSxZQUFBLFFBQUEscUJBQUE7QUFzQ0EsV0FBTSxjQUFOO0FBQUEsNEJBQUE7QUFDRSxTQUFBLGNBQUEsR0FBQSxFQUFBO0FBQ0EsU0FBQSxRQUFBLEdBQXFCLENBQXJCLE1BQXFCLENBQXJCO0FBRUEsU0FBQSxHQUFBLEdBQUEsSUFBQTtBQTRDRDs7QUFoREQ7O0FBQUEsU0FNRSxTQU5GLEdBTUUscUJBQVM7QUFDUCxXQUFPLEtBQUEsUUFBQSxDQUFBLEtBQUEsQ0FBUCxDQUFPLENBQVA7QUFDRCxHQVJIOztBQUFBLFNBVUUsUUFWRixHQVVFLG9CQUFRO0FBQ04sV0FBTyxLQUFQLGNBQUE7QUFDRCxHQVpIOztBQUFBLFNBY0UsT0FkRixHQWNFLGlCQUFPLElBQVAsRUFBb0I7QUFDbEIsV0FBTyxTQUFTLENBQUMsS0FBRCxjQUFBLEVBQWhCLElBQWdCLENBQWhCO0FBQ0QsR0FoQkg7O0FBQUEsU0FrQkUsS0FsQkYsR0FrQkUsZUFBSyxJQUFMLEVBQWtCO0FBQ2hCLFdBQU8sS0FBQSxNQUFBLENBQVAsSUFBTyxDQUFQO0FBQ0QsR0FwQkg7O0FBQUEsU0FzQkUsR0F0QkYsR0FzQkUsYUFBRyxJQUFILEVBQWdCO0FBQ2QsV0FBTyxTQUFTLENBQUMsS0FBRCxRQUFBLEVBQWhCLElBQWdCLENBQWhCO0FBQ0QsR0F4Qkg7O0FBQUEsU0EwQkUsS0ExQkYsR0EwQkUsZUFBSyxJQUFMLEVBQWtCO0FBQ2hCLFVBQU0sSUFBQSxLQUFBLGVBQ1EsSUFEUixxQ0FDNEMsSUFENUMsd0JBQU4sSUFBTSxtQkFBTjtBQUdELEdBOUJI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LEVBQUEsT0FBQSxDQUE2QixVQUFBLElBQUQsRUFBUztBQUNuQyxJQUFBLElBQUksQ0FBSixJQUFBLENBQUEsSUFBQTs7QUFFQSxRQUFJLElBQUksS0FBUixTQUFBLEVBQXdCO0FBQ3RCLFVBQUksT0FBTyxHQUFHLE1BQU0sQ0FBTixLQUFBLENBQWEsV0FBVyxJQUF0QyxFQUFjLENBQWQ7QUFFQSxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxPQUFBLEVBQXdCLE9BQU8sQ0FBckQsWUFBc0IsQ0FBdEI7QUFIRixLQUFBLE1BSU87QUFDTCxNQUFBLE1BQU0sQ0FBTixJQUFBLENBQVksVUFBVSxDQUFDLE1BQU0sQ0FBUCxJQUFPLENBQVAsRUFBQSxNQUFBLEVBQXRCLEVBQXNCLENBQXRCO0FBQ0Q7QUFUSCxHQUFBO0FBWUEsU0FBTyxDQUFBLElBQUEsRUFBUCxNQUFPLENBQVA7QUFDRDs7QUFFRCxTQUFBLFVBQUEsQ0FBQSxLQUFBLEVBQUEsT0FBQSxFQUdFLE1BSEYsRUFHdUI7QUFBQSxNQUFyQixNQUFxQjtBQUFyQixJQUFBLE1BQXFCLEdBSHZCLEVBR3VCO0FBQUE7O0FBRXJCLFNBQU8sQ0FBQyx5QkFBeUIsQ0FBQSxLQUFBLEVBQTFCLE9BQTBCLENBQTFCLEVBQVAsTUFBTyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaWN0LFxuICBFeHByZXNzaW9ucyxcbiAgR2V0Q29udGV4dHVhbEZyZWVPcCxcbiAgT3B0aW9uLFxuICBQcmVzZW50QXJyYXksXG4gIFNleHBPcGNvZGVzLFxuICBWYXJpYWJsZVJlc29sdXRpb25Db250ZXh0LFxuICBXaXJlRm9ybWF0LFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0TmV2ZXIsIGRpY3QsIGV4aGF1c3RlZCwgZXhwZWN0LCBpc1ByZXNlbnQsIHZhbHVlcyB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgQXR0ck5hbWVzcGFjZSwgTmFtZXNwYWNlIH0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcblxuaW1wb3J0IHtcbiAgQnVpbGRlcixcbiAgQnVpbGRlckNvbW1lbnQsXG4gIEJ1aWxkZXJTdGF0ZW1lbnQsXG4gIEV4cHJlc3Npb25LaW5kLFxuICBIZWFkS2luZCxcbiAgTm9ybWFsaXplZEFuZ2xlSW52b2NhdGlvbixcbiAgTm9ybWFsaXplZEF0dHJzLFxuICBOb3JtYWxpemVkQmxvY2ssXG4gIE5vcm1hbGl6ZWRCbG9ja3MsXG4gIE5vcm1hbGl6ZWRFbGVtZW50LFxuICBOb3JtYWxpemVkRXhwcmVzc2lvbixcbiAgTm9ybWFsaXplZEhhc2gsXG4gIE5vcm1hbGl6ZWRIZWFkLFxuICBOb3JtYWxpemVkS2V5d29yZFN0YXRlbWVudCxcbiAgTm9ybWFsaXplZFBhcmFtcyxcbiAgTm9ybWFsaXplZFBhdGgsXG4gIE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIG5vcm1hbGl6ZVN0YXRlbWVudCxcbiAgVmFyaWFibGUsXG4gIFZhcmlhYmxlS2luZCxcbn0gZnJvbSAnLi9idWlsZGVyLWludGVyZmFjZSc7XG5cbmltcG9ydCBPcCA9IFdpcmVGb3JtYXQuU2V4cE9wY29kZXM7XG5cbmludGVyZmFjZSBTeW1ib2xzIHtcbiAgdG9wOiBQcm9ncmFtU3ltYm9scztcbiAgZnJlZVZhcihuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgbG9jYWwobmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICB0aGlzKCk6IG51bWJlcjtcblxuICBoYXNMb2NhbChuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIGNoaWxkKHBhcmFtczogc3RyaW5nW10pOiBMb2NhbFN5bWJvbHM7XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmFtU3ltYm9scyBpbXBsZW1lbnRzIFN5bWJvbHMge1xuICBfZnJlZVZhcmlhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgX3N5bWJvbHM6IHN0cmluZ1tdID0gWyd0aGlzJ107XG5cbiAgdG9wID0gdGhpcztcblxuICB0b1N5bWJvbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9zeW1ib2xzLnNsaWNlKDEpO1xuICB9XG5cbiAgdG9VcHZhcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9mcmVlVmFyaWFibGVzO1xuICB9XG5cbiAgZnJlZVZhcihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBhZGRTdHJpbmcodGhpcy5fZnJlZVZhcmlhYmxlcywgbmFtZSk7XG4gIH1cblxuICBibG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbChuYW1lKTtcbiAgfVxuXG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiBhZGRTdHJpbmcodGhpcy5fc3ltYm9scywgbmFtZSk7XG4gIH1cblxuICBsb2NhbChuYW1lOiBzdHJpbmcpOiBuZXZlciB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIGxvY2FsICR7bmFtZX0gd2FzIGZvdW5kLiBNYXliZSB5b3UgbWVhbnQgXiR7bmFtZX0gZm9yIHVwdmFyLCBvciAhJHtuYW1lfSBmb3Iga2V5d29yZD9gXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGhhc0xvY2FsKF9uYW1lOiBzdHJpbmcpOiBmYWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gYW55IHN5bWJvbFxuICBzeW1ib2wobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYWRkU3RyaW5nKHRoaXMuX3N5bWJvbHMsIG5hbWUpO1xuICB9XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbFN5bWJvbHModGhpcywgbG9jYWxzKTtcbiAgfVxufVxuXG5jbGFzcyBMb2NhbFN5bWJvbHMgaW1wbGVtZW50cyBTeW1ib2xzIHtcbiAgcHJpdmF0ZSBsb2NhbHM6IERpY3Q8bnVtYmVyPiA9IGRpY3QoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmVudDogU3ltYm9scywgbG9jYWxzOiBzdHJpbmdbXSkge1xuICAgIGZvciAobGV0IGxvY2FsIG9mIGxvY2Fscykge1xuICAgICAgdGhpcy5sb2NhbHNbbG9jYWxdID0gcGFyZW50LnRvcC5zeW1ib2wobG9jYWwpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYXJhbVN5bWJvbHMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB2YWx1ZXModGhpcy5sb2NhbHMpO1xuICB9XG5cbiAgZ2V0IHRvcCgpOiBQcm9ncmFtU3ltYm9scyB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LnRvcDtcbiAgfVxuXG4gIGZyZWVWYXIobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuZnJlZVZhcihuYW1lKTtcbiAgfVxuXG4gIGFyZyhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5hcmcobmFtZSk7XG4gIH1cblxuICBibG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5ibG9jayhuYW1lKTtcbiAgfVxuXG4gIGxvY2FsKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5sb2NhbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY2Fsc1tuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmxvY2FsKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQudGhpcygpO1xuICB9XG5cbiAgaGFzTG9jYWwobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKG5hbWUgaW4gdGhpcy5sb2NhbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnQuaGFzTG9jYWwobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IExvY2FsU3ltYm9scyB7XG4gICAgcmV0dXJuIG5ldyBMb2NhbFN5bWJvbHModGhpcywgbG9jYWxzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRTdHJpbmcoYXJyYXk6IHN0cmluZ1tdLCBpdGVtOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xuXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBpbmRleCA9IGFycmF5Lmxlbmd0aDtcbiAgICBhcnJheS5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBpbmRleDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVyR2V0RnJlZSB7XG4gIHR5cGU6ICdHZXRGcmVlJztcbiAgaGVhZDogc3RyaW5nO1xuICB0YWlsOiBzdHJpbmdbXTtcbn1cblxuZnVuY3Rpb24gdW5pbXBsKG1lc3NhZ2U6IHN0cmluZyk6IEVycm9yIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihgdW5pbXBsZW1lbnRlZCAke21lc3NhZ2V9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0YXRlbWVudHMoXG4gIHN0YXRlbWVudHM6IEJ1aWxkZXJTdGF0ZW1lbnRbXSxcbiAgc3ltYm9sczogU3ltYm9sc1xuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIGxldCBvdXQ6IFdpcmVGb3JtYXQuU3RhdGVtZW50W10gPSBbXTtcblxuICBzdGF0ZW1lbnRzLmZvckVhY2goKHMpID0+IG91dC5wdXNoKC4uLmJ1aWxkU3RhdGVtZW50KG5vcm1hbGl6ZVN0YXRlbWVudChzKSwgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkU3RhdGVtZW50cyhcbiAgc3RhdGVtZW50czogTm9ybWFsaXplZFN0YXRlbWVudFtdLFxuICBzeW1ib2xzOiBTeW1ib2xzXG4pOiBXaXJlRm9ybWF0LlN0YXRlbWVudFtdIHtcbiAgbGV0IG91dDogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSA9IFtdO1xuXG4gIHN0YXRlbWVudHMuZm9yRWFjaCgocykgPT4gb3V0LnB1c2goLi4uYnVpbGRTdGF0ZW1lbnQocywgc3ltYm9scykpKTtcblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdGF0ZW1lbnQoXG4gIG5vcm1hbGl6ZWQ6IE5vcm1hbGl6ZWRTdGF0ZW1lbnQsXG4gIHN5bWJvbHM6IFN5bWJvbHMgPSBuZXcgUHJvZ3JhbVN5bWJvbHMoKVxuKTogV2lyZUZvcm1hdC5TdGF0ZW1lbnRbXSB7XG4gIHN3aXRjaCAobm9ybWFsaXplZC5raW5kKSB7XG4gICAgY2FzZSBIZWFkS2luZC5BcHBlbmRQYXRoOiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBbXG4gICAgICAgICAgbm9ybWFsaXplZC50cnVzdGVkID8gT3AuVHJ1c3RpbmdBcHBlbmQgOiBPcC5BcHBlbmQsXG4gICAgICAgICAgYnVpbGRHZXRQYXRoKG5vcm1hbGl6ZWQucGF0aCwgc3ltYm9scyksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuQXBwZW5kRXhwcjoge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgW1xuICAgICAgICAgIG5vcm1hbGl6ZWQudHJ1c3RlZCA/IE9wLlRydXN0aW5nQXBwZW5kIDogT3AuQXBwZW5kLFxuICAgICAgICAgIGJ1aWxkRXhwcmVzc2lvbihcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQuZXhwcixcbiAgICAgICAgICAgIG5vcm1hbGl6ZWQudHJ1c3RlZCA/ICdUcnVzdGVkQXBwZW5kJyA6ICdBcHBlbmQnLFxuICAgICAgICAgICAgc3ltYm9sc1xuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNhc2UgSGVhZEtpbmQuQ2FsbDoge1xuICAgICAgbGV0IHsgaGVhZDogcGF0aCwgcGFyYW1zLCBoYXNoLCB0cnVzdGVkIH0gPSBub3JtYWxpemVkO1xuICAgICAgbGV0IGJ1aWx0UGFyYW1zOiBPcHRpb248V2lyZUZvcm1hdC5Db3JlLlBhcmFtcz4gPSBwYXJhbXNcbiAgICAgICAgPyBidWlsZFBhcmFtcyhwYXJhbXMsIHN5bWJvbHMpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGxldCBidWlsdEhhc2g6IFdpcmVGb3JtYXQuQ29yZS5IYXNoID0gaGFzaCA/IGJ1aWxkSGFzaChoYXNoLCBzeW1ib2xzKSA6IG51bGw7XG4gICAgICBsZXQgYnVpbHRFeHByOiBXaXJlRm9ybWF0LkV4cHJlc3Npb24gPSBidWlsZENhbGxIZWFkKFxuICAgICAgICBwYXRoLFxuICAgICAgICB0cnVzdGVkXG4gICAgICAgICAgPyBWYXJpYWJsZVJlc29sdXRpb25Db250ZXh0LkFtYmlndW91c0ludm9rZVxuICAgICAgICAgIDogVmFyaWFibGVSZXNvbHV0aW9uQ29udGV4dC5BbWJpZ3VvdXNBcHBlbmRJbnZva2UsXG4gICAgICAgIHN5bWJvbHNcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIFt0cnVzdGVkID8gT3AuVHJ1c3RpbmdBcHBlbmQgOiBPcC5BcHBlbmQsIFtPcC5DYWxsLCBidWlsdEV4cHIsIGJ1aWx0UGFyYW1zLCBidWlsdEhhc2hdXSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY2FzZSBIZWFkS2luZC5MaXRlcmFsOiB7XG4gICAgICByZXR1cm4gW1tPcC5BcHBlbmQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkNvbW1lbnQ6IHtcbiAgICAgIHJldHVybiBbW09wLkNvbW1lbnQsIG5vcm1hbGl6ZWQudmFsdWVdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkJsb2NrOiB7XG4gICAgICBsZXQgYmxvY2tzID0gYnVpbGRCbG9ja3Mobm9ybWFsaXplZC5ibG9ja3MsIG5vcm1hbGl6ZWQuYmxvY2tQYXJhbXMsIHN5bWJvbHMpO1xuICAgICAgbGV0IGhhc2ggPSBidWlsZEhhc2gobm9ybWFsaXplZC5oYXNoLCBzeW1ib2xzKTtcbiAgICAgIGxldCBwYXJhbXMgPSBidWlsZFBhcmFtcyhub3JtYWxpemVkLnBhcmFtcywgc3ltYm9scyk7XG4gICAgICBsZXQgcGF0aCA9IGJ1aWxkQ2FsbEhlYWQoXG4gICAgICAgIG5vcm1hbGl6ZWQuaGVhZCxcbiAgICAgICAgVmFyaWFibGVSZXNvbHV0aW9uQ29udGV4dC5SZXNvbHZlQXNDb21wb25lbnRIZWFkLFxuICAgICAgICBzeW1ib2xzXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gW1tPcC5CbG9jaywgcGF0aCwgcGFyYW1zLCBoYXNoLCBibG9ja3NdXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLktleXdvcmQ6IHtcbiAgICAgIHJldHVybiBbYnVpbGRLZXl3b3JkKG5vcm1hbGl6ZWQsIHN5bWJvbHMpXTtcbiAgICB9XG5cbiAgICBjYXNlIEhlYWRLaW5kLkVsZW1lbnQ6XG4gICAgICByZXR1cm4gYnVpbGRFbGVtZW50KG5vcm1hbGl6ZWQsIHN5bWJvbHMpO1xuXG4gICAgY2FzZSBIZWFkS2luZC5Nb2RpZmllcjpcbiAgICAgIHRocm93IHVuaW1wbCgnbW9kaWZpZXInKTtcblxuICAgIGNhc2UgSGVhZEtpbmQuRHluYW1pY0NvbXBvbmVudDpcbiAgICAgIHRocm93IHVuaW1wbCgnZHluYW1pYyBjb21wb25lbnQnKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBhc3NlcnROZXZlcihub3JtYWxpemVkKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcyhcbiAgYXJyOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgLi4uaW50ZXJwb2xhdGVkOiB1bmtub3duW11cbik6IFtCdWlsZGVyLkxpdGVyYWwsIHN0cmluZ10ge1xuICBsZXQgcmVzdWx0ID0gYXJyLnJlZHVjZShcbiAgICAocmVzdWx0LCBzdHJpbmcsIGkpID0+IHJlc3VsdCArIGAke3N0cmluZ30ke2ludGVycG9sYXRlZFtpXSA/IFN0cmluZyhpbnRlcnBvbGF0ZWRbaV0pIDogJyd9YCxcbiAgICAnJ1xuICApO1xuXG4gIHJldHVybiBbQnVpbGRlci5MaXRlcmFsLCByZXN1bHRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYyhhcnI6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi5pbnRlcnBvbGF0ZWQ6IHVua25vd25bXSk6IEJ1aWxkZXJDb21tZW50IHtcbiAgbGV0IHJlc3VsdCA9IGFyci5yZWR1Y2UoXG4gICAgKHJlc3VsdCwgc3RyaW5nLCBpKSA9PiByZXN1bHQgKyBgJHt