@light0x00/parser-generator
Version:
A Parser Generator
266 lines (186 loc) • 22.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.GrammarError = exports.ActionGrammar = exports.SimpleGrammar = exports.Production = exports.NonTerminal = void 0;
var _shim = require("@light0x00/shim");
var _parserDefinition = require("@light0x00/parser-definition");
var _lodash = _interopRequireDefault(require("lodash"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
class NonTerminal extends Array {
constructor(name, prods = []) {
super(...prods);
_defineProperty(this, "name", void 0);
this.name = name;
}
get prods() {
return this;
}
set prods(prods) {
this.push(...prods);
}
toString() {
return this.name;
}
addProd(id, body) {
let prod = new Production(id, this, body);
this.prods.push(prod);
return prod;
}
}
exports.NonTerminal = NonTerminal;
class Production extends Array {
constructor(id, non_terminal, body, makeAST = Production.DefaultMakeAST, precedence = 0, leftAssociation = false) {
super(...body);
_defineProperty(this, "id", void 0);
_defineProperty(this, "name", void 0);
_defineProperty(this, "nonTerminal", void 0);
_defineProperty(this, "makeAST", void 0);
_defineProperty(this, "_precedence", void 0);
_defineProperty(this, "_leftAssociation", void 0);
this.id = id;
this.nonTerminal = non_terminal;
this.name = non_terminal.name;
this._precedence = precedence;
this._leftAssociation = leftAssociation;
this.makeAST = makeAST;
}
get leftAssoc() {
return this._leftAssociation;
}
get prec() {
return this._precedence;
}
/* 是否为空推导 形如 A->𝝴 */
isEpsilon() {
return this.length == 1 && this[0] == _parserDefinition.NIL;
}
toString() {
return `(${this.id}) ${this.name}->${this.join("")}`;
}
}
exports.Production = Production;
_defineProperty(Production, "DefaultMakeAST", () => {
throw new Error("No action is provided");
});
class SimpleGrammar {
constructor(rawGrammar) {
_defineProperty(this, "prodIdCounter", 0);
_defineProperty(this, "non_terminals", []);
_defineProperty(this, "productions", []);
_defineProperty(this, "prodMap", new Map());
this.construct(rawGrammar);
}
beforeConstruct(rawGrammar) {
(0, _shim.assert)(rawGrammar.length > 0);
}
construct(rawGrammar) {
this.beforeConstruct(rawGrammar); //每一个非终结符
for (let x of rawGrammar) {
(0, _shim.assert)(x.length > 1 && x[0] instanceof NonTerminal);
let nt = x[0];
this.non_terminals.push(x[0]); //非终结符的每一个产生式
for (let i = 1; i < x.length; i++) {
(0, _shim.assert)(x[i] instanceof Array);
let prod = new Production(this.prodIdCounter++, nt, x[i]);
nt.prods.push(prod);
this.prodMap.set(prod.id, prod);
this.productions.push(prod);
}
}
this.afterConstruct();
}
afterConstruct() {//Implement in subclasses
}
toString() {
return this.productions.join("\n");
}
NTS() {
return this.non_terminals;
}
Prods() {
if (this.productions == null) this.productions = Array.from(this.prodMap.values());
return this.productions;
} //start symbol
startNT() {
return this.non_terminals[0];
}
}
/* production with semantic action */
exports.SimpleGrammar = SimpleGrammar;
class ActionGrammar {
constructor(rawGrammar, traits = new Map()) {
_defineProperty(this, "prodIdCounter", 0);
_defineProperty(this, "nonTerminals", []);
_defineProperty(this, "productions", []);
_defineProperty(this, "productionsMap", new Map());
_defineProperty(this, "traits", void 0);
this.traits = traits;
this.construct(rawGrammar);
}
beforeConstruct(rawGrammar) {
(0, _shim.assert)(rawGrammar.length > 0);
}
construct(rawGrammar) {
this.beforeConstruct(rawGrammar); //for each non-terminal
for (let x of rawGrammar) {
(0, _shim.assert)(x.length > 1 && x[0] instanceof NonTerminal); //The first one must be NonTerminal
let nonTerminal = x[0];
this.nonTerminals.push(nonTerminal); //The last one could be ASTMaker
let hasDefault = _lodash.default.isFunction(x[x.length - 1]); //for each production in non-terminal
for (let i = 1; i < (hasDefault ? x.length - 1 : x.length); i++) {
let rawProd = x[i];
(0, _shim.assert)(x[i] != null && rawProd.body != null);
let {
body,
action
} = rawProd; //动作
if (action == null && hasDefault) action = x[x.length - 1]; //优先级、结合方向
let {
prec,
leftAssoc
} = this.determineProdTrait(body);
let prod = new Production(this.prodIdCounter++, nonTerminal, body, action, prec, leftAssoc);
nonTerminal.prods.push(prod);
this.productionsMap.set(prod.id, prod);
this.productions.push(prod);
}
}
this.afterConstruct();
}
determineProdTrait(prodBody) {
let maxTrait = {
prec: -1,
leftAssoc: false
};
for (let sym of prodBody) {
if (this.traits.has(sym)) {
let curTrait = this.traits.get(sym);
if (curTrait.prec >= maxTrait.prec) {
maxTrait = curTrait;
}
}
}
return maxTrait;
}
afterConstruct() {//Implement in subclasses
}
toString() {
return this.productions.join("\n");
}
NTS() {
return this.nonTerminals;
}
Prods() {
if (this.productions == null) this.productions = Array.from(this.productionsMap.values());
return this.productions;
} //start symbol
startNT() {
return this.nonTerminals[0];
}
}
exports.ActionGrammar = ActionGrammar;
class GrammarError extends Error {}
exports.GrammarError = GrammarError;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9EZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbIk5vblRlcm1pbmFsIiwiQXJyYXkiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJwcm9kcyIsInB1c2giLCJ0b1N0cmluZyIsImFkZFByb2QiLCJpZCIsImJvZHkiLCJwcm9kIiwiUHJvZHVjdGlvbiIsIm5vbl90ZXJtaW5hbCIsIm1ha2VBU1QiLCJEZWZhdWx0TWFrZUFTVCIsInByZWNlZGVuY2UiLCJsZWZ0QXNzb2NpYXRpb24iLCJub25UZXJtaW5hbCIsIl9wcmVjZWRlbmNlIiwiX2xlZnRBc3NvY2lhdGlvbiIsImxlZnRBc3NvYyIsInByZWMiLCJpc0Vwc2lsb24iLCJsZW5ndGgiLCJOSUwiLCJqb2luIiwiRXJyb3IiLCJTaW1wbGVHcmFtbWFyIiwicmF3R3JhbW1hciIsIk1hcCIsImNvbnN0cnVjdCIsImJlZm9yZUNvbnN0cnVjdCIsIngiLCJudCIsIm5vbl90ZXJtaW5hbHMiLCJpIiwicHJvZElkQ291bnRlciIsInByb2RNYXAiLCJzZXQiLCJwcm9kdWN0aW9ucyIsImFmdGVyQ29uc3RydWN0IiwiTlRTIiwiUHJvZHMiLCJmcm9tIiwidmFsdWVzIiwic3RhcnROVCIsIkFjdGlvbkdyYW1tYXIiLCJ0cmFpdHMiLCJub25UZXJtaW5hbHMiLCJoYXNEZWZhdWx0IiwiXyIsImlzRnVuY3Rpb24iLCJyYXdQcm9kIiwiYWN0aW9uIiwiZGV0ZXJtaW5lUHJvZFRyYWl0IiwicHJvZHVjdGlvbnNNYXAiLCJwcm9kQm9keSIsIm1heFRyYWl0Iiwic3ltIiwiaGFzIiwiY3VyVHJhaXQiLCJnZXQiLCJHcmFtbWFyRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7O0FBS08sTUFBTUEsV0FBTixTQUEwQkMsS0FBMUIsQ0FBNEM7QUFFbERDLEVBQUFBLFdBQVcsQ0FBQ0MsSUFBRCxFQUFlQyxLQUFtQixHQUFHLEVBQXJDLEVBQXlDO0FBQ25ELFVBQU0sR0FBR0EsS0FBVDs7QUFE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LENBQVljLEdBQVosQ0FBZ0JILEdBQWhCLENBQWY7O0FBQ0EsWUFBSUUsUUFBUSxDQUFDdkMsSUFBVCxJQUFpQm9DLFFBQVEsQ0FBQ3BDLElBQTlCLEVBQW9DO0FBQ25Db0MsVUFBQUEsUUFBUSxHQUFHRyxRQUFYO0FBQ0E7QUFDRDtBQUNEOztBQUNELFdBQU9ILFFBQVA7QUFDQTs7QUFFU2pCLEVBQUFBLGNBQVYsR0FBMkIsQ0FDMUI7QUFDQTs7QUFDRGxDLEVBQUFBLFFBQVEsR0FBRztBQUNWLFdBQU8sS0FBS2lDLFdBQUwsQ0FBaUJkLElBQWpCLENBQXNCLElBQXRCLENBQVA7QUFDQTs7QUFDRGdCLEVBQUFBLEdBQUcsR0FBRztBQUNMLFdBQU8sS0FBS08sWUFBWjtBQUNBOztBQUNETixFQUFBQSxLQUFLLEdBQUc7QUFDUCxRQUFJLEtBQUtILFdBQUwsSUFBb0IsSUFBeEIsRUFDQyxLQUFLQSxXQUFMLEdBQW1CdEMsS0FBSyxDQUFDMEMsSUFBTixDQUFXLEtBQUtZLGNBQUwsQ0FBb0JYLE1BQXBCLEVBQVgsQ0FBbkI7QUFDRCxXQUFPLEtBQUtMLFdBQVo7QUFDQSxHQXBFNkMsQ0FxRTlDOzs7QUFDQU0sRUFBQUEsT0FBTyxHQUFHO0FBQ1QsV0FBTyxLQUFLRyxZQUFMLENBQWtCLENBQWxCLENBQVA7QUFDQTs7QUF4RTZDOzs7O0FBMkV4QyxNQUFNYyxZQUFOLFNBQTJCcEMsS0FBM0IsQ0FBaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3NlcnQgfSBmcm9tIFwiQGxpZ2h0MHgwMC9zaGltXCI7XG5pbXBvcnQgeyBBU1RNYWtlciwgTklMLCBJTGV4ZXIgfSBmcm9tIFwiQGxpZ2h0MHgwMC9wYXJzZXItZGVmaW5pdGlvblwiO1xuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xuXG4vLyBleHBvcnQgdHlwZSBUZXJtaW5hbCA9IHN0cmluZyB8IFRhZyB8IElUb2tlbjtcbmV4cG9ydCB0eXBlIFRlcm1pbmFsID0gT2JqZWN0O1xuZXhwb3J0IHR5cGUgU3ltYm9sID0gTm9uVGVybWluYWwgfCBUZXJtaW5hbDtcbmV4cG9ydCBjbGFzcyBOb25UZXJtaW5hbCBleHRlbmRzIEFycmF5PFByb2R1Y3Rpb24+IHtcblx0bmFtZTogc3RyaW5nO1xuXHRjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHByb2RzOiBQcm9kdWN0aW9uW10gPSBbXSkge1xuXHRcdHN1cGVyKC4uLnByb2RzKTtcblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHR9XG5cdGdldCBwcm9kcygpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXHRzZXQgcHJvZHMocHJvZHM6IFByb2R1Y3Rpb25bXSkge1xuXHRcdHRoaXMucHVzaCguLi5wcm9kcyk7XG5cdH1cblx0dG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMubmFtZTtcblx0fVxuXHRhZGRQcm9kKGlkOiBudW1iZXIsIGJvZHk6IFN5bWJvbFtdKSB7XG5cdFx0bGV0IHByb2QgPSBuZXcgUHJvZHVjdGlvbihpZCwgdGhpcywgYm9keSk7XG5cdFx0dGhpcy5wcm9kcy5wdXNoKHByb2QpO1xuXHRcdHJldHVybiBwcm9kO1xuXHR9XG59XG5leHBvcnQgY2xhc3MgUHJvZHVjdGlvbiBleHRlbmRzIEFycmF5PFN5bWJvbD4ge1xuXHRpZDogbnVtYmVyO1xuXHRuYW1lOiBzdHJpbmc7XG5cdG5vblRlcm1pbmFsOiBOb25UZXJtaW5hbDtcblx0bWFrZUFTVDogQVNUTWFrZXI7XG5cdHByaXZhdGUgX3ByZWNlZGVuY2U6IG51bWJlcjtcblx0cHJpdmF0ZSBfbGVmdEFzc29jaWF0aW9uOiBib29sZWFuO1xuXHRzdGF0aWMgRGVmYXVsdE1ha2VBU1QgPSAoKSA9PiB7IHRocm93IG5ldyBFcnJvcihcIk5vIGFjdGlvbiBpcyBwcm92aWRlZFwiKTsgfTtcblx0Y29uc3RydWN0b3IoaWQ6IG51bWJlciwgbm9uX3Rlcm1pbmFsOiBOb25UZXJtaW5hbCwgYm9keTogU3ltYm9sW10sIG1ha2VBU1Q6IEFTVE1ha2VyID0gUHJvZHVjdGlvbi5EZWZhdWx0TWFrZUFTVCwgcHJlY2VkZW5jZTogbnVtYmVyID0gMCwgbGVmdEFzc29jaWF0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcblx0XHRzdXBlciguLi5ib2R5KTtcblx0XHR0aGlzLmlkID0gaWQ7XG5cdFx0dGhpcy5ub25UZXJtaW5hbCA9IG5vbl90ZXJtaW5hbDtcblx0XHR0aGlzLm5hbWUgPSBub25fdGVybWluYWwubmFtZTtcblx0XHR0aGlzLl9wcmVjZWRlbmNlID0gcHJlY2VkZW5jZTtcblx0XHR0aGlzLl9sZWZ0QXNzb2NpYXRpb24gPSBsZWZ0QXNzb2NpYXRpb247XG5cdFx0dGhpcy5tYWtlQVNUID0gbWFrZUFTVDtcblx0fVxuXG5cdGdldCBsZWZ0QXNzb2MoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2xlZnRBc3NvY2lhdGlvbjtcblx0fVxuXG5cdGdldCBwcmVjKCkge1xuXHRcdHJldHVybiB0aGlzLl9wcmVjZWRlbmNlO1xuXHR9XG5cblx0Lyog5piv5ZCm5Li656m65o6o5a+8IOW9ouWmgiBBLT7wnZ20ICovXG5cdGlzRXBzaWxvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5sZW5ndGggPT0gMSAmJiB0aGlzWzBdID09IE5JTDtcblx0fVxuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gYCgke3RoaXMuaWR9KSAke3RoaXMubmFtZX0tPiR7dGhpcy5qb2luKFwiXCIpfWA7XG5cdH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcnNlciB7XG5cdHBhcnNlKGxleGVyOiBJTGV4ZXIpOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJR3JhbW1hciB7XG5cdE5UUygpOiBOb25UZXJtaW5hbFtdO1xuXHRQcm9kcygpOiBQcm9kdWN0aW9uW107XG5cdHN0YXJ0TlQoKTogTm9uVGVybWluYWw7XG59XG4vKiDnlKjkuo7mtYvor5XliIbmnpDooagg5peg5rOV55So5LqO55Sf5oiQ6K+t5rOV5qCRICghIeS4i+S4gOasoei/reS7o+W5suaOiSkqL1xuZXhwb3J0IHR5cGUgUmF3U2ltcGxlR3JhbW1hciA9IEFycmF5PEFycmF5PE5vblRlcm1pbmFsIHwgU3ltYm9sW10+PjtcbmV4cG9ydCBjbGFzcyBTaW1wbGVHcmFtbWFyIGltcGxlbWVudHMgSUdyYW1tYXIge1xuXHRwcm90ZWN0ZWQgcHJvZElkQ291bnRlciA9IDA7XG5cdHByb3RlY3RlZCBub25fdGVybWluYWxzOiBOb25UZXJtaW5hbFtdID0gW107XG5cdHByb3RlY3RlZCBwcm9kdWN0aW9uczogUHJvZHVjdGlvbltdID0gW107XG5cdHByb3RlY3RlZCBwcm9kTWFwID0gbmV3IE1hcDxudW1iZXIsIFByb2R1Y3Rpb24+KCk7XG5cdGNvbnN0cnVjdG9yKHJhd0dyYW1tYXI6IFJhd1NpbXBsZUdyYW1tYXIpIHtcblx0XHR0aGlzLmNvbnN0cnVjdChyYXdHcmFtbWFyKTtcblx0fVxuXHRwcm90ZWN0ZWQgYmVmb3JlQ29uc3RydWN0KHJhd0dyYW1tYXI6IFJhd1NpbXBsZUdyYW1tYXIpIHtcblx0XHRhc3NlcnQocmF3R3JhbW1hci5sZW5ndGggPiAwKTtcblx0fVxuXHRwcm90ZWN0ZWQgY29uc3RydWN0KHJhd0dyYW1tYXI6IFJhd1NpbXBsZUdyYW1tYXIpIHtcblx0XHR0aGlzLmJlZm9yZUNvbnN0cnVjdChyYXdHcmFtbWFyKTtcblx0XHQvL+avj+S4gOS4qumdnue7iOe7k+esplxuXHRcdGZvciAobGV0IHggb2YgcmF3R3JhbW1hcikge1xuXHRcdFx0YXNzZXJ0KHgubGVuZ3RoID4gMSAmJiB4WzBdIGluc3RhbmNlb2YgTm9uVGVybWluYWwpO1xuXHRcdFx0bGV0IG50ID0geFswXTtcblx0XHRcdHRoaXMubm9uX3Rlcm1pbmFscy5wdXNoKHhbMF0pO1xuXHRcdFx0Ly/pnZ7nu4jnu5PnrKbnmoTmr4/kuIDkuKrkuqfnlJ/lvI9cblx0XHRcdGZvciAobGV0IGkgPSAxOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRhc3NlcnQoeFtpXSBpbnN0YW5jZW9mIEFycmF5KTtcblx0XHRcdFx0bGV0IHByb2QgPSBuZXcgUHJvZHVjdGlvbih0aGlzLnByb2RJZENvdW50ZXIrKywgbnQsIHhbaV0gYXMgU3ltYm9sW10pO1xuXHRcdFx0XHRudC5wcm9kcy5wdXNoKHByb2QpO1xuXHRcdFx0XHR0aGlzLnByb2RNYXAuc2V0KHByb2QuaWQsIHByb2QpO1xuXHRcdFx0XHR0aGlzLnByb2R1Y3Rpb25zLnB1c2gocHJvZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuYWZ0ZXJDb25zdHJ1Y3QoKTtcblx0fVxuXHRwcm90ZWN0ZWQgYWZ0ZXJDb25zdHJ1Y3QoKSB7XG5cdFx0Ly9JbXBsZW1lbnQgaW4gc3ViY2xhc3Nlc1xuXHR9XG5cdHRvU3RyaW5nKCkge1xuXHRcdHJldHVybiB0aGlzLnByb2R1Y3Rpb25zLmpvaW4oXCJcXG5cIik7XG5cdH1cblx0TlRTKCkge1xuXHRcdHJldHVybiB0aGlzLm5vbl90ZXJtaW5hbHM7XG5cdH1cblx0UHJvZHMoKSB7XG5cdFx0aWYgKHRoaXMucHJvZHVjdGlvbnMgPT0gbnVsbClcblx0XHRcdHRoaXMucHJvZHVjdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMucHJvZE1hcC52YWx1ZXMoKSk7XG5cdFx0cmV0dXJuIHRoaXMucHJvZHVjdGlvbnM7XG5cdH1cblx0Ly9zdGFydCBzeW1ib2xcblx0c3RhcnROVCgpIHtcblx0XHRyZXR1cm4gdGhpcy5ub25fdGVybWluYWxzWzBdO1xuXHR9XG59XG4vKiBwcm9kdWN0aW9uIHdpdGggc2VtYW50aWMgYWN0aW9uICovXG5leHBvcnQgdHlwZSBSYXdQcm9kdWN0aW9uID0ge1xuXHRhY3Rpb24/OiBBU1RNYWtlcjtcblx0Ym9keTogU3ltYm9sW107XG59O1xuXG5leHBvcnQgdHlwZSBUZXJtaW5hbFRyYWl0ID0geyBwcmVjOiBudW1iZXIsIGxlZnRBc3NvYzogYm9vbGVhbiB9XG5leHBvcnQgdHlwZSBUcmFpdHNUYWJsZSA9IE1hcDxUZXJtaW5hbCwgVGVybWluYWxUcmFpdD5cblxuZXhwb3J0IHR5cGUgUmF3QWN0aW9uR3JhbW1hciA9IEFycmF5PEFycmF5PE5vblRlcm1pbmFsIHwgUmF3UHJvZHVjdGlvbiB8IEFTVE1ha2VyPj47XG5leHBvcnQgY2xhc3MgQWN0aW9uR3JhbW1hciBpbXBsZW1lbnRzIElHcmFtbWFyIHtcblx0cHJvdGVjdGVkIHByb2RJZENvdW50ZXIgPSAwO1xuXHRwcm90ZWN0ZWQgbm9uVGVybWluYWxzOiBOb25UZXJtaW5hbFtdID0gW107XG5cdHByb3RlY3RlZCBwcm9kdWN0aW9uczogUHJvZHVjdGlvbltdID0gW107XG5cdHByb3RlY3RlZCBwcm9kdWN0aW9uc01hcCA9IG5ldyBNYXA8bnVtYmVyLCBQcm9kdWN0aW9uPigpO1xuXHRwcm90ZWN0ZWQgdHJhaXRzOiBUcmFpdHNUYWJsZTtcblx0Y29uc3RydWN0b3IocmF3R3JhbW1hcjogUmF3QWN0aW9uR3JhbW1hciwgdHJhaXRzOiBUcmFpdHNUYWJsZSA9IG5ldyBNYXA8VGVybWluYWwsIFRlcm1pbmFsVHJhaXQ+KCkpIHtcblx0XHR0aGlzLnRyYWl0cyA9IHRyYWl0cztcblx0XHR0aGlzLmNvbnN0cnVjdChyYXdHcmFtbWFyKTtcblx0fVxuXHRwcm90ZWN0ZWQgYmVmb3JlQ29uc3RydWN0KHJhd0dyYW1tYXI6IFJhd0FjdGlvbkdyYW1tYXIpIHtcblx0XHRhc3NlcnQocmF3R3JhbW1hci5sZW5ndGggPiAwKTtcblx0fVxuXHRwcm90ZWN0ZWQgY29uc3RydWN0KHJhd0dyYW1tYXI6IFJhd0FjdGlvbkdyYW1tYXIpIHtcblx0XHR0aGlzLmJlZm9yZUNvbnN0cnVjdChyYXdHcmFtbWFyKTtcblx0XHQvL2ZvciBlYWNoIG5vbi10ZXJtaW5hbFxuXHRcdGZvciAobGV0IHggb2YgcmF3R3JhbW1hcikge1xuXHRcdFx0YXNzZXJ0KHgubGVuZ3RoID4gMSAmJiB4WzBdIGluc3RhbmNlb2YgTm9uVGVybWluYWwpO1xuXHRcdFx0Ly9UaGUgZmlyc3Qgb25lIG11c3QgYmUgTm9uVGVybWluYWxcblx0XHRcdGxldCBub25UZXJtaW5hbCA9IHhbMF07XG5cdFx0XHR0aGlzLm5vblRlcm1pbmFscy5wdXNoKG5vblRlcm1pbmFsKTtcblx0XHRcdC8vVGhlIGxhc3Qgb25lIGNvdWxkIGJlIEFTVE1ha2VyXG5cdFx0XHRsZXQgaGFzRGVmYXVsdCA9IF8uaXNGdW5jdGlvbih4W3gubGVuZ3RoIC0gMV0pO1xuXHRcdFx0Ly9mb3IgZWFjaCBwcm9kdWN0aW9uIGluIG5vbi10ZXJtaW5hbFxuXHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCAoaGFzRGVmYXVsdCA/IHgubGVuZ3RoIC0gMSA6IHgubGVuZ3RoKTsgaSsrKSB7XG5cdFx0XHRcdGxldCByYXdQcm9kID0geFtpXSBhcyBSYXdQcm9kdWN0aW9uO1xuXHRcdFx0XHRhc3NlcnQoeFtpXSAhPSBudWxsICYmIHJhd1Byb2QuYm9keSAhPSBudWxsKTtcblx0XHRcdFx0bGV0IHsgYm9keSwgYWN0aW9uIH0gPSByYXdQcm9kO1xuXHRcdFx0XHQvL+WKqOS9nFxuXHRcdFx0XHRpZiAoYWN0aW9uID09IG51bGwgJiYgaGFzRGVmYXVsdClcblx0XHRcdFx0XHRhY3Rpb24gPSB4W3gubGVuZ3RoIC0gMV0gYXMgQVNUTWFrZXI7XG5cdFx0XHRcdC8v5LyY5YWI57qn44CB57uT5ZCI5pa55ZCRXG5cdFx0XHRcdGxldCB7IHByZWMsIGxlZnRBc3NvYyB9ID0gdGhpcy5kZXRlcm1pbmVQcm9kVHJhaXQoYm9keSk7XG5cdFx0XHRcdGxldCBwcm9kID0gbmV3IFByb2R1Y3Rpb24odGhpcy5wcm9kSWRDb3VudGVyKyssIG5vblRlcm1pbmFsLCBib2R5LCBhY3Rpb24sIHByZWMsIGxlZnRBc3NvYyk7XG5cdFx0XHRcdG5vblRlcm1pbmFsLnByb2RzLnB1c2gocHJvZCk7XG5cdFx0XHRcdHRoaXMucHJvZHVjdGlvbnNNYXAuc2V0KHByb2QuaWQsIHByb2QpO1xuXHRcdFx0XHR0aGlzLnByb2R1Y3Rpb25zLnB1c2gocHJvZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMuYWZ0ZXJDb25zdHJ1Y3QoKTtcblx0fVxuXG5cdHByaXZhdGUgZGV0ZXJtaW5lUHJvZFRyYWl0KHByb2RCb2R5OiBTeW1ib2xbXSk6IFRlcm1pbmFsVHJhaXQge1xuXHRcdGxldCBtYXhUcmFpdDogVGVybWluYWxUcmFpdCA9IHsgcHJlYzogLTEsIGxlZnRBc3NvYzogZmFsc2UgfTtcblx0XHRmb3IgKGxldCBzeW0gb2YgcHJvZEJvZHkpIHtcblx0XHRcdGlmICh0aGlzLnRyYWl0cy5oYXMoc3ltKSkge1xuXHRcdFx0XHRsZXQgY3VyVHJhaXQgPSB0aGlzLnRyYWl0cy5nZXQoc3ltKSE7XG5cdFx0XHRcdGlmIChjdXJUcmFpdC5wcmVjID49IG1heFRyYWl0LnByZWMpIHtcblx0XHRcdFx0XHRtYXhUcmFpdCA9IGN1clRyYWl0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBtYXhUcmFpdDtcblx0fVxuXG5cdHByb3RlY3RlZCBhZnRlckNvbnN0cnVjdCgpIHtcblx0XHQvL0ltcGxlbWVudCBpbiBzdWJjbGFzc2VzXG5cdH1cblx0dG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJvZHVjdGlvbnMuam9pbihcIlxcblwiKTtcblx0fVxuXHROVFMoKSB7XG5cdFx0cmV0dXJuIHRoaXMubm9uVGVybWluYWxzO1xuXHR9XG5cdFByb2RzKCkge1xuXHRcdGlmICh0aGlzLnByb2R1Y3Rpb25zID09IG51bGwpXG5cdFx0XHR0aGlzLnByb2R1Y3Rpb25zID0gQXJyYXkuZnJvbSh0aGlzLnByb2R1Y3Rpb25zTWFwLnZhbHVlcygpKTtcblx0XHRyZXR1cm4gdGhpcy5wcm9kdWN0aW9ucztcblx0fVxuXHQvL3N0YXJ0IHN5bWJvbFxuXHRzdGFydE5UKCkge1xuXHRcdHJldHVybiB0aGlzLm5vblRlcm1pbmFsc1swXTtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgR3JhbW1hckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXG59Il19