@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
206 lines (171 loc) • 17.9 kB
JavaScript
import { DEBUG } from '@glimmer/env';
import { assign, Stack } from '@glimmer/util';
import { reifyArgs } from './vm/arguments';
var GUID = 0;
export var Ref = /*#__PURE__*/function () {
function Ref(value) {
this.id = GUID++;
this.value = value;
}
var _proto = Ref.prototype;
_proto.get = function get() {
return this.value;
};
_proto.release = function release() {
if (DEBUG && this.value === null) {
throw new Error('BUG: double release?');
}
this.value = null;
};
_proto.toString = function toString() {
var label = "Ref " + this.id;
if (this.value === null) {
return label + " (released)";
} else {
try {
return label + ": " + this.value;
} catch (_a) {
return label;
}
}
};
return Ref;
}();
var DebugRenderTreeImpl = /*#__PURE__*/function () {
function DebugRenderTreeImpl() {
this.stack = new Stack();
this.refs = new WeakMap();
this.roots = new Set();
this.nodes = new WeakMap();
}
var _proto2 = DebugRenderTreeImpl.prototype;
_proto2.begin = function begin() {
this.reset();
};
_proto2.create = function create(state, node) {
var internalNode = assign({}, node, {
bounds: null,
refs: new Set()
});
this.nodes.set(state, internalNode);
this.appendChild(internalNode, state);
this.enter(state);
};
_proto2.update = function update(state) {
this.enter(state);
};
_proto2.didRender = function didRender(state, bounds) {
if (DEBUG && this.stack.current !== state) {
throw new Error("BUG: expecting " + this.stack.current + ", got " + state);
}
this.nodeFor(state).bounds = bounds;
this.exit();
};
_proto2.willDestroy = function willDestroy(state) {
this.refs.get(state).release();
};
_proto2.commit = function commit() {
this.reset();
};
_proto2.capture = function capture() {
return this.captureRefs(this.roots);
};
_proto2.reset = function reset() {
if (this.stack.size !== 0) {
// We probably encountered an error during the rendering loop. This will
// likely trigger undefined behavior and memory leaks as the error left
// things in an inconsistent state. It is recommended that the user
// refresh the page.
// TODO: We could warn here? But this happens all the time in our tests?
// Clean up the root reference to prevent errors from happening if we
// attempt to capture the render tree (Ember Inspector may do this)
var root = this.stack.toArray()[0];
var ref = this.refs.get(root);
if (ref !== undefined) {
this.roots["delete"](ref);
}
while (!this.stack.isEmpty()) {
this.stack.pop();
}
}
};
_proto2.enter = function enter(state) {
this.stack.push(state);
};
_proto2.exit = function exit() {
if (DEBUG && this.stack.size === 0) {
throw new Error('BUG: unbalanced pop');
}
this.stack.pop();
};
_proto2.nodeFor = function nodeFor(state) {
return this.nodes.get(state);
};
_proto2.appendChild = function appendChild(node, state) {
if (DEBUG && this.refs.has(state)) {
throw new Error('BUG: child already appended');
}
var parent = this.stack.current;
var ref = new Ref(state);
this.refs.set(state, ref);
if (parent) {
var parentNode = this.nodeFor(parent);
parentNode.refs.add(ref);
node.parent = parentNode;
} else {
this.roots.add(ref);
}
};
_proto2.captureRefs = function captureRefs(refs) {
var _this = this;
var captured = [];
refs.forEach(function (ref) {
var state = ref.get();
if (state) {
captured.push(_this.captureNode("render-node:" + ref.id, state));
} else {
refs["delete"](ref);
}
});
return captured;
};
_proto2.captureNode = function captureNode(id, state) {
var node = this.nodeFor(state);
var type = node.type,
name = node.name,
args = node.args,
instance = node.instance,
refs = node.refs;
var template = this.captureTemplate(node);
var bounds = this.captureBounds(node);
var children = this.captureRefs(refs);
return {
id: id,
type: type,
name: name,
args: reifyArgs(args),
instance: instance,
template: template,
bounds: bounds,
children: children
};
};
_proto2.captureTemplate = function captureTemplate(_ref) {
var template = _ref.template;
return template || null;
};
_proto2.captureBounds = function captureBounds(node) {
var bounds = node.bounds;
var parentElement = bounds.parentElement();
var firstNode = bounds.firstNode();
var lastNode = bounds.lastNode();
return {
parentElement: parentElement,
firstNode: firstNode,
lastNode: lastNode
};
};
return DebugRenderTreeImpl;
}();
export { DebugRenderTreeImpl as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2RlYnVnLXJlbmRlci10cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQUEsS0FBQSxRQUFBLGNBQUE7QUFRQSxTQUFBLE1BQUEsRUFBQSxLQUFBLFFBQUEsZUFBQTtBQUNBLFNBQUEsU0FBQSxRQUFBLGdCQUFBO0FBUUEsSUFBSSxJQUFJLEdBQVIsQ0FBQTtBQUVBLFdBQU0sR0FBTjtBQUlFLGVBQUEsS0FBQSxFQUFvQjtBQUhYLFNBQUEsRUFBQSxHQUFhLElBQWIsRUFBQTtBQUlQLFNBQUEsS0FBQSxHQUFBLEtBQUE7QUFDRDs7QUFOSDs7QUFBQSxTQVFFLEdBUkYsR0FRRSxlQUFHO0FBQ0QsV0FBTyxLQUFQLEtBQUE7QUFDRCxHQVZIOztBQUFBLFNBWUUsT0FaRixHQVlFLG1CQUFPO0FBQ0wsUUFBSSxLQUFLLElBQUksS0FBQSxLQUFBLEtBQWIsSUFBQSxFQUFrQztBQUNoQyxZQUFNLElBQUEsS0FBQSxDQUFOLHNCQUFNLENBQU47QUFDRDs7QUFFRCxTQUFBLEtBQUEsR0FBQSxJQUFBO0FBQ0QsR0FsQkg7O0FBQUEsU0FvQkUsUUFwQkYsR0FvQkUsb0JBQVE7QUFDTixRQUFJLEtBQUssWUFBVSxLQUFuQixFQUFBOztBQUVBLFFBQUksS0FBQSxLQUFBLEtBQUosSUFBQSxFQUF5QjtBQUN2QixhQUFBLEtBQUE7QUFERixLQUFBLE1BRU87QUFDTCxVQUFJO0FBQ0YsZUFBVSxLQUFWLFVBQW9CLEtBQXBCLEtBQUE7QUFERixPQUFBLENBRUUsT0FBQSxFQUFBLEVBQU07QUFDTixlQUFBLEtBQUE7QUFDRDtBQUNGO0FBQ0YsR0FoQ0g7O0FBQUE7QUFBQTs7SUFtQ2MsbUI7QUFBZCxpQ0FBQTtBQUVVLFNBQUEsS0FBQSxHQUFRLElBQVIsS0FBUSxFQUFSO0FBRUEsU0FBQSxJQUFBLEdBQU8sSUFBUCxPQUFPLEVBQVA7QUFDQSxTQUFBLEtBQUEsR0FBUSxJQUFSLEdB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TSxHQUFHLEtBQUEsYUFBQSxDQUFiLElBQWEsQ0FBYjtBQUNBLFFBQUksUUFBUSxHQUFHLEtBQUEsV0FBQSxDQUFmLElBQWUsQ0FBZjtBQUNBLFdBQU87QUFBRSxNQUFBLEVBQUYsRUFBRSxFQUFGO0FBQU0sTUFBQSxJQUFOLEVBQU0sSUFBTjtBQUFZLE1BQUEsSUFBWixFQUFZLElBQVo7QUFBa0IsTUFBQSxJQUFJLEVBQUUsU0FBUyxDQUFqQyxJQUFpQyxDQUFqQztBQUF5QyxNQUFBLFFBQXpDLEVBQXlDLFFBQXpDO0FBQW1ELE1BQUEsUUFBbkQsRUFBbUQsUUFBbkQ7QUFBNkQsTUFBQSxNQUE3RCxFQUE2RCxNQUE3RDtBQUFxRSxNQUFBLFFBQUEsRUFBQTtBQUFyRSxLQUFQO0FBQ0QsRzs7VUFFTyxlLEdBQUEsK0JBQXlEO0FBQUEsUUFBdkMsUUFBdUMsUUFBdkMsUUFBdUM7QUFDL0QsV0FBTyxRQUFRLElBQWYsSUFBQTtBQUNELEc7O1VBRU8sYSxHQUFBLHVCQUFhLElBQWIsRUFBK0M7QUFDckQsUUFBSSxNQUFNLEdBQVUsSUFBSSxDQUF4QixNQUFBO0FBQ0EsUUFBSSxhQUFhLEdBQUcsTUFBTSxDQUExQixhQUFvQixFQUFwQjtBQUNBLFFBQUksU0FBUyxHQUFHLE1BQU0sQ0FBdEIsU0FBZ0IsRUFBaEI7QUFDQSxRQUFJLFFBQVEsR0FBRyxNQUFNLENBQXJCLFFBQWUsRUFBZjtBQUNBLFdBQU87QUFBRSxNQUFBLGFBQUYsRUFBRSxhQUFGO0FBQWlCLE1BQUEsU0FBakIsRUFBaUIsU0FBakI7QUFBNEIsTUFBQSxRQUFBLEVBQUE7QUFBNUIsS0FBUDtBQUNELEc7Ozs7O1NBN0lXLG1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IHtcbiAgQm91bmRzLFxuICBDYXB0dXJlZFJlbmRlck5vZGUsXG4gIERlYnVnUmVuZGVyVHJlZSxcbiAgT3B0aW9uLFxuICBSZW5kZXJOb2RlLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGV4cGVjdCwgYXNzaWduLCBTdGFjayB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgcmVpZnlBcmdzIH0gZnJvbSAnLi92bS9hcmd1bWVudHMnO1xuXG5pbnRlcmZhY2UgSW50ZXJuYWxSZW5kZXJOb2RlPFQgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUmVuZGVyTm9kZSB7XG4gIGJvdW5kczogT3B0aW9uPEJvdW5kcz47XG4gIHJlZnM6IFNldDxSZWY8VD4+O1xuICBwYXJlbnQ/OiBJbnRlcm5hbFJlbmRlck5vZGU8VD47XG59XG5cbmxldCBHVUlEID0gMDtcblxuZXhwb3J0IGNsYXNzIFJlZjxUIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHJlYWRvbmx5IGlkOiBudW1iZXIgPSBHVUlEKys7XG4gIHByaXZhdGUgdmFsdWU6IE9wdGlvbjxUPjtcblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogVCkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCgpOiBPcHRpb248VD4ge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG5cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBpZiAoREVCVUcgJiYgdGhpcy52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCVUc6IGRvdWJsZSByZWxlYXNlPycpO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogU3RyaW5nIHtcbiAgICBsZXQgbGFiZWwgPSBgUmVmICR7dGhpcy5pZH1gO1xuXG4gICAgaWYgKHRoaXMudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBgJHtsYWJlbH0gKHJlbGVhc2VkKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBgJHtsYWJlbH06ICR7dGhpcy52YWx1ZX1gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVidWdSZW5kZXJUcmVlSW1wbDxUQnVja2V0IGV4dGVuZHMgb2JqZWN0PlxuICBpbXBsZW1lbnRzIERlYnVnUmVuZGVyVHJlZTxUQnVja2V0PiB7XG4gIHByaXZhdGUgc3RhY2sgPSBuZXcgU3RhY2s8VEJ1Y2tldD4oKTtcblxuICBwcml2YXRlIHJlZnMgPSBuZXcgV2Vha01hcDxUQnVja2V0LCBSZWY8VEJ1Y2tldD4+KCk7XG4gIHByaXZhdGUgcm9vdHMgPSBuZXcgU2V0PFJlZjxUQnVja2V0Pj4oKTtcbiAgcHJpdmF0ZSBub2RlcyA9IG5ldyBXZWFrTWFwPFRCdWNrZXQsIEludGVybmFsUmVuZGVyTm9kZTxUQnVja2V0Pj4oKTtcblxuICBiZWdpbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICBjcmVhdGUoc3RhdGU6IFRCdWNrZXQsIG5vZGU6IFJlbmRlck5vZGUpOiB2b2lkIHtcbiAgICBsZXQgaW50ZXJuYWxOb2RlOiBJbnRlcm5hbFJlbmRlck5vZGU8VEJ1Y2tldD4gPSBhc3NpZ24oe30sIG5vZGUsIHtcbiAgICAgIGJvdW5kczogbnVsbCxcbiAgICAgIHJlZnM6IG5ldyBTZXQ8UmVmPFRCdWNrZXQ+PigpLFxuICAgIH0pO1xuICAgIHRoaXMubm9kZXMuc2V0KHN0YXRlLCBpbnRlcm5hbE5vZGUpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQoaW50ZXJuYWxOb2RlLCBzdGF0ZSk7XG4gICAgdGhpcy5lbnRlcihzdGF0ZSk7XG4gIH1cblxuICB1cGRhdGUoc3RhdGU6IFRCdWNrZXQpOiB2b2lkIHtcbiAgICB0aGlzLmVudGVyKHN0YXRlKTtcbiAgfVxuXG4gIGRpZFJlbmRlcihzdGF0ZTogVEJ1Y2tldCwgYm91bmRzOiBCb3VuZHMpOiB2b2lkIHtcbiAgICBpZiAoREVCVUcgJiYgdGhpcy5zdGFjay5jdXJyZW50ICE9PSBzdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBCVUc6IGV4cGVjdGluZyAke3RoaXMuc3RhY2suY3VycmVudH0sIGdvdCAke3N0YXRlfWApO1xuICAgIH1cblxuICAgIHRoaXMubm9kZUZvcihzdGF0ZSkuYm91bmRzID0gYm91bmRzO1xuICAgIHRoaXMuZXhpdCgpO1xuICB9XG5cbiAgd2lsbERlc3Ryb3koc3RhdGU6IFRCdWNrZXQpOiB2b2lkIHtcbiAgICBleHBlY3QodGhpcy5yZWZzLmdldChzdGF0ZSksICdCVUc6IG1pc3NpbmcgcmVmJykucmVsZWFzZSgpO1xuICB9XG5cbiAgY29tbWl0KCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgfVxuXG4gIGNhcHR1cmUoKTogQ2FwdHVyZWRSZW5kZXJOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmNhcHR1cmVSZWZzKHRoaXMucm9vdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGFjay5zaXplICE9PSAwKSB7XG4gICAgICAvLyBXZSBwcm9iYWJseSBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdXJpbmcgdGhlIHJlbmRlcmluZyBsb29wLiBUaGlzIHdpbGxcbiAgICAgIC8vIGxpa2VseSB0cmlnZ2VyIHVuZGVmaW5lZCBiZWhhdmlvciBhbmQgbWVtb3J5IGxlYWtzIGFzIHRoZSBlcnJvciBsZWZ0XG4gICAgICAvLyB0aGluZ3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSB1c2VyXG4gICAgICAvLyByZWZyZXNoIHRoZSBwYWdlLlxuXG4gICAgICAvLyBUT0RPOiBXZSBjb3VsZCB3YXJuIGhlcmU/IEJ1dCB0aGlzIGhhcHBlbnMgYWxsIHRoZSB0aW1lIGluIG91ciB0ZXN0cz9cblxuICAgICAgLy8gQ2xlYW4gdXAgdGhlIHJvb3QgcmVmZXJlbmNlIHRvIHByZXZlbnQgZXJyb3JzIGZyb20gaGFwcGVuaW5nIGlmIHdlXG4gICAgICAvLyBhdHRlbXB0IHRvIGNhcHR1cmUgdGhlIHJlbmRlciB0cmVlIChFbWJlciBJbnNwZWN0b3IgbWF5IGRvIHRoaXMpXG4gICAgICBsZXQgcm9vdCA9IGV4cGVjdCh0aGlzLnN0YWNrLnRvQXJyYXkoKVswXSwgJ2V4cGVjdGVkIHJvb3Qgc3RhdGUgd2hlbiByZXNldHRpbmcgcmVuZGVyIHRyZWUnKTtcbiAgICAgIGxldCByZWYgPSB0aGlzLnJlZnMuZ2V0KHJvb3QpO1xuXG4gICAgICBpZiAocmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yb290cy5kZWxldGUocmVmKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCF0aGlzLnN0YWNrLmlzRW1wdHkoKSkge1xuICAgICAgICB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW50ZXIoc3RhdGU6IFRCdWNrZXQpOiB2b2lkIHtcbiAgICB0aGlzLnN0YWNrLnB1c2goc3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGl0KCk6IHZvaWQge1xuICAgIGlmIChERUJVRyAmJiB0aGlzLnN0YWNrLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQlVHOiB1bmJhbGFuY2VkIHBvcCcpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhY2sucG9wKCk7XG4gIH1cblxuICBwcml2YXRlIG5vZGVGb3Ioc3RhdGU6IFRCdWNrZXQpOiBJbnRlcm5hbFJlbmRlck5vZGU8VEJ1Y2tldD4ge1xuICAgIHJldHVybiBleHBlY3QodGhpcy5ub2Rlcy5nZXQoc3RhdGUpLCAnQlVHOiBtaXNzaW5nIG5vZGUnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwZW5kQ2hpbGQobm9kZTogSW50ZXJuYWxSZW5kZXJOb2RlPFRCdWNrZXQ+LCBzdGF0ZTogVEJ1Y2tldCk6IHZvaWQge1xuICAgIGlmIChERUJVRyAmJiB0aGlzLnJlZnMuaGFzKHN0YXRlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCVUc6IGNoaWxkIGFscmVhZHkgYXBwZW5kZWQnKTtcbiAgICB9XG5cbiAgICBsZXQgcGFyZW50ID0gdGhpcy5zdGFjay5jdXJyZW50O1xuICAgIGxldCByZWYgPSBuZXcgUmVmKHN0YXRlKTtcblxuICAgIHRoaXMucmVmcy5zZXQoc3RhdGUsIHJlZik7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBsZXQgcGFyZW50Tm9kZSA9IHRoaXMubm9kZUZvcihwYXJlbnQpO1xuICAgICAgcGFyZW50Tm9kZS5yZWZzLmFkZChyZWYpO1xuICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3RzLmFkZChyZWYpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FwdHVyZVJlZnMocmVmczogU2V0PFJlZjxUQnVja2V0Pj4pOiBDYXB0dXJlZFJlbmRlck5vZGVbXSB7XG4gICAgbGV0IGNhcHR1cmVkOiBDYXB0dXJlZFJlbmRlck5vZGVbXSA9IFtdO1xuXG4gICAgcmVmcy5mb3JFYWNoKChyZWYpID0+IHtcbiAgICAgIGxldCBzdGF0ZSA9IHJlZi5nZXQoKTtcblxuICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgIGNhcHR1cmVkLnB1c2godGhpcy5jYXB0dXJlTm9kZShgcmVuZGVyLW5vZGU6JHtyZWYuaWR9YCwgc3RhdGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZnMuZGVsZXRlKHJlZik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2FwdHVyZWQ7XG4gIH1cblxuICBwcml2YXRlIGNhcHR1cmVOb2RlKGlkOiBzdHJpbmcsIHN0YXRlOiBUQnVja2V0KTogQ2FwdHVyZWRSZW5kZXJOb2RlIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMubm9kZUZvcihzdGF0ZSk7XG4gICAgbGV0IHsgdHlwZSwgbmFtZSwgYXJncywgaW5zdGFuY2UsIHJlZnMgfSA9IG5vZGU7XG4gICAgbGV0IHRlbXBsYXRlID0gdGhpcy5jYXB0dXJlVGVtcGxhdGUobm9kZSk7XG4gICAgbGV0IGJvdW5kcyA9IHRoaXMuY2FwdHVyZUJvdW5kcyhub2RlKTtcbiAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLmNhcHR1cmVSZWZzKHJlZnMpO1xuICAgIHJldHVybiB7IGlkLCB0eXBlLCBuYW1lLCBhcmdzOiByZWlmeUFyZ3MoYXJncyksIGluc3RhbmNlLCB0ZW1wbGF0ZSwgYm91bmRzLCBjaGlsZHJlbiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYXB0dXJlVGVtcGxhdGUoeyB0ZW1wbGF0ZSB9OiBJbnRlcm5hbFJlbmRlck5vZGU8VEJ1Y2tldD4pOiBPcHRpb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRlbXBsYXRlIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNhcHR1cmVCb3VuZHMobm9kZTogSW50ZXJuYWxSZW5kZXJOb2RlPFRCdWNrZXQ+KTogQ2FwdHVyZWRSZW5kZXJOb2RlWydib3VuZHMnXSB7XG4gICAgbGV0IGJvdW5kcyA9IGV4cGVjdChub2RlLmJvdW5kcywgJ0JVRzogbWlzc2luZyBib3VuZHMnKTtcbiAgICBsZXQgcGFyZW50RWxlbWVudCA9IGJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gICAgbGV0IGZpcnN0Tm9kZSA9IGJvdW5kcy5maXJzdE5vZGUoKTtcbiAgICBsZXQgbGFzdE5vZGUgPSBib3VuZHMubGFzdE5vZGUoKTtcbiAgICByZXR1cm4geyBwYXJlbnRFbGVtZW50LCBmaXJzdE5vZGUsIGxhc3ROb2RlIH07XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=