@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
403 lines (323 loc) • 31.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.EndTrackFrameOpcode = exports.BeginTrackFrameOpcode = exports.JumpIfNotModifiedOpcode = exports.AssertFilter = exports.Assert = void 0;
var _globalContext = require("@glimmer/global-context");
var _reference = require("@glimmer/reference");
var _validator = require("@glimmer/validator");
var _util = require("@glimmer/util");
var _assert = require("./assert");
var _opcodes = require("../../opcodes");
var _symbols = require("../../symbols");
_opcodes.APPEND_OPCODES.add(39
/* ChildScope */
, function (vm) {
return vm.pushChildScope();
});
_opcodes.APPEND_OPCODES.add(40
/* PopScope */
, function (vm) {
return vm.popScope();
});
_opcodes.APPEND_OPCODES.add(59
/* PushDynamicScope */
, function (vm) {
return vm.pushDynamicScope();
});
_opcodes.APPEND_OPCODES.add(60
/* PopDynamicScope */
, function (vm) {
return vm.popDynamicScope();
});
_opcodes.APPEND_OPCODES.add(28
/* Constant */
, function (vm, _ref) {
var other = _ref.op1;
vm.stack.push(vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(other)));
});
_opcodes.APPEND_OPCODES.add(29
/* ConstantReference */
, function (vm, _ref2) {
var other = _ref2.op1;
vm.stack.push((0, _reference.createConstRef)(vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(other)), false));
});
_opcodes.APPEND_OPCODES.add(30
/* Primitive */
, function (vm, _ref3) {
var primitive = _ref3.op1;
var stack = vm.stack;
if ((0, _util.isHandle)(primitive)) {
// it is a handle which does not already exist on the stack
var value = vm[_symbols.CONSTANTS].getValue((0, _util.decodeHandle)(primitive));
stack.push(value);
} else {
// is already an encoded immediate or primitive handle
stack.push((0, _util.decodeImmediate)(primitive));
}
});
_opcodes.APPEND_OPCODES.add(31
/* PrimitiveReference */
, function (vm) {
var stack = vm.stack;
var value = stack.pop();
var ref;
if (value === undefined) {
ref = _reference.UNDEFINED_REFERENCE;
} else if (value === null) {
ref = _reference.NULL_REFERENCE;
} else if (value === true) {
ref = _reference.TRUE_REFERENCE;
} else if (value === false) {
ref = _reference.FALSE_REFERENCE;
} else {
ref = (0, _reference.createPrimitiveRef)(value);
}
stack.push(ref);
});
_opcodes.APPEND_OPCODES.add(33
/* Dup */
, function (vm, _ref4) {
var register = _ref4.op1,
offset = _ref4.op2;
var position = vm.fetchValue(register) - offset;
vm.stack.dup(position);
});
_opcodes.APPEND_OPCODES.add(34
/* Pop */
, function (vm, _ref5) {
var count = _ref5.op1;
vm.stack.pop(count);
});
_opcodes.APPEND_OPCODES.add(35
/* Load */
, function (vm, _ref6) {
var register = _ref6.op1;
vm.load(register);
});
_opcodes.APPEND_OPCODES.add(36
/* Fetch */
, function (vm, _ref7) {
var register = _ref7.op1;
vm.fetch(register);
});
_opcodes.APPEND_OPCODES.add(58
/* BindDynamicScope */
, function (vm, _ref8) {
var _names = _ref8.op1;
var names = vm[_symbols.CONSTANTS].getArray(_names);
vm.bindDynamicScope(names);
});
_opcodes.APPEND_OPCODES.add(69
/* Enter */
, function (vm, _ref9) {
var args = _ref9.op1;
vm.enter(args);
});
_opcodes.APPEND_OPCODES.add(70
/* Exit */
, function (vm) {
vm.exit();
});
_opcodes.APPEND_OPCODES.add(63
/* PushSymbolTable */
, function (vm, _ref10) {
var _table = _ref10.op1;
var stack = vm.stack;
stack.push(vm[_symbols.CONSTANTS].getValue(_table));
});
_opcodes.APPEND_OPCODES.add(62
/* PushBlockScope */
, function (vm) {
var stack = vm.stack;
stack.push(vm.scope());
});
_opcodes.APPEND_OPCODES.add(61
/* CompileBlock */
, function (vm) {
var stack = vm.stack;
var block = stack.pop();
if (block) {
stack.push(vm.compile(block));
} else {
stack.push(null);
}
});
_opcodes.APPEND_OPCODES.add(64
/* InvokeYield */
, function (vm) {
var stack = vm.stack;
var handle = stack.pop();
var scope = stack.pop();
var table = stack.pop();
false && (0, _util.assert)(table === null || table && typeof table === 'object' && Array.isArray(table.parameters), (0, _assert.stackAssert)('Option<BlockSymbolTable>', table));
var args = stack.pop();
if (table === null) {
// To balance the pop{Frame,Scope}
vm.pushFrame();
vm.pushScope(scope !== null && scope !== void 0 ? scope : vm.scope());
return;
}
var invokingScope = scope; // If necessary, create a child scope
{
var locals = table.parameters;
var localsCount = locals.length;
if (localsCount > 0) {
invokingScope = invokingScope.child();
for (var i = 0; i < localsCount; i++) {
invokingScope.bindSymbol(locals[i], args.at(i));
}
}
}
vm.pushFrame();
vm.pushScope(invokingScope);
vm.call(handle);
});
_opcodes.APPEND_OPCODES.add(65
/* JumpIf */
, function (vm, _ref11) {
var target = _ref11.op1;
var reference = vm.stack.pop();
var value = Boolean((0, _reference.valueForRef)(reference));
if ((0, _reference.isConstRef)(reference)) {
if (value === true) {
vm["goto"](target);
}
} else {
if (value === true) {
vm["goto"](target);
}
vm.updateWith(new Assert(reference));
}
});
_opcodes.APPEND_OPCODES.add(66
/* JumpUnless */
, function (vm, _ref12) {
var target = _ref12.op1;
var reference = vm.stack.pop();
var value = Boolean((0, _reference.valueForRef)(reference));
if ((0, _reference.isConstRef)(reference)) {
if (value === false) {
vm["goto"](target);
}
} else {
if (value === false) {
vm["goto"](target);
}
vm.updateWith(new Assert(reference));
}
});
_opcodes.APPEND_OPCODES.add(67
/* JumpEq */
, function (vm, _ref13) {
var target = _ref13.op1,
comparison = _ref13.op2;
var other = vm.stack.peek();
if (other === comparison) {
vm["goto"](target);
}
});
_opcodes.APPEND_OPCODES.add(68
/* AssertSame */
, function (vm) {
var reference = vm.stack.peek();
if ((0, _reference.isConstRef)(reference) === false) {
vm.updateWith(new Assert(reference));
}
});
_opcodes.APPEND_OPCODES.add(71
/* ToBoolean */
, function (vm) {
var stack = vm.stack;
var valueRef = stack.pop();
stack.push((0, _reference.createComputeRef)(function () {
return (0, _globalContext.toBool)((0, _reference.valueForRef)(valueRef));
}));
});
var Assert = /*#__PURE__*/function () {
function Assert(ref) {
this.ref = ref;
this.last = (0, _reference.valueForRef)(ref);
}
var _proto = Assert.prototype;
_proto.evaluate = function evaluate(vm) {
var last = this.last,
ref = this.ref;
var current = (0, _reference.valueForRef)(ref);
if (last !== current) {
vm["throw"]();
}
};
return Assert;
}();
exports.Assert = Assert;
var AssertFilter = /*#__PURE__*/function () {
function AssertFilter(ref, filter) {
this.ref = ref;
this.filter = filter;
this.last = filter((0, _reference.valueForRef)(ref));
}
var _proto2 = AssertFilter.prototype;
_proto2.evaluate = function evaluate(vm) {
var last = this.last,
ref = this.ref,
filter = this.filter;
var current = filter((0, _reference.valueForRef)(ref));
if (last !== current) {
vm["throw"]();
}
};
return AssertFilter;
}();
exports.AssertFilter = AssertFilter;
var JumpIfNotModifiedOpcode = /*#__PURE__*/function () {
function JumpIfNotModifiedOpcode() {
this.tag = _validator.CONSTANT_TAG;
this.lastRevision = _validator.INITIAL;
}
var _proto3 = JumpIfNotModifiedOpcode.prototype;
_proto3.finalize = function finalize(tag, target) {
this.target = target;
this.didModify(tag);
};
_proto3.evaluate = function evaluate(vm) {
var tag = this.tag,
target = this.target,
lastRevision = this.lastRevision;
if (!vm.alwaysRevalidate && (0, _validator.validateTag)(tag, lastRevision)) {
(0, _validator.consumeTag)(tag);
vm["goto"](target);
}
};
_proto3.didModify = function didModify(tag) {
this.tag = tag;
this.lastRevision = (0, _validator.valueForTag)(this.tag);
(0, _validator.consumeTag)(tag);
};
return JumpIfNotModifiedOpcode;
}();
exports.JumpIfNotModifiedOpcode = JumpIfNotModifiedOpcode;
var BeginTrackFrameOpcode = /*#__PURE__*/function () {
function BeginTrackFrameOpcode(debugLabel) {
this.debugLabel = debugLabel;
}
var _proto4 = BeginTrackFrameOpcode.prototype;
_proto4.evaluate = function evaluate() {
(0, _validator.beginTrackFrame)(this.debugLabel);
};
return BeginTrackFrameOpcode;
}();
exports.BeginTrackFrameOpcode = BeginTrackFrameOpcode;
var EndTrackFrameOpcode = /*#__PURE__*/function () {
function EndTrackFrameOpcode(target) {
this.target = target;
}
var _proto5 = EndTrackFrameOpcode.prototype;
_proto5.evaluate = function evaluate() {
var tag = (0, _validator.endTrackFrame)();
this.target.didModify(tag);
};
return EndTrackFrameOpcode;
}();
exports.EndTrackFrameOpcode = EndTrackFrameOpcode;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUVBOztBQVlBOztBQVdBOztBQVVBOztBQUNBOztBQUlBOztBQUdBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFtQyxVQUFELEVBQUMsRUFBRDtBQUFBLFNBQVEsRUFBRSxDQUE1QyxjQUEwQyxFQUFSO0FBQWxDLENBQUE7O0FBRUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQWlDLFVBQUQsRUFBQyxFQUFEO0FBQUEsU0FBUSxFQUFFLENBQTFDLFFBQXdDLEVBQVI7QUFBaEMsQ0FBQTs7QUFFQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBeUMsVUFBRCxFQUFDLEVBQUQ7QUFBQSxTQUFRLEVBQUUsQ0FBbEQsZ0JBQWdELEVBQVI7QUFBeEMsQ0FBQTs7QUFFQSx3QkFBQSxHQUFBLENBQWtCO0FBQUE7QUFBbEIsRUFBd0MsVUFBRCxFQUFDLEVBQUQ7QUFBQSxTQUFRLEVBQUUsQ0FBakQsZUFBK0MsRUFBUjtBQUF2QyxDQUFBOztBQUVBLHdCQUFBLEdBQUEsQ0FBa0I7QUFBQTtBQUFsQixFQUFnQyxVQUFBLEVBQUEsRUFBQSxJQUFBLEVBQXVCO0FBQUEsTUFBWCxLQUFXLEdBQUEsSUFBQSxDQUFoQixHQUFnQjtBQUNyRCxFQUFBLEVBQUUsQ0FBRixLQUFBLENBQUEsSUFBQSxDQUFjLEVBQUUsQ0FBRixrQkFBRSxDQUFGLENBQUEsUUFBQSxDQUF1Qix3QkFBckMsS0FBcUMsQ0FBdkIsQ0FBZDtBQURGLENBQUE7O0FBSUEsd0JBQUEsR0FBQSxDQUFrQjtBQUFBO0FBQWxCLEVBQXlDLFVBQUEsRUFBQSxFQUFBLEtBQUEsRUFBdUI7QUFBQSxNQUFYLEtBQVcsR0FBQSxLQUFBLENBQWhCLEdBQWdCO0FBQzlELEVBQUEsRUFBRSxDQUFG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QSxPQUFBLENBQUEsU0FBQSxHQW1CRSxTQUFBLFNBQUEsQ0FBQSxHQUFBLEVBQWtCO0FBQ2hCLFNBQUEsR0FBQSxHQUFBLEdBQUE7QUFDQSxTQUFBLFlBQUEsR0FBb0IsNEJBQVksS0FBaEMsR0FBb0IsQ0FBcEI7QUFDQSwrQkFBQSxHQUFBO0FBdEJKLEdBQUE7O0FBQUEsU0FBQSx1QkFBQTtBQUFBLENBQUEsRUFBQTs7OztBQTBCQSxJQUFNLHFCQUFOLEdBQUEsYUFBQSxZQUFBO0FBQ0UsV0FBQSxxQkFBQSxDQUFBLFVBQUEsRUFBdUM7QUFBbkIsU0FBQSxVQUFBLEdBQUEsVUFBQTtBQUF1Qjs7QUFEN0MsTUFBQSxPQUFBLEdBQUEscUJBQUEsQ0FBQSxTQUFBOztBQUFBLEVBQUEsT0FBQSxDQUFBLFFBQUEsR0FHRSxTQUFBLFFBQUEsR0FBUTtBQUNOLG9DQUFnQixLQUFoQixVQUFBO0FBSkosR0FBQTs7QUFBQSxTQUFBLHFCQUFBO0FBQUEsQ0FBQSxFQUFBOzs7O0FBUUEsSUFBTSxtQkFBTixHQUFBLGFBQUEsWUFBQTtBQUNFLFdBQUEsbUJBQUEsQ0FBQSxNQUFBLEVBQW1EO0FBQS9CLFNBQUEsTUFBQSxHQUFBLE1BQUE7QUFBbUM7O0FBRHpELE1BQUEsT0FBQSxHQUFBLG1CQUFBLENBQUEsU0FBQTs7QUFBQSxFQUFBLE9BQUEsQ0FBQSxRQUFBLEdBR0UsU0FBQSxRQUFBLEdBQVE7QUFDTixRQUFJLEdBQUcsR0FBUCwrQkFBQTtBQUNBLFNBQUEsTUFBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBO0FBTEosR0FBQTs7QUFBQSxTQUFBLG1CQUFBO0FBQUEsQ0FBQSxFQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdG9Cb29sIH0gZnJvbSAnQGdsaW1tZXIvZ2xvYmFsLWNvbnRleHQnO1xuaW1wb3J0IHsgQ29tcGlsYWJsZVRlbXBsYXRlLCBPcHRpb24sIE9wLCBVcGRhdGluZ09wY29kZSB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgUmVmZXJlbmNlLFxuICB2YWx1ZUZvclJlZixcbiAgaXNDb25zdFJlZixcbiAgY3JlYXRlUHJpbWl0aXZlUmVmLFxuICBVTkRFRklORURfUkVGRVJFTkNFLFxuICBOVUxMX1JFRkVSRU5DRSxcbiAgVFJVRV9SRUZFUkVOQ0UsXG4gIEZBTFNFX1JFRkVSRU5DRSxcbiAgY3JlYXRlQ29tcHV0ZVJlZixcbiAgY3JlYXRlQ29uc3RSZWYsXG59IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5pbXBvcnQge1xuICBDT05TVEFOVF9UQUcsXG4gIFJldmlzaW9uLFxuICBUYWcsXG4gIHZhbHVlRm9yVGFnLFxuICB2YWxpZGF0ZVRhZyxcbiAgSU5JVElBTCxcbiAgYmVnaW5UcmFja0ZyYW1lLFxuICBlbmRUcmFja0ZyYW1lLFxuICBjb25zdW1lVGFnLFxufSBmcm9tICdAZ2xpbW1lci92YWxpZGF0b3InO1xuaW1wb3J0IHsgYXNzZXJ0LCBkZWNvZGVIYW5kbGUsIGRlY29kZUltbWVkaWF0ZSwgZXhwZWN0LCBpc0hhbmRsZSB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHtcbiAgQ2hlY2tOdW1iZXIsXG4gIGNoZWNrLFxuICBDaGVja0luc3RhbmNlb2YsXG4gIENoZWNrT3B0aW9uLFxuICBDaGVja0Jsb2NrU3ltYm9sVGFibGUsXG4gIENoZWNrSGFuZGxlLFxuICBDaGVja1ByaW1pdGl2ZSxcbn0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHsgc3RhY2tBc3NlcnQgfSBmcm9tICcuL2Fzc2VydCc7XG5pbXBvcnQgeyBBUFBFTkRfT1BDT0RFUyB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgVXBkYXRpbmdWTSB9IGZyb20gJy4uLy4uL3ZtJztcbmltcG9ydCB7IFZNQXJndW1lbnRzSW1wbCB9IGZyb20gJy4uLy4uL3ZtL2FyZ3VtZW50cyc7XG5pbXBvcnQgeyBDaGVja1JlZmVyZW5jZSwgQ2hlY2tTY29wZSB9IGZyb20gJy4vLWRlYnVnLXN0cmlwJztcbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4uLy4uL3N5bWJvbHMnO1xuaW1wb3J0IHsgSW50ZXJuYWxWTSB9IGZyb20gJy4uLy4uL3ZtL2FwcGVuZCc7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5DaGlsZFNjb3BlLCAodm0pID0+IHZtLnB1c2hDaGlsZFNjb3BlKCkpO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUG9wU2NvcGUsICh2bSkgPT4gdm0ucG9wU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QdXNoRHluYW1pY1Njb3BlLCAodm0pID0+IHZtLnB1c2hEeW5hbWljU2NvcGUoKSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3BEeW5hbWljU2NvcGUsICh2bSkgPT4gdm0ucG9wRHluYW1pY1Njb3BlKCkpO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29uc3RhbnQsICh2bSwgeyBvcDE6IG90aGVyIH0pID0+IHtcbiAgdm0uc3RhY2sucHVzaCh2bVtDT05TVEFOVFNdLmdldFZhbHVlKGRlY29kZUhhbmRsZShvdGhlcikpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29uc3RhbnRSZWZlcmVuY2UsICh2bSwgeyBvcDE6IG90aGVyIH0pID0+IHtcbiAgdm0uc3RhY2sucHVzaChjcmVhdGVDb25zdFJlZih2bVtDT05TVEFOVFNdLmdldFZhbHVlKGRlY29kZUhhbmRsZShvdGhlcikpLCBmYWxzZSkpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5QcmltaXRpdmUsICh2bSwgeyBvcDE6IHByaW1pdGl2ZSB9KSA9PiB7XG4gIGxldCBzdGFjayA9IHZtLnN0YWNrO1xuXG4gIGlmIChpc0hhbmRsZShwcmltaXRpdmUpKSB7XG4gICAgLy8gaXQgaXMgYSBoYW5kbGUgd2hpY2ggZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgc3RhY2tcbiAgICBsZXQgdmFsdWUgPSB2bVtDT05TVEFOVFNdLmdldFZhbHVlKGRlY29kZUhhbmRsZShwcmltaXRpdmUpKTtcbiAgICBzdGFjay5wdXNoKHZhbHVlIGFzIG9iamVjdCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaXMgYWxyZWFkeSBhbiBlbmNvZGVkIGltbWVkaWF0ZSBvciBwcmltaXRpdmUgaGFuZGxlXG4gICAgc3RhY2sucHVzaChkZWNvZGVJbW1lZGlhdGUocHJpbWl0aXZlKSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHJpbWl0aXZlUmVmZXJlbmNlLCAodm0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG4gIGxldCB2YWx1ZSA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1ByaW1pdGl2ZSk7XG4gIGxldCByZWY7XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZWYgPSBVTkRFRklORURfUkVGRVJFTkNFO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmVmID0gTlVMTF9SRUZFUkVOQ0U7XG4gIH0gZWxzZSBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICByZWYgPSBUUlVFX1JFRkVSRU5DRTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICByZWYgPSBGQUxTRV9SRUZFUkVOQ0U7XG4gIH0gZWxzZSB7XG4gICAgcmVmID0gY3JlYXRlUHJpbWl0aXZlUmVmKHZhbHVlKTtcbiAgfVxuXG4gIHN0YWNrLnB1c2gocmVmKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRHVwLCAodm0sIHsgb3AxOiByZWdpc3Rlciwgb3AyOiBvZmZzZXQgfSkgPT4ge1xuICBsZXQgcG9zaXRpb24gPSBjaGVjayh2bS5mZXRjaFZhbHVlKHJlZ2lzdGVyKSwgQ2hlY2tOdW1iZXIpIC0gb2Zmc2V0O1xuICB2bS5zdGFjay5kdXAocG9zaXRpb24pO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Qb3AsICh2bSwgeyBvcDE6IGNvdW50IH0pID0+IHtcbiAgdm0uc3RhY2sucG9wKGNvdW50KTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuTG9hZCwgKHZtLCB7IG9wMTogcmVnaXN0ZXIgfSkgPT4ge1xuICB2bS5sb2FkKHJlZ2lzdGVyKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRmV0Y2gsICh2bSwgeyBvcDE6IHJlZ2lzdGVyIH0pID0+IHtcbiAgdm0uZmV0Y2gocmVnaXN0ZXIpO1xufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5CaW5kRHluYW1pY1Njb3BlLCAodm0sIHsgb3AxOiBfbmFtZXMgfSkgPT4ge1xuICBsZXQgbmFtZXMgPSB2bVtDT05TVEFOVFNdLmdldEFycmF5PHN0cmluZz4oX25hbWVzKTtcbiAgdm0uYmluZER5bmFtaWNTY29wZShuYW1lcyk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkVudGVyLCAodm0sIHsgb3AxOiBhcmdzIH0pID0+IHtcbiAgdm0uZW50ZXIoYXJncyk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkV4aXQsICh2bSkgPT4ge1xuICB2bS5leGl0KCk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLlB1c2hTeW1ib2xUYWJsZSwgKHZtLCB7IG9wMTogX3RhYmxlIH0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG4gIHN0YWNrLnB1c2godm1bQ09OU1RBTlRTXS5nZXRWYWx1ZShfdGFibGUpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuUHVzaEJsb2NrU2NvcGUsICh2bSkgPT4ge1xuICBsZXQgc3RhY2sgPSB2bS5zdGFjaztcbiAgc3RhY2sucHVzaCh2bS5zY29wZSgpKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQ29tcGlsZUJsb2NrLCAodm06IEludGVybmFsVk0pID0+IHtcbiAgbGV0IHN0YWNrID0gdm0uc3RhY2s7XG4gIGxldCBibG9jayA9IHN0YWNrLnBvcDxPcHRpb248Q29tcGlsYWJsZVRlbXBsYXRlPiB8IDA+KCk7XG5cbiAgaWYgKGJsb2NrKSB7XG4gICAgc3RhY2sucHVzaCh2bS5jb21waWxlKGJsb2NrKSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhY2sucHVzaChudWxsKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5JbnZva2VZaWVsZCwgKHZtKSA9PiB7XG4gIGxldCB7IHN0YWNrIH0gPSB2bTtcblxuICBsZXQgaGFuZGxlID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrT3B0aW9uKENoZWNrSGFuZGxlKSk7XG4gIGxldCBzY29wZSA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja09wdGlvbihDaGVja1Njb3BlKSk7XG4gIGxldCB0YWJsZSA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja09wdGlvbihDaGVja0Jsb2NrU3ltYm9sVGFibGUpKTtcblxuICBhc3NlcnQoXG4gICAgdGFibGUgPT09IG51bGwgfHwgKHRhYmxlICYmIHR5cGVvZiB0YWJsZSA9PT0gJ29iamVjdCcgJiYgQXJyYXkuaXNBcnJheSh0YWJsZS5wYXJhbWV0ZXJzKSksXG4gICAgc3RhY2tBc3NlcnQoJ09wdGlvbjxCbG9ja1N5bWJvbFRhYmxlPicsIHRhYmxlKVxuICApO1xuXG4gIGxldCBhcmdzID0gY2hlY2soc3RhY2sucG9wKCksIENoZWNrSW5zdGFuY2VvZihWTUFyZ3VtZW50c0ltcGwpKTtcblxuICBpZiAodGFibGUgPT09IG51bGwpIHtcbiAgICAvLyBUbyBiYWxhbmNlIHRoZSBwb3B7RnJhbWUsU2NvcGV9XG4gICAgdm0ucHVzaEZyYW1lKCk7XG4gICAgdm0ucHVzaFNjb3BlKHNjb3BlID8/IHZtLnNjb3BlKCkpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGludm9raW5nU2NvcGUgPSBleHBlY3Qoc2NvcGUsICdCVUc6IGV4cGVjdGVkIHNjb3BlJyk7XG5cbiAgLy8gSWYgbmVjZXNzYXJ5LCBjcmVhdGUgYSBjaGlsZCBzY29wZVxuICB7XG4gICAgbGV0IGxvY2FscyA9IHRhYmxlLnBhcmFtZXRlcnM7XG4gICAgbGV0IGxvY2Fsc0NvdW50ID0gbG9jYWxzLmxlbmd0aDtcblxuICAgIGlmIChsb2NhbHNDb3VudCA+IDApIHtcbiAgICAgIGludm9raW5nU2NvcGUgPSBpbnZva2luZ1Njb3BlLmNoaWxkKCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxzQ291bnQ7IGkrKykge1xuICAgICAgICBpbnZva2luZ1Njb3BlLmJpbmRTeW1ib2wobG9jYWxzIVtpXSwgYXJncy5hdChpKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdm0ucHVzaEZyYW1lKCk7XG4gIHZtLnB1c2hTY29wZShpbnZva2luZ1Njb3BlKTtcbiAgdm0uY2FsbChoYW5kbGUhKTtcbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuSnVtcElmLCAodm0sIHsgb3AxOiB0YXJnZXQgfSkgPT4ge1xuICBsZXQgcmVmZXJlbmNlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IHZhbHVlID0gQm9vbGVhbih2YWx1ZUZvclJlZihyZWZlcmVuY2UpKTtcblxuICBpZiAoaXNDb25zdFJlZihyZWZlcmVuY2UpKSB7XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgdm0uZ290byh0YXJnZXQpO1xuICAgIH1cblxuICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChyZWZlcmVuY2UpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5KdW1wVW5sZXNzLCAodm0sIHsgb3AxOiB0YXJnZXQgfSkgPT4ge1xuICBsZXQgcmVmZXJlbmNlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcbiAgbGV0IHZhbHVlID0gQm9vbGVhbih2YWx1ZUZvclJlZihyZWZlcmVuY2UpKTtcblxuICBpZiAoaXNDb25zdFJlZihyZWZlcmVuY2UpKSB7XG4gICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgdm0uZ290byh0YXJnZXQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICB2bS5nb3RvKHRhcmdldCk7XG4gICAgfVxuXG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0KHJlZmVyZW5jZSkpO1xuICB9XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkp1bXBFcSwgKHZtLCB7IG9wMTogdGFyZ2V0LCBvcDI6IGNvbXBhcmlzb24gfSkgPT4ge1xuICBsZXQgb3RoZXIgPSBjaGVjayh2bS5zdGFjay5wZWVrKCksIENoZWNrTnVtYmVyKTtcblxuICBpZiAob3RoZXIgPT09IGNvbXBhcmlzb24pIHtcbiAgICB2bS5nb3RvKHRhcmdldCk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuQXNzZXJ0U2FtZSwgKHZtKSA9PiB7XG4gIGxldCByZWZlcmVuY2UgPSBjaGVjayh2bS5zdGFjay5wZWVrKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBpZiAoaXNDb25zdFJlZihyZWZlcmVuY2UpID09PSBmYWxzZSkge1xuICAgIHZtLnVwZGF0ZVdpdGgobmV3IEFzc2VydChyZWZlcmVuY2UpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5Ub0Jvb2xlYW4sICh2bSkgPT4ge1xuICBsZXQgeyBzdGFjayB9ID0gdm07XG4gIGxldCB2YWx1ZVJlZiA9IGNoZWNrKHN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgc3RhY2sucHVzaChjcmVhdGVDb21wdXRlUmVmKCgpID0+IHRvQm9vbCh2YWx1ZUZvclJlZih2YWx1ZVJlZikpKSk7XG59KTtcblxuZXhwb3J0IGNsYXNzIEFzc2VydCBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSBsYXN0OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVmOiBSZWZlcmVuY2UpIHtcbiAgICB0aGlzLmxhc3QgPSB2YWx1ZUZvclJlZihyZWYpO1xuICB9XG5cbiAgZXZhbHVhdGUodm06IFVwZGF0aW5nVk0pIHtcbiAgICBsZXQgeyBsYXN0LCByZWYgfSA9IHRoaXM7XG4gICAgbGV0IGN1cnJlbnQgPSB2YWx1ZUZvclJlZihyZWYpO1xuXG4gICAgaWYgKGxhc3QgIT09IGN1cnJlbnQpIHtcbiAgICAgIHZtLnRocm93KCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NlcnRGaWx0ZXI8VCwgVT4gaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIHByaXZhdGUgbGFzdDogVTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogUmVmZXJlbmNlPFQ+LCBwcml2YXRlIGZpbHRlcjogKGZyb206IFQpID0+IFUpIHtcbiAgICB0aGlzLmxhc3QgPSBmaWx0ZXIodmFsdWVGb3JSZWYocmVmKSk7XG4gIH1cblxuICBldmFsdWF0ZSh2bTogVXBkYXRpbmdWTSkge1xuICAgIGxldCB7IGxhc3QsIHJlZiwgZmlsdGVyIH0gPSB0aGlzO1xuICAgIGxldCBjdXJyZW50ID0gZmlsdGVyKHZhbHVlRm9yUmVmKHJlZikpO1xuXG4gICAgaWYgKGxhc3QgIT09IGN1cnJlbnQpIHtcbiAgICAgIHZtLnRocm93KCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKdW1wSWZOb3RNb2RpZmllZE9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgcHJpdmF0ZSB0YWc6IFRhZyA9IENPTlNUQU5UX1RBRztcbiAgcHJpdmF0ZSBsYXN0UmV2aXNpb246IFJldmlzaW9uID0gSU5JVElBTDtcbiAgcHJpdmF0ZSB0YXJnZXQ/OiBudW1iZXI7XG5cbiAgZmluYWxpemUodGFnOiBUYWcsIHRhcmdldDogbnVtYmVyKSB7XG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy5kaWRNb2RpZnkodGFnKTtcbiAgfVxuXG4gIGV2YWx1YXRlKHZtOiBVcGRhdGluZ1ZNKSB7XG4gICAgbGV0IHsgdGFnLCB0YXJnZXQsIGxhc3RSZXZpc2lvbiB9ID0gdGhpcztcblxuICAgIGlmICghdm0uYWx3YXlzUmV2YWxpZGF0ZSAmJiB2YWxpZGF0ZVRhZyh0YWcsIGxhc3RSZXZpc2lvbikpIHtcbiAgICAgIGNvbnN1bWVUYWcodGFnKTtcbiAgICAgIHZtLmdvdG8oZXhwZWN0KHRhcmdldCwgJ1ZNIEJVRzogVGFyZ2V0IG11c3QgYmUgc2V0IGJlZm9yZSBhdHRlbXB0aW5nIHRvIGp1bXAnKSk7XG4gICAgfVxuICB9XG5cbiAgZGlkTW9kaWZ5KHRhZzogVGFnKSB7XG4gICAgdGhpcy50YWcgPSB0YWc7XG4gICAgdGhpcy5sYXN0UmV2aXNpb24gPSB2YWx1ZUZvclRhZyh0aGlzLnRhZyk7XG4gICAgY29uc3VtZVRhZyh0YWcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCZWdpblRyYWNrRnJhbWVPcGNvZGUgaW1wbGVtZW50cyBVcGRhdGluZ09wY29kZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVidWdMYWJlbD86IHN0cmluZykge31cblxuICBldmFsdWF0ZSgpIHtcbiAgICBiZWdpblRyYWNrRnJhbWUodGhpcy5kZWJ1Z0xhYmVsKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5kVHJhY2tGcmFtZU9wY29kZSBpbXBsZW1lbnRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0YXJnZXQ6IEp1bXBJZk5vdE1vZGlmaWVkT3Bjb2RlKSB7fVxuXG4gIGV2YWx1YXRlKCkge1xuICAgIGxldCB0YWcgPSBlbmRUcmFja0ZyYW1lKCk7XG4gICAgdGhpcy50YXJnZXQuZGlkTW9kaWZ5KHRhZyk7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=