@glimmer/syntax
Version:
139 lines (106 loc) • 12.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.match = match;
exports.IsInvisible = exports.MatchAny = void 0;
var _util = require("@glimmer/util");
/**
* This file implements the DSL used by span and offset in places where they need to exhaustively
* consider all combinations of states (Handlebars offsets, character offsets and invisible/broken
* offsets).
*
* It's probably overkill, but it makes the code that uses it clear. It could be refactored or
* removed.
*/
const MatchAny = 'MATCH_ANY';
exports.MatchAny = MatchAny;
const IsInvisible = 'IS_INVISIBLE';
exports.IsInvisible = IsInvisible;
class WhenList {
constructor(whens) {
this._whens = whens;
}
first(kind) {
for (let when of this._whens) {
let value = when.match(kind);
if ((0, _util.isPresent)(value)) {
return value[0];
}
}
return null;
}
}
class When {
constructor() {
this._map = new Map();
}
get(pattern, or) {
let value = this._map.get(pattern);
if (value) {
return value;
}
value = or();
this._map.set(pattern, value);
return value;
}
add(pattern, out) {
this._map.set(pattern, out);
}
match(kind) {
let pattern = patternFor(kind);
let out = [];
let exact = this._map.get(pattern);
let fallback = this._map.get(MatchAny);
if (exact) {
out.push(exact);
}
if (fallback) {
out.push(fallback);
}
return out;
}
}
function match(callback) {
return callback(new Matcher()).check();
}
class Matcher {
constructor() {
this._whens = new When();
}
/**
* You didn't exhaustively match all possibilities.
*/
check() {
return (left, right) => this.matchFor(left.kind, right.kind)(left, right);
}
matchFor(left, right) {
let nesteds = this._whens.match(left);
false && (0, _util.assert)((0, _util.isPresent)(nesteds), `no match defined for (${left}, ${right}) and no AnyMatch defined either`);
let callback = new WhenList(nesteds).first(right);
false && (0, _util.assert)(callback !== null, `no match defined for (${left}, ${right}) and no AnyMatch defined either`);
return callback;
}
when(left, right, // eslint-disable-next-line @typescript-eslint/no-explicit-any
callback) {
this._whens.get(left, () => new When()).add(right, callback);
return this;
}
}
function patternFor(kind) {
switch (kind) {
case "Broken"
/* Broken */
:
case "InternalsSynthetic"
/* InternalsSynthetic */
:
case "NonExistent"
/* NonExistent */
:
return IsInvisible;
default:
return kind;
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvc291cmNlL2xvYy9tYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOztBQUlBOzs7Ozs7OztBQVNPLE1BQU0sUUFBUSxHQUFkLFdBQUE7O0FBV0EsTUFBTSxXQUFXLEdBQWpCLGNBQUE7OztBQUtQLE1BQUEsUUFBQSxDQUFjO0FBR1osRUFBQSxXQUFBLENBQUEsS0FBQSxFQUE4QjtBQUM1QixTQUFBLE1BQUEsR0FBQSxLQUFBO0FBQ0Q7O0FBRUQsRUFBQSxLQUFLLENBQUEsSUFBQSxFQUFpQjtBQUNwQixTQUFLLElBQUwsSUFBQSxJQUFpQixLQUFqQixNQUFBLEVBQThCO0FBQzVCLFVBQUksS0FBSyxHQUFHLElBQUksQ0FBSixLQUFBLENBQVosSUFBWSxDQUFaOztBQUNBLFVBQUkscUJBQUosS0FBSSxDQUFKLEVBQXNCO0FBQ3BCLGVBQU8sS0FBSyxDQUFaLENBQVksQ0FBWjtBQUNEO0FBQ0Y7O0FBRUQsV0FBQSxJQUFBO0FBQ0Q7O0FBaEJXOztBQW1CZCxNQUFBLElBQUEsQ0FBVTtBQUFWLEVBQUEsV0FBQSxHQUFBO0FBQ0UsU0FBQSxJQUFBLEdBQTBCLElBQTFCLEdBQTBCLEVBQTFCO0FBc0NEOztBQXBDQyxFQUFBLEdBQUcsQ0FBQSxPQUFBLEVBQUEsRUFBQSxFQUFnQztBQUNqQyxRQUFJLEtBQUssR0FBRyxLQUFBLElBQUEsQ0FBQSxHQUFBLENBQVosT0FBWSxDQUFaOztBQUVBLFFBQUEsS0FBQSxFQUFXO0FBQ1QsYUFBQSxLQUFBO0FBQ0Q7O0FBRUQsSUFBQSxLQUFLLEdBQUcsRUFBUixFQUFBOztBQUVBLFNBQUEsSUFBQSxDQUFBLEdBQUEsQ0FBQSxPQUFBLEVBQUEsS0FBQTs7QUFFQSxXQUFBLEtBQUE7QUFDRDs7QUFFRCxFQUFBLEdBQUcsQ0FBQSxPQUFBLEVBQUEsR0FBQSxFQUEyQjtBQUM1QixTQUFBLElBQUEsQ0FBQSxHQUFBLENBQUEsT0FBQSxFQUFBLEdBQUE7QUFDRDs7QUFFRCxFQUFBLEtBQUssQ0FBQSxJQUFBLEVBQWlCO0FBQ3BCLFFBQUksT0FBTyxHQUFHLFVBQVUsQ0FBeEIsSUFBd0IsQ0FBeEI7QUFFQSxRQUFJLEdBQUcsR0FBUCxFQUFBOztBQUVBLFFBQUksS0FBSyxHQUFHLEtBQUEsSUFBQSxDQUFBLEdBQUEsQ0FBWixPQUFZLENBQVo7O0FBQ0EsUUFBSSxRQUFRLEdBQUcsS0FBQSxJQUFBLENBQUEsR0FBQSxDQUFmLFFBQWUsQ0FBZjs7QUFFQSxRQUFBLEtBQUEsRUFBVztBQUNULE1BQUEsR0FBRyxDQUFILElBQUEsQ0FBQSxLQUFBO0FBQ0Q7O0FBRUQsUUFBQSxRQUFBLEVBQWM7QUFDWixNQUFBLEdBQUcsQ0FBSCxJQUFBLENBQUEsUUFBQTtBQUNEOztBQUVELFdBQUEsR0FBQTtBQUNEOztBQXRDTzs7QUFzREosU0FBQSxLQUFBLENBQUEsUUFBQSxFQUEwRTtBQUM5RSxTQUFPLFFBQVEsQ0FBQyxJQUFULE9BQVMsRUFBRCxDQUFSLENBQVAsS0FBTyxFQUFQO0FBQ0Q7O0FBRUQsTUFBQSxPQUFBLENBQWE7QUFBYixFQUFBLFdBQUEsR0FBQTtBQUNFLFNBQUEsTUFBQSxHQUF1RSxJQUF2RSxJQUF1RSxFQUF2RTtBQThFRDtBQTVFQzs7Ozs7QUFHVSxFQUFBLEtBQUssR0FBQTtBQUNiLFdBQU8sQ0FBQSxJQUFBLEVBQUEsS0FBQSxLQUFpQixLQUFBLFFBQUEsQ0FBYyxJQUFJLENBQWxCLElBQUEsRUFBeUIsS0FBSyxDQUE5QixJQUFBLEVBQUEsSUFBQSxFQUF4QixLQUF3QixDQUF4QjtBQUNEOztBQUVPLEVBQUEsUUFBUSxDQUFBLElBQUEsRUFBQSxLQUFBLEVBRUc7QUFFakIsUUFBSSxPQUFPLEdBQUcsS0FBQSxNQUFBLENBQUEsS0FBQSxDQUFkLElBQWMsQ0FBZDs7QUFGaUIsYUFJakIsa0JBQ0UscUJBREksT0FDSixDQURGLEVBRUUseUJBQXlCLElBQUksS0FBSyxLQU5uQixrQ0FJakIsQ0FKaUI7QUFTakIsUUFBSSxRQUFRLEdBQUcsSUFBQSxRQUFBLENBQUEsT0FBQSxFQUFBLEtBQUEsQ0FBZixLQUFlLENBQWY7QUFUaUIsYUFXakIsa0JBQ0UsUUFBUSxLQURKLElBQU4sRUFFRSx5QkFBeUIsSUFBSSxLQUFLLEtBYm5CLGtDQVdqQixDQVhpQjtBQWdCakIsV0FBQSxRQUFBO0FBQ0Q7O0FBd0NELEVBQUEsSUFBSSxDQUFBLElBQUEsRUFBQSxLQUFBLEVBR0Y7QUFIRSxFQUFBLFFBQUEsRUFJc0M7QUFFeEMsU0FBQSxNQUFBLENBQUEsR0FBQSxDQUFBLElBQUEsRUFBc0IsTUFBTSxJQUE1QixJQUE0QixFQUE1QixFQUFBLEdBQUEsQ0FBQSxLQUFBLEVBQUEsUUFBQTs7QUFFQSxXQUFBLElBQUE7QUFDRDs7QUE5RVU7O0FBaUZiLFNBQUEsVUFBQSxDQUFBLElBQUEsRUFBb0M7QUFDbEMsVUFBQSxJQUFBO0FBQ0UsU0FBQTtBQUFBO0FBQUE7QUFDQSxTQUFBO0FBQUE7QUFBQTtBQUNBLFNBQUE7QUFBQTtBQUFBO0FBQ0UsYUFBQSxXQUFBOztBQUNGO0FBQ0UsYUFBQSxJQUFBO0FBTko7QUFRRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFzc2VydCwgaXNQcmVzZW50IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5cbmltcG9ydCB7IENoYXJQb3NpdGlvbiwgSGJzUG9zaXRpb24sIEludmlzaWJsZVBvc2l0aW9uLCBPZmZzZXRLaW5kLCBQb3NpdGlvbkRhdGEgfSBmcm9tICcuL29mZnNldCc7XG5cbi8qKlxuICogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIERTTCB1c2VkIGJ5IHNwYW4gYW5kIG9mZnNldCBpbiBwbGFjZXMgd2hlcmUgdGhleSBuZWVkIHRvIGV4aGF1c3RpdmVseVxuICogY29uc2lkZXIgYWxsIGNvbWJpbmF0aW9ucyBvZiBzdGF0ZXMgKEhhbmRsZWJhcnMgb2Zmc2V0cywgY2hhcmFjdGVyIG9mZnNldHMgYW5kIGludmlzaWJsZS9icm9rZW5cbiAqIG9mZnNldHMpLlxuICpcbiAqIEl0J3MgcHJvYmFibHkgb3ZlcmtpbGwsIGJ1dCBpdCBtYWtlcyB0aGUgY29kZSB0aGF0IHVzZXMgaXQgY2xlYXIuIEl0IGNvdWxkIGJlIHJlZmFjdG9yZWQgb3JcbiAqIHJlbW92ZWQuXG4gKi9cblxuZXhwb3J0IGNvbnN0IE1hdGNoQW55ID0gJ01BVENIX0FOWSc7XG5leHBvcnQgdHlwZSBNYXRjaEFueSA9ICdNQVRDSF9BTlknO1xuXG50eXBlIE1hdGNoZXMgPVxuICB8ICdDaGFyLEhicydcbiAgfCAnSGJzLENoYXInXG4gIHwgJ0hicyxIYnMnXG4gIHwgJ0NoYXIsQ2hhcidcbiAgfCAnSW52aXNpYmxlLEFueSdcbiAgfCAnQW55LEludmlzaWJsZSc7XG5cbmV4cG9ydCBjb25zdCBJc0ludmlzaWJsZSA9ICdJU19JTlZJU0lCTEUnO1xuZXhwb3J0IHR5cGUgSXNJbnZpc2libGUgPSAnSVNfSU5WSVNJQkxFJztcblxudHlwZSBQYXR0ZXJuID0gT2Zmc2V0S2luZCB8IElzSW52aXNpYmxlIHwgTWF0Y2hBbnk7XG5cbmNsYXNzIFdoZW5MaXN0PE91dD4ge1xuICBfd2hlbnM6IFdoZW48T3V0PltdO1xuXG4gIGNvbnN0cnVjdG9yKHdoZW5zOiBXaGVuPE91dD5bXSkge1xuICAgIHRoaXMuX3doZW5zID0gd2hlbnM7XG4gIH1cblxuICBmaXJzdChraW5kOiBPZmZzZXRLaW5kKTogT3V0IHwgbnVsbCB7XG4gICAgZm9yIChsZXQgd2hlbiBvZiB0aGlzLl93aGVucykge1xuICAgICAgbGV0IHZhbHVlID0gd2hlbi5tYXRjaChraW5kKTtcbiAgICAgIGlmIChpc1ByZXNlbnQodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVswXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jbGFzcyBXaGVuPE91dD4ge1xuICBfbWFwOiBNYXA8UGF0dGVybiwgT3V0PiA9IG5ldyBNYXAoKTtcblxuICBnZXQocGF0dGVybjogUGF0dGVybiwgb3I6ICgpID0+IE91dCk6IE91dCB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5fbWFwLmdldChwYXR0ZXJuKTtcblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHZhbHVlID0gb3IoKTtcblxuICAgIHRoaXMuX21hcC5zZXQocGF0dGVybiwgdmFsdWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgYWRkKHBhdHRlcm46IFBhdHRlcm4sIG91dDogT3V0KTogdm9pZCB7XG4gICAgdGhpcy5fbWFwLnNldChwYXR0ZXJuLCBvdXQpO1xuICB9XG5cbiAgbWF0Y2goa2luZDogT2Zmc2V0S2luZCk6IE91dFtdIHtcbiAgICBsZXQgcGF0dGVybiA9IHBhdHRlcm5Gb3Ioa2luZCk7XG5cbiAgICBsZXQgb3V0OiBPdXRbXSA9IFtdO1xuXG4gICAgbGV0IGV4YWN0ID0gdGhpcy5fbWFwLmdldChwYXR0ZXJuKTtcbiAgICBsZXQgZmFsbGJhY2sgPSB0aGlzLl9tYXAuZ2V0KE1hdGNoQW55KTtcblxuICAgIGlmIChleGFjdCkge1xuICAgICAgb3V0LnB1c2goZXhhY3QpO1xuICAgIH1cblxuICAgIGlmIChmYWxsYmFjaykge1xuICAgICAgb3V0LnB1c2goZmFsbGJhY2spO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn1cblxudHlwZSBFeGhhdXN0aXZlQ2hlY2s8T3V0LCBJbiBleHRlbmRzIE1hdGNoZXMsIFJlbW92ZWQgZXh0ZW5kcyBNYXRjaGVzPiA9IEV4Y2x1ZGU8XG4gIEluLFxuICBSZW1vdmVkXG4+IGV4dGVuZHMgbmV2ZXJcbiAgPyBFeGhhdXN0aXZlTWF0Y2hlcjxPdXQ+XG4gIDogTWF0Y2hlcjxPdXQsIEV4Y2x1ZGU8SW4sIFJlbW92ZWQ+PjtcblxuZXhwb3J0IHR5cGUgTWF0Y2hGbjxPdXQ+ID0gKGxlZnQ6IFBvc2l0aW9uRGF0YSwgcmlnaHQ6IFBvc2l0aW9uRGF0YSkgPT4gT3V0O1xuXG5pbnRlcmZhY2UgRXhoYXVzdGl2ZU1hdGNoZXI8T3V0PiB7XG4gIGNoZWNrKCk6IE1hdGNoRm48T3V0Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoPE91dD4oY2FsbGJhY2s6IChtOiBNYXRjaGVyPE91dD4pID0+IEV4aGF1c3RpdmVNYXRjaGVyPE91dD4pOiBNYXRjaEZuPE91dD4ge1xuICByZXR1cm4gY2FsbGJhY2sobmV3IE1hdGNoZXIoKSkuY2hlY2soKTtcbn1cblxuY2xhc3MgTWF0Y2hlcjxPdXQsIE0gZXh0ZW5kcyBNYXRjaGVzID0gTWF0Y2hlcz4ge1xuICBfd2hlbnM6IFdoZW48V2hlbjwobGVmdDogUG9zaXRpb25EYXRhLCByaWdodDogUG9zaXRpb25EYXRhKSA9PiBPdXQ+PiA9IG5ldyBXaGVuKCk7XG5cbiAgLyoqXG4gICAqIFlvdSBkaWRuJ3QgZXhoYXVzdGl2ZWx5IG1hdGNoIGFsbCBwb3NzaWJpbGl0aWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNoZWNrKCk6IE1hdGNoRm48T3V0PiB7XG4gICAgcmV0dXJuIChsZWZ0LCByaWdodCkgPT4gdGhpcy5tYXRjaEZvcihsZWZ0LmtpbmQsIHJpZ2h0LmtpbmQpKGxlZnQsIHJpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgbWF0Y2hGb3IoXG4gICAgbGVmdDogT2Zmc2V0S2luZCxcbiAgICByaWdodDogT2Zmc2V0S2luZFxuICApOiAobGVmdDogUG9zaXRpb25EYXRhLCByaWdodDogUG9zaXRpb25EYXRhKSA9PiBPdXQge1xuICAgIGxldCBuZXN0ZWRzID0gdGhpcy5fd2hlbnMubWF0Y2gobGVmdCk7XG5cbiAgICBhc3NlcnQoXG4gICAgICBpc1ByZXNlbnQobmVzdGVkcyksXG4gICAgICBgbm8gbWF0Y2ggZGVmaW5lZCBmb3IgKCR7bGVmdH0sICR7cmlnaHR9KSBhbmQgbm8gQW55TWF0Y2ggZGVmaW5lZCBlaXRoZXJgXG4gICAgKTtcblxuICAgIGxldCBjYWxsYmFjayA9IG5ldyBXaGVuTGlzdChuZXN0ZWRzKS5maXJzdChyaWdodCk7XG5cbiAgICBhc3NlcnQoXG4gICAgICBjYWxsYmFjayAhPT0gbnVsbCxcbiAgICAgIGBubyBtYXRjaCBkZWZpbmVkIGZvciAoJHtsZWZ0fSwgJHtyaWdodH0pIGFuZCBubyBBbnlNYXRjaCBkZWZpbmVkIGVpdGhlcmBcbiAgICApO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrO1xuICB9XG5cbiAgLy8gVGhpcyBiaWcgYmxvY2sgaXMgdGhlIGJ1bGsgb2YgdGhlIGhlYXZ5IGxpZnRpbmcgaW4gdGhpcyBmaWxlLiBJdCBmYWNpbGl0YXRlcyBleGhhdXN0aXZlbmVzc1xuICAvLyBjaGVja2luZyBzbyB0aGF0IG1hdGNoZXJzIGNhbiBlbnN1cmUgdGhleSd2ZSBhY3R1YWxseSBjb3ZlcmVkIGFsbCB0aGUgY2FzZXMgKGFuZCBUeXBlU2NyaXB0XG4gIC8vIHdpbGwgdHJlYXQgaXQgYXMgYW4gZXhoYXVzdGl2ZSBtYXRjaCkuXG4gIHdoZW4oXG4gICAgbGVmdDogT2Zmc2V0S2luZC5DaGFyUG9zaXRpb24sXG4gICAgcmlnaHQ6IE9mZnNldEtpbmQuSGJzUG9zaXRpb24sXG4gICAgY2FsbGJhY2s6IChsZWZ0OiBDaGFyUG9zaXRpb24sIHJpZ2h0OiBIYnNQb3NpdGlvbikgPT4gT3V0XG4gICk6IEV4aGF1c3RpdmVDaGVjazxPdXQsIE0sICdDaGFyLEhicyc+O1xuICB3aGVuKFxuICAgIGxlZnQ6IE9mZnNldEtpbmQuSGJzUG9zaXRpb24sXG4gICAgcmlnaHQ6IE9mZnNldEtpbmQuQ2hhclBvc2l0aW9uLFxuICAgIGNhbGxiYWNrOiAobGVmdDogSGJzUG9zaXRpb24sIHJpZ2h0OiBDaGFyUG9zaXRpb24pID0+IE91dFxuICApOiBFeGhhdXN0aXZlQ2hlY2s8T3V0LCBNLCAnSGJzLENoYXInPjtcbiAgd2hlbihcbiAgICBsZWZ0OiBPZmZzZXRLaW5kLkhic1Bvc2l0aW9uLFxuICAgIHJpZ2h0OiBPZmZzZXRLaW5kLkhic1Bvc2l0aW9uLFxuICAgIGNhbGxiYWNrOiAobGVmdDogSGJzUG9zaXRpb24sIHJpZ2h0OiBIYnNQb3NpdGlvbikgPT4gT3V0XG4gICk6IEV4aGF1c3RpdmVDaGVjazxPdXQsIE0sICdIYnMsSGJzJz47XG4gIHdoZW4oXG4gICAgbGVmdDogT2Zmc2V0S2luZC5DaGFyUG9zaXRpb24sXG4gICAgcmlnaHQ6IE9mZnNldEtpbmQuQ2hhclBvc2l0aW9uLFxuICAgIGNhbGxiYWNrOiAobGVmdDogQ2hhclBvc2l0aW9uLCByaWdodDogQ2hhclBvc2l0aW9uKSA9PiBPdXRcbiAgKTogRXhoYXVzdGl2ZUNoZWNrPE91dCwgTSwgJ0NoYXIsQ2hhcic+O1xuICB3aGVuKFxuICAgIGxlZnQ6IElzSW52aXNpYmxlLFxuICAgIHJpZ2h0OiBNYXRjaEFueSxcbiAgICBjYWxsYmFjazogKGxlZnQ6IEludmlzaWJsZVBvc2l0aW9uLCByaWdodDogUG9zaXRpb25EYXRhKSA9PiBPdXRcbiAgKTogTWF0Y2hlcjxPdXQsIEV4Y2x1ZGU8TSwgJ0ludmlzaWJsZSxBbnknPj47XG4gIHdoZW4oXG4gICAgbGVmdDogTWF0Y2hBbnksXG4gICAgcmlnaHQ6IElzSW52aXNpYmxlLFxuICAgIGNhbGxiYWNrOiAobGVmdDogUG9zaXRpb25EYXRhLCByaWdodDogSW52aXNpYmxlUG9zaXRpb24pID0+IE91dFxuICApOiBFeGhhdXN0aXZlQ2hlY2s8T3V0LCBNLCAnQW55LEludmlzaWJsZSc+O1xuICB3aGVuKFxuICAgIGxlZnQ6IE1hdGNoQW55LFxuICAgIHJpZ2h0OiBNYXRjaEFueSxcbiAgICBjYWxsYmFjazogKGxlZnQ6IFBvc2l0aW9uRGF0YSwgcmlnaHQ6IFBvc2l0aW9uRGF0YSkgPT4gT3V0XG4gICk6IEV4aGF1c3RpdmVNYXRjaGVyPE91dD47XG4gIHdoZW4oXG4gICAgbGVmdDogUGF0dGVybixcbiAgICByaWdodDogUGF0dGVybixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNhbGxiYWNrOiAobGVmdDogYW55LCByaWdodDogYW55KSA9PiBPdXRcbiAgKTogTWF0Y2hlcjxPdXQsIE1hdGNoZXM+IHwgRXhoYXVzdGl2ZU1hdGNoZXI8T3V0PiB7XG4gICAgdGhpcy5fd2hlbnMuZ2V0KGxlZnQsICgpID0+IG5ldyBXaGVuKCkpLmFkZChyaWdodCwgY2FsbGJhY2spO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGF0dGVybkZvcihraW5kOiBPZmZzZXRLaW5kKTogUGF0dGVybiB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgT2Zmc2V0S2luZC5Ccm9rZW46XG4gICAgY2FzZSBPZmZzZXRLaW5kLkludGVybmFsc1N5bnRoZXRpYzpcbiAgICBjYXNlIE9mZnNldEtpbmQuTm9uRXhpc3RlbnQ6XG4gICAgICByZXR1cm4gSXNJbnZpc2libGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBraW5kO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9