UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

278 lines (252 loc) 31.7 kB
import { childRefFor, UNDEFINED_REFERENCE, TRUE_REFERENCE, FALSE_REFERENCE, valueForRef, createComputeRef } from '@glimmer/reference'; import { $v0 } from '@glimmer/vm'; import { APPEND_OPCODES } from '../../opcodes'; import { createConcatRef } from '../expressions/concat'; import { associateDestroyableChild, destroy, _hasDestroyableChildren } from '@glimmer/destroyable'; import { assert, assign, debugToString, decodeHandle, isObject } from '@glimmer/util'; import { toBool } from '@glimmer/global-context'; import { CONSTANTS } from '../../symbols'; import { DEBUG } from '@glimmer/env'; import createCurryRef from '../../references/curry-value'; import { isCurriedType, resolveCurriedValue } from '../../curried-value'; import { reifyPositional } from '../../vm/arguments'; 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 (DEBUG) { // strict check only happens in DEBUG builds, no reason to load it otherwise isStrict = vm[CONSTANTS].getValue(decodeHandle(_isStrict)); } vm.loadValue($v0, createCurryRef(type, definition, owner, capturedArgs, resolver, isStrict)); }); 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 = createComputeRef(function () { if (helperRef !== undefined) { destroy(helperRef); } var definition = valueForRef(ref); if (isCurriedType(definition, 1 /* Helper */ )) { var _resolveCurriedValue = resolveCurriedValue(definition), resolvedDef = _resolveCurriedValue.definition, owner = _resolveCurriedValue.owner, positional = _resolveCurriedValue.positional, named = _resolveCurriedValue.named; var helper = resolveHelper(vm[CONSTANTS], resolvedDef, ref); if (named !== undefined) { args.named = assign.apply(void 0, [{}].concat(named, [args.named])); } if (positional !== undefined) { args.positional = positional.concat(args.positional); } helperRef = helper(args, owner); associateDestroyableChild(helperInstanceRef, helperRef); } else if (isObject(definition)) { var _helper = resolveHelper(vm[CONSTANTS], definition, ref); helperRef = _helper(args, initialOwner); if (_hasDestroyableChildren(helperRef)) { associateDestroyableChild(helperInstanceRef, helperRef); } } else { helperRef = UNDEFINED_REFERENCE; } }); var helperValueRef = createComputeRef(function () { valueForRef(helperInstanceRef); return valueForRef(helperRef); }); vm.associateDestroyable(helperInstanceRef); vm.loadValue($v0, helperValueRef); }); function resolveHelper(constants, definition, ref) { var handle = constants.helper(definition, null, true); if (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: " + debugToString(definition)); } return constants.getValue(handle); } APPEND_OPCODES.add(16 /* Helper */ , function (vm, _ref2) { var handle = _ref2.op1; var stack = vm.stack; var helper = vm[CONSTANTS].getValue(handle); var args = stack.pop(); var value = helper(args.capture(), vm.getOwner(), vm.dynamicScope()); if (_hasDestroyableChildren(value)) { vm.associateDestroyable(value); } vm.loadValue($v0, value); }); APPEND_OPCODES.add(21 /* GetVariable */ , function (vm, _ref3) { var symbol = _ref3.op1; var expr = vm.referenceForSymbol(symbol); vm.stack.push(expr); }); APPEND_OPCODES.add(19 /* SetVariable */ , function (vm, _ref4) { var symbol = _ref4.op1; var expr = vm.stack.pop(); vm.scope().bindSymbol(symbol, expr); }); 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]); }); APPEND_OPCODES.add(102 /* ResolveMaybeLocal */ , function (vm, _ref6) { var _name = _ref6.op1; var name = vm[CONSTANTS].getValue(_name); var locals = vm.scope().getPartialMap(); var ref = locals[name]; if (ref === undefined) { ref = childRefFor(vm.getSelf(), name); } vm.stack.push(ref); }); APPEND_OPCODES.add(37 /* RootScope */ , function (vm, _ref7) { var symbols = _ref7.op1; vm.pushRootScope(symbols, vm.getOwner()); }); APPEND_OPCODES.add(22 /* GetProperty */ , function (vm, _ref8) { var _key = _ref8.op1; var key = vm[CONSTANTS].getValue(_key); var expr = vm.stack.pop(); vm.stack.push(childRefFor(expr, key)); }); 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); }); 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 && assert(Array.isArray(input) || input === UNDEFINED_REFERENCE, 'a reference other than UNDEFINED_REFERENCE is illegal here'); return input === UNDEFINED_REFERENCE; } APPEND_OPCODES.add(25 /* HasBlock */ , function (vm) { var stack = vm.stack; var block = stack.pop(); if (block && !isUndefinedReference(block)) { stack.push(TRUE_REFERENCE); } else { stack.push(FALSE_REFERENCE); } }); 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 ? TRUE_REFERENCE : FALSE_REFERENCE); }); 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(createConcatRef(out)); }); 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(createComputeRef(function () { if (toBool(valueForRef(condition)) === true) { return valueForRef(truthy); } else { return valueForRef(falsy); } })); }); APPEND_OPCODES.add(110 /* Not */ , function (vm) { var ref = vm.stack.pop(); vm.stack.push(createComputeRef(function () { return !toBool(valueForRef(ref)); })); }); APPEND_OPCODES.add(111 /* GetDynamicVar */ , function (vm) { var scope = vm.dynamicScope(); var stack = vm.stack; var nameRef = stack.pop(); stack.push(createComputeRef(function () { var name = String(valueForRef(nameRef)); return valueForRef(scope.get(name)); })); }); APPEND_OPCODES.add(112 /* Log */ , function (vm) { var _vm$stack$pop$capture = vm.stack.pop().capture(), positional = _vm$stack$pop$capture.positional; vm.loadValue($v0, createComputeRef(function () { var _console; // eslint-disable-next-line no-console (_console = console).log.apply(_console, reifyPositional(positional)); })); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZXhwcmVzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBWUEsU0FBQSxXQUFBLEVBQUEsbUJBQUEsRUFBQSxjQUFBLEVBQUEsZUFBQSxFQUFBLFdBQUEsRUFBQSxnQkFBQSxRQUFBLG9CQUFBO0FBU0EsU0FBQSxHQUFBLFFBQUEsYUFBQTtBQUNBLFNBQUEsY0FBQSxRQUFBLGVBQUE7QUFDQSxTQUFBLGVBQUEsUUFBQSx1QkFBQTtBQUNBLFNBQUEseUJBQUEsRUFBQSxPQUFBLEVBQUEsdUJBQUEsUUFBQSxzQkFBQTtBQUNBLFNBQUEsTUFBQSxFQUFBLE1BQUEsRUFBQSxhQUFBLEVBQUEsWUFBQSxFQUFBLFFBQUEsUUFBQSxlQUFBO0FBQ0EsU0FBQSxNQUFBLFFBQUEseUJBQUE7QUFtQkEsU0FBQSxTQUFBLFFBQUEsZUFBQTtBQUNBLFNBQUEsS0FBQSxRQUFBLGNBQUE7QUFDQSxPQUFBLGNBQUEsTUFBQSw4QkFBQTtBQUNBLFNBQUEsYUFBQSxFQUFBLG1CQUFBLFFBQUEscUJBQUE7QUFDQSxTQUFBLGVBQUEsUUFBQSxvQkFBQTtBQUlBLGNBQWMsQ0FBZCxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBNkIsVUFBQSxFQUFBLFFBQXNDO0FBQUEsTUFBakMsSUFBaUMsUUFBL0IsR0FBK0I7QUFBQSxNQUFmLFNBQWUsUUFBcEIsR0FBb0I7QUFDakUsTUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFkLEtBQUE7QUFFQSxNQUFJLFVBQVUsR0FBUyxLQUFLLENBQTVCLEdBQXVCLEVBQXZCO0FBQ0EsTUFBSSxZQUFZLEdBQVMsS0FBSyxDQUE5QixHQUF5QixFQUF6QjtBQUVBLE1BQUksS0FBSyxHQUFHLEVBQUUsQ0FBZCxRQUFZLEVBQVo7QUFDQSxNQUFJLFFBQVEsR0FBRyxFQUFFLENBQUYsT0FBQSxDQUFmLFFBQUE7QUFFQSxNQUFJLFFBQVEs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QUFPLFdBQVcsQ0FBQyxLQUFLLENBQUwsR0FBQSxDQUFuQixJQUFtQixDQUFELENBQWxCO0FBSEosR0FDa0IsQ0FEbEI7QUFMRixDQUFBO0FBYUEsY0FBYyxDQUFkLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUE0QixVQUFBLEVBQUQsRUFBTztBQUFBLDhCQUNMLEVBQUUsQ0FBRixLQUFBLENBQU4sR0FBTSxHQUEzQixPQUEyQixFQURLO0FBQUEsTUFDMUIsVUFEMEIseUJBQzFCLFVBRDBCOztBQUdoQyxFQUFBLEVBQUUsQ0FBRixTQUFBLENBQUEsR0FBQSxFQUVFLGdCQUFnQixDQUFDLFlBQUs7QUFBQTs7QUFDcEI7QUFDQSxnQkFBQSxPQUFPLEVBQVAsR0FBQSxpQkFBZSxlQUFlLENBQTlCLFVBQThCLENBQTlCO0FBSkosR0FFa0IsQ0FGbEI7QUFIRixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2FwdHVyZWRQb3NpdGlvbmFsQXJndW1lbnRzLFxuICBDdXJyaWVkVHlwZSxcbiAgSGVscGVyLFxuICBIZWxwZXJEZWZpbml0aW9uU3RhdGUsXG4gIE9wLFxuICBPd25lcixcbiAgUmVzb2x1dGlvblRpbWVDb25zdGFudHMsXG4gIFJ1bnRpbWVDb25zdGFudHMsXG4gIFNjb3BlQmxvY2ssXG4gIFZNIGFzIFB1YmxpY1ZNLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIFJlZmVyZW5jZSxcbiAgY2hpbGRSZWZGb3IsXG4gIFVOREVGSU5FRF9SRUZFUkVOQ0UsXG4gIFRSVUVfUkVGRVJFTkNFLFxuICBGQUxTRV9SRUZFUkVOQ0UsXG4gIHZhbHVlRm9yUmVmLFxuICBjcmVhdGVDb21wdXRlUmVmLFxufSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuaW1wb3J0IHsgJHYwIH0gZnJvbSAnQGdsaW1tZXIvdm0nO1xuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IGNyZWF0ZUNvbmNhdFJlZiB9IGZyb20gJy4uL2V4cHJlc3Npb25zL2NvbmNhdCc7XG5pbXBvcnQgeyBhc3NvY2lhdGVEZXN0cm95YWJsZUNoaWxkLCBkZXN0cm95LCBfaGFzRGVzdHJveWFibGVDaGlsZHJlbiB9IGZyb20gJ0BnbGltbWVyL2Rlc3Ryb3lhYmxlJztcbmltcG9ydCB7IGFzc2VydCwgYXNzaWduLCBkZWJ1Z1RvU3RyaW5nLCBkZWNvZGVIYW5kbGUsIGlzT2JqZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyB0b0Jvb2wgfSBmcm9tICdAZ2xpbW1lci9nbG9iYWwtY29udGV4dCc7XG5pbXBvcnQge1xuICBjaGVjayxcbiAgQ2hlY2tPcHRpb24sXG4gIENoZWNrSGFuZGxlLFxuICBDaGVja0Jsb2NrU3ltYm9sVGFibGUsXG4gIENoZWNrT3IsXG4gIENoZWNrTWF5YmUsXG59IGZyb20gJ0BnbGltbWVyL2RlYnVnJztcbmltcG9ydCB7XG4gIENoZWNrQXJndW1lbnRzLFxuICBDaGVja1JlZmVyZW5jZSxcbiAgQ2hlY2tDb21waWxhYmxlQmxvY2ssXG4gIENoZWNrU2NvcGUsXG4gIENoZWNrSGVscGVyLFxuICBDaGVja1VuZGVmaW5lZFJlZmVyZW5jZSxcbiAgQ2hlY2tTY29wZUJsb2NrLFxuICBDaGVja0NhcHR1cmVkQXJndW1lbnRzLFxufSBmcm9tICcuLy1kZWJ1Zy1zdHJpcCc7XG5pbXBvcnQgeyBDT05TVEFOVFMgfSBmcm9tICcuLi8uLi9zeW1ib2xzJztcbmltcG9ydCB7IERFQlVHIH0gZnJvbSAnQGdsaW1tZXIvZW52JztcbmltcG9ydCBjcmVhdGVDdXJyeVJlZiBmcm9tICcuLi8uLi9yZWZlcmVuY2VzL2N1cnJ5LXZhbHVlJztcbmltcG9ydCB7IGlzQ3VycmllZFR5cGUsIHJlc29sdmVDdXJyaWVkVmFsdWUgfSBmcm9tICcuLi8uLi9jdXJyaWVkLXZhbHVlJztcbmltcG9ydCB7IHJlaWZ5UG9zaXRpb25hbCB9IGZyb20gJy4uLy4uL3ZtL2FyZ3VtZW50cyc7XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uRXhwcmVzc2lvbjxUPiA9ICh2bTogUHVibGljVk0pID0+IFJlZmVyZW5jZTxUPjtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkN1cnJ5LCAodm0sIHsgb3AxOiB0eXBlLCBvcDI6IF9pc1N0cmljdCB9KSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuXG4gIGxldCBkZWZpbml0aW9uID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGNhcHR1cmVkQXJncyA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja0NhcHR1cmVkQXJndW1lbnRzKTtcblxuICBsZXQgb3duZXIgPSB2bS5nZXRPd25lcigpO1xuICBsZXQgcmVzb2x2ZXIgPSB2bS5ydW50aW1lLnJlc29sdmVyO1xuXG4gIGxldCBpc1N0cmljdCA9IGZhbHNlO1xuXG4gIGlmIChERUJVRykge1xuICAgIC8vIHN0cmljdCBjaGVjayBvbmx5IGhhcHBlbnMgaW4gREVCVUcgYnVpbGRzLCBubyByZWFzb24gdG8gbG9hZCBpdCBvdGhlcndpc2VcbiAgICBpc1N0cmljdCA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8Ym9vbGVhbj4oZGVjb2RlSGFuZGxlKF9pc1N0cmljdCkpO1xuICB9XG5cbiAgdm0ubG9hZFZhbHVlKFxuICAgICR2MCxcbiAgICBjcmVhdGVDdXJyeVJlZih0eXBlIGFzIEN1cnJpZWRUeXBlLCBkZWZpbml0aW9uLCBvd25lciwgY2FwdHVyZWRBcmdzLCByZXNvbHZlciwgaXNTdHJpY3QpXG4gICk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkR5bmFtaWNIZWxwZXIsICh2bSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IHJlZiA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCBhcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrQXJndW1lbnRzKS5jYXB0dXJlKCk7XG5cbiAgbGV0IGhlbHBlclJlZjogUmVmZXJlbmNlO1xuICBsZXQgaW5pdGlhbE93bmVyOiBPd25lciA9IHZtLmdldE93bmVyKCk7XG5cbiAgbGV0IGhlbHBlckluc3RhbmNlUmVmID0gY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgaWYgKGhlbHBlclJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0cm95KGhlbHBlclJlZik7XG4gICAgfVxuXG4gICAgbGV0IGRlZmluaXRpb24gPSB2YWx1ZUZvclJlZihyZWYpO1xuXG4gICAgaWYgKGlzQ3VycmllZFR5cGUoZGVmaW5pdGlvbiwgQ3VycmllZFR5cGUuSGVscGVyKSkge1xuICAgICAgbGV0IHsgZGVmaW5pdGlvbjogcmVzb2x2ZWREZWYsIG93bmVyLCBwb3NpdGlvbmFsLCBuYW1lZCB9ID0gcmVzb2x2ZUN1cnJpZWRWYWx1ZShkZWZpbml0aW9uKTtcblxuICAgICAgbGV0IGhlbHBlciA9IHJlc29sdmVIZWxwZXIodm1bQ09OU1RBTlRTXSwgcmVzb2x2ZWREZWYsIHJlZik7XG5cbiAgICAgIGlmIChuYW1lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MubmFtZWQgPSBhc3NpZ24oe30sIC4uLm5hbWVkLCBhcmdzLm5hbWVkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvc2l0aW9uYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhcmdzLnBvc2l0aW9uYWwgPSBwb3NpdGlvbmFsLmNvbmNhdChhcmdzLnBvc2l0aW9uYWwpIGFzIENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cztcbiAgICAgIH1cblxuICAgICAgaGVscGVyUmVmID0gaGVscGVyKGFyZ3MsIG93bmVyKTtcblxuICAgICAgYXNzb2NpYXRlRGVzdHJveWFibGVDaGlsZChoZWxwZXJJbnN0YW5jZVJlZiwgaGVscGVyUmVmKTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICBsZXQgaGVscGVyID0gcmVzb2x2ZUhlbHBlcih2bVtDT05TVEFOVFNdLCBkZWZpbml0aW9uLCByZWYpO1xuICAgICAgaGVscGVyUmVmID0gaGVscGVyKGFyZ3MsIGluaXRpYWxPd25lcik7XG5cbiAgICAgIGlmIChfaGFzRGVzdHJveWFibGVDaGlsZHJlbihoZWxwZXJSZWYpKSB7XG4gICAgICAgIGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQoaGVscGVySW5zdGFuY2VSZWYsIGhlbHBlclJlZik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlbHBlclJlZiA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgfVxuICB9KTtcblxuICBsZXQgaGVscGVyVmFsdWVSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICB2YWx1ZUZvclJlZihoZWxwZXJJbnN0YW5jZVJlZik7XG4gICAgcmV0dXJuIHZhbHVlRm9yUmVmKGhlbHBlclJlZik7XG4gIH0pO1xuXG4gIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKGhlbHBlckluc3RhbmNlUmVmKTtcbiAgdm0ubG9hZFZhbHVlKCR2MCwgaGVscGVyVmFsdWVSZWYpO1xufSk7XG5cbmZ1bmN0aW9uIHJlc29sdmVIZWxwZXIoXG4gIGNvbnN0YW50czogUnVudGltZUNvbnN0YW50cyAmIFJlc29sdXRpb25UaW1lQ29uc3RhbnRzLFxuICBkZWZpbml0aW9uOiBIZWxwZXJEZWZpbml0aW9uU3RhdGUsXG4gIHJlZjogUmVmZXJlbmNlXG4pOiBIZWxwZXIge1xuICBsZXQgaGFuZGxlID0gY29uc3RhbnRzLmhlbHBlcihkZWZpbml0aW9uLCBudWxsLCB0cnVlKSE7XG5cbiAgaWYgKERFQlVHICYmIGhhbmRsZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFeHBlY3RlZCBhIGR5bmFtaWMgaGVscGVyIGRlZmluaXRpb24sIGJ1dCByZWNlaXZlZCBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkaWQgbm90IGhhdmUgYSBoZWxwZXIgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggaXQuIFRoZSBkeW5hbWljIGludm9jYXRpb24gd2FzIFxcYHt7JHtcbiAgICAgICAgcmVmLmRlYnVnTGFiZWxcbiAgICAgIH19fVxcYCBvciBcXGAoJHtyZWYuZGVidWdMYWJlbH0pXFxgLCBhbmQgdGhlIGluY29ycmVjdCBkZWZpbml0aW9uIGlzIHRoZSB2YWx1ZSBhdCB0aGUgcGF0aCBcXGAke1xuICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgfVxcYCwgd2hpY2ggd2FzOiAke2RlYnVnVG9TdHJpbmchKGRlZmluaXRpb24pfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNvbnN0YW50cy5nZXRWYWx1ZShoYW5kbGUpO1xufVxuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSGVscGVyLCAodm0sIHsgb3AxOiBoYW5kbGUgfSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IGhlbHBlciA9IGNoZWNrKHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUoaGFuZGxlKSwgQ2hlY2tIZWxwZXIpO1xuICBsZXQgYXJncyA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cyk7XG4gIGxldCB2YWx1ZSA9IGhlbHBlcihhcmdzLmNhcHR1cmUoKSwgdm0uZ2V0T3duZXIoKSwgdm0uZHluYW1pY1Njb3BlKCkpO1xuXG4gIGlmIChfaGFzRGVzdHJveWFibGVDaGlsZHJlbih2YWx1ZSkpIHtcbiAgICB2bS5hc3NvY2lhdGVEZXN0cm95YWJsZSh2YWx1ZSk7XG4gIH1cblxuICB2bS5sb2FkVmFsdWUoJHYwLCB2YWx1ZSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkdldFZhcmlhYmxlLCAodm0sIHsgb3AxOiBzeW1ib2wgfSkgPT4ge1xuICBsZXQgZXhwciA9IHZtLnJlZmVyZW5jZUZvclN5bWJvbChzeW1ib2wpO1xuXG4gIHZtLnN0YWNrLnB1c2goZXhwcik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlNldFZhcmlhYmxlLCAodm0sIHsgb3AxOiBzeW1ib2wgfSkgPT4ge1xuICBsZXQgZXhwciA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIHZtLnNjb3BlKCkuYmluZFN5bWJvbChzeW1ib2wsIGV4cHIpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5TZXRCbG9jaywgKHZtLCB7IG9wMTogc3ltYm9sIH0pID0+IHtcbiAgbGV0IGhhbmRsZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja0NvbXBpbGFibGVCbG9jayk7XG4gIGxldCBzY29wZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1Njb3BlKTtcbiAgbGV0IHRhYmxlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrQmxvY2tTeW1ib2xUYWJsZSk7XG5cbiAgdm0uc2NvcGUoKS5iaW5kQmxvY2soc3ltYm9sLCBbaGFuZGxlLCBzY29wZSwgdGFibGVdKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUmVzb2x2ZU1heWJlTG9jYWwsICh2bSwgeyBvcDE6IF9uYW1lIH0pID0+IHtcbiAgbGV0IG5hbWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWUpO1xuICBsZXQgbG9jYWxzID0gdm0uc2NvcGUoKS5nZXRQYXJ0aWFsTWFwKCkhO1xuXG4gIGxldCByZWYgPSBsb2NhbHNbbmFtZV07XG4gIGlmIChyZWYgPT09IHVuZGVmaW5lZCkge1xuICAgIHJlZiA9IGNoaWxkUmVmRm9yKHZtLmdldFNlbGYoKSwgbmFtZSk7XG4gIH1cblxuICB2bS5zdGFjay5wdXNoKHJlZik7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlJvb3RTY29wZSwgKHZtLCB7IG9wMTogc3ltYm9scyB9KSA9PiB7XG4gIHZtLnB1c2hSb290U2NvcGUoc3ltYm9scywgdm0uZ2V0T3duZXIoKSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkdldFByb3BlcnR5LCAodm0sIHsgb3AxOiBfa2V5IH0pID0+IHtcbiAgbGV0IGtleSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfa2V5KTtcbiAgbGV0IGV4cHIgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICB2bS5zdGFjay5wdXNoKGNoaWxkUmVmRm9yKGV4cHIsIGtleSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5HZXRCbG9jaywgKHZtLCB7IG9wMTogX2Jsb2NrIH0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuICBsZXQgYmxvY2sgPSB2bS5zY29wZSgpLmdldEJsb2NrKF9ibG9jayk7XG5cbiAgc3RhY2sucHVzaChibG9jayk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlNwcmVhZEJsb2NrLCAodm0pID0+IHtcbiAgbGV0IHsgc3RhY2sgfSA9IHZtO1xuICBsZXQgYmxvY2sgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tPcHRpb24oQ2hlY2tPcihDaGVja1Njb3BlQmxvY2ssIENoZWNrVW5kZWZpbmVkUmVmZXJlbmNlKSkpO1xuXG4gIGlmIChibG9jayAmJiAhaXNVbmRlZmluZWRSZWZlcmVuY2UoYmxvY2spKSB7XG4gICAgbGV0IFtoYW5kbGVPckNvbXBpbGFibGUsIHNjb3BlLCB0YWJsZV0gPSBibG9jaztcblxuICAgIHN0YWNrLnB1c2godGFibGUpO1xuICAgIHN0YWNrLnB1c2goc2NvcGUpO1xuICAgIHN0YWNrLnB1c2goaGFuZGxlT3JDb21waWxhYmxlKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFjay5wdXNoKG51bGwpO1xuICAgIHN0YWNrLnB1c2gobnVsbCk7XG4gICAgc3RhY2sucHVzaChudWxsKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkUmVmZXJlbmNlKGlucHV0OiBTY29wZUJsb2NrIHwgUmVmZXJlbmNlKTogaW5wdXQgaXMgUmVmZXJlbmNlIHtcbiAgYXNzZXJ0KFxuICAgIEFycmF5LmlzQXJyYXkoaW5wdXQpIHx8IGlucHV0ID09PSBVTkRFRklORURfUkVGRVJFTkNFLFxuICAgICdhIHJlZmVyZW5jZSBvdGhlciB0aGFuIFVOREVGSU5FRF9SRUZFUkVOQ0UgaXMgaWxsZWdhbCBoZXJlJ1xuICApO1xuICByZXR1cm4gaW5wdXQgPT09IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG59XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5IYXNCbG9jaywgKHZtKSA9PiB7XG4gIGxldCB7IHN0YWNrIH0gPSB2bTtcbiAgbGV0IGJsb2NrID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrT3IoQ2hlY2tTY29wZUJsb2NrLCBDaGVja1VuZGVmaW5lZFJlZmVyZW5jZSkpKTtcblxuICBpZiAoYmxvY2sgJiYgIWlzVW5kZWZpbmVkUmVmZXJlbmNlKGJsb2NrKSkge1xuICAgIHN0YWNrLnB1c2goVFJVRV9SRUZFUkVOQ0UpO1xuICB9IGVsc2Uge1xuICAgIHN0YWNrLnB1c2goRkFMU0VfUkVGRVJFTkNFKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5IYXNCbG9ja1BhcmFtcywgKHZtKSA9PiB7XG4gIC8vIEZJWE1FKG1tdW4pOiBzaG91bGQgb25seSBuZWVkIHRvIHB1c2ggdGhlIHN5bWJvbCB0YWJsZVxuICBsZXQgYmxvY2sgPSB2bS5zdGFjay5wb3AoKTtcbiAgbGV0IHNjb3BlID0gdm0uc3RhY2sucG9wKCk7XG5cbiAgY2hlY2soYmxvY2ssIENoZWNrTWF5YmUoQ2hlY2tPcihDaGVja0hhbmRsZSwgQ2hlY2tDb21waWxhYmxlQmxvY2spKSk7XG4gIGNoZWNrKHNjb3BlLCBDaGVja01heWJlKENoZWNrU2NvcGUpKTtcbiAgbGV0IHRhYmxlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrTWF5YmUoQ2hlY2tCbG9ja1N5bWJvbFRhYmxlKSk7XG5cbiAgbGV0IGhhc0Jsb2NrUGFyYW1zID0gdGFibGUgJiYgdGFibGUucGFyYW1ldGVycy5sZW5ndGg7XG4gIHZtLnN0YWNrLnB1c2goaGFzQmxvY2tQYXJhbXMgPyBUUlVFX1JFRkVSRU5DRSA6IEZBTFNFX1JFRkVSRU5DRSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNvbmNhdCwgKHZtLCB7IG9wMTogY291bnQgfSkgPT4ge1xuICBsZXQgb3V0OiBBcnJheTxSZWZlcmVuY2U8dW5rbm93bj4+ID0gbmV3IEFycmF5KGNvdW50KTtcblxuICBmb3IgKGxldCBpID0gY291bnQ7IGkgPiAwOyBpLS0pIHtcbiAgICBsZXQgb2Zmc2V0ID0gaSAtIDE7XG4gICAgb3V0W29mZnNldF0gPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICB9XG5cbiAgdm0uc3RhY2sucHVzaChjcmVhdGVDb25jYXRSZWYob3V0KSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLklmSW5saW5lLCAodm0pID0+IHtcbiAgbGV0IGNvbmRpdGlvbiA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCB0cnV0aHkgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgZmFsc3kgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHZtLnN0YWNrLnB1c2goXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICBpZiAodG9Cb29sKHZhbHVlRm9yUmVmKGNvbmRpdGlvbikpID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUZvclJlZih0cnV0aHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRm9yUmVmKGZhbHN5KTtcbiAgICAgIH1cbiAgICB9KVxuICApO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Ob3QsICh2bSkgPT4ge1xuICBsZXQgcmVmID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICB2bS5zdGFjay5wdXNoKFxuICAgIGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgICAgcmV0dXJuICF0b0Jvb2wodmFsdWVGb3JSZWYocmVmKSk7XG4gICAgfSlcbiAgKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuR2V0RHluYW1pY1ZhciwgKHZtKSA9PiB7XG4gIGxldCBzY29wZSA9IHZtLmR5bmFtaWNTY29wZSgpO1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgbGV0IG5hbWVSZWYgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHN0YWNrLnB1c2goXG4gICAgY3JlYXRlQ29tcHV0ZVJlZigoKSA9PiB7XG4gICAgICBsZXQgbmFtZSA9IFN0cmluZyh2YWx1ZUZvclJlZihuYW1lUmVmKSk7XG4gICAgICByZXR1cm4gdmFsdWVGb3JSZWYoc2NvcGUuZ2V0KG5hbWUpKTtcbiAgICB9KVxuICApO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Mb2csICh2bSkgPT4ge1xuICBsZXQgeyBwb3NpdGlvbmFsIH0gPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tBcmd1bWVudHMpLmNhcHR1cmUoKTtcblxuICB2bS5sb2FkVmFsdWUoXG4gICAgJHYwLFxuICAgIGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKC4uLnJlaWZ5UG9zaXRpb25hbChwb3NpdGlvbmFsKSk7XG4gICAgfSlcbiAgKTtcbn0pO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==