@glimmer/compiler
Version:
256 lines (206 loc) • 21.3 kB
JavaScript
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; }
import { assertPresent, isPresent, mapPresent } from '@glimmer/util';
export var ExpressionEncoder = /*#__PURE__*/function () {
function ExpressionEncoder() {}
var _proto = ExpressionEncoder.prototype;
_proto.expr = function expr(_expr) {
switch (_expr.type) {
case 'Missing':
return undefined;
case 'Literal':
return this.Literal(_expr);
case 'CallExpression':
return this.CallExpression(_expr);
case 'DeprecatedCallExpression':
return this.DeprecatedCallExpression(_expr);
case 'PathExpression':
return this.PathExpression(_expr);
case 'Arg':
return [30
/* GetSymbol */
, _expr.symbol];
case 'Local':
return this.Local(_expr);
case 'This':
return [30
/* GetSymbol */
, 0];
case 'Free':
return [_expr.resolution.resolution(), _expr.symbol];
case 'HasBlock':
return this.HasBlock(_expr);
case 'HasBlockParams':
return this.HasBlockParams(_expr);
case 'Curry':
return this.Curry(_expr);
case 'Not':
return this.Not(_expr);
case 'IfInline':
return this.IfInline(_expr);
case 'InterpolateExpression':
return this.InterpolateExpression(_expr);
case 'GetDynamicVar':
return this.GetDynamicVar(_expr);
case 'Log':
return this.Log(_expr);
}
};
_proto.Literal = function Literal(_ref) {
var value = _ref.value;
if (value === undefined) {
return [27
/* Undefined */
];
} else {
return value;
}
};
_proto.Missing = function Missing() {
return undefined;
};
_proto.HasBlock = function HasBlock(_ref2) {
var symbol = _ref2.symbol;
return [48
/* HasBlock */
, [30
/* GetSymbol */
, symbol]];
};
_proto.HasBlockParams = function HasBlockParams(_ref3) {
var symbol = _ref3.symbol;
return [49
/* HasBlockParams */
, [30
/* GetSymbol */
, symbol]];
};
_proto.Curry = function Curry(_ref4) {
var definition = _ref4.definition,
curriedType = _ref4.curriedType,
args = _ref4.args;
return [50
/* Curry */
, EXPR.expr(definition), curriedType, EXPR.Positional(args.positional), EXPR.NamedArguments(args.named)];
};
_proto.Local = function Local(_ref5) {
var isTemplateLocal = _ref5.isTemplateLocal,
symbol = _ref5.symbol;
return [isTemplateLocal ? 32
/* GetTemplateSymbol */
: 30
/* GetSymbol */
, symbol];
};
_proto.GetWithResolver = function GetWithResolver(_ref6) {
var symbol = _ref6.symbol;
return [34
/* GetFreeAsComponentOrHelperHeadOrThisFallback */
, symbol];
};
_proto.PathExpression = function PathExpression(_ref7) {
var head = _ref7.head,
tail = _ref7.tail;
var getOp = EXPR.expr(head);
return [].concat(getOp, [EXPR.Tail(tail)]);
};
_proto.InterpolateExpression = function InterpolateExpression(_ref8) {
var parts = _ref8.parts;
return [29
/* Concat */
, parts.map(function (e) {
return EXPR.expr(e);
}).toArray()];
};
_proto.CallExpression = function CallExpression(_ref9) {
var callee = _ref9.callee,
args = _ref9.args;
return [28
/* Call */
, EXPR.expr(callee)].concat(EXPR.Args(args));
};
_proto.DeprecatedCallExpression = function DeprecatedCallExpression(_ref10) {
var arg = _ref10.arg,
callee = _ref10.callee;
return [99
/* GetFreeAsDeprecatedHelperHeadOrThisFallback */
, callee.symbol, [arg.chars]];
};
_proto.Tail = function Tail(_ref11) {
var members = _ref11.members;
return mapPresent(members, function (member) {
return member.chars;
});
};
_proto.Args = function Args(_ref12) {
var positional = _ref12.positional,
named = _ref12.named;
return [this.Positional(positional), this.NamedArguments(named)];
};
_proto.Positional = function Positional(_ref13) {
var list = _ref13.list;
return list.map(function (l) {
return EXPR.expr(l);
}).toPresentArray();
};
_proto.NamedArgument = function NamedArgument(_ref14) {
var key = _ref14.key,
value = _ref14.value;
return [key.chars, EXPR.expr(value)];
};
_proto.NamedArguments = function NamedArguments(_ref15) {
var pairs = _ref15.entries;
var list = pairs.toArray();
if (isPresent(list)) {
var names = [];
var values = [];
for (var _iterator = _createForOfIteratorHelperLoose(list), _step; !(_step = _iterator()).done;) {
var pair = _step.value;
var _EXPR$NamedArgument = EXPR.NamedArgument(pair),
name = _EXPR$NamedArgument[0],
value = _EXPR$NamedArgument[1];
names.push(name);
values.push(value);
}
assertPresent(names);
assertPresent(values);
return [names, values];
} else {
return null;
}
};
_proto.Not = function Not(_ref16) {
var value = _ref16.value;
return [51
/* Not */
, EXPR.expr(value)];
};
_proto.IfInline = function IfInline(_ref17) {
var condition = _ref17.condition,
truthy = _ref17.truthy,
falsy = _ref17.falsy;
var expr = [52
/* IfInline */
, EXPR.expr(condition), EXPR.expr(truthy)];
if (falsy) {
expr.push(EXPR.expr(falsy));
}
return expr;
};
_proto.GetDynamicVar = function GetDynamicVar(_ref18) {
var name = _ref18.name;
return [53
/* GetDynamicVar */
, EXPR.expr(name)];
};
_proto.Log = function Log(_ref19) {
var positional = _ref19.positional;
return [54
/* Log */
, this.Positional(positional)];
};
return ExpressionEncoder;
}();
export var EXPR = new ExpressionEncoder();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL2NvbXBpbGVyL2xpYi9wYXNzZXMvMi1lbmNvZGluZy9leHByZXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxTQUFBLGFBQUEsRUFBQSxTQUFBLEVBQUEsVUFBQSxRQUFBLGVBQUE7QUFNQSxXQUFNLGlCQUFOO0FBQUE7O0FBQUE7O0FBQUEsU0FDRSxJQURGLEdBQ0UsY0FBSSxLQUFKLEVBQTZCO0FBQzNCLFlBQVEsS0FBSSxDQUFaLElBQUE7QUFDRSxXQUFBLFNBQUE7QUFDRSxlQUFBLFNBQUE7O0FBQ0YsV0FBQSxTQUFBO0FBQ0UsZUFBTyxLQUFBLE9BQUEsQ0FBUCxLQUFPLENBQVA7O0FBQ0YsV0FBQSxnQkFBQTtBQUNFLGVBQU8sS0FBQSxjQUFBLENBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsMEJBQUE7QUFDRSxlQUFPLEtBQUEsd0JBQUEsQ0FBUCxLQUFPLENBQVA7O0FBQ0YsV0FBQSxnQkFBQTtBQUNFLGVBQU8sS0FBQSxjQUFBLENBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsS0FBQTtBQUNFLGVBQU8sQ0FBQTtBQUFBO0FBQUEsVUFBd0IsS0FBSSxDQUFuQyxNQUFPLENBQVA7O0FBQ0YsV0FBQSxPQUFBO0FBQ0UsZUFBTyxLQUFBLEtBQUEsQ0FBUCxLQUFPLENBQVA7O0FBQ0YsV0FBQSxNQUFBO0FBQ0UsZUFBTyxDQUFBO0FBQUE7QUFBQSxVQUFQLENBQU8sQ0FBUDs7QUFDRixXQUFBLE1BQUE7QUFDRSxlQUFPLENBQUMsS0FBSSxDQUFKLFVBQUEsQ0FBRCxVQUFDLEVBQUQsRUFBK0IsS0FBSSxDQUExQyxNQUFPLENBQVA7O0FBQ0YsV0FBQSxVQUFBO0FBQ0UsZUFBTyxLQUFBLFFBQUEsQ0FBUCxLQUFPLENBQVA7O0FBQ0YsV0FBQSxnQkFBQTtBQUNFLGVBQU8sS0FBQSxjQUFBLENBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsT0FBQTtBQUNFLGVBQU8sS0FBQSxLQUFBLENBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsS0FBQTtBQUNFLGVBQU8sS0FBQSxHQUFBLENBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsVUFBQTtBQUNFLGVBQU8sS0FBQSxRQUFBLENBQVAsS0FBTyxDQUFQOztBQUNGLFdBQUEsdUJBQUE7QUFDRSxlQUFPLEtBQUEscUJBQUEsQ0FBUCxLQUFPLENBQVA7O0FBQ0YsV0FBQSxlQUFBO0FBQ0UsZUFBTyxLQUFBLGFBQUEsQ0FBUCxLQUFPLENBQVA7O0FBQ0YsV0FBQSxLQUFBO0FBQ0UsZUFBTyxLQUFBLEdBQUEsQ0FBUCxLQUFPLENBQVA7QUFsQ0o7QUFvQ0QsR0F0Q0g7O0FBQUEsU0F3Q0UsT0F4Q0YsR0F3Q0UsdUJBRTBCO0FBQUEsUUFEeEIsS0FDd0IsUUFEeEIsS0FDd0I7O0FBQ3hCLFFBQUksS0FBSyxLQUFULFNBQUEsRUFBeUI7QUFDdkIsYUFBTyxDQUFBO0FBQUE7QUFBQSxPQUFQO0FBREYsS0FBQSxNQUVPO0FBQ0wsYUFBQSxLQUFBO0FBQ0Q7QUFDRixHQWhESDs7QUFBQSxTQWtERSxPQWxERixHQWtERSxtQkFBTztBQUNMLFdBQUEsU0FBQTtBQUNELEdBcERIOztBQUFBLFNBc0RFLFFBdERGLEdBc0RFLHlCQUFpQztBQUFBLFFBQXRCLE1BQXNCLFNBQXRCLE1BQXNCO0FBQy9CLFdBQU8sQ0FBQTtBQUFBO0FBQUEsTUFBdUIsQ0FBQTtBQUFBO0FBQUEsTUFBOUIsTUFBOEIsQ0FBdkIsQ0FBUDtBQUNELEdBeERIOztBQUFBLFNBMERFLGNBMURGLEdBMERFLCtCQUE2QztBQUFBLFFBQTVCLE1BQTRCLFNBQTVCLE1BQTRCO0FBQzNDLFdBQU8sQ0FBQTtBQUFBO0FBQUEsTUFBNkIsQ0FBQTtBQUFBO0FBQUEsTUFBcEMsTUFBb0MsQ0FBN0IsQ0FBUDtBQUNELEdBNURIOztBQUFBLFNBOERFLEtBOURGLEdBOERFLHNCQUFrRDtBQUFBLFFBQTVDLFVBQTRDLFNBQTVDLFVBQTRDO0FBQUEsUUFBNUMsV0FBNEMsU0FBNUMsV0FBNEM7QUFBQSxRQUFqQixJQUFpQixTQUFqQixJQUFpQjtBQUNoRCxXQUFPLEM7O0FBQUEsTUFFTCxJQUFJLENBQUosSUFBQSxDQUZLLFVBRUwsQ0FGSyxFQUFBLFdBQUEsRUFJTCxJQUFJLENBQUosVUFBQSxDQUFnQixJQUFJLENBSmYsVUFJTCxDQUpLLEVBS0wsSUFBSSxDQUFKLGNBQUEsQ0FBb0IsSUFBSSxDQUwxQixLQUtFLENBTEssQ0FBUDtBQU9ELEdBdEVIOztBQUFBLFNBd0VFLEtBeEVGLEdBd0VFLHNCQUcwQjtBQUFBLFFBSHBCLGVBR29CLFNBSHBCLGVBR29CO0FBQUEsUUFEeEIsTUFDd0IsU0FEeEIsTUFDd0I7QUFHeEIsV0FBTyxDQUFDLGVBQWUsR0FBRTtBQUFBO0FBQUYsTUFBa0M7QUFBQTtBQUFsRCxNQUFQLE1BQU8sQ0FBUDtBQUNELEdBL0VIOztBQUFBLFNBaUZFLGVBakZGLEdBaUZFLGdDQUErQztBQUFBLFFBQTdCLE1BQTZCLFNBQTdCLE1BQTZCO0FBQzdDLFdBQU8sQ0FBQTtBQUFBO0FBQUEsTUFBUCxNQUFPLENBQVA7QUFDRCxHQW5GSDs7QUFBQSxTQXFGRSxjQXJGRixHQXFGRSwrQkFBaUQ7QUFBQSxRQUFsQyxJQUFrQyxTQUFsQyxJQUFrQztBQUFBLFFBQTFCLElBQTBCLFNBQTFCLElBQTBCO0FBQy9DLFFBQUksS0FBSyxHQUFHLElBQUksQ0FBSixJQUFBLENBQVosSUFBWSxDQUFaO0FBRUEscUJBQU8sS0FBUCxHQUFrQixJQUFJLENBQUosSUFBQSxDQUFsQixJQUFrQixDQUFsQjtBQUNELEdBekZIOztBQUFBLFNBMkZFLHFCQTNGRixHQTJGRSxzQ0FBMEQ7QUFBQSxRQUFsQyxLQUFrQyxTQUFsQyxLQUFrQztBQUN4RCxXQUFPLENBQUE7QUFBQTtBQUFBLE1BQXFCLEtBQUssQ0FBTCxHQUFBLENBQVcsVUFBQSxDQUFEO0FBQUEsYUFBTyxJQUFJLENBQUosSUFBQSxDQUFqQixDQUFpQixDQUFQO0FBQUEsS0FBVixFQUE1QixPQUE0QixFQUFyQixDQUFQO0FBQ0QsR0E3Rkg7O0FBQUEsU0ErRkUsY0EvRkYsR0ErRkUsK0JBQW1EO0FBQUEsUUFBcEMsTUFBb0MsU0FBcEMsTUFBb0M7QUFBQSxRQUExQixJQUEwQixTQUExQixJQUEwQjtBQUNqRCxZQUFPO0FBQUE7QUFBUCxNQUEwQixJQUFJLENBQUosSUFBQSxDQUFuQixNQUFtQixDQUExQixTQUFnRCxJQUFJLENBQUosSUFBQSxDQUFoRCxJQUFnRCxDQUFoRDtBQUNELEdBakdIOztBQUFBLFNBbUdFLHdCQW5HRixHQW1HRSwwQ0FHK0I7QUFBQSxRQUhOLEdBR00sVUFITixHQUdNO0FBQUEsUUFEN0IsTUFDNkIsVUFEN0IsTUFDNkI7QUFDN0IsV0FBTyxDQUFBO0FBQUE7QUFBQSxNQUEwRCxNQUFNLENBQWhFLE1BQUEsRUFBeUUsQ0FBQyxHQUFHLENBQXBGLEtBQWdGLENBQXpFLENBQVA7QUFDRCxHQXhHSDs7QUFBQSxTQTBHRSxJQTFHRixHQTBHRSxzQkFBMEI7QUFBQSxRQUFuQixPQUFtQixVQUFuQixPQUFtQjtBQUN4QixXQUFPLFVBQVUsQ0FBQSxPQUFBLEVBQVcsVUFBQSxNQUFEO0FBQUEsYUFBWSxNQUFNLENBQTdDLEtBQTJCO0FBQUEsS0FBVixDQUFqQjtBQUNELEdBNUdIOztBQUFBLFNBOEdFLElBOUdGLEdBOEdFLHNCQUFvQztBQUFBLFFBQS9CLFVBQStCLFVBQS9CLFVBQStCO0FBQUEsUUFBakIsS0FBaUIsVUFBakIsS0FBaUI7QUFDbEMsV0FBTyxDQUFDLEtBQUEsVUFBQSxDQUFELFVBQUMsQ0FBRCxFQUE4QixLQUFBLGNBQUEsQ0FBckMsS0FBcUMsQ0FBOUIsQ0FBUDtBQUNELEdBaEhIOztBQUFBLFNBa0hFLFVBbEhGLEdBa0hFLDRCQUFtQztBQUFBLFFBQXRCLElBQXNCLFVBQXRCLElBQXNCO0FBQ2pDLFdBQU8sSUFBSSxDQUFKLEdBQUEsQ0FBVSxVQUFBLENBQUQ7QUFBQSxhQUFPLElBQUksQ0FBSixJQUFBLENBQWhCLENBQWdCLENBQVA7QUFBQSxLQUFULEVBQVAsY0FBTyxFQUFQO0FBQ0QsR0FwSEg7O0FBQUEsU0FzSEUsYUF0SEYsR0FzSEUsK0JBQStDO0FBQUEsUUFBakMsR0FBaUMsVUFBakMsR0FBaUM7QUFBQSxRQUExQixLQUEwQixVQUExQixLQUEwQjtBQUM3QyxXQUFPLENBQUMsR0FBRyxDQUFKLEtBQUEsRUFBWSxJQUFJLENBQUosSUFBQSxDQUFuQixLQUFtQixDQUFaLENBQVA7QUFDRCxHQXhISDs7QUFBQSxTQTBIRSxjQTFIRixHQTBIRSxnQ0FBcUQ7QUFBQSxRQUEzQixLQUEyQixVQUFwQyxPQUFvQztBQUNuRCxRQUFJLElBQUksR0FBRyxLQUFLLENBQWhCLE9BQVcsRUFBWDs7QUFFQSxRQUFJLFNBQVMsQ0FBYixJQUFhLENBQWIsRUFBcUI7QUFDbkIsVUFBSSxLQUFLLEdBQVQsRUFBQTtBQUNBLFVBQUksTUFBTSxHQUFWLEVBQUE7O0FBRUEsMkRBQUEsSUFBQSx3Q0FBdUI7QUFBQSxZQUF2QixJQUF1Qjs7QUFBQSxrQ0FDRCxJQUFJLENBQUosYUFBQSxDQUFwQixJQUFvQixDQURDO0FBQUEsWUFDakIsSUFEaUI7QUFBQSxZQUNqQixLQURpQjs7QUFFckIsUUFBQSxLQUFLLENBQUwsSUFBQSxDQUFBLElBQUE7QUFDQSxRQUFBLE1BQU0sQ0FBTixJQUFBLENBQUEsS0FBQTtBQUNEOztBQUVELE1BQUEsYUFBYSxDQUFiLEtBQWEsQ0FBYjtBQUNBLE1BQUEsYUFBYSxDQUFiLE1BQWEsQ0FBYjtBQUVBLGFBQU8sQ0FBQSxLQUFBLEVBQVAsTUFBTyxDQUFQO0FBYkYsS0FBQSxNQWNPO0FBQ0wsYUFBQSxJQUFBO0FBQ0Q7QUFDRixHQTlJSDs7QUFBQSxTQWdKRSxHQWhKRixHQWdKRSxxQkFBc0I7QUFBQSxRQUFoQixLQUFnQixVQUFoQixLQUFnQjtBQUNwQixXQUFPLENBQUE7QUFBQTtBQUFBLE1BQWtCLElBQUksQ0FBSixJQUFBLENBQXpCLEtBQXlCLENBQWxCLENBQVA7QUFDRCxHQWxKSDs7QUFBQSxTQW9KRSxRQXBKRixHQW9KRSwwQkFBbUQ7QUFBQSxRQUExQyxTQUEwQyxVQUExQyxTQUEwQztBQUFBLFFBQTFDLE1BQTBDLFVBQTFDLE1BQTBDO0FBQUEsUUFBckIsS0FBcUIsVUFBckIsS0FBcUI7QUFDakQsUUFBSSxJQUFJLEdBQUcsQ0FBQTtBQUFBO0FBQUEsTUFBdUIsSUFBSSxDQUFKLElBQUEsQ0FBdkIsU0FBdUIsQ0FBdkIsRUFBNkMsSUFBSSxDQUFKLElBQUEsQ0FBeEQsTUFBd0QsQ0FBN0MsQ0FBWDs7QUFFQSxRQUFBLEtBQUEsRUFBVztBQUNULE1BQUEsSUFBSSxDQUFKLElBQUEsQ0FBVSxJQUFJLENBQUosSUFBQSxDQUFWLEtBQVUsQ0FBVjtBQUNEOztBQUVELFdBQUEsSUFBQTtBQUNELEdBNUpIOztBQUFBLFNBOEpFLGFBOUpGLEdBOEpFLCtCQUF5QztBQUFBLFFBQXpCLElBQXlCLFVBQXpCLElBQXlCO0FBQ3ZDLFdBQU8sQ0FBQTtBQUFBO0FBQUEsTUFBNEIsSUFBSSxDQUFKLElBQUEsQ0FBbkMsSUFBbUMsQ0FBNUIsQ0FBUDtBQUNELEdBaEtIOztBQUFBLFNBa0tFLEdBbEtGLEdBa0tFLHFCQUEyQjtBQUFBLFFBQXJCLFVBQXFCLFVBQXJCLFVBQXFCO0FBQ3pCLFdBQU8sQ0FBQTtBQUFBO0FBQUEsTUFBa0IsS0FBQSxVQUFBLENBQXpCLFVBQXlCLENBQWxCLENBQVA7QUFDRCxHQXBLSDs7QUFBQTtBQUFBO0FBdUtBLE9BQU8sSUFBTSxJQUFJLEdBQUcsSUFBYixpQkFBYSxFQUFiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJlc2VudEFycmF5LCBTZXhwT3Bjb2RlcywgV2lyZUZvcm1hdCB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQVNUdjIgfSBmcm9tICdAZ2xpbW1lci9zeW50YXgnO1xuaW1wb3J0IHsgYXNzZXJ0UHJlc2VudCwgaXNQcmVzZW50LCBtYXBQcmVzZW50IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmltcG9ydCAqIGFzIG1pciBmcm9tICcuL21pcic7XG5cbmV4cG9ydCB0eXBlIEhhc2hQYWlyID0gW3N0cmluZywgV2lyZUZvcm1hdC5FeHByZXNzaW9uXTtcblxuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25FbmNvZGVyIHtcbiAgZXhwcihleHByOiBtaXIuRXhwcmVzc2lvbk5vZGUpOiBXaXJlRm9ybWF0LkV4cHJlc3Npb24ge1xuICAgIHN3aXRjaCAoZXhwci50eXBlKSB7XG4gICAgICBjYXNlICdNaXNzaW5nJzpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5MaXRlcmFsKGV4cHIpO1xuICAgICAgY2FzZSAnQ2FsbEV4cHJlc3Npb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5DYWxsRXhwcmVzc2lvbihleHByKTtcbiAgICAgIGNhc2UgJ0RlcHJlY2F0ZWRDYWxsRXhwcmVzc2lvbic6XG4gICAgICAgIHJldHVybiB0aGlzLkRlcHJlY2F0ZWRDYWxsRXhwcmVzc2lvbihleHByKTtcbiAgICAgIGNhc2UgJ1BhdGhFeHByZXNzaW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuUGF0aEV4cHJlc3Npb24oZXhwcik7XG4gICAgICBjYXNlICdBcmcnOlxuICAgICAgICByZXR1cm4gW1NleHBPcGNvZGVzLkdldFN5bWJvbCwgZXhwci5zeW1ib2xdO1xuICAgICAgY2FzZSAnTG9jYWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5Mb2NhbChleHByKTtcbiAgICAgIGNhc2UgJ1RoaXMnOlxuICAgICAgICByZXR1cm4gW1NleHBPcGNvZGVzLkdldFN5bWJvbCwgMF07XG4gICAgICBjYXNlICdGcmVlJzpcbiAgICAgICAgcmV0dXJuIFtleHByLnJlc29sdXRpb24ucmVzb2x1dGlvbigpLCBleHByLnN5bWJvbF07XG4gICAgICBjYXNlICdIYXNCbG9jayc6XG4gICAgICAgIHJldHVybiB0aGlzLkhhc0Jsb2NrKGV4cHIpO1xuICAgICAgY2FzZSAnSGFzQmxvY2tQYXJhbXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5IYXNCbG9ja1BhcmFtcyhleHByKTtcbiAgICAgIGNhc2UgJ0N1cnJ5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3VycnkoZXhwcik7XG4gICAgICBjYXNlICdOb3QnOlxuICAgICAgICByZXR1cm4gdGhpcy5Ob3QoZXhwcik7XG4gICAgICBjYXNlICdJZklubGluZSc6XG4gICAgICAgIHJldHVybiB0aGlzLklmSW5saW5lKGV4cHIpO1xuICAgICAgY2FzZSAnSW50ZXJwb2xhdGVFeHByZXNzaW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuSW50ZXJwb2xhdGVFeHByZXNzaW9uKGV4cHIpO1xuICAgICAgY2FzZSAnR2V0RHluYW1pY1Zhcic6XG4gICAgICAgIHJldHVybiB0aGlzLkdldER5bmFtaWNWYXIoZXhwcik7XG4gICAgICBjYXNlICdMb2cnOlxuICAgICAgICByZXR1cm4gdGhpcy5Mb2coZXhwcik7XG4gICAgfVxuICB9XG5cbiAgTGl0ZXJhbCh7XG4gICAgdmFsdWUsXG4gIH06IEFTVHYyLkxpdGVyYWxFeHByZXNzaW9uKTogV2lyZUZvcm1hdC5FeHByZXNzaW9ucy5WYWx1ZSB8IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuVW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5VbmRlZmluZWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgTWlzc2luZygpOiB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBIYXNCbG9jayh7IHN5bWJvbCB9OiBtaXIuSGFzQmxvY2spOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkhhc0Jsb2NrIHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLkhhc0Jsb2NrLCBbU2V4cE9wY29kZXMuR2V0U3ltYm9sLCBzeW1ib2xdXTtcbiAgfVxuXG4gIEhhc0Jsb2NrUGFyYW1zKHsgc3ltYm9sIH06IG1pci5IYXNCbG9ja1BhcmFtcyk6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuSGFzQmxvY2tQYXJhbXMge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuSGFzQmxvY2tQYXJhbXMsIFtTZXhwT3Bjb2Rlcy5HZXRTeW1ib2wsIHN5bWJvbF1dO1xuICB9XG5cbiAgQ3VycnkoeyBkZWZpbml0aW9uLCBjdXJyaWVkVHlwZSwgYXJncyB9OiBtaXIuQ3VycnkpOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkN1cnJ5IHtcbiAgICByZXR1cm4gW1xuICAgICAgU2V4cE9wY29kZXMuQ3VycnksXG4gICAgICBFWFBSLmV4cHIoZGVmaW5pdGlvbiksXG4gICAgICBjdXJyaWVkVHlwZSxcbiAgICAgIEVYUFIuUG9zaXRpb25hbChhcmdzLnBvc2l0aW9uYWwpLFxuICAgICAgRVhQUi5OYW1lZEFyZ3VtZW50cyhhcmdzLm5hbWVkKSxcbiAgICBdO1xuICB9XG5cbiAgTG9jYWwoe1xuICAgIGlzVGVtcGxhdGVMb2NhbCxcbiAgICBzeW1ib2wsXG4gIH06IEFTVHYyLkxvY2FsVmFyUmVmZXJlbmNlKTpcbiAgICB8IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuR2V0U3ltYm9sXG4gICAgfCBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkdldFRlbXBsYXRlU3ltYm9sIHtcbiAgICByZXR1cm4gW2lzVGVtcGxhdGVMb2NhbCA/IFNleHBPcGNvZGVzLkdldFRlbXBsYXRlU3ltYm9sIDogU2V4cE9wY29kZXMuR2V0U3ltYm9sLCBzeW1ib2xdO1xuICB9XG5cbiAgR2V0V2l0aFJlc29sdmVyKHsgc3ltYm9sIH06IG1pci5HZXRXaXRoUmVzb2x2ZXIpOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkdldENvbnRleHR1YWxGcmVlIHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLkdldEZyZWVBc0NvbXBvbmVudE9ySGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrLCBzeW1ib2xdO1xuICB9XG5cbiAgUGF0aEV4cHJlc3Npb24oeyBoZWFkLCB0YWlsIH06IG1pci5QYXRoRXhwcmVzc2lvbik6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuR2V0UGF0aCB7XG4gICAgbGV0IGdldE9wID0gRVhQUi5leHByKGhlYWQpIGFzIFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuR2V0VmFyO1xuXG4gICAgcmV0dXJuIFsuLi5nZXRPcCwgRVhQUi5UYWlsKHRhaWwpXTtcbiAgfVxuXG4gIEludGVycG9sYXRlRXhwcmVzc2lvbih7IHBhcnRzIH06IG1pci5JbnRlcnBvbGF0ZUV4cHJlc3Npb24pOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkNvbmNhdCB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5Db25jYXQsIHBhcnRzLm1hcCgoZSkgPT4gRVhQUi5leHByKGUpKS50b0FycmF5KCldO1xuICB9XG5cbiAgQ2FsbEV4cHJlc3Npb24oeyBjYWxsZWUsIGFyZ3MgfTogbWlyLkNhbGxFeHByZXNzaW9uKTogV2lyZUZvcm1hdC5FeHByZXNzaW9ucy5IZWxwZXIge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuQ2FsbCwgRVhQUi5leHByKGNhbGxlZSksIC4uLkVYUFIuQXJncyhhcmdzKV07XG4gIH1cblxuICBEZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24oe1xuICAgIGFyZyxcbiAgICBjYWxsZWUsXG4gIH06IG1pci5EZXByZWNhdGVkQ2FsbEV4cHJlc3Npb24pOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLkdldFBhdGhGcmVlQXNEZXByZWNhdGVkSGVscGVySGVhZE9yVGhpc0ZhbGxiYWNrIHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLkdldEZyZWVBc0RlcHJlY2F0ZWRIZWxwZXJIZWFkT3JUaGlzRmFsbGJhY2ssIGNhbGxlZS5zeW1ib2wsIFthcmcuY2hhcnNdXTtcbiAgfVxuXG4gIFRhaWwoeyBtZW1iZXJzIH06IG1pci5UYWlsKTogUHJlc2VudEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiBtYXBQcmVzZW50KG1lbWJlcnMsIChtZW1iZXIpID0+IG1lbWJlci5jaGFycyk7XG4gIH1cblxuICBBcmdzKHsgcG9zaXRpb25hbCwgbmFtZWQgfTogbWlyLkFyZ3MpOiBXaXJlRm9ybWF0LkNvcmUuQXJncyB7XG4gICAgcmV0dXJuIFt0aGlzLlBvc2l0aW9uYWwocG9zaXRpb25hbCksIHRoaXMuTmFtZWRBcmd1bWVudHMobmFtZWQpXTtcbiAgfVxuXG4gIFBvc2l0aW9uYWwoeyBsaXN0IH06IG1pci5Qb3NpdGlvbmFsKTogV2lyZUZvcm1hdC5Db3JlLlBhcmFtcyB7XG4gICAgcmV0dXJuIGxpc3QubWFwKChsKSA9PiBFWFBSLmV4cHIobCkpLnRvUHJlc2VudEFycmF5KCk7XG4gIH1cblxuICBOYW1lZEFyZ3VtZW50KHsga2V5LCB2YWx1ZSB9OiBtaXIuTmFtZWRBcmd1bWVudCk6IEhhc2hQYWlyIHtcbiAgICByZXR1cm4gW2tleS5jaGFycywgRVhQUi5leHByKHZhbHVlKV07XG4gIH1cblxuICBOYW1lZEFyZ3VtZW50cyh7IGVudHJpZXM6IHBhaXJzIH06IG1pci5OYW1lZEFyZ3VtZW50cyk6IFdpcmVGb3JtYXQuQ29yZS5IYXNoIHtcbiAgICBsZXQgbGlzdCA9IHBhaXJzLnRvQXJyYXkoKTtcblxuICAgIGlmIChpc1ByZXNlbnQobGlzdCkpIHtcbiAgICAgIGxldCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCB2YWx1ZXM6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbltdID0gW107XG5cbiAgICAgIGZvciAobGV0IHBhaXIgb2YgbGlzdCkge1xuICAgICAgICBsZXQgW25hbWUsIHZhbHVlXSA9IEVYUFIuTmFtZWRBcmd1bWVudChwYWlyKTtcbiAgICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnRQcmVzZW50KG5hbWVzKTtcbiAgICAgIGFzc2VydFByZXNlbnQodmFsdWVzKTtcblxuICAgICAgcmV0dXJuIFtuYW1lcywgdmFsdWVzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgTm90KHsgdmFsdWUgfTogbWlyLk5vdCk6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuTm90IHtcbiAgICByZXR1cm4gW1NleHBPcGNvZGVzLk5vdCwgRVhQUi5leHByKHZhbHVlKV07XG4gIH1cblxuICBJZklubGluZSh7IGNvbmRpdGlvbiwgdHJ1dGh5LCBmYWxzeSB9OiBtaXIuSWZJbmxpbmUpOiBXaXJlRm9ybWF0LkV4cHJlc3Npb25zLklmSW5saW5lIHtcbiAgICBsZXQgZXhwciA9IFtTZXhwT3Bjb2Rlcy5JZklubGluZSwgRVhQUi5leHByKGNvbmRpdGlvbiksIEVYUFIuZXhwcih0cnV0aHkpXTtcblxuICAgIGlmIChmYWxzeSkge1xuICAgICAgZXhwci5wdXNoKEVYUFIuZXhwcihmYWxzeSkpO1xuICAgIH1cblxuICAgIHJldHVybiBleHByIGFzIFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuSWZJbmxpbmU7XG4gIH1cblxuICBHZXREeW5hbWljVmFyKHsgbmFtZSB9OiBtaXIuR2V0RHluYW1pY1Zhcik6IFdpcmVGb3JtYXQuRXhwcmVzc2lvbnMuR2V0RHluYW1pY1ZhciB7XG4gICAgcmV0dXJuIFtTZXhwT3Bjb2Rlcy5HZXREeW5hbWljVmFyLCBFWFBSLmV4cHIobmFtZSldO1xuICB9XG5cbiAgTG9nKHsgcG9zaXRpb25hbCB9OiBtaXIuTG9nKTogV2lyZUZvcm1hdC5FeHByZXNzaW9ucy5Mb2cge1xuICAgIHJldHVybiBbU2V4cE9wY29kZXMuTG9nLCB0aGlzLlBvc2l0aW9uYWwocG9zaXRpb25hbCldO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBFWFBSID0gbmV3IEV4cHJlc3Npb25FbmNvZGVyKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9