UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

315 lines (253 loc) 32.2 kB
"use strict"; var _reference = require("@glimmer/reference"); var _vm = require("@glimmer/vm"); var _opcodes = require("../../opcodes"); var _concat = require("../expressions/concat"); var _destroyable = require("@glimmer/destroyable"); var _util = require("@glimmer/util"); var _globalContext = require("@glimmer/global-context"); var _symbols = require("../../symbols"); var _env = require("@glimmer/env"); var _curryValue = _interopRequireDefault(require("../../references/curry-value")); var _curriedValue = require("../../curried-value"); var _arguments = require("../../vm/arguments"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } _opcodes.APPEND_OPCODES.add(77 /* Curry */ , function (vm, _ref) { var type = _ref.op1, _isStrict = _ref.op2; var stack = vm.stack; var definition = stack.pop(); var capturedArgs = stack.pop(); var owner = vm.getOwner(); var resolver = vm.runtime.resolver; var isStrict = false; if (_env.DEBUG) { // strict check only happens in DEBUG builds, no reason to load it otherwise isStrict = vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(_isStrict)); } vm.loadValue(_vm.$v0, (0, _curryValue.default)(type, definition, owner, capturedArgs, resolver, isStrict)); }); _opcodes.APPEND_OPCODES.add(107 /* DynamicHelper */ , function (vm) { var stack = vm.stack; var ref = stack.pop(); var args = stack.pop().capture(); var helperRef; var initialOwner = vm.getOwner(); var helperInstanceRef = (0, _reference.createComputeRef)(function () { if (helperRef !== undefined) { (0, _destroyable.destroy)(helperRef); } var definition = (0, _reference.valueForRef)(ref); if ((0, _curriedValue.isCurriedType)(definition, 1 /* Helper */ )) { var _resolveCurriedValue = (0, _curriedValue.resolveCurriedValue)(definition), resolvedDef = _resolveCurriedValue.definition, owner = _resolveCurriedValue.owner, positional = _resolveCurriedValue.positional, named = _resolveCurriedValue.named; var helper = resolveHelper(vm[_symbols.CONSTANTS], resolvedDef, ref); if (named !== undefined) { args.named = _util.assign.apply(void 0, [{}].concat(named, [args.named])); } if (positional !== undefined) { args.positional = positional.concat(args.positional); } helperRef = helper(args, owner); (0, _destroyable.associateDestroyableChild)(helperInstanceRef, helperRef); } else if ((0, _util.isObject)(definition)) { var _helper = resolveHelper(vm[_symbols.CONSTANTS], definition, ref); helperRef = _helper(args, initialOwner); if ((0, _destroyable._hasDestroyableChildren)(helperRef)) { (0, _destroyable.associateDestroyableChild)(helperInstanceRef, helperRef); } } else { helperRef = _reference.UNDEFINED_REFERENCE; } }); var helperValueRef = (0, _reference.createComputeRef)(function () { (0, _reference.valueForRef)(helperInstanceRef); return (0, _reference.valueForRef)(helperRef); }); vm.associateDestroyable(helperInstanceRef); vm.loadValue(_vm.$v0, helperValueRef); }); function resolveHelper(constants, definition, ref) { var handle = constants.helper(definition, null, true); if (_env.DEBUG && handle === null) { throw new Error("Expected a dynamic helper definition, but received an object or function that did not have a helper manager associated with it. The dynamic invocation was `{{" + ref.debugLabel + "}}` or `(" + ref.debugLabel + ")`, and the incorrect definition is the value at the path `" + ref.debugLabel + "`, which was: " + (0, _util.debugToString)(definition)); } return constants.getValue(handle); } _opcodes.APPEND_OPCODES.add(16 /* Helper */ , function (vm, _ref2) { var handle = _ref2.op1; var stack = vm.stack; var helper = vm[_symbols.CONSTANTS].getValue(handle); var args = stack.pop(); var value = helper(args.capture(), vm.getOwner(), vm.dynamicScope()); if ((0, _destroyable._hasDestroyableChildren)(value)) { vm.associateDestroyable(value); } vm.loadValue(_vm.$v0, value); }); _opcodes.APPEND_OPCODES.add(21 /* GetVariable */ , function (vm, _ref3) { var symbol = _ref3.op1; var expr = vm.referenceForSymbol(symbol); vm.stack.push(expr); }); _opcodes.APPEND_OPCODES.add(19 /* SetVariable */ , function (vm, _ref4) { var symbol = _ref4.op1; var expr = vm.stack.pop(); vm.scope().bindSymbol(symbol, expr); }); _opcodes.APPEND_OPCODES.add(20 /* SetBlock */ , function (vm, _ref5) { var symbol = _ref5.op1; var handle = vm.stack.pop(); var scope = vm.stack.pop(); var table = vm.stack.pop(); vm.scope().bindBlock(symbol, [handle, scope, table]); }); _opcodes.APPEND_OPCODES.add(102 /* ResolveMaybeLocal */ , function (vm, _ref6) { var _name = _ref6.op1; var name = vm[_symbols.CONSTANTS].getValue(_name); var locals = vm.scope().getPartialMap(); var ref = locals[name]; if (ref === undefined) { ref = (0, _reference.childRefFor)(vm.getSelf(), name); } vm.stack.push(ref); }); _opcodes.APPEND_OPCODES.add(37 /* RootScope */ , function (vm, _ref7) { var symbols = _ref7.op1; vm.pushRootScope(symbols, vm.getOwner()); }); _opcodes.APPEND_OPCODES.add(22 /* GetProperty */ , function (vm, _ref8) { var _key = _ref8.op1; var key = vm[_symbols.CONSTANTS].getValue(_key); var expr = vm.stack.pop(); vm.stack.push((0, _reference.childRefFor)(expr, key)); }); _opcodes.APPEND_OPCODES.add(23 /* GetBlock */ , function (vm, _ref9) { var _block = _ref9.op1; var stack = vm.stack; var block = vm.scope().getBlock(_block); stack.push(block); }); _opcodes.APPEND_OPCODES.add(24 /* SpreadBlock */ , function (vm) { var stack = vm.stack; var block = stack.pop(); if (block && !isUndefinedReference(block)) { var handleOrCompilable = block[0], scope = block[1], table = block[2]; stack.push(table); stack.push(scope); stack.push(handleOrCompilable); } else { stack.push(null); stack.push(null); stack.push(null); } }); function isUndefinedReference(input) { false && (0, _util.assert)(Array.isArray(input) || input === _reference.UNDEFINED_REFERENCE, 'a reference other than UNDEFINED_REFERENCE is illegal here'); return input === _reference.UNDEFINED_REFERENCE; } _opcodes.APPEND_OPCODES.add(25 /* HasBlock */ , function (vm) { var stack = vm.stack; var block = stack.pop(); if (block && !isUndefinedReference(block)) { stack.push(_reference.TRUE_REFERENCE); } else { stack.push(_reference.FALSE_REFERENCE); } }); _opcodes.APPEND_OPCODES.add(26 /* HasBlockParams */ , function (vm) { // FIXME(mmun): should only need to push the symbol table var block = vm.stack.pop(); var scope = vm.stack.pop(); var table = vm.stack.pop(); var hasBlockParams = table && table.parameters.length; vm.stack.push(hasBlockParams ? _reference.TRUE_REFERENCE : _reference.FALSE_REFERENCE); }); _opcodes.APPEND_OPCODES.add(27 /* Concat */ , function (vm, _ref10) { var count = _ref10.op1; var out = new Array(count); for (var i = count; i > 0; i--) { var offset = i - 1; out[offset] = vm.stack.pop(); } vm.stack.push((0, _concat.createConcatRef)(out)); }); _opcodes.APPEND_OPCODES.add(109 /* IfInline */ , function (vm) { var condition = vm.stack.pop(); var truthy = vm.stack.pop(); var falsy = vm.stack.pop(); vm.stack.push((0, _reference.createComputeRef)(function () { if ((0, _globalContext.toBool)((0, _reference.valueForRef)(condition)) === true) { return (0, _reference.valueForRef)(truthy); } else { return (0, _reference.valueForRef)(falsy); } })); }); _opcodes.APPEND_OPCODES.add(110 /* Not */ , function (vm) { var ref = vm.stack.pop(); vm.stack.push((0, _reference.createComputeRef)(function () { return !(0, _globalContext.toBool)((0, _reference.valueForRef)(ref)); })); }); _opcodes.APPEND_OPCODES.add(111 /* GetDynamicVar */ , function (vm) { var scope = vm.dynamicScope(); var stack = vm.stack; var nameRef = stack.pop(); stack.push((0, _reference.createComputeRef)(function () { var name = String((0, _reference.valueForRef)(nameRef)); return (0, _reference.valueForRef)(scope.get(name)); })); }); _opcodes.APPEND_OPCODES.add(112 /* Log */ , function (vm) { var _vm$stack$pop$capture = vm.stack.pop().capture(), positional = _vm$stack$pop$capture.positional; vm.loadValue(_vm.$v0, (0, _reference.createComputeRef)(function () { var _console; // eslint-disable-next-line no-console (_console = console).log.apply(_console, (0, _arguments.reifyPositional)(positional)); })); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZXhwcmVzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFZQTs7QUFTQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFtQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFJQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBNkIsVUFBQSxFQUFBLEVBQUEsSUFBQSxFQUFzQztBQUFBLE1BQWpDLElBQWlDLEdBQUEsSUFBQSxDQUEvQixHQUErQjtBQUFBLE1BQWYsU0FBZSxHQUFBLElBQUEsQ0FBcEIsR0FBb0I7QUFDakUsTUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFkLEtBQUE7QUFFQSxNQUFJLFVBQVUsR0FBUyxLQUFLLENBQTVCLEdBQXVCLEVBQXZCO0FBQ0EsTUFBSSxZQUFZLEdBQVMsS0FBSyxDQUE5QixHQUF5QixFQUF6QjtBQUVBLE1BQUksS0FBSyxHQUFHLEVBQUUsQ0FBZCxRQUFZLEVBQVo7QUFDQSxNQUFJLFFBQVEsR0FBRyxFQUFFLENBQUYsT0FBQSxDQUFmLFFBQUE7QUFFQSxNQUFJLFFBQVEsR0FBWixLQUFBOztBQUVBLE1BQUEsVUFBQSxFQUFXO0FBQ1Q7QUFDQSxJQUFBLFFBQVEsR0FBRyxFQUFFLENBQUYsa0JBQUUsQ0FBRixDQUFBLFFBQUEsQ0FBZ0Msd0JBQTNDLFNBQTJDLENBQWhDLENBQVg7QUFDRDs7QUFFRCxFQUFBLEVBQUUsQ0FBRixTQUFBLENBQUEsT0FBQSxFQUVFLHlCQUFjLElBQWQsRUFBYyxVQUFkLEVBQWMsS0FBZCxFQUFjLFlBQWQsRUFBYyxRQUFkLEVBRkYsUUFFRSxDQUZGO0FBaEJGLENBQUE7O0FBc0JBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFzQyxVQUFELEVBQUMsRUFBTTtBQUMxQyxNQUFJLEtBQUssR0FBRyxFQUFFLENBQWQsS0FB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LFNBQUEsQ0FBQSxPQUFBLEVBRUUsaUNBQWlCLFlBQUs7QUFBQSxRQUFBLFFBQUEsQ0FBQSxDQUNwQjs7O0FBQ0EsS0FBQSxRQUFBLEdBQUEsT0FBQSxFQUFBLEdBQUEsQ0FBQSxLQUFBLENBQUEsUUFBQSxFQUFlLGdDQUFmLFVBQWUsQ0FBZjtBQUpKLEdBRUUsQ0FGRjtBQUhGLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHMsXG4gIEN1cnJpZWRUeXBlLFxuICBIZWxwZXIsXG4gIEhlbHBlckRlZmluaXRpb25TdGF0ZSxcbiAgT3AsXG4gIE93bmVyLFxuICBSZXNvbHV0aW9uVGltZUNvbnN0YW50cyxcbiAgUnVudGltZUNvbnN0YW50cyxcbiAgU2NvcGVCbG9jayxcbiAgVk0gYXMgUHVibGljVk0sXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgUmVmZXJlbmNlLFxuICBjaGlsZFJlZkZvcixcbiAgVU5ERUZJTkVEX1JFRkVSRU5DRSxcbiAgVFJVRV9SRUZFUkVOQ0UsXG4gIEZBTFNFX1JFRkVSRU5DRSxcbiAgdmFsdWVGb3JSZWYsXG4gIGNyZWF0ZUNvbXB1dGVSZWYsXG59IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQgeyAkdjAgfSBmcm9tICdAZ2xpbW1lci92bSc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUyB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgY3JlYXRlQ29uY2F0UmVmIH0gZnJvbSAnLi4vZXhwcmVzc2lvbnMvY29uY2F0JztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQsIGRlc3Ryb3ksIF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuIH0gZnJvbSAnQGdsaW1tZXIvZGVzdHJveWFibGUnO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NpZ24sIGRlYnVnVG9TdHJpbmcsIGRlY29kZUhhbmRsZSwgaXNPYmplY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IHRvQm9vbCB9IGZyb20gJ0BnbGltbWVyL2dsb2JhbC1jb250ZXh0JztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBDaGVja09wdGlvbixcbiAgQ2hlY2tIYW5kbGUsXG4gIENoZWNrQmxvY2tTeW1ib2xUYWJsZSxcbiAgQ2hlY2tPcixcbiAgQ2hlY2tNYXliZSxcbn0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHtcbiAgQ2hlY2tBcmd1bWVudHMsXG4gIENoZWNrUmVmZXJlbmNlLFxuICBDaGVja0NvbXBpbGFibGVCbG9jayxcbiAgQ2hlY2tTY29wZSxcbiAgQ2hlY2tIZWxwZXIsXG4gIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlLFxuICBDaGVja1Njb3BlQmxvY2ssXG4gIENoZWNrQ2FwdHVyZWRBcmd1bWVudHMsXG59IGZyb20gJy4vLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IGNyZWF0ZUN1cnJ5UmVmIGZyb20gJy4uLy4uL3JlZmVyZW5jZXMvY3VycnktdmFsdWUnO1xuaW1wb3J0IHsgaXNDdXJyaWVkVHlwZSwgcmVzb2x2ZUN1cnJpZWRWYWx1ZSB9IGZyb20gJy4uLy4uL2N1cnJpZWQtdmFsdWUnO1xuaW1wb3J0IHsgcmVpZnlQb3NpdGlvbmFsIH0gZnJvbSAnLi4vLi4vdm0vYXJndW1lbnRzJztcblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25FeHByZXNzaW9uPFQ+ID0gKHZtOiBQdWJsaWNWTSkgPT4gUmVmZXJlbmNlPFQ+O1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ3VycnksICh2bSwgeyBvcDE6IHR5cGUsIG9wMjogX2lzU3RyaWN0IH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG5cbiAgbGV0IGRlZmluaXRpb24gPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgY2FwdHVyZWRBcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQ2FwdHVyZWRBcmd1bWVudHMpO1xuXG4gIGxldCBvd25lciA9IHZtLmdldE93bmVyKCk7XG4gIGxldCByZXNvbHZlciA9IHZtLnJ1bnRpbWUucmVzb2x2ZXI7XG5cbiAgbGV0IGlzU3RyaWN0ID0gZmFsc2U7XG5cbiAgaWYgKERFQlVHKSB7XG4gICAgLy8gc3RyaWN0IGNoZWNrIG9ubHkgaGFwcGVucyBpbiBERUJVRyBidWlsZHMsIG5vIHJlYXNvbiB0byBsb2FkIGl0IG90aGVyd2lzZVxuICAgIGlzU3RyaWN0ID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxib29sZWFuPihkZWNvZGVIYW5kbGUoX2lzU3RyaWN0KSk7XG4gIH1cblxuICB2bS5sb2FkVmFsdWUoXG4gICAgJHYwLFxuICAgIGNyZWF0ZUN1cnJ5UmVmKHR5cGUgYXMgQ3VycmllZFR5cGUsIGRlZmluaXRpb24sIG93bmVyLCBjYXB0dXJlZEFyZ3MsIHJlc29sdmVyLCBpc1N0cmljdClcbiAgKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRHluYW1pY0hlbHBlciwgKHZtKSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgcmVmID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGFyZ3MgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tBcmd1bWVudHMpLmNhcHR1cmUoKTtcblxuICBsZXQgaGVscGVyUmVmOiBSZWZlcmVuY2U7XG4gIGxldCBpbml0aWFsT3duZXI6IE93bmVyID0gdm0uZ2V0T3duZXIoKTtcblxuICBsZXQgaGVscGVySW5zdGFuY2VSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICBpZiAoaGVscGVyUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3Ryb3koaGVscGVyUmVmKTtcbiAgICB9XG5cbiAgICBsZXQgZGVmaW5pdGlvbiA9IHZhbHVlRm9yUmVmKHJlZik7XG5cbiAgICBpZiAoaXNDdXJyaWVkVHlwZShkZWZpbml0aW9uLCBDdXJyaWVkVHlwZS5IZWxwZXIpKSB7XG4gICAgICBsZXQgeyBkZWZpbml0aW9uOiByZXNvbHZlZERlZiwgb3duZXIsIHBvc2l0aW9uYWwsIG5hbWVkIH0gPSByZXNvbHZlQ3VycmllZFZhbHVlKGRlZmluaXRpb24pO1xuXG4gICAgICBsZXQgaGVscGVyID0gcmVzb2x2ZUhlbHBlcih2bVtDT05TVEFOVFNdLCByZXNvbHZlZERlZiwgcmVmKTtcblxuICAgICAgaWYgKG5hbWVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncy5uYW1lZCA9IGFzc2lnbih7fSwgLi4ubmFtZWQsIGFyZ3MubmFtZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MucG9zaXRpb25hbCA9IHBvc2l0aW9uYWwuY29uY2F0KGFyZ3MucG9zaXRpb25hbCkgYXMgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzO1xuICAgICAgfVxuXG4gICAgICBoZWxwZXJSZWYgPSBoZWxwZXIoYXJncywgb3duZXIpO1xuXG4gICAgICBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkKGhlbHBlckluc3RhbmNlUmVmLCBoZWxwZXJSZWYpO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGVmaW5pdGlvbikpIHtcbiAgICAgIGxldCBoZWxwZXIgPSByZXNvbHZlSGVscGVyKHZtW0NPTlNUQU5UU10sIGRlZmluaXRpb24sIHJlZik7XG4gICAgICBoZWxwZXJSZWYgPSBoZWxwZXIoYXJncywgaW5pdGlhbE93bmVyKTtcblxuICAgICAgaWYgKF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuKGhlbHBlclJlZikpIHtcbiAgICAgICAgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZChoZWxwZXJJbnN0YW5jZVJlZiwgaGVscGVyUmVmKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVscGVyUmVmID0gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCBoZWxwZXJWYWx1ZVJlZiA9IGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgIHZhbHVlRm9yUmVmKGhlbHBlckluc3RhbmNlUmVmKTtcbiAgICByZXR1cm4gdmFsdWVGb3JSZWYoaGVscGVyUmVmKTtcbiAgfSk7XG5cbiAgdm0uYXNzb2NpYXRlRGVzdHJveWFibGUoaGVscGVySW5zdGFuY2VSZWYpO1xuICB2bS5sb2FkVmFsdWUoJHYwLCBoZWxwZXJWYWx1ZVJlZik7XG59KTtcblxuZnVuY3Rpb24gcmVzb2x2ZUhlbHBlcihcbiAgY29uc3RhbnRzOiBSdW50aW1lQ29uc3RhbnRzICYgUmVzb2x1dGlvblRpbWVDb25zdGFudHMsXG4gIGRlZmluaXRpb246IEhlbHBlckRlZmluaXRpb25TdGF0ZSxcbiAgcmVmOiBSZWZlcmVuY2Vcbik6IEhlbHBlciB7XG4gIGxldCBoYW5kbGUgPSBjb25zdGFudHMuaGVscGVyKGRlZmluaXRpb24sIG51bGwsIHRydWUpITtcblxuICBpZiAoREVCVUcgJiYgaGFuZGxlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV4cGVjdGVkIGEgZHluYW1pYyBoZWxwZXIgZGVmaW5pdGlvbiwgYnV0IHJlY2VpdmVkIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRpZCBub3QgaGF2ZSBhIGhlbHBlciBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhlIGR5bmFtaWMgaW52b2NhdGlvbiB3YXMgXFxge3ske1xuICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgfX19XFxgIG9yIFxcYCgke3JlZi5kZWJ1Z0xhYmVsfSlcXGAsIGFuZCB0aGUgaW5jb3JyZWN0IGRlZmluaXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBwYXRoIFxcYCR7XG4gICAgICAgIHJlZi5kZWJ1Z0xhYmVsXG4gICAgICB9XFxgLCB3aGljaCB3YXM6ICR7ZGVidWdUb1N0cmluZyEoZGVmaW5pdGlvbil9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29uc3RhbnRzLmdldFZhbHVlKGhhbmRsZSk7XG59XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5IZWxwZXIsICh2bSwgeyBvcDE6IGhhbmRsZSB9KSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgaGVscGVyID0gY2hlY2sodm1bQ09OU1RBTlRTXS5nZXRWYWx1ZShoYW5kbGUpLCBDaGVja0hlbHBlcik7XG4gIGxldCBhcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQXJndW1lbnRzKTtcbiAgbGV0IHZhbHVlID0gaGVscGVyKGFyZ3MuY2FwdHVyZSgpLCB2bS5nZXRPd25lcigpLCB2bS5keW5hbWljU2NvcGUoKSk7XG5cbiAgaWYgKF9oYXNEZXN0cm95YWJsZUNoaWxkcmVuKHZhbHVlKSkge1xuICAgIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKHZhbHVlKTtcbiAgfVxuXG4gIHZtLmxvYWRWYWx1ZSgkdjAsIHZhbHVlKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0VmFyaWFibGUsICh2bSwgeyBvcDE6IHN5bWJvbCB9KSA9PiB7XG4gIGxldCBleHByID0gdm0ucmVmZXJlbmNlRm9yU3ltYm9sKHN5bWJvbCk7XG5cbiAgdm0uc3RhY2sucHVzaChleHByKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuU2V0VmFyaWFibGUsICh2bSwgeyBvcDE6IHN5bWJvbCB9KSA9PiB7XG4gIGxldCBleHByID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgdm0uc2NvcGUoKS5iaW5kU3ltYm9sKHN5bWJvbCwgZXhwcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlNldEJsb2NrLCAodm0sIHsgb3AxOiBzeW1ib2wgfSkgPT4ge1xuICBsZXQgaGFuZGxlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrQ29tcGlsYWJsZUJsb2NrKTtcbiAgbGV0IHNjb3BlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrU2NvcGUpO1xuICBsZXQgdGFibGUgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tCbG9ja1N5bWJvbFRhYmxlKTtcblxuICB2bS5zY29wZSgpLmJpbmRCbG9jayhzeW1ib2wsIFtoYW5kbGUsIHNjb3BlLCB0YWJsZV0pO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5SZXNvbHZlTWF5YmVMb2NhbCwgKHZtLCB7IG9wMTogX25hbWUgfSkgPT4ge1xuICBsZXQgbmFtZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZSk7XG4gIGxldCBsb2NhbHMgPSB2bS5zY29wZSgpLmdldFBhcnRpYWxNYXAoKSE7XG5cbiAgbGV0IHJlZiA9IGxvY2Fsc1tuYW1lXTtcbiAgaWYgKHJlZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVmID0gY2hpbGRSZWZGb3Iodm0uZ2V0U2VsZigpLCBuYW1lKTtcbiAgfVxuXG4gIHZtLnN0YWNrLnB1c2gocmVmKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUm9vdFNjb3BlLCAodm0sIHsgb3AxOiBzeW1ib2xzIH0pID0+IHtcbiAgdm0ucHVzaFJvb3RTY29wZShzeW1ib2xzLCB2bS5nZXRPd25lcigpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0UHJvcGVydHksICh2bSwgeyBvcDE6IF9rZXkgfSkgPT4ge1xuICBsZXQga2V5ID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9rZXkpO1xuICBsZXQgZXhwciA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIHZtLnN0YWNrLnB1c2goY2hpbGRSZWZGb3IoZXhwciwga2V5KSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkdldEJsb2NrLCAodm0sIHsgb3AxOiBfYmxvY2sgfSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCBibG9jayA9IHZtLnNjb3BlKCkuZ2V0QmxvY2soX2Jsb2NrKTtcblxuICBzdGFjay5wdXNoKGJsb2NrKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuU3ByZWFkQmxvY2ssICh2bSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCBibG9jayA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja09wdGlvbihDaGVja09yKENoZWNrU2NvcGVCbG9jaywgQ2hlY2tVbmRlZmluZWRSZWZlcmVuY2UpKSk7XG5cbiAgaWYgKGJsb2NrICYmICFpc1VuZGVmaW5lZFJlZmVyZW5jZShibG9jaykpIHtcbiAgICBsZXQgW2hhbmRsZU9yQ29tcGlsYWJsZSwgc2NvcGUsIHRhYmxlXSA9IGJsb2NrO1xuXG4gICAgc3RhY2sucHVzaCh0YWJsZSk7XG4gICAgc3RhY2sucHVzaChzY29wZSk7XG4gICAgc3RhY2sucHVzaChoYW5kbGVPckNvbXBpbGFibGUpO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgc3RhY2sucHVzaChudWxsKTtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWRSZWZlcmVuY2UoaW5wdXQ6IFNjb3BlQmxvY2sgfCBSZWZlcmVuY2UpOiBpbnB1dCBpcyBSZWZlcmVuY2Uge1xuICBhc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShpbnB1dCkgfHwgaW5wdXQgPT09IFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gICAgJ2EgcmVmZXJlbmNlIG90aGVyIHRoYW4gVU5ERUZJTkVEX1JFRkVSRU5DRSBpcyBpbGxlZ2FsIGhlcmUnXG4gICk7XG4gIHJldHVybiBpbnB1dCA9PT0gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbn1cblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkhhc0Jsb2NrLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuICBsZXQgYmxvY2sgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tPcihDaGVja1Njb3BlQmxvY2ssIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlKSkpO1xuXG4gIGlmIChibG9jayAmJiAhaXNVbmRlZmluZWRSZWZlcmVuY2UoYmxvY2spKSB7XG4gICAgc3RhY2sucHVzaChUUlVFX1JFRkVSRU5DRSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhY2sucHVzaChGQUxTRV9SRUZFUkVOQ0UpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkhhc0Jsb2NrUGFyYW1zLCAodm0pID0+IHtcbiAgLy8gRklYTUUobW11bik6IHNob3VsZCBvbmx5IG5lZWQgdG8gcHVzaCB0aGUgc3ltYm9sIHRhYmxlXG4gIGxldCBibG9jayA9IHZtLnN0YWNrLnBvcCgpO1xuICBsZXQgc2NvcGUgPSB2bS5zdGFjay5wb3AoKTtcblxuICBjaGVjayhibG9jaywgQ2hlY2tNYXliZShDaGVja09yKENoZWNrSGFuZGxlLCBDaGVja0NvbXBpbGFibGVCbG9jaykpKTtcbiAgY2hlY2soc2NvcGUsIENoZWNrTWF5YmUoQ2hlY2tTY29wZSkpO1xuICBsZXQgdGFibGUgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tNYXliZShDaGVja0Jsb2NrU3ltYm9sVGFibGUpKTtcblxuICBsZXQgaGFzQmxvY2tQYXJhbXMgPSB0YWJsZSAmJiB0YWJsZS5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgdm0uc3RhY2sucHVzaChoYXNCbG9ja1BhcmFtcyA/IFRSVUVfUkVGRVJFTkNFIDogRkFMU0VfUkVGRVJFTkNFKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29uY2F0LCAodm0sIHsgb3AxOiBjb3VudCB9KSA9PiB7XG4gIGxldCBvdXQ6IEFycmF5PFJlZmVyZW5jZTx1bmtub3duPj4gPSBuZXcgQXJyYXkoY291bnQpO1xuXG4gIGZvciAobGV0IGkgPSBjb3VudDsgaSA+IDA7IGktLSkge1xuICAgIGxldCBvZmZzZXQgPSBpIC0gMTtcbiAgICBvdXRbb2Zmc2V0XSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIH1cblxuICB2bS5zdGFjay5wdXNoKGNyZWF0ZUNvbmNhdFJlZihvdXQpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSWZJbmxpbmUsICh2bSkgPT4ge1xuICBsZXQgY29uZGl0aW9uID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IHRydXRoeSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCBmYWxzeSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgdm0uc3RhY2sucHVzaChcbiAgICBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGlmICh0b0Jvb2wodmFsdWVGb3JSZWYoY29uZGl0aW9uKSkgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRm9yUmVmKHRydXRoeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWVGb3JSZWYoZmFsc3kpO1xuICAgICAgfVxuICAgIH0pXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLk5vdCwgKHZtKSA9PiB7XG4gIGxldCByZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHZtLnN0YWNrLnB1c2goXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICByZXR1cm4gIXRvQm9vbCh2YWx1ZUZvclJlZihyZWYpKTtcbiAgICB9KVxuICApO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5HZXREeW5hbWljVmFyLCAodm0pID0+IHtcbiAgbGV0IHNjb3BlID0gdm0uZHluYW1pY1Njb3BlKCk7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuICBsZXQgbmFtZVJlZiA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgc3RhY2sucHVzaChcbiAgICBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGxldCBuYW1lID0gU3RyaW5nKHZhbHVlRm9yUmVmKG5hbWVSZWYpKTtcbiAgICAgIHJldHVybiB2YWx1ZUZvclJlZihzY29wZS5nZXQobmFtZSkpO1xuICAgIH0pXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkxvZywgKHZtKSA9PiB7XG4gIGxldCB7IHBvc2l0aW9uYWwgfSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cykuY2FwdHVyZSgpO1xuXG4gIHZtLmxvYWRWYWx1ZShcbiAgICAkdjAsXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coLi4ucmVpZnlQb3NpdGlvbmFsKHBvc2l0aW9uYWwpKTtcbiAgICB9KVxuICApO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9