@firestone-hs/replay-parser
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.
112 lines • 18 kB
JavaScript
import { Injectable } from '@angular/core';
import { GameTag, Mulligan, Step } from '@firestone-hs/reference-data';
import { ActionTurn } from '../../models/game/action-turn';
import { Game } from '../../models/game/game';
import { GameEntity } from '../../models/game/game-entity';
import { MulliganTurn } from '../../models/game/mulligan-turn';
import { TagChangeHistoryItem } from '../../models/history/tag-change-history-item';
import { PlayerHistoryItem } from '../../models/models';
import * as i0 from "@angular/core";
export class TurnParserService {
constructor() { }
createTurns(game, history) {
let turns = game.turns;
let turnNumber = turns.size;
// // console.log('last history item', history[history.length - 1]);
for (const item of history) {
if (turnNumber === 0 && this.isMulligan(item, game)) {
// // console.log('adding mulligan turn', item);
const mulliganTurn = this.parseMulliganTurn(item, turns);
turns = turns.set(0, mulliganTurn);
turnNumber++;
}
else if (turnNumber === 0 && this.isMulliganDone(item, game)) {
// The proper mulligan input could not be parsed
// console.warn('Could not detect mulligan input, creating mulligan turn');
const mulliganTurn = this.parseMulliganTurn(item, turns);
turns = turns.set(0, mulliganTurn);
turnNumber++;
}
else if (this.isStartOfTurn(item, game)) {
// // console.log('adding new turn', turnNumber);
// Used for instance in Bob's encounters
if (!turns.has(0)) {
// // console.log('creating fake mulligan turn', turns, turns.toJS());
const mulliganTurn = this.parseMulliganTurn(item, turns);
turns = turns.set(0, mulliganTurn);
turnNumber++;
}
const turn = this.parseTurn(turnNumber, item, turns);
turns = turns.set(turnNumber, turn);
turnNumber++;
}
}
// // console.log('created turns', turns.toJS());
return Game.createGame(game, { turns });
}
parseTurn(currentTurnNumber, item, turns) {
const itemIndex = item.tag.index;
// Turn 1 is mulligan in the log, while for us mulligan is turn 0
let turn = turns.get(currentTurnNumber, Object.assign(new ActionTurn(), {
turn: `${currentTurnNumber}`,
timestamp: item.timestamp,
index: itemIndex,
activePlayer: undefined,
actions: [],
}));
turn = Object.assign(new ActionTurn(), turn, {
index: Math.max(turn.index, itemIndex),
});
return turn;
}
parseMulliganTurn(item, turns) {
const itemIndex = item instanceof TagChangeHistoryItem ? item.tag.index : item.index;
let mulliganTurn = turns.get(0, Object.assign(new MulliganTurn(), {
turn: 'mulligan',
timestamp: item.timestamp,
index: itemIndex,
actions: [],
}));
mulliganTurn = Object.assign(new MulliganTurn(), mulliganTurn, {
index: Math.max(mulliganTurn.index, itemIndex),
});
return mulliganTurn;
}
isMulligan(item, game) {
return (item instanceof TagChangeHistoryItem &&
item.tag.tag === GameTag.MULLIGAN_STATE &&
item.tag.value === Mulligan.INPUT);
}
isMulliganDone(item, game) {
return ((item instanceof PlayerHistoryItem &&
item.entityDefintion.tags[GameTag[GameTag.MULLIGAN_STATE]] === Mulligan.DONE) ||
(item instanceof TagChangeHistoryItem &&
item.tag.tag === GameTag.MULLIGAN_STATE &&
item.tag.value === Mulligan.DONE));
}
isStartOfTurn(item, game) {
if (!(item instanceof TagChangeHistoryItem)) {
return false;
}
const startOfTurn = item.tag.tag === GameTag.STEP && item.tag.value === Step.MAIN_READY;
if (startOfTurn) {
// // console.log('start of turn, isGameEntity?', item.tag.entity, game.getLatestParsedState()?.toJS())
}
return this.isGameEntity(item.tag.entity, game) && startOfTurn;
}
// private isPlayerEntity(entityId: number, game: Game) {
// return game.entities.get(entityId) instanceof PlayerEntity;
// }
isGameEntity(entityId, game) {
return game.getLatestParsedState().get(entityId) instanceof GameEntity;
}
}
TurnParserService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TurnParserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
TurnParserService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TurnParserService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TurnParserService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVybi1wYXJzZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9nYW1lcGlwZWxpbmUvdHVybi1wYXJzZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFLeEQsTUFBTSxPQUFPLGlCQUFpQjtJQUM3QixnQkFBZSxDQUFDO0lBRVQsV0FBVyxDQUFDLElBQVUsRUFBRSxPQUErQjtRQUM3RCxJQUFJLEtBQUssR0FBc0IsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzVCLG9FQUFvRTtRQUNwRSxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sRUFBRTtZQUMzQixJQUFJLFVBQVUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BELGdEQUFnRDtnQkFDaEQsTUFBTSxZQUFZLEdBQWlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUE0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QUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN4RixJQUFJLFdBQVcsRUFBRTtZQUNoQix1R0FBdUc7U0FDdkc7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDO0lBQ2hFLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsK0RBQStEO0lBQy9ELElBQUk7SUFFSSxZQUFZLENBQUMsUUFBZ0IsRUFBRSxJQUFVO1FBQ2hELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLFVBQVUsQ0FBQztJQUN4RSxDQUFDOzs4R0E1R1csaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FGakIsTUFBTTsyRkFFTixpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBHYW1lVGFnLCBNdWxsaWdhbiwgU3RlcCB9IGZyb20gJ0BmaXJlc3RvbmUtaHMvcmVmZXJlbmNlLWRhdGEnO1xyXG5pbXBvcnQgeyBNYXAgfSBmcm9tICdpbW11dGFibGUnO1xyXG5pbXBvcnQgeyBBY3Rpb25UdXJuIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvYWN0aW9uLXR1cm4nO1xyXG5pbXBvcnQgeyBHYW1lIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvZ2FtZSc7XHJcbmltcG9ydCB7IEdhbWVFbnRpdHkgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS9nYW1lLWVudGl0eSc7XHJcbmltcG9ydCB7IE11bGxpZ2FuVHVybiB9IGZyb20gJy4uLy4uL21vZGVscy9nYW1lL211bGxpZ2FuLXR1cm4nO1xyXG5pbXBvcnQgeyBUdXJuIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvdHVybic7XHJcbmltcG9ydCB7IEhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hpc3RvcnkvaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS90YWctY2hhbmdlLWhpc3RvcnktaXRlbSc7XHJcbmltcG9ydCB7IFBsYXllckhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21vZGVscyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcblx0cHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHVyblBhcnNlclNlcnZpY2Uge1xyXG5cdGNvbnN0cnVjdG9yKCkge31cclxuXHJcblx0cHVibGljIGNyZWF0ZVR1cm5zKGdhbWU6IEdhbWUsIGhpc3Rvcnk6IHJlYWRvbmx5IEhpc3RvcnlJdGVtW10pOiBHYW1lIHtcclxuXHRcdGxldCB0dXJuczogTWFwPG51bWJlciwgVHVybj4gPSBnYW1lLnR1cm5zO1xyXG5cdFx0bGV0IHR1cm5OdW1iZXIgPSB0dXJucy5zaXplO1xyXG5cdFx0Ly8gLy8gY29uc29sZS5sb2coJ2xhc3QgaGlzdG9yeSBpdGVtJywgaGlzdG9yeVtoaXN0b3J5Lmxlbmd0aCAtIDFdKTtcclxuXHRcdGZvciAoY29uc3QgaXRlbSBvZiBoaXN0b3J5KSB7XHJcblx0XHRcdGlmICh0dXJuTnVtYmVyID09PSAwICYmIHRoaXMuaXNNdWxsaWdhbihpdGVtLCBnYW1lKSkge1xyXG5cdFx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdhZGRpbmcgbXVsbGlnYW4gdHVybicsIGl0ZW0pO1xyXG5cdFx0XHRcdGNvbnN0IG11bGxpZ2FuVHVybjogTXVsbGlnYW5UdXJuID0gdGhpcy5wYXJzZU11bGxpZ2FuVHVybihpdGVtIGFzIFRhZ0NoYW5nZUhpc3RvcnlJdGVtLCB0dXJucyk7XHJcblx0XHRcdFx0dHVybnMgPSB0dXJucy5zZXQoMCwgbXVsbGlnYW5UdXJuKTtcclxuXHRcdFx0XHR0dXJuTnVtYmVyKys7XHJcblx0XHRcdH0gZWxzZSBpZiAodHVybk51bWJlciA9PT0gMCAmJiB0aGlzLmlzTXVsbGlnYW5Eb25lKGl0ZW0sIGdhbWUpKSB7XHJcblx0XHRcdFx0Ly8gVGhlIHByb3BlciBtdWxsaWdhbiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkXHJcblx0XHRcdFx0Ly8gY29uc29sZS53YXJuKCdDb3VsZCBub3QgZGV0ZWN0IG11bGxpZ2FuIGlucHV0LCBjcmVhdGluZyBtdWxsaWdhbiB0dXJuJyk7XHJcblx0XHRcdFx0Y29uc3QgbXVsbGlnYW5UdXJuOiBNdWxsaWdhblR1cm4gPSB0aGlzLnBhcnNlTXVsbGlnYW5UdXJuKGl0ZW0gYXMgUGxheWVySGlzdG9yeUl0ZW0sIHR1cm5zKTtcclxuXHRcdFx0XHR0dXJucyA9IHR1cm5zLnNldCgwLCBtdWxsaWdhblR1cm4pO1xyXG5cdFx0XHRcdHR1cm5OdW1iZXIrKztcclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmlzU3RhcnRPZlR1cm4oaXRlbSwgZ2FtZSkpIHtcclxuXHRcdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnYWRkaW5nIG5ldyB0dXJuJywgdHVybk51bWJlcik7XHJcblx0XHRcdFx0Ly8gVXNlZCBmb3IgaW5zdGFuY2UgaW4gQm9iJ3MgZW5jb3VudGVyc1xyXG5cdFx0XHRcdGlmICghdHVybnMuaGFzKDApKSB7XHJcblx0XHRcdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnY3JlYXRpbmcgZmFrZSBtdWxsaWdhbiB0dXJuJywgdHVybnMsIHR1cm5zLnRvSlMoKSk7XHJcblx0XHRcdFx0XHRjb25zdCBtdWxsaWdhblR1cm46IE11bGxpZ2FuVHVybiA9IHRoaXMucGFyc2VNdWxsaWdhblR1cm4oaXRlbSBhcyBUYWdDaGFuZ2VIaXN0b3J5SXRlbSwgdHVybnMpO1xyXG5cdFx0XHRcdFx0dHVybnMgPSB0dXJucy5zZXQoMCwgbXVsbGlnYW5UdXJuKTtcclxuXHRcdFx0XHRcdHR1cm5OdW1iZXIrKztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgdHVybjogQWN0aW9uVHVybiA9IHRoaXMucGFyc2VUdXJuKHR1cm5OdW1iZXIsIGl0ZW0gYXMgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0sIHR1cm5zKTtcclxuXHRcdFx0XHR0dXJucyA9IHR1cm5zLnNldCh0dXJuTnVtYmVyLCB0dXJuKTtcclxuXHRcdFx0XHR0dXJuTnVtYmVyKys7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdC8vIC8vIGNvbnNvbGUubG9nKCdjcmVhdGVkIHR1cm5zJywgdHVybnMudG9KUygpKTtcclxuXHRcdHJldHVybiBHYW1lLmNyZWF0ZUdhbWUoZ2FtZSwgeyB0dXJucyB9IGFzIEdhbWUpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBwYXJzZVR1cm4oY3VycmVudFR1cm5OdW1iZXI6IG51bWJlciwgaXRlbTogVGFnQ2hhbmdlSGlzdG9yeUl0ZW0sIHR1cm5zOiBNYXA8bnVtYmVyLCBUdXJuPik6IEFjdGlvblR1cm4ge1xyXG5cdFx0Y29uc3QgaXRlbUluZGV4ID0gKGl0ZW0gYXMgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0pLnRhZy5pbmRleDtcclxuXHRcdC8vIFR1cm4gMSBpcyBtdWxsaWdhbiBpbiB0aGUgbG9nLCB3aGlsZSBmb3IgdXMgbXVsbGlnYW4gaXMgdHVybiAwXHJcblx0XHRsZXQgdHVybjogQWN0aW9uVHVybiA9IHR1cm5zLmdldChcclxuXHRcdFx0Y3VycmVudFR1cm5OdW1iZXIsXHJcblx0XHRcdE9iamVjdC5hc3NpZ24obmV3IEFjdGlvblR1cm4oKSwge1xyXG5cdFx0XHRcdHR1cm46IGAke2N1cnJlbnRUdXJuTnVtYmVyfWAsXHJcblx0XHRcdFx0dGltZXN0YW1wOiBpdGVtLnRpbWVzdGFtcCxcclxuXHRcdFx0XHRpbmRleDogaXRlbUluZGV4LFxyXG5cdFx0XHRcdGFjdGl2ZVBsYXllcjogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdGFjdGlvbnM6IFtdLFxyXG5cdFx0XHR9KSBhcyBBY3Rpb25UdXJuLFxyXG5cdFx0KSBhcyBBY3Rpb25UdXJuO1xyXG5cdFx0dHVybiA9IE9iamVjdC5hc3NpZ24obmV3IEFjdGlvblR1cm4oKSwgdHVybiwge1xyXG5cdFx0XHRpbmRleDogTWF0aC5tYXgodHVybi5pbmRleCwgaXRlbUluZGV4KSxcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHR1cm47XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHBhcnNlTXVsbGlnYW5UdXJuKGl0ZW06IFRhZ0NoYW5nZUhpc3RvcnlJdGVtIHwgUGxheWVySGlzdG9yeUl0ZW0sIHR1cm5zOiBNYXA8bnVtYmVyLCBUdXJuPik6IE11bGxpZ2FuVHVybiB7XHJcblx0XHRjb25zdCBpdGVtSW5kZXggPSBpdGVtIGluc3RhbmNlb2YgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gPyBpdGVtLnRhZy5pbmRleCA6IGl0ZW0uaW5kZXg7XHJcblx0XHRsZXQgbXVsbGlnYW5UdXJuOiBNdWxsaWdhblR1cm4gPSB0dXJucy5nZXQoXHJcblx0XHRcdDAsXHJcblx0XHRcdE9iamVjdC5hc3NpZ24obmV3IE11bGxpZ2FuVHVybigpLCB7XHJcblx0XHRcdFx0dHVybjogJ211bGxpZ2FuJyxcclxuXHRcdFx0XHR0aW1lc3RhbXA6IGl0ZW0udGltZXN0YW1wLFxyXG5cdFx0XHRcdGluZGV4OiBpdGVtSW5kZXgsXHJcblx0XHRcdFx0YWN0aW9uczogW10sXHJcblx0XHRcdH0pIGFzIE11bGxpZ2FuVHVybixcclxuXHRcdCkgYXMgTXVsbGlnYW5UdXJuO1xyXG5cdFx0bXVsbGlnYW5UdXJuID0gT2JqZWN0LmFzc2lnbihuZXcgTXVsbGlnYW5UdXJuKCksIG11bGxpZ2FuVHVybiwge1xyXG5cdFx0XHRpbmRleDogTWF0aC5tYXgobXVsbGlnYW5UdXJuLmluZGV4LCBpdGVtSW5kZXgpLFxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gbXVsbGlnYW5UdXJuO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBpc011bGxpZ2FuKGl0ZW06IEhpc3RvcnlJdGVtLCBnYW1lOiBHYW1lKSB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRpdGVtIGluc3RhbmNlb2YgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gJiZcclxuXHRcdFx0aXRlbS50YWcudGFnID09PSBHYW1lVGFnLk1VTExJR0FOX1NUQVRFICYmXHJcblx0XHRcdGl0ZW0udGFnLnZhbHVlID09PSBNdWxsaWdhbi5JTlBVVFxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgaXNNdWxsaWdhbkRvbmUoaXRlbTogSGlzdG9yeUl0ZW0sIGdhbWU6IEdhbWUpIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdChpdGVtIGluc3RhbmNlb2YgUGxheWVySGlzdG9yeUl0ZW0gJiZcclxuXHRcdFx0XHRpdGVtLmVudGl0eURlZmludGlvbi50YWdzW0dhbWVUYWdbR2FtZVRhZy5NVUxMSUdBTl9TVEFURV1dID09PSBNdWxsaWdhbi5ET05FKSB8fFxyXG5cdFx0XHQoaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtICYmXHJcblx0XHRcdFx0aXRlbS50YWcudGFnID09PSBHYW1lVGFnLk1VTExJR0FOX1NUQVRFICYmXHJcblx0XHRcdFx0aXRlbS50YWcudmFsdWUgPT09IE11bGxpZ2FuLkRPTkUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBpc1N0YXJ0T2ZUdXJuKGl0ZW06IEhpc3RvcnlJdGVtLCBnYW1lOiBHYW1lKSB7XHJcblx0XHRpZiAoIShpdGVtIGluc3RhbmNlb2YgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0pKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHN0YXJ0T2ZUdXJuID0gaXRlbS50YWcudGFnID09PSBHYW1lVGFnLlNURVAgJiYgaXRlbS50YWcudmFsdWUgPT09IFN0ZXAuTUFJTl9SRUFEWTtcclxuXHRcdGlmIChzdGFydE9mVHVybikge1xyXG5cdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnc3RhcnQgb2YgdHVybiwgaXNHYW1lRW50aXR5PycsIGl0ZW0udGFnLmVudGl0eSwgZ2FtZS5nZXRMYXRlc3RQYXJzZWRTdGF0ZSgpPy50b0pTKCkpXHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5pc0dhbWVFbnRpdHkoaXRlbS50YWcuZW50aXR5LCBnYW1lKSAmJiBzdGFydE9mVHVybjtcclxuXHR9XHJcblxyXG5cdC8vIHByaXZhdGUgaXNQbGF5ZXJFbnRpdHkoZW50aXR5SWQ6IG51bWJlciwgZ2FtZTogR2FtZSkge1xyXG5cdC8vIFx0cmV0dXJuIGdhbWUuZW50aXRpZXMuZ2V0KGVudGl0eUlkKSBpbnN0YW5jZW9mIFBsYXllckVudGl0eTtcclxuXHQvLyB9XHJcblxyXG5cdHByaXZhdGUgaXNHYW1lRW50aXR5KGVudGl0eUlkOiBudW1iZXIsIGdhbWU6IEdhbWUpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBnYW1lLmdldExhdGVzdFBhcnNlZFN0YXRlKCkuZ2V0KGVudGl0eUlkKSBpbnN0YW5jZW9mIEdhbWVFbnRpdHk7XHJcblx0fVxyXG59XHJcbiJdfQ==