UNPKG

@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
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVybi1wYXJzZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9nYW1lcGlwZWxpbmUvdHVybi1wYXJzZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFLeEQsTUFBTSxPQUFPLGlCQUFpQjtJQUM3QixnQkFBZSxDQUFDO0lBRVQsV0FBVyxDQUFDLElBQVUsRUFBRSxPQUErQjtRQUM3RCxJQUFJLEtBQUssR0FBc0IsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzVCLG9FQUFvRTtRQUNwRSxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sRUFBRTtZQUMzQixJQUFJLFVBQVUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BELGdEQUFnRDtnQkFDaEQsTUFBTSxZQUFZLEdBQWlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvRixLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ25DLFVBQVUsRUFBRSxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUMvRCxnREFBZ0Q7Z0JBQ2hELDJFQUEyRTtnQkFDM0UsTUFBTSxZQUFZLEdBQWlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM1RixLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ25DLFVBQVUsRUFBRSxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDMUMsaURBQWlEO2dCQUNqRCx3Q0FBd0M7Z0JBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNsQixzRUFBc0U7b0JBQ3RFLE1BQU0sWUFBWSxHQUFpQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDL0YsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUNuQyxVQUFVLEVBQUUsQ0FBQztpQkFDYjtnQkFDRCxNQUFNLElBQUksR0FBZSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN6RixLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLFVBQVUsRUFBRSxDQUFDO2FBQ2I7U0FDRDtRQUNELGlEQUFpRDtRQUNqRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sU0FBUyxDQUFDLGlCQUF5QixFQUFFLElBQTBCLEVBQUUsS0FBd0I7UUFDaEcsTUFBTSxTQUFTLEdBQUksSUFBNkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzNELGlFQUFpRTtRQUNqRSxJQUFJLElBQUksR0FBZSxLQUFLLENBQUMsR0FBRyxDQUMvQixpQkFBaUIsRUFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsRUFBRSxFQUFFO1lBQy9CLElBQUksRUFBRSxHQUFHLGlCQUFpQixFQUFFO1lBQzVCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixLQUFLLEVBQUUsU0FBUztZQUNoQixZQUFZLEVBQUUsU0FBUztZQUN2QixPQUFPLEVBQUUsRUFBRTtTQUNYLENBQWUsQ0FDRixDQUFDO1FBQ2hCLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFO1lBQzVDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDO1NBQ3RDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUVPLGlCQUFpQixDQUFDLElBQThDLEVBQUUsS0FBd0I7UUFDakcsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFZLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNyRixJQUFJLFlBQVksR0FBaUIsS0FBSyxDQUFDLEdBQUcsQ0FDekMsQ0FBQyxFQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLEVBQUUsRUFBRTtZQUNqQyxJQUFJLEVBQUUsVUFBVTtZQUNoQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsS0FBSyxFQUFFLFNBQVM7WUFDaEIsT0FBTyxFQUFFLEVBQUU7U0FDWCxDQUFpQixDQUNGLENBQUM7UUFDbEIsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUU7WUFDOUQsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7U0FDOUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxZQUFZLENBQUM7SUFDckIsQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFpQixFQUFFLElBQVU7UUFDL0MsT0FBTyxDQUNOLElBQUksWUFBWSxvQkFBb0I7WUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLGNBQWM7WUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FDakMsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsSUFBaUIsRUFBRSxJQUFVO1FBQ25ELE9BQU8sQ0FDTixDQUFDLElBQUksWUFBWSxpQkFBaUI7WUFDakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDOUUsQ0FBQyxJQUFJLFlBQVksb0JBQW9CO2dCQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsY0FBYztnQkFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxDQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFpQixFQUFFLElBQVU7UUFDbEQsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLG9CQUFvQixDQUFDLEVBQUU7WUFDNUMsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN4RixJQUFJLFdBQVcsRUFBRTtZQUNoQix1R0FBdUc7U0FDdkc7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDO0lBQ2hFLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsK0RBQStEO0lBQy9ELElBQUk7SUFFSSxZQUFZLENBQUMsUUFBZ0IsRUFBRSxJQUFVO1FBQ2hELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLFVBQVUsQ0FBQztJQUN4RSxDQUFDOzs4R0E1R1csaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FGakIsTUFBTTsyRkFFTixpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBHYW1lVGFnLCBNdWxsaWdhbiwgU3RlcCB9IGZyb20gJ0BmaXJlc3RvbmUtaHMvcmVmZXJlbmNlLWRhdGEnO1xyXG5pbXBvcnQgeyBNYXAgfSBmcm9tICdpbW11dGFibGUnO1xyXG5pbXBvcnQgeyBBY3Rpb25UdXJuIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvYWN0aW9uLXR1cm4nO1xyXG5pbXBvcnQgeyBHYW1lIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvZ2FtZSc7XHJcbmltcG9ydCB7IEdhbWVFbnRpdHkgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS9nYW1lLWVudGl0eSc7XHJcbmltcG9ydCB7IE11bGxpZ2FuVHVybiB9IGZyb20gJy4uLy4uL21vZGVscy9nYW1lL211bGxpZ2FuLXR1cm4nO1xyXG5pbXBvcnQgeyBUdXJuIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvdHVybic7XHJcbmltcG9ydCB7IEhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hpc3RvcnkvaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS90YWctY2hhbmdlLWhpc3RvcnktaXRlbSc7XHJcbmltcG9ydCB7IFBsYXllckhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21vZGVscyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcblx0cHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHVyblBhcnNlclNlcnZpY2Uge1xyXG5cdGNvbnN0cnVjdG9yKCkge31cclxuXHJcblx0cHVibGljIGNyZWF0ZVR1cm5zKGdhbWU6IEdhbWUsIGhpc3Rvcnk6IHJlYWRvbmx5IEhpc3RvcnlJdGVtW10pOiBHYW1lIHtcclxuXHRcdGxldCB0dXJuczogTWFwPG51bWJlciwgVHVybj4gPSBnYW1lLnR1cm5zO1xyXG5cdFx0bGV0IHR1cm5OdW1iZXIgPSB0dXJucy5zaXplO1xyXG5cdFx0Ly8gLy8gY29uc29sZS5sb2coJ2xhc3QgaGlzdG9yeSBpdGVtJywgaGlzdG9yeVtoaXN0b3J5Lmxlbmd0aCAtIDFdKTtcclxuXHRcdGZvciAoY29uc3QgaXRlbSBvZiBoaXN0b3J5KSB7XHJcblx0XHRcdGlmICh0dXJuTnVtYmVyID09PSAwICYmIHRoaXMuaXNNdWxsaWdhbihpdGVtLCBnYW1lKSkge1xyXG5cdFx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdhZGRpbmcgbXVsbGlnYW4gdHVybicsIGl0ZW0pO1xyXG5cdFx0XHRcdGNvbnN0IG11bGxpZ2FuVHVybjogTXVsbGlnYW5UdXJuID0gdGhpcy5wYXJzZU11bGxpZ2FuVHVybihpdGVtIGFzIFRhZ0NoYW5nZUhpc3RvcnlJdGVtLCB0dXJucyk7XHJcblx0XHRcdFx0dHVybnMgPSB0dXJucy5zZXQoMCwgbXVsbGlnYW5UdXJuKTtcclxuXHRcdFx0XHR0dXJuTnVtYmVyKys7XHJcblx0XHRcdH0gZWxzZSBpZiAodHVybk51bWJlciA9PT0gMCAmJiB0aGlzLmlzTXVsbGlnYW5Eb25lKGl0ZW0sIGdhbWUpKSB7XHJcblx0XHRcdFx0Ly8gVGhlIHByb3BlciBtdWxsaWdhbiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkXHJcblx0XHRcdFx0Ly8gY29uc29sZS53YXJuKCdDb3VsZCBub3QgZGV0ZWN0IG11bGxpZ2FuIGlucHV0LCBjcmVhdGluZyBtdWxsaWdhbiB0dXJuJyk7XHJcblx0XHRcdFx0Y29uc3QgbXVsbGlnYW5UdXJuOiBNdWxsaWdhblR1cm4gPSB0aGlzLnBhcnNlTXVsbGlnYW5UdXJuKGl0ZW0gYXMgUGxheWVySGlzdG9yeUl0ZW0sIHR1cm5zKTtcclxuXHRcdFx0XHR0dXJucyA9IHR1cm5zLnNldCgwLCBtdWxsaWdhblR1cm4pO1xyXG5cdFx0XHRcdHR1cm5OdW1iZXIrKztcclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmlzU3RhcnRPZlR1cm4oaXRlbSwgZ2FtZSkpIHtcclxuXHRcdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnYWRkaW5nIG5ldyB0dXJuJywgdHVybk51bWJlcik7XHJcblx0XHRcdFx0Ly8gVXNlZCBmb3IgaW5zdGFuY2UgaW4gQm9iJ3MgZW5jb3VudGVyc1xyXG5cdFx0XHRcdGlmICghdHVybnMuaGFzKDApKSB7XHJcblx0XHRcdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnY3JlYXRpbmcgZmFrZSBtdWxsaWdhbiB0dXJuJywgdHVybnMsIHR1cm5zLnRvSlMoKSk7XHJcblx0XHRcdFx0XHRjb25zdCBtdWxsaWdhblR1cm46IE11bGxpZ2FuVHVybiA9IHRoaXMucGFyc2VNdWxsaWdhblR1cm4oaXRlbSBhcyBUYWdDaGFuZ2VIaXN0b3J5SXRlbSwgdHVybnMpO1xyXG5cdFx0XHRcdFx0dHVybnMgPSB0dXJucy5zZXQoMCwgbXVsbGlnYW5UdXJuKTtcclxuXHRcdFx0XHRcdHR1cm5OdW1iZXIrKztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgdHVybjogQWN0aW9uVHVybiA9IHRoaXMucGFyc2VUdXJuKHR1cm5OdW1iZXIsIGl0ZW0gYXMgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0sIHR1cm5zKTtcclxuXHRcdFx0XHR0dXJucyA9IHR1cm5zLnNldCh0dXJuTnVtYmVyLCB0dXJuKTtcclxuXHRcdFx0XHR0dXJuTnVtYmVyKys7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdC8vIC8vIGNvbnNvbGUubG9nKCdjcmVhdGVkIHR1cm5zJywgdHVybnMudG9KUygpKTtcclxuXHRcdHJldHVybiBHYW1lLmNyZWF0ZUdhbWUoZ2FtZSwgeyB0dXJucyB9IGFzIEdhbWUpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBwYXJzZVR1cm4oY3VycmVudFR1cm5OdW1iZXI6IG51bWJlciwgaXRlbTogVGFnQ2hhbmdlSGlzdG9yeUl0ZW0sIHR1cm5zOiBNYXA8bnVtYmVyLCBUdXJuPik6IEFjdGlvblR1cm4ge1xyXG5cdFx0Y29uc3QgaXRlbUluZGV4ID0gKGl0ZW0gYXMgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0pLnRhZy5pbmRleDtcclxuXHRcdC8vIFR1cm4gMSBpcyBtdWxsaWdhbiBpbiB0aGUgbG9nLCB3aGlsZSBmb3IgdXMgbXVsbGlnYW4gaXMgdHVybiAwXHJcblx0XHRsZXQgdHVybjogQWN0aW9uVHVybiA9IHR1cm5zLmdldChcclxuXHRcdFx0Y3VycmVudFR1cm5OdW1iZXIsXHJcblx0XHRcdE9iamVjdC5hc3NpZ24obmV3IEFjdGlvblR1cm4oKSwge1xyXG5cdFx0XHRcdHR1cm46IGAke2N1cnJlbnRUdXJuTnVtYmVyfWAsXHJcblx0XHRcdFx0dGltZXN0YW1wOiBpdGVtLnRpbWVzdGFtcCxcclxuXHRcdFx0XHRpbmRleDogaXRlbUluZGV4LFxyXG5cdFx0XHRcdGFjdGl2ZVBsYXllcjogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdGFjdGlvbnM6IFtdLFxyXG5cdFx0XHR9KSBhcyBBY3Rpb25UdXJuLFxyXG5cdFx0KSBhcyBBY3Rpb25UdXJuO1xyXG5cdFx0dHVybiA9IE9iamVjdC5hc3NpZ24obmV3IEFjdGlvblR1cm4oKSwgdHVybiwge1xyXG5cdFx0XHRpbmRleDogTWF0aC5tYXgodHVybi5pbmRleCwgaXRlbUluZGV4KSxcclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIHR1cm47XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHBhcnNlTXVsbGlnYW5UdXJuKGl0ZW06IFRhZ0NoYW5nZUhpc3RvcnlJdGVtIHwgUGxheWVySGlzdG9yeUl0ZW0sIHR1cm5zOiBNYXA8bnVtYmVyLCBUdXJuPik6IE11bGxpZ2FuVHVybiB7XHJcblx0XHRjb25zdCBpdGVtSW5kZXggPSBpdGVtIGluc3RhbmNlb2YgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gPyBpdGVtLnRhZy5pbmRleCA6IGl0ZW0uaW5kZXg7XHJcblx0XHRsZXQgbXVsbGlnYW5UdXJuOiBNdWxsaWdhblR1cm4gPSB0dXJucy5nZXQoXHJcblx0XHRcdDAsXHJcblx0XHRcdE9iamVjdC5hc3NpZ24obmV3IE11bGxpZ2FuVHVybigpLCB7XHJcblx0XHRcdFx0dHVybjogJ211bGxpZ2FuJyxcclxuXHRcdFx0XHR0aW1lc3RhbXA6IGl0ZW0udGltZXN0YW1wLFxyXG5cdFx0XHRcdGluZGV4OiBpdGVtSW5kZXgsXHJcblx0XHRcdFx0YWN0aW9uczogW10sXHJcblx0XHRcdH0pIGFzIE11bGxpZ2FuVHVybixcclxuXHRcdCkgYXMgTXVsbGlnYW5UdXJuO1xyXG5cdFx0bXVsbGlnYW5UdXJuID0gT2JqZWN0LmFzc2lnbihuZXcgTXVsbGlnYW5UdXJuKCksIG11bGxpZ2FuVHVybiwge1xyXG5cdFx0XHRpbmRleDogTWF0aC5tYXgobXVsbGlnYW5UdXJuLmluZGV4LCBpdGVtSW5kZXgpLFxyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gbXVsbGlnYW5UdXJuO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBpc011bGxpZ2FuKGl0ZW06IEhpc3RvcnlJdGVtLCBnYW1lOiBHYW1lKSB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRpdGVtIGluc3RhbmNlb2YgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gJiZcclxuXHRcdFx0aXRlbS50YWcudGFnID09PSBHYW1lVGFnLk1VTExJR0FOX1NUQVRFICYmXHJcblx0XHRcdGl0ZW0udGFnLnZhbHVlID09PSBNdWxsaWdhbi5JTlBVVFxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgaXNNdWxsaWdhbkRvbmUoaXRlbTogSGlzdG9yeUl0ZW0sIGdhbWU6IEdhbWUpIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdChpdGVtIGluc3RhbmNlb2YgUGxheWVySGlzdG9yeUl0ZW0gJiZcclxuXHRcdFx0XHRpdGVtLmVudGl0eURlZmludGlvbi50YWdzW0dhbWVUYWdbR2FtZVRhZy5NVUxMSUdBTl9TVEFURV1dID09PSBNdWxsaWdhbi5ET05FKSB8fFxyXG5cdFx0XHQoaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtICYmXHJcblx0XHRcdFx0aXRlbS50YWcudGFnID09PSBHYW1lVGFnLk1VTExJR0FOX1NUQVRFICYmXHJcblx0XHRcdFx0aXRlbS50YWcudmFsdWUgPT09IE11bGxpZ2FuLkRPTkUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBpc1N0YXJ0T2ZUdXJuKGl0ZW06IEhpc3RvcnlJdGVtLCBnYW1lOiBHYW1lKSB7XHJcblx0XHRpZiAoIShpdGVtIGluc3RhbmNlb2YgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0pKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHN0YXJ0T2ZUdXJuID0gaXRlbS50YWcudGFnID09PSBHYW1lVGFnLlNURVAgJiYgaXRlbS50YWcudmFsdWUgPT09IFN0ZXAuTUFJTl9SRUFEWTtcclxuXHRcdGlmIChzdGFydE9mVHVybikge1xyXG5cdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnc3RhcnQgb2YgdHVybiwgaXNHYW1lRW50aXR5PycsIGl0ZW0udGFnLmVudGl0eSwgZ2FtZS5nZXRMYXRlc3RQYXJzZWRTdGF0ZSgpPy50b0pTKCkpXHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5pc0dhbWVFbnRpdHkoaXRlbS50YWcuZW50aXR5LCBnYW1lKSAmJiBzdGFydE9mVHVybjtcclxuXHR9XHJcblxyXG5cdC8vIHByaXZhdGUgaXNQbGF5ZXJFbnRpdHkoZW50aXR5SWQ6IG51bWJlciwgZ2FtZTogR2FtZSkge1xyXG5cdC8vIFx0cmV0dXJuIGdhbWUuZW50aXRpZXMuZ2V0KGVudGl0eUlkKSBpbnN0YW5jZW9mIFBsYXllckVudGl0eTtcclxuXHQvLyB9XHJcblxyXG5cdHByaXZhdGUgaXNHYW1lRW50aXR5KGVudGl0eUlkOiBudW1iZXIsIGdhbWU6IEdhbWUpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBnYW1lLmdldExhdGVzdFBhcnNlZFN0YXRlKCkuZ2V0KGVudGl0eUlkKSBpbnN0YW5jZW9mIEdhbWVFbnRpdHk7XHJcblx0fVxyXG59XHJcbiJdfQ==