UNPKG

@firestone-hs/replay-parser

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.

144 lines 23 kB
import { GameTag, Zone } from '@firestone-hs/reference-data'; import uniq from 'lodash-es/uniq'; import { CardDrawAction } from '../../models/action/card-draw-action'; import { FullEntityHistoryItem } from '../../models/history/full-entity-history-item'; import { ShowEntityHistoryItem } from '../../models/history/show-entity-history-item'; import { TagChangeHistoryItem } from '../../models/history/tag-change-history-item'; import { ActionHelper } from './action-helper'; export class CardDrawParser { constructor(allCards) { this.allCards = allCards; } applies(item) { return (item instanceof TagChangeHistoryItem || item instanceof FullEntityHistoryItem || item instanceof ShowEntityHistoryItem); } parse(item, currentTurn, entitiesBeforeAction, history) { if (item) if (currentTurn === 0) { return; } // We typically get a TagChange when the card is hidden, so typically when our opponent draws a card if (item instanceof TagChangeHistoryItem) { // if (item.tag.entity === 37) { // console.warn('handling card draw from tagchange?', item); // } if (!entitiesBeforeAction.get(item.tag.entity)) { // console.warn('could not get drawn entity from tag change', item); return []; } const previousZone = entitiesBeforeAction.get(item.tag.entity).getTag(GameTag.ZONE); if (item.tag.tag === GameTag.ZONE && item.tag.value === Zone.HAND && // SETASIDE is for discovery actions (previousZone === Zone.DECK || previousZone === Zone.SETASIDE || !previousZone)) { const controller = entitiesBeforeAction.get(item.tag.entity).getTag(GameTag.CONTROLLER); if (!controller) { console.warn('[card-draw-parser] empty controller', item, entitiesBeforeAction.get(item.tag.entity)); return null; } return [ CardDrawAction.create({ timestamp: item.timestamp, index: item.index, controller, data: [item.tag.entity], }, this.allCards), ]; } else { // if (item.tag.entity === 37) { // console.warn('invalid previous zone', previousZone); // } } } else if (item instanceof ShowEntityHistoryItem) { // if (item.entityDefintion.id === 37) { // console.warn('hanndling card draw showentity?', item); // } if (!entitiesBeforeAction.get(item.entityDefintion.id)) { // if (item.entityDefintion.id === 37) { // console.warn('could not get drawn entity from showentity', item); // } return []; } const previousZone = entitiesBeforeAction.get(item.entityDefintion.id).getTag(GameTag.ZONE); if (item.entityDefintion.tags.get(GameTag[GameTag.ZONE]) === Zone.HAND && (previousZone === Zone.DECK || !previousZone)) { const controller = entitiesBeforeAction.get(item.entityDefintion.id).getTag(GameTag.CONTROLLER); if (!controller) { console.warn('empty controller', item, entitiesBeforeAction.get(item.entityDefintion.id)); return null; } return [ CardDrawAction.create({ timestamp: item.timestamp, index: item.index, controller, data: [item.entityDefintion.id], }, this.allCards), ]; } else { // if (item.entityDefintion.id === 37) { // console.warn('invalid previous zone from showentity?', previousZone, item); // } } } else if (item instanceof FullEntityHistoryItem) { if (!entitiesBeforeAction.get(item.entityDefintion.id)) { // console.warn('could not get drawn entity from fullen', item); return []; } const zone = item.entityDefintion.tags.get(GameTag[GameTag.ZONE]); if (zone !== Zone.HAND) { // console.warn('incorrect zone from showentity', item); return []; } const previousZone = entitiesBeforeAction.get(item.entityDefintion.id).getTag(GameTag.ZONE); if (previousZone && previousZone !== Zone.DECK) { // console.warn('previous zone was not deck', item); return; } const controller = item.entityDefintion.tags.get(GameTag[GameTag.CONTROLLER]) || entitiesBeforeAction.get(item.entityDefintion.id).getTag(GameTag.CONTROLLER); if (!controller) { console.warn('[card-draw-parser] empty controller', item); return []; } return [ CardDrawAction.create({ timestamp: item.timestamp, index: item.index, controller, data: [item.entityDefintion.id], }, this.allCards), ]; } return []; } reduce(actions) { return ActionHelper.combineActions(actions, (previous, current) => this.shouldMergeActions(previous, current), (previous, current) => this.mergeActions(previous, current)); } shouldMergeActions(previous, current) { if (!(previous instanceof CardDrawAction && current instanceof CardDrawAction)) { return false; } if (previous.controller === undefined || current.controller === undefined) { console.warn('[card-draw-parser] Empty controller for draw action', previous, current); return false; } return previous.controller === current.controller; } mergeActions(previousAction, currentAction) { return CardDrawAction.create({ timestamp: previousAction.timestamp, index: currentAction.index, entities: currentAction.entities, controller: currentAction.controller, data: uniq([...uniq(previousAction.data || []), ...uniq(currentAction.data || [])]), }, this.allCards); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1kcmF3LXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vY2FyZC1kcmF3LXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTdELE9BQU8sSUFBSSxNQUFNLGdCQUFnQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUV0RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUVwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHL0MsTUFBTSxPQUFPLGNBQWM7SUFDMUIsWUFBb0IsUUFBeUI7UUFBekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFBRyxDQUFDO0lBRTFDLE9BQU8sQ0FBQyxJQUFpQjtRQUMvQixPQUFPLENBQ04sSUFBSSxZQUFZLG9CQUFvQjtZQUNwQyxJQUFJLFlBQVkscUJBQXFCO1lBQ3JDLElBQUksWUFBWSxxQkFBcUIsQ0FDckMsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQ1gsSUFBMEUsRUFDMUUsV0FBbUIsRUFDbkIsb0JBQXlDLEVBQ3pDLE9BQStCO1FBRS9CLElBQUksSUFBSTtZQUNQLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRTtnQkFDdEIsT0FBTzthQUNQO1FBRUYsb0dBQW9HO1FBQ3BHLElBQUksSUFBSSxZQUFZLG9CQUFvQixFQUFFO1lBQ3pDLGdDQUFnQztZQUNoQyw2REFBNkQ7WUFDN0QsSUFBSTtZQUNKLElBQUksQ0FB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RCxPQUFPLFFBQVEsQ0FBQyxVQUFVLEtBQUssT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUNuRCxDQUFDO0lBRU8sWUFBWSxDQUFDLGNBQThCLEVBQUUsYUFBNkI7UUFDakYsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUMzQjtZQUNDLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztZQUNuQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7WUFDMUIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO1lBQ2hDLFVBQVUsRUFBRSxhQUFhLENBQUMsVUFBVTtZQUNwQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbkYsRUFDRCxJQUFJLENBQUMsUUFBUSxDQUNiLENBQUM7SUFDSCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHYW1lVGFnLCBab25lIH0gZnJvbSAnQGZpcmVzdG9uZS1ocy9yZWZlcmVuY2UtZGF0YSc7XHJcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XHJcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC1lcy91bmlxJztcclxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9hY3Rpb24nO1xyXG5pbXBvcnQgeyBDYXJkRHJhd0FjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vY2FyZC1kcmF3LWFjdGlvbic7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscy9nYW1lL2VudGl0eSc7XHJcbmltcG9ydCB7IEZ1bGxFbnRpdHlIaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L2Z1bGwtZW50aXR5LWhpc3RvcnktaXRlbSc7XHJcbmltcG9ydCB7IEhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hpc3RvcnkvaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgU2hvd0VudGl0eUhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hpc3Rvcnkvc2hvdy1lbnRpdHktaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS90YWctY2hhbmdlLWhpc3RvcnktaXRlbSc7XHJcbmltcG9ydCB7IEFsbENhcmRzU2VydmljZSB9IGZyb20gJy4uL2FsbC1jYXJkcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWN0aW9uSGVscGVyIH0gZnJvbSAnLi9hY3Rpb24taGVscGVyJztcclxuaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSAnLi9wYXJzZXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIENhcmREcmF3UGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHtcclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGFsbENhcmRzOiBBbGxDYXJkc1NlcnZpY2UpIHt9XHJcblxyXG5cdHB1YmxpYyBhcHBsaWVzKGl0ZW06IEhpc3RvcnlJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gKFxyXG5cdFx0XHRpdGVtIGluc3RhbmNlb2YgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gfHxcclxuXHRcdFx0aXRlbSBpbnN0YW5jZW9mIEZ1bGxFbnRpdHlIaXN0b3J5SXRlbSB8fFxyXG5cdFx0XHRpdGVtIGluc3RhbmNlb2YgU2hvd0VudGl0eUhpc3RvcnlJdGVtXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHBhcnNlKFxyXG5cdFx0aXRlbTogVGFnQ2hhbmdlSGlzdG9yeUl0ZW0gfCBGdWxsRW50aXR5SGlzdG9yeUl0ZW0gfCBTaG93RW50aXR5SGlzdG9yeUl0ZW0sXHJcblx0XHRjdXJyZW50VHVybjogbnVtYmVyLFxyXG5cdFx0ZW50aXRpZXNCZWZvcmVBY3Rpb246IE1hcDxudW1iZXIsIEVudGl0eT4sXHJcblx0XHRoaXN0b3J5OiByZWFkb25seSBIaXN0b3J5SXRlbVtdLFxyXG5cdCk6IEFjdGlvbltdIHtcclxuXHRcdGlmIChpdGVtKVxyXG5cdFx0XHRpZiAoY3VycmVudFR1cm4gPT09IDApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHQvLyBXZSB0eXBpY2FsbHkgZ2V0IGEgVGFnQ2hhbmdlIHdoZW4gdGhlIGNhcmQgaXMgaGlkZGVuLCBzbyB0eXBpY2FsbHkgd2hlbiBvdXIgb3Bwb25lbnQgZHJhd3MgYSBjYXJkXHJcblx0XHRpZiAoaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtKSB7XHJcblx0XHRcdC8vIGlmIChpdGVtLnRhZy5lbnRpdHkgPT09IDM3KSB7XHJcblx0XHRcdC8vIFx0Y29uc29sZS53YXJuKCdoYW5kbGluZyBjYXJkIGRyYXcgZnJvbSB0YWdjaGFuZ2U/JywgaXRlbSk7XHJcblx0XHRcdC8vIH1cclxuXHRcdFx0aWYgKCFlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS50YWcuZW50aXR5KSkge1xyXG5cdFx0XHRcdC8vIGNvbnNvbGUud2FybignY291bGQgbm90IGdldCBkcmF3biBlbnRpdHkgZnJvbSB0YWcgY2hhbmdlJywgaXRlbSk7XHJcblx0XHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnN0IHByZXZpb3VzWm9uZSA9IGVudGl0aWVzQmVmb3JlQWN0aW9uLmdldChpdGVtLnRhZy5lbnRpdHkpLmdldFRhZyhHYW1lVGFnLlpPTkUpO1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0aXRlbS50YWcudGFnID09PSBHYW1lVGFnLlpPTkUgJiZcclxuXHRcdFx0XHRpdGVtLnRhZy52YWx1ZSA9PT0gWm9uZS5IQU5EICYmXHJcblx0XHRcdFx0Ly8gU0VUQVNJREUgaXMgZm9yIGRpc2NvdmVyeSBhY3Rpb25zXHJcblx0XHRcdFx0KHByZXZpb3VzWm9uZSA9PT0gWm9uZS5ERUNLIHx8IHByZXZpb3VzWm9uZSA9PT0gWm9uZS5TRVRBU0lERSB8fCAhcHJldmlvdXNab25lKVxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRjb25zdCBjb250cm9sbGVyID0gZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0udGFnLmVudGl0eSkuZ2V0VGFnKEdhbWVUYWcuQ09OVFJPTExFUik7XHJcblx0XHRcdFx0aWYgKCFjb250cm9sbGVyKSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oXHJcblx0XHRcdFx0XHRcdCdbY2FyZC1kcmF3LXBhcnNlcl0gZW1wdHkgY29udHJvbGxlcicsXHJcblx0XHRcdFx0XHRcdGl0ZW0sXHJcblx0XHRcdFx0XHRcdGVudGl0aWVzQmVmb3JlQWN0aW9uLmdldChpdGVtLnRhZy5lbnRpdHkpLFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gW1xyXG5cdFx0XHRcdFx0Q2FyZERyYXdBY3Rpb24uY3JlYXRlKFxyXG5cdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0dGltZXN0YW1wOiBpdGVtLnRpbWVzdGFtcCxcclxuXHRcdFx0XHRcdFx0XHRpbmRleDogaXRlbS5pbmRleCxcclxuXHRcdFx0XHRcdFx0XHRjb250cm9sbGVyLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGE6IFtpdGVtLnRhZy5lbnRpdHldLFxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHR0aGlzLmFsbENhcmRzLFxyXG5cdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRdO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIGlmIChpdGVtLnRhZy5lbnRpdHkgPT09IDM3KSB7XHJcblx0XHRcdFx0Ly8gXHRjb25zb2xlLndhcm4oJ2ludmFsaWQgcHJldmlvdXMgem9uZScsIHByZXZpb3VzWm9uZSk7XHJcblx0XHRcdFx0Ly8gfVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTaG93RW50aXR5SGlzdG9yeUl0ZW0pIHtcclxuXHRcdFx0Ly8gaWYgKGl0ZW0uZW50aXR5RGVmaW50aW9uLmlkID09PSAzNykge1xyXG5cdFx0XHQvLyBcdGNvbnNvbGUud2FybignaGFubmRsaW5nIGNhcmQgZHJhdyBzaG93ZW50aXR5PycsIGl0ZW0pO1xyXG5cdFx0XHQvLyB9XHJcblx0XHRcdGlmICghZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0uZW50aXR5RGVmaW50aW9uLmlkKSkge1xyXG5cdFx0XHRcdC8vIGlmIChpdGVtLmVudGl0eURlZmludGlvbi5pZCA9PT0gMzcpIHtcclxuXHRcdFx0XHQvLyBcdGNvbnNvbGUud2FybignY291bGQgbm90IGdldCBkcmF3biBlbnRpdHkgZnJvbSBzaG93ZW50aXR5JywgaXRlbSk7XHJcblx0XHRcdFx0Ly8gfVxyXG5cdFx0XHRcdHJldHVybiBbXTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBwcmV2aW91c1pvbmUgPSBlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS5lbnRpdHlEZWZpbnRpb24uaWQpLmdldFRhZyhHYW1lVGFnLlpPTkUpO1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0aXRlbS5lbnRpdHlEZWZpbnRpb24udGFncy5nZXQoR2FtZVRhZ1tHYW1lVGFnLlpPTkVdKSA9PT0gWm9uZS5IQU5EICYmXHJcblx0XHRcdFx0KHByZXZpb3VzWm9uZSA9PT0gWm9uZS5ERUNLIHx8ICFwcmV2aW91c1pvbmUpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSBlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS5lbnRpdHlEZWZpbnRpb24uaWQpLmdldFRhZyhHYW1lVGFnLkNPTlRST0xMRVIpO1xyXG5cdFx0XHRcdGlmICghY29udHJvbGxlcikge1xyXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdlbXB0eSBjb250cm9sbGVyJywgaXRlbSwgZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0uZW50aXR5RGVmaW50aW9uLmlkKSk7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIFtcclxuXHRcdFx0XHRcdENhcmREcmF3QWN0aW9uLmNyZWF0ZShcclxuXHRcdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRcdHRpbWVzdGFtcDogaXRlbS50aW1lc3RhbXAsXHJcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGl0ZW0uaW5kZXgsXHJcblx0XHRcdFx0XHRcdFx0Y29udHJvbGxlcixcclxuXHRcdFx0XHRcdFx0XHRkYXRhOiBbaXRlbS5lbnRpdHlEZWZpbnRpb24uaWRdLFxyXG5cdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHR0aGlzLmFsbENhcmRzLFxyXG5cdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRdO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIGlmIChpdGVtLmVudGl0eURlZmludGlvbi5pZCA9PT0gMzcpIHtcclxuXHRcdFx0XHQvLyBcdGNvbnNvbGUud2FybignaW52YWxpZCBwcmV2aW91cyB6b25lIGZyb20gc2hvd2VudGl0eT8nLCBwcmV2aW91c1pvbmUsIGl0ZW0pO1xyXG5cdFx0XHRcdC8vIH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRnVsbEVudGl0eUhpc3RvcnlJdGVtKSB7XHJcblx0XHRcdGlmICghZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0uZW50aXR5RGVmaW50aW9uLmlkKSkge1xyXG5cdFx0XHRcdC8vIGNvbnNvbGUud2FybignY291bGQgbm90IGdldCBkcmF3biBlbnRpdHkgZnJvbSBmdWxsZW4nLCBpdGVtKTtcclxuXHRcdFx0XHRyZXR1cm4gW107XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3Qgem9uZSA9IGl0ZW0uZW50aXR5RGVmaW50aW9uLnRhZ3MuZ2V0KEdhbWVUYWdbR2FtZVRhZy5aT05FXSk7XHJcblx0XHRcdGlmICh6b25lICE9PSBab25lLkhBTkQpIHtcclxuXHRcdFx0XHQvLyBjb25zb2xlLndhcm4oJ2luY29ycmVjdCB6b25lIGZyb20gc2hvd2VudGl0eScsIGl0ZW0pO1xyXG5cdFx0XHRcdHJldHVybiBbXTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBwcmV2aW91c1pvbmUgPSBlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS5lbnRpdHlEZWZpbnRpb24uaWQpLmdldFRhZyhHYW1lVGFnLlpPTkUpO1xyXG5cdFx0XHRpZiAocHJldmlvdXNab25lICYmIHByZXZpb3VzWm9uZSAhPT0gWm9uZS5ERUNLKSB7XHJcblx0XHRcdFx0Ly8gY29uc29sZS53YXJuKCdwcmV2aW91cyB6b25lIHdhcyBub3QgZGVjaycsIGl0ZW0pO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb25zdCBjb250cm9sbGVyID1cclxuXHRcdFx0XHRpdGVtLmVudGl0eURlZmludGlvbi50YWdzLmdldChHYW1lVGFnW0dhbWVUYWcuQ09OVFJPTExFUl0pIHx8XHJcblx0XHRcdFx0ZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0uZW50aXR5RGVmaW50aW9uLmlkKS5nZXRUYWcoR2FtZVRhZy5DT05UUk9MTEVSKTtcclxuXHRcdFx0aWYgKCFjb250cm9sbGVyKSB7XHJcblx0XHRcdFx0Y29uc29sZS53YXJuKCdbY2FyZC1kcmF3LXBhcnNlcl0gZW1wdHkgY29udHJvbGxlcicsIGl0ZW0pO1xyXG5cdFx0XHRcdHJldHVybiBbXTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gW1xyXG5cdFx0XHRcdENhcmREcmF3QWN0aW9uLmNyZWF0ZShcclxuXHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0dGltZXN0YW1wOiBpdGVtLnRpbWVzdGFtcCxcclxuXHRcdFx0XHRcdFx0aW5kZXg6IGl0ZW0uaW5kZXgsXHJcblx0XHRcdFx0XHRcdGNvbnRyb2xsZXIsXHJcblx0XHRcdFx0XHRcdGRhdGE6IFtpdGVtLmVudGl0eURlZmludGlvbi5pZF0sXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0dGhpcy5hbGxDYXJkcyxcclxuXHRcdFx0XHQpLFxyXG5cdFx0XHRdO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyByZWR1Y2UoYWN0aW9uczogcmVhZG9ubHkgQWN0aW9uW10pOiByZWFkb25seSBBY3Rpb25bXSB7XHJcblx0XHRyZXR1cm4gQWN0aW9uSGVscGVyLmNvbWJpbmVBY3Rpb25zPENhcmREcmF3QWN0aW9uPihcclxuXHRcdFx0YWN0aW9ucyxcclxuXHRcdFx0KHByZXZpb3VzLCBjdXJyZW50KSA9PiB0aGlzLnNob3VsZE1lcmdlQWN0aW9ucyhwcmV2aW91cywgY3VycmVudCksXHJcblx0XHRcdChwcmV2aW91cywgY3VycmVudCkgPT4gdGhpcy5tZXJnZUFjdGlvbnMocHJldmlvdXMsIGN1cnJlbnQpLFxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2hvdWxkTWVyZ2VBY3Rpb25zKHByZXZpb3VzOiBBY3Rpb24sIGN1cnJlbnQ6IEFjdGlvbik6IGJvb2xlYW4ge1xyXG5cdFx0aWYgKCEocHJldmlvdXMgaW5zdGFuY2VvZiBDYXJkRHJhd0FjdGlvbiAmJiBjdXJyZW50IGluc3RhbmNlb2YgQ2FyZERyYXdBY3Rpb24pKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91cy5jb250cm9sbGVyID09PSB1bmRlZmluZWQgfHwgY3VycmVudC5jb250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdbY2FyZC1kcmF3LXBhcnNlcl0gRW1wdHkgY29udHJvbGxlciBmb3IgZHJhdyBhY3Rpb24nLCBwcmV2aW91cywgY3VycmVudCk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBwcmV2aW91cy5jb250cm9sbGVyID09PSBjdXJyZW50LmNvbnRyb2xsZXI7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG1lcmdlQWN0aW9ucyhwcmV2aW91c0FjdGlvbjogQ2FyZERyYXdBY3Rpb24sIGN1cnJlbnRBY3Rpb246IENhcmREcmF3QWN0aW9uKTogQ2FyZERyYXdBY3Rpb24ge1xyXG5cdFx0cmV0dXJuIENhcmREcmF3QWN0aW9uLmNyZWF0ZShcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHRpbWVzdGFtcDogcHJldmlvdXNBY3Rpb24udGltZXN0YW1wLFxyXG5cdFx0XHRcdGluZGV4OiBjdXJyZW50QWN0aW9uLmluZGV4LFxyXG5cdFx0XHRcdGVudGl0aWVzOiBjdXJyZW50QWN0aW9uLmVudGl0aWVzLFxyXG5cdFx0XHRcdGNvbnRyb2xsZXI6IGN1cnJlbnRBY3Rpb24uY29udHJvbGxlcixcclxuXHRcdFx0XHRkYXRhOiB1bmlxKFsuLi51bmlxKHByZXZpb3VzQWN0aW9uLmRhdGEgfHwgW10pLCAuLi51bmlxKGN1cnJlbnRBY3Rpb24uZGF0YSB8fCBbXSldKSxcclxuXHRcdFx0fSxcclxuXHRcdFx0dGhpcy5hbGxDYXJkcyxcclxuXHRcdCk7XHJcblx0fVxyXG59XHJcbiJdfQ==