UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

339 lines (290 loc) 36.2 kB
import { valueForRef, isConstRef, createComputeRef } from '@glimmer/reference'; import { valueForTag, validateTag, consumeTag, CURRENT_TAG } from '@glimmer/validator'; import { $t0 } from '@glimmer/vm'; import { APPEND_OPCODES } from '../../opcodes'; import { Assert } from './vm'; import { CONSTANTS } from '../../symbols'; import { assign, debugToString, isObject } from '@glimmer/util'; import { isCurriedType, resolveCurriedValue } from '../../curried-value'; import { DEBUG } from '@glimmer/env'; import { associateDestroyableChild, destroy } from '@glimmer/destroyable'; APPEND_OPCODES.add(41 /* Text */ , function (vm, _ref) { var text = _ref.op1; vm.elements().appendText(vm[CONSTANTS].getValue(text)); }); APPEND_OPCODES.add(42 /* Comment */ , function (vm, _ref2) { var text = _ref2.op1; vm.elements().appendComment(vm[CONSTANTS].getValue(text)); }); APPEND_OPCODES.add(48 /* OpenElement */ , function (vm, _ref3) { var tag = _ref3.op1; vm.elements().openElement(vm[CONSTANTS].getValue(tag)); }); APPEND_OPCODES.add(49 /* OpenDynamicElement */ , function (vm) { var tagName = valueForRef(vm.stack.pop()); vm.elements().openElement(tagName); }); APPEND_OPCODES.add(50 /* PushRemoteElement */ , function (vm) { var elementRef = vm.stack.pop(); var insertBeforeRef = vm.stack.pop(); var guidRef = vm.stack.pop(); var element = valueForRef(elementRef); var insertBefore = valueForRef(insertBeforeRef); var guid = valueForRef(guidRef); if (!isConstRef(elementRef)) { vm.updateWith(new Assert(elementRef)); } if (insertBefore !== undefined && !isConstRef(insertBeforeRef)) { vm.updateWith(new Assert(insertBeforeRef)); } var block = vm.elements().pushRemoteElement(element, guid, insertBefore); if (block) vm.associateDestroyable(block); }); APPEND_OPCODES.add(56 /* PopRemoteElement */ , function (vm) { vm.elements().popRemoteElement(); }); APPEND_OPCODES.add(54 /* FlushElement */ , function (vm) { var operations = vm.fetchValue($t0); var modifiers = null; if (operations) { modifiers = operations.flush(vm); vm.loadValue($t0, null); } vm.elements().flushElement(modifiers); }); APPEND_OPCODES.add(55 /* CloseElement */ , function (vm) { var modifiers = vm.elements().closeElement(); if (modifiers) { modifiers.forEach(function (modifier) { vm.env.scheduleInstallModifier(modifier); var manager = modifier.manager, state = modifier.state; var d = manager.getDestroyable(state); if (d) { vm.associateDestroyable(d); } }); } }); APPEND_OPCODES.add(57 /* Modifier */ , function (vm, _ref4) { var handle = _ref4.op1; if (vm.env.isInteractive === false) { return; } var owner = vm.getOwner(); var args = vm.stack.pop(); var definition = vm[CONSTANTS].getValue(handle); var manager = definition.manager; var _vm$elements = vm.elements(), constructing = _vm$elements.constructing; var state = manager.create(owner, constructing, definition.state, args.capture()); var instance = { manager: manager, state: state, definition: definition }; var operations = vm.fetchValue($t0); operations.addModifier(instance); var tag = manager.getTag(state); if (tag !== null) { consumeTag(tag); return vm.updateWith(new UpdateModifierOpcode(tag, instance)); } }); APPEND_OPCODES.add(108 /* DynamicModifier */ , function (vm) { if (vm.env.isInteractive === false) { return; } var stack = vm.stack, constants = vm[CONSTANTS]; var ref = stack.pop(); var args = stack.pop().capture(); var _vm$elements2 = vm.elements(), constructing = _vm$elements2.constructing; var initialOwner = vm.getOwner(); var instanceRef = createComputeRef(function () { var value = valueForRef(ref); var owner; if (!isObject(value)) { return; } var hostDefinition; if (isCurriedType(value, 2 /* Modifier */ )) { var _resolveCurriedValue = resolveCurriedValue(value), resolvedDefinition = _resolveCurriedValue.definition, curriedOwner = _resolveCurriedValue.owner, positional = _resolveCurriedValue.positional, named = _resolveCurriedValue.named; hostDefinition = resolvedDefinition; owner = curriedOwner; if (positional !== undefined) { args.positional = positional.concat(args.positional); } if (named !== undefined) { args.named = assign.apply(void 0, [{}].concat(named, [args.named])); } } else { hostDefinition = value; owner = initialOwner; } var handle = constants.modifier(hostDefinition, null, true); if (DEBUG && handle === null) { throw new Error("Expected a dynamic modifier definition, but received an object or function that did not have a modifier manager associated with it. The dynamic invocation was `{{" + ref.debugLabel + "}}`, and the incorrect definition is the value at the path `" + ref.debugLabel + "`, which was: " + debugToString(hostDefinition)); } var definition = constants.getValue(handle); var manager = definition.manager; var state = manager.create(owner, constructing, definition.state, args); return { manager: manager, state: state, definition: definition }; }); var instance = valueForRef(instanceRef); var tag = null; if (instance !== undefined) { var operations = vm.fetchValue($t0); operations.addModifier(instance); tag = instance.manager.getTag(instance.state); if (tag !== null) { consumeTag(tag); } } if (!isConstRef(ref) || tag) { return vm.updateWith(new UpdateDynamicModifierOpcode(tag, instance, instanceRef)); } }); export var UpdateModifierOpcode = /*#__PURE__*/function () { function UpdateModifierOpcode(tag, modifier) { this.tag = tag; this.modifier = modifier; this.lastUpdated = valueForTag(tag); } var _proto = UpdateModifierOpcode.prototype; _proto.evaluate = function evaluate(vm) { var modifier = this.modifier, tag = this.tag, lastUpdated = this.lastUpdated; consumeTag(tag); if (!validateTag(tag, lastUpdated)) { vm.env.scheduleUpdateModifier(modifier); this.lastUpdated = valueForTag(tag); } }; return UpdateModifierOpcode; }(); export var UpdateDynamicModifierOpcode = /*#__PURE__*/function () { function UpdateDynamicModifierOpcode(tag, instance, instanceRef) { this.tag = tag; this.instance = instance; this.instanceRef = instanceRef; this.lastUpdated = valueForTag(tag !== null && tag !== void 0 ? tag : CURRENT_TAG); } var _proto2 = UpdateDynamicModifierOpcode.prototype; _proto2.evaluate = function evaluate(vm) { var tag = this.tag, lastUpdated = this.lastUpdated, instance = this.instance, instanceRef = this.instanceRef; var newInstance = valueForRef(instanceRef); if (newInstance !== instance) { if (instance !== undefined) { var destroyable = instance.manager.getDestroyable(instance.state); if (destroyable !== null) { destroy(destroyable); } } if (newInstance !== undefined) { var manager = newInstance.manager, state = newInstance.state; var _destroyable = manager.getDestroyable(state); if (_destroyable !== null) { associateDestroyableChild(this, _destroyable); } tag = manager.getTag(state); if (tag !== null) { this.lastUpdated = valueForTag(tag); } this.tag = tag; vm.env.scheduleInstallModifier(newInstance); } this.instance = newInstance; } else if (tag !== null && !validateTag(tag, lastUpdated)) { vm.env.scheduleUpdateModifier(instance); this.lastUpdated = valueForTag(tag); } if (tag !== null) { consumeTag(tag); } }; return UpdateDynamicModifierOpcode; }(); APPEND_OPCODES.add(51 /* StaticAttr */ , function (vm, _ref5) { var _name = _ref5.op1, _value = _ref5.op2, _namespace = _ref5.op3; var name = vm[CONSTANTS].getValue(_name); var value = vm[CONSTANTS].getValue(_value); var namespace = _namespace ? vm[CONSTANTS].getValue(_namespace) : null; vm.elements().setStaticAttribute(name, value, namespace); }); APPEND_OPCODES.add(52 /* DynamicAttr */ , function (vm, _ref6) { var _name = _ref6.op1, _trusting = _ref6.op2, _namespace = _ref6.op3; var name = vm[CONSTANTS].getValue(_name); var trusting = vm[CONSTANTS].getValue(_trusting); var reference = vm.stack.pop(); var value = valueForRef(reference); var namespace = _namespace ? vm[CONSTANTS].getValue(_namespace) : null; var attribute = vm.elements().setDynamicAttribute(name, value, trusting, namespace); if (!isConstRef(reference)) { vm.updateWith(new UpdateDynamicAttributeOpcode(reference, attribute, vm.env)); } }); export var UpdateDynamicAttributeOpcode = /*#__PURE__*/function () { function UpdateDynamicAttributeOpcode(reference, attribute, env) { var initialized = false; this.updateRef = createComputeRef(function () { var value = valueForRef(reference); if (initialized === true) { attribute.update(value, env); } else { initialized = true; } }); valueForRef(this.updateRef); } var _proto3 = UpdateDynamicAttributeOpcode.prototype; _proto3.evaluate = function evaluate() { valueForRef(this.updateRef); }; return UpdateDynamicAttributeOpcode; }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQUEsV0FBQSxFQUFBLFVBQUEsRUFBQSxnQkFBQSxRQUFBLG9CQUFBO0FBQ0EsU0FBQSxXQUFBLEVBQUEsV0FBQSxFQUFBLFVBQUEsRUFBQSxXQUFBLFFBQUEsb0JBQUE7QUE2QkEsU0FBQSxHQUFBLFFBQUEsYUFBQTtBQUNBLFNBQUEsY0FBQSxRQUFBLGVBQUE7QUFDQSxTQUFBLE1BQUEsUUFBQSxNQUFBO0FBR0EsU0FBQSxTQUFBLFFBQUEsZUFBQTtBQUNBLFNBQUEsTUFBQSxFQUFBLGFBQUEsRUFBQSxRQUFBLFFBQUEsZUFBQTtBQUNBLFNBQUEsYUFBQSxFQUFBLG1CQUFBLFFBQUEscUJBQUE7QUFDQSxTQUFBLEtBQUEsUUFBQSxjQUFBO0FBQ0EsU0FBQSx5QkFBQSxFQUFBLE9BQUEsUUFBQSxzQkFBQTtBQUVBLGNBQWMsQ0FBZCxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBNEIsVUFBQSxFQUFBLFFBQXNCO0FBQUEsTUFBVixJQUFVLFFBQWYsR0FBZTtBQUNoRCxFQUFBLEVBQUUsQ0FBRixRQUFBLEdBQUEsVUFBQSxDQUF5QixFQUFFLENBQUYsU0FBRSxDQUFGLENBQUEsUUFBQSxDQUF6QixJQUF5QixDQUF6QjtBQURGLENBQUE7QUFJQSxjQUFjLENBQWQsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQStCLFVBQUEsRUFBQSxTQUFzQjtBQUFBLE1BQVYsSUFBVSxTQUFmLEdBQWU7QUFDbkQsRUFBQSxFQUFFLENBQUYsUUFBQSxHQUFBLGFBQUEsQ0FBNEIsRUFBRSxDQUFGLFNBQUUsQ0FBRixDQUFBLFFBQUEsQ0FBNUIsSUFBNEIsQ0FBNUI7QUFERixDQUFBO0FBSUEsY0FBYyxDQUFkLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFtQyxVQUFBLEVBQUEsU0FBcUI7QUFB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RSx3Q0FBQSxTQUFBLEVBQUEsU0FBQSxFQUFBLEdBQUEsRUFBd0Y7QUFDdEYsUUFBSSxXQUFXLEdBQWYsS0FBQTtBQUVBLFNBQUEsU0FBQSxHQUFpQixnQkFBZ0IsQ0FBQyxZQUFLO0FBQ3JDLFVBQUksS0FBSyxHQUFHLFdBQVcsQ0FBdkIsU0FBdUIsQ0FBdkI7O0FBRUEsVUFBSSxXQUFXLEtBQWYsSUFBQSxFQUEwQjtBQUN4QixRQUFBLFNBQVMsQ0FBVCxNQUFBLENBQUEsS0FBQSxFQUFBLEdBQUE7QUFERixPQUFBLE1BRU87QUFDTCxRQUFBLFdBQVcsR0FBWCxJQUFBO0FBQ0Q7QUFQSCxLQUFpQyxDQUFqQztBQVVBLElBQUEsV0FBVyxDQUFDLEtBQVosU0FBVyxDQUFYO0FBQ0Q7O0FBakJIOztBQUFBLFVBbUJFLFFBbkJGLEdBbUJFLG9CQUFRO0FBQ04sSUFBQSxXQUFXLENBQUMsS0FBWixTQUFXLENBQVg7QUFDRCxHQXJCSDs7QUFBQTtBQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVmZXJlbmNlLCB2YWx1ZUZvclJlZiwgaXNDb25zdFJlZiwgY3JlYXRlQ29tcHV0ZVJlZiB9IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQge1xuICBSZXZpc2lvbixcbiAgVGFnLFxuICB2YWx1ZUZvclRhZyxcbiAgdmFsaWRhdGVUYWcsXG4gIGNvbnN1bWVUYWcsXG4gIENVUlJFTlRfVEFHLFxufSBmcm9tICdAZ2xpbW1lci92YWxpZGF0b3InO1xuaW1wb3J0IHtcbiAgY2hlY2ssXG4gIENoZWNrU3RyaW5nLFxuICBDaGVja0VsZW1lbnQsXG4gIENoZWNrT3B0aW9uLFxuICBDaGVja05vZGUsXG4gIENoZWNrTWF5YmUsXG59IGZyb20gJ0BnbGltbWVyL2RlYnVnJztcbmltcG9ydCB7XG4gIE9wLFxuICBPcHRpb24sXG4gIE1vZGlmaWVyRGVmaW5pdGlvbixcbiAgTW9kaWZpZXJJbnN0YW5jZSxcbiAgT3duZXIsXG4gIENhcHR1cmVkUG9zaXRpb25hbEFyZ3VtZW50cyxcbiAgQ3VycmllZFR5cGUsXG4gIE1vZGlmaWVyRGVmaW5pdGlvblN0YXRlLFxuICBFbnZpcm9ubWVudCxcbiAgVXBkYXRpbmdWTSxcbiAgVXBkYXRpbmdPcGNvZGUsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgJHQwIH0gZnJvbSAnQGdsaW1tZXIvdm0nO1xuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IEFzc2VydCB9IGZyb20gJy4vdm0nO1xuaW1wb3J0IHsgRHluYW1pY0F0dHJpYnV0ZSB9IGZyb20gJy4uLy4uL3ZtL2F0dHJpYnV0ZXMvZHluYW1pYyc7XG5pbXBvcnQgeyBDaGVja1JlZmVyZW5jZSwgQ2hlY2tBcmd1bWVudHMsIENoZWNrT3BlcmF0aW9ucyB9IGZyb20gJy4vLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgYXNzaWduLCBkZWJ1Z1RvU3RyaW5nLCBleHBlY3QsIGlzT2JqZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBDdXJyaWVkVmFsdWUsIGlzQ3VycmllZFR5cGUsIHJlc29sdmVDdXJyaWVkVmFsdWUgfSBmcm9tICcuLi8uLi9jdXJyaWVkLXZhbHVlJztcbmltcG9ydCB7IERFQlVHIH0gZnJvbSAnQGdsaW1tZXIvZW52JztcbmltcG9ydCB7IGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQsIGRlc3Ryb3kgfSBmcm9tICdAZ2xpbW1lci9kZXN0cm95YWJsZSc7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5UZXh0LCAodm0sIHsgb3AxOiB0ZXh0IH0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5hcHBlbmRUZXh0KHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUodGV4dCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Db21tZW50LCAodm0sIHsgb3AxOiB0ZXh0IH0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5hcHBlbmRDb21tZW50KHZtW0NPTlNUQU5UU10uZ2V0VmFsdWUodGV4dCkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5PcGVuRWxlbWVudCwgKHZtLCB7IG9wMTogdGFnIH0pID0+IHtcbiAgdm0uZWxlbWVudHMoKS5vcGVuRWxlbWVudCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKHRhZykpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5PcGVuRHluYW1pY0VsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgdGFnTmFtZSA9IGNoZWNrKHZhbHVlRm9yUmVmKGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSkpLCBDaGVja1N0cmluZyk7XG4gIHZtLmVsZW1lbnRzKCkub3BlbkVsZW1lbnQodGFnTmFtZSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hSZW1vdGVFbGVtZW50LCAodm0pID0+IHtcbiAgbGV0IGVsZW1lbnRSZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgaW5zZXJ0QmVmb3JlUmVmID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IGd1aWRSZWYgPSBjaGVjayh2bS5zdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIGxldCBlbGVtZW50ID0gY2hlY2sodmFsdWVGb3JSZWYoZWxlbWVudFJlZiksIENoZWNrRWxlbWVudCk7XG4gIGxldCBpbnNlcnRCZWZvcmUgPSBjaGVjayh2YWx1ZUZvclJlZihpbnNlcnRCZWZvcmVSZWYpLCBDaGVja01heWJlKENoZWNrT3B0aW9uKENoZWNrTm9kZSkpKTtcbiAgbGV0IGd1aWQgPSB2YWx1ZUZvclJlZihndWlkUmVmKSBhcyBzdHJpbmc7XG5cbiAgaWYgKCFpc0NvbnN0UmVmKGVsZW1lbnRSZWYpKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KGVsZW1lbnRSZWYpKTtcbiAgfVxuXG4gIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCAmJiAhaXNDb25zdFJlZihpbnNlcnRCZWZvcmVSZWYpKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KGluc2VydEJlZm9yZVJlZikpO1xuICB9XG5cbiAgbGV0IGJsb2NrID0gdm0uZWxlbWVudHMoKS5wdXNoUmVtb3RlRWxlbWVudChlbGVtZW50LCBndWlkLCBpbnNlcnRCZWZvcmUpO1xuICBpZiAoYmxvY2spIHZtLmFzc29jaWF0ZURlc3Ryb3lhYmxlKGJsb2NrKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUG9wUmVtb3RlRWxlbWVudCwgKHZtKSA9PiB7XG4gIHZtLmVsZW1lbnRzKCkucG9wUmVtb3RlRWxlbWVudCgpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5GbHVzaEVsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgb3BlcmF0aW9ucyA9IGNoZWNrKHZtLmZldGNoVmFsdWUoJHQwKSwgQ2hlY2tPcGVyYXRpb25zKTtcbiAgbGV0IG1vZGlmaWVyczogT3B0aW9uPE1vZGlmaWVySW5zdGFuY2VbXT4gPSBudWxsO1xuXG4gIGlmIChvcGVyYXRpb25zKSB7XG4gICAgbW9kaWZpZXJzID0gb3BlcmF0aW9ucy5mbHVzaCh2bSk7XG4gICAgdm0ubG9hZFZhbHVlKCR0MCwgbnVsbCk7XG4gIH1cblxuICB2bS5lbGVtZW50cygpLmZsdXNoRWxlbWVudChtb2RpZmllcnMpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5DbG9zZUVsZW1lbnQsICh2bSkgPT4ge1xuICBsZXQgbW9kaWZpZXJzID0gdm0uZWxlbWVudHMoKS5jbG9zZUVsZW1lbnQoKTtcblxuICBpZiAobW9kaWZpZXJzKSB7XG4gICAgbW9kaWZpZXJzLmZvckVhY2goKG1vZGlmaWVyKSA9PiB7XG4gICAgICB2bS5lbnYuc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobW9kaWZpZXIpO1xuICAgICAgbGV0IHsgbWFuYWdlciwgc3RhdGUgfSA9IG1vZGlmaWVyO1xuICAgICAgbGV0IGQgPSBtYW5hZ2VyLmdldERlc3Ryb3lhYmxlKHN0YXRlKTtcblxuICAgICAgaWYgKGQpIHtcbiAgICAgICAgdm0uYXNzb2NpYXRlRGVzdHJveWFibGUoZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuTW9kaWZpZXIsICh2bSwgeyBvcDE6IGhhbmRsZSB9KSA9PiB7XG4gIGlmICh2bS5lbnYuaXNJbnRlcmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgb3duZXIgPSB2bS5nZXRPd25lcigpO1xuICBsZXQgYXJncyA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cyk7XG4gIGxldCBkZWZpbml0aW9uID0gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxNb2RpZmllckRlZmluaXRpb24+KGhhbmRsZSk7XG5cbiAgbGV0IHsgbWFuYWdlciB9ID0gZGVmaW5pdGlvbjtcblxuICBsZXQgeyBjb25zdHJ1Y3RpbmcgfSA9IHZtLmVsZW1lbnRzKCk7XG5cbiAgbGV0IHN0YXRlID0gbWFuYWdlci5jcmVhdGUoXG4gICAgb3duZXIsXG4gICAgZXhwZWN0KGNvbnN0cnVjdGluZywgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIHRoZSBlbGVtZW50IGl0IGFwcGxpZXMgdG8nKSxcbiAgICBkZWZpbml0aW9uLnN0YXRlLFxuICAgIGFyZ3MuY2FwdHVyZSgpXG4gICk7XG5cbiAgbGV0IGluc3RhbmNlOiBNb2RpZmllckluc3RhbmNlID0ge1xuICAgIG1hbmFnZXIsXG4gICAgc3RhdGUsXG4gICAgZGVmaW5pdGlvbixcbiAgfTtcblxuICBsZXQgb3BlcmF0aW9ucyA9IGV4cGVjdChcbiAgICBjaGVjayh2bS5mZXRjaFZhbHVlKCR0MCksIENoZWNrT3BlcmF0aW9ucyksXG4gICAgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIG9wZXJhdGlvbnMgdG8gYXBwZW5kIHRvJ1xuICApO1xuXG4gIG9wZXJhdGlvbnMuYWRkTW9kaWZpZXIoaW5zdGFuY2UpO1xuXG4gIGxldCB0YWcgPSBtYW5hZ2VyLmdldFRhZyhzdGF0ZSk7XG5cbiAgaWYgKHRhZyAhPT0gbnVsbCkge1xuICAgIGNvbnN1bWVUYWcodGFnKTtcbiAgICByZXR1cm4gdm0udXBkYXRlV2l0aChuZXcgVXBkYXRlTW9kaWZpZXJPcGNvZGUodGFnLCBpbnN0YW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkR5bmFtaWNNb2RpZmllciwgKHZtKSA9PiB7XG4gIGlmICh2bS5lbnYuaXNJbnRlcmFjdGl2ZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgeyBzdGFjaywgW0NPTlNUQU5UU106IGNvbnN0YW50cyB9ID0gdm07XG4gIGxldCByZWYgPSBjaGVjayhzdGFjay5wb3AoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuICBsZXQgYXJncyA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja0FyZ3VtZW50cykuY2FwdHVyZSgpO1xuICBsZXQgeyBjb25zdHJ1Y3RpbmcgfSA9IHZtLmVsZW1lbnRzKCk7XG4gIGxldCBpbml0aWFsT3duZXIgPSB2bS5nZXRPd25lcigpO1xuXG4gIGxldCBpbnN0YW5jZVJlZiA9IGNyZWF0ZUNvbXB1dGVSZWYoKCkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IHZhbHVlRm9yUmVmKHJlZik7XG4gICAgbGV0IG93bmVyOiBPd25lcjtcblxuICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGhvc3REZWZpbml0aW9uOiBDdXJyaWVkVmFsdWUgfCBNb2RpZmllckRlZmluaXRpb25TdGF0ZTtcblxuICAgIGlmIChpc0N1cnJpZWRUeXBlKHZhbHVlLCBDdXJyaWVkVHlwZS5Nb2RpZmllcikpIHtcbiAgICAgIGxldCB7XG4gICAgICAgIGRlZmluaXRpb246IHJlc29sdmVkRGVmaW5pdGlvbixcbiAgICAgICAgb3duZXI6IGN1cnJpZWRPd25lcixcbiAgICAgICAgcG9zaXRpb25hbCxcbiAgICAgICAgbmFtZWQsXG4gICAgICB9ID0gcmVzb2x2ZUN1cnJpZWRWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhvc3REZWZpbml0aW9uID0gcmVzb2x2ZWREZWZpbml0aW9uO1xuICAgICAgb3duZXIgPSBjdXJyaWVkT3duZXI7XG5cbiAgICAgIGlmIChwb3NpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncy5wb3NpdGlvbmFsID0gcG9zaXRpb25hbC5jb25jYXQoYXJncy5wb3NpdGlvbmFsKSBhcyBDYXB0dXJlZFBvc2l0aW9uYWxBcmd1bWVudHM7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MubmFtZWQgPSBhc3NpZ24oe30sIC4uLm5hbWVkLCBhcmdzLm5hbWVkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaG9zdERlZmluaXRpb24gPSB2YWx1ZTtcbiAgICAgIG93bmVyID0gaW5pdGlhbE93bmVyO1xuICAgIH1cblxuICAgIGxldCBoYW5kbGUgPSBjb25zdGFudHMubW9kaWZpZXIoaG9zdERlZmluaXRpb24sIG51bGwsIHRydWUpO1xuXG4gICAgaWYgKERFQlVHICYmIGhhbmRsZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgYSBkeW5hbWljIG1vZGlmaWVyIGRlZmluaXRpb24sIGJ1dCByZWNlaXZlZCBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkaWQgbm90IGhhdmUgYSBtb2RpZmllciBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhlIGR5bmFtaWMgaW52b2NhdGlvbiB3YXMgXFxge3ske1xuICAgICAgICAgIHJlZi5kZWJ1Z0xhYmVsXG4gICAgICAgIH19fVxcYCwgYW5kIHRoZSBpbmNvcnJlY3QgZGVmaW5pdGlvbiBpcyB0aGUgdmFsdWUgYXQgdGhlIHBhdGggXFxgJHtcbiAgICAgICAgICByZWYuZGVidWdMYWJlbFxuICAgICAgICB9XFxgLCB3aGljaCB3YXM6ICR7ZGVidWdUb1N0cmluZyEoaG9zdERlZmluaXRpb24pfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGRlZmluaXRpb24gPSBjb25zdGFudHMuZ2V0VmFsdWU8TW9kaWZpZXJEZWZpbml0aW9uPihcbiAgICAgIGV4cGVjdChoYW5kbGUsICdCVUc6IG1vZGlmaWVyIGhhbmRsZSBleHBlY3RlZCcpXG4gICAgKTtcblxuICAgIGxldCB7IG1hbmFnZXIgfSA9IGRlZmluaXRpb247XG5cbiAgICBsZXQgc3RhdGUgPSBtYW5hZ2VyLmNyZWF0ZShcbiAgICAgIG93bmVyLFxuICAgICAgZXhwZWN0KGNvbnN0cnVjdGluZywgJ0JVRzogRWxlbWVudE1vZGlmaWVyIGNvdWxkIG5vdCBmaW5kIHRoZSBlbGVtZW50IGl0IGFwcGxpZXMgdG8nKSxcbiAgICAgIGRlZmluaXRpb24uc3RhdGUsXG4gICAgICBhcmdzXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBtYW5hZ2VyLFxuICAgICAgc3RhdGUsXG4gICAgICBkZWZpbml0aW9uLFxuICAgIH07XG4gIH0pO1xuXG4gIGxldCBpbnN0YW5jZSA9IHZhbHVlRm9yUmVmKGluc3RhbmNlUmVmKTtcbiAgbGV0IHRhZyA9IG51bGw7XG5cbiAgaWYgKGluc3RhbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb3BlcmF0aW9ucyA9IGV4cGVjdChcbiAgICAgIGNoZWNrKHZtLmZldGNoVmFsdWUoJHQwKSwgQ2hlY2tPcGVyYXRpb25zKSxcbiAgICAgICdCVUc6IEVsZW1lbnRNb2RpZmllciBjb3VsZCBub3QgZmluZCBvcGVyYXRpb25zIHRvIGFwcGVuZCB0bydcbiAgICApO1xuXG4gICAgb3BlcmF0aW9ucy5hZGRNb2RpZmllcihpbnN0YW5jZSk7XG5cbiAgICB0YWcgPSBpbnN0YW5jZS5tYW5hZ2VyLmdldFRhZyhpbnN0YW5jZS5zdGF0ZSk7XG5cbiAgICBpZiAodGFnICE9PSBudWxsKSB7XG4gICAgICBjb25zdW1lVGFnKHRhZyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc0NvbnN0UmVmKHJlZikgfHwgdGFnKSB7XG4gICAgcmV0dXJuIHZtLnVwZGF0ZVdpdGgobmV3IFVwZGF0ZUR5bmFtaWNNb2RpZmllck9wY29kZSh0YWcsIGluc3RhbmNlLCBpbnN0YW5jZVJlZikpO1xuICB9XG59KTtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZU1vZGlmaWVyT3Bjb2RlIGltcGxlbWVudHMgVXBkYXRpbmdPcGNvZGUge1xuICBwcml2YXRlIGxhc3RVcGRhdGVkOiBSZXZpc2lvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhZzogVGFnLCBwcml2YXRlIG1vZGlmaWVyOiBNb2RpZmllckluc3RhbmNlKSB7XG4gICAgdGhpcy5sYXN0VXBkYXRlZCA9IHZhbHVlRm9yVGFnKHRhZyk7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IG1vZGlmaWVyLCB0YWcsIGxhc3RVcGRhdGVkIH0gPSB0aGlzO1xuXG4gICAgY29uc3VtZVRhZyh0YWcpO1xuXG4gICAgaWYgKCF2YWxpZGF0ZVRhZyh0YWcsIGxhc3RVcGRhdGVkKSkge1xuICAgICAgdm0uZW52LnNjaGVkdWxlVXBkYXRlTW9kaWZpZXIobW9kaWZpZXIpO1xuICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IHZhbHVlRm9yVGFnKHRhZyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVEeW5hbWljTW9kaWZpZXJPcGNvZGUgaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIHByaXZhdGUgbGFzdFVwZGF0ZWQ6IFJldmlzaW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGFnOiBUYWcgfCBudWxsLFxuICAgIHByaXZhdGUgaW5zdGFuY2U6IE1vZGlmaWVySW5zdGFuY2UgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSBpbnN0YW5jZVJlZjogUmVmZXJlbmNlPE1vZGlmaWVySW5zdGFuY2UgfCB1bmRlZmluZWQ+XG4gICkge1xuICAgIHRoaXMubGFzdFVwZGF0ZWQgPSB2YWx1ZUZvclRhZyh0YWcgPz8gQ1VSUkVOVF9UQUcpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyB0YWcsIGxhc3RVcGRhdGVkLCBpbnN0YW5jZSwgaW5zdGFuY2VSZWYgfSA9IHRoaXM7XG5cbiAgICBsZXQgbmV3SW5zdGFuY2UgPSB2YWx1ZUZvclJlZihpbnN0YW5jZVJlZik7XG5cbiAgICBpZiAobmV3SW5zdGFuY2UgIT09IGluc3RhbmNlKSB7XG4gICAgICBpZiAoaW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgZGVzdHJveWFibGUgPSBpbnN0YW5jZS5tYW5hZ2VyLmdldERlc3Ryb3lhYmxlKGluc3RhbmNlLnN0YXRlKTtcblxuICAgICAgICBpZiAoZGVzdHJveWFibGUgIT09IG51bGwpIHtcbiAgICAgICAgICBkZXN0cm95KGRlc3Ryb3lhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV3SW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgeyBtYW5hZ2VyLCBzdGF0ZSB9ID0gbmV3SW5zdGFuY2U7XG4gICAgICAgIGxldCBkZXN0cm95YWJsZSA9IG1hbmFnZXIuZ2V0RGVzdHJveWFibGUoc3RhdGUpO1xuXG4gICAgICAgIGlmIChkZXN0cm95YWJsZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGFzc29jaWF0ZURlc3Ryb3lhYmxlQ2hpbGQodGhpcywgZGVzdHJveWFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFnID0gbWFuYWdlci5nZXRUYWcoc3RhdGUpO1xuXG4gICAgICAgIGlmICh0YWcgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmxhc3RVcGRhdGVkID0gdmFsdWVGb3JUYWcodGFnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFnID0gdGFnO1xuICAgICAgICB2bS5lbnYuc2NoZWR1bGVJbnN0YWxsTW9kaWZpZXIobmV3SW5zdGFuY2UhKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ld0luc3RhbmNlO1xuICAgIH0gZWxzZSBpZiAodGFnICE9PSBudWxsICYmICF2YWxpZGF0ZVRhZyh0YWcsIGxhc3RVcGRhdGVkKSkge1xuICAgICAgdm0uZW52LnNjaGVkdWxlVXBkYXRlTW9kaWZpZXIoaW5zdGFuY2UhKTtcbiAgICAgIHRoaXMubGFzdFVwZGF0ZWQgPSB2YWx1ZUZvclRhZyh0YWcpO1xuICAgIH1cblxuICAgIGlmICh0YWcgIT09IG51bGwpIHtcbiAgICAgIGNvbnN1bWVUYWcodGFnKTtcbiAgICB9XG4gIH1cbn1cblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlN0YXRpY0F0dHIsICh2bSwgeyBvcDE6IF9uYW1lLCBvcDI6IF92YWx1ZSwgb3AzOiBfbmFtZXNwYWNlIH0pID0+IHtcbiAgbGV0IG5hbWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWUpO1xuICBsZXQgdmFsdWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX3ZhbHVlKTtcbiAgbGV0IG5hbWVzcGFjZSA9IF9uYW1lc3BhY2UgPyB2bVtDT05TVEFOVFNdLmdldFZhbHVlPHN0cmluZz4oX25hbWVzcGFjZSkgOiBudWxsO1xuXG4gIHZtLmVsZW1lbnRzKCkuc2V0U3RhdGljQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5EeW5hbWljQXR0ciwgKHZtLCB7IG9wMTogX25hbWUsIG9wMjogX3RydXN0aW5nLCBvcDM6IF9uYW1lc3BhY2UgfSkgPT4ge1xuICBsZXQgbmFtZSA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8c3RyaW5nPihfbmFtZSk7XG4gIGxldCB0cnVzdGluZyA9IHZtW0NPTlNUQU5UU10uZ2V0VmFsdWU8Ym9vbGVhbj4oX3RydXN0aW5nKTtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG4gIGxldCB2YWx1ZSA9IHZhbHVlRm9yUmVmKHJlZmVyZW5jZSk7XG4gIGxldCBuYW1lc3BhY2UgPSBfbmFtZXNwYWNlID8gdm1bQ09OU1RBTlRTXS5nZXRWYWx1ZTxzdHJpbmc+KF9uYW1lc3BhY2UpIDogbnVsbDtcblxuICBsZXQgYXR0cmlidXRlID0gdm0uZWxlbWVudHMoKS5zZXREeW5hbWljQXR0cmlidXRlKG5hbWUsIHZhbHVlLCB0cnVzdGluZywgbmFtZXNwYWNlKTtcblxuICBpZiAoIWlzQ29uc3RSZWYocmVmZXJlbmNlKSkge1xuICAgIHZtLnVwZGF0ZVdpdGgobmV3IFVwZGF0ZUR5bmFtaWNBdHRyaWJ1dGVPcGNvZGUocmVmZXJlbmNlLCBhdHRyaWJ1dGUsIHZtLmVudikpO1xuICB9XG59KTtcblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUR5bmFtaWNBdHRyaWJ1dGVPcGNvZGUgaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIHByaXZhdGUgdXBkYXRlUmVmOiBSZWZlcmVuY2U7XG5cbiAgY29uc3RydWN0b3IocmVmZXJlbmNlOiBSZWZlcmVuY2U8dW5rbm93bj4sIGF0dHJpYnV0ZTogRHluYW1pY0F0dHJpYnV0ZSwgZW52OiBFbnZpcm9ubWVudCkge1xuICAgIGxldCBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgdGhpcy51cGRhdGVSZWYgPSBjcmVhdGVDb21wdXRlUmVmKCgpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IHZhbHVlRm9yUmVmKHJlZmVyZW5jZSk7XG5cbiAgICAgIGlmIChpbml0aWFsaXplZCA9PT0gdHJ1ZSkge1xuICAgICAgICBhdHRyaWJ1dGUudXBkYXRlKHZhbHVlLCBlbnYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFsdWVGb3JSZWYodGhpcy51cGRhdGVSZWYpO1xuICB9XG5cbiAgZXZhbHVhdGUoKSB7XG4gICAgdmFsdWVGb3JSZWYodGhpcy51cGRhdGVSZWYpO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9