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 19.1 kB
import { BlockType } from '@firestone-hs/reference-data'; import { AttachingEnchantmentAction } from '../../models/action/attaching-enchantment-action'; import { CardTargetAction } from '../../models/action/card-target-action'; import { TradeAction } from '../../models/action/trade-action'; import { ActionHistoryItem } from '../../models/history/action-history-item'; import { ActionButtonUsedAction, CardPlayedFromHandAction } from '../../models/models'; import { deepEqual } from '../../utils'; import { ActionHelper } from './action-helper'; export class CardTargetParser { constructor(allCards) { this.allCards = allCards; } applies(item) { return item instanceof ActionHistoryItem; } parse(item, currentTurn, entitiesBeforeAction, history) { if (parseInt(item.node.attributes.type) !== BlockType.POWER && parseInt(item.node.attributes.type) !== BlockType.TRIGGER) { return; } const originId = parseInt(item.node.attributes.entity); const entity = entitiesBeforeAction.get(originId); if (!entity) { return []; } // Remove the dummy effects if ([ 'DALA_744d', "BG20_GEM_No_Impact" /* CardIds.BloodGemNoImpactToken */, "BGDUO20_GEM_No_Impact_Copy" /* CardIds.BloodGemNoImpactFromTeammateDnt_BGDUO20_GEM_No_Impact_Copy */, ].includes(entity.cardID)) { return []; } const targetId = parseInt(item.node.attributes.target); if (targetId > 0) { return [ CardTargetAction.create({ timestamp: item.timestamp, index: item.index, originId, targetIds: [targetId], }, this.allCards), ]; } return []; } reduce(actions) { return ActionHelper.combineActions(actions, (previous, current) => this.shouldMergeActions(previous, current), (previous, current) => this.mergeActions(previous, current)); } shouldMergeActions(previousAction, currentAction) { if (previousAction instanceof CardTargetAction && currentAction instanceof CardTargetAction) { if (previousAction.originId === currentAction.originId) { return true; } } if (previousAction instanceof ActionButtonUsedAction) { return previousAction.entityId === currentAction.originId; } if (previousAction instanceof TradeAction) { return previousAction.originId === currentAction.originId; } if (previousAction instanceof AttachingEnchantmentAction && currentAction instanceof CardTargetAction) { if (previousAction.originId === currentAction.originId && deepEqual(previousAction.targetIds ?? [], currentAction.targetIds ?? [])) { return true; } } if (previousAction instanceof CardPlayedFromHandAction && currentAction instanceof CardTargetAction) { if (previousAction.entityId === currentAction.originId) { return true; } } return false; } mergeActions(previousAction, currentAction) { if (currentAction instanceof AttachingEnchantmentAction) { console.warn('incorrect AttachingEnchantmentAction as current action for card-target-parser', currentAction); return; } if (previousAction instanceof ActionButtonUsedAction) { // // console.log('merging actions', previousAction, currentAction); return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, { entities: currentAction.entities, entityId: previousAction.entityId, originId: currentAction.originId, targetIds: [...(previousAction.targetIds ?? []), ...(currentAction.targetIds ?? [])].filter((id, index, self) => self.indexOf(id) === index), }); } else if (previousAction instanceof CardPlayedFromHandAction) { // // console.log('merging actions', previousAction, currentAction); return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, { entities: currentAction.entities, entityId: previousAction.entityId, originId: currentAction.originId, targetIds: [...(previousAction.targetIds ?? []), ...(currentAction.targetIds ?? [])].filter((id, index, self) => self.indexOf(id) === index), }); } else if (previousAction instanceof CardTargetAction) { return CardTargetAction.create({ timestamp: previousAction.timestamp, index: previousAction.index, entities: currentAction.entities, originId: currentAction.originId, targetIds: [...(previousAction.targetIds ?? []), ...(currentAction.targetIds ?? [])].filter((id, index, self) => self.indexOf(id) === index), }, this.allCards); } else if (previousAction instanceof AttachingEnchantmentAction || previousAction instanceof TradeAction) { return previousAction; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC10YXJnZXQtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwbGF5LXBhcnNlci9zcmMvbGliL3NlcnZpY2VzL2FjdGlvbi9jYXJkLXRhcmdldC1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVyxNQUFNLDhCQUE4QixDQUFDO0FBR2xFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcvQyxNQUFNLE9BQU8sZ0JBQWdCO0lBQzVCLFlBQW9CLFFBQXlCO1FBQXpCLGFBQVEsR0FBUixRQUFRLENBQWlCO0lBQUcsQ0FBQztJQUUxQyxPQUFPLENBQUMsSUFBaUI7UUFDL0IsT0FBTyxJQUFJLFlBQVksaUJBQWlCLENBQUM7SUFDMUMsQ0FBQztJQUVNLEtBQUssQ0FDWCxJQUF1QixFQUN2QixXQUFtQixFQUNuQixvQkFBeUMsRUFDekMsT0FBK0I7UUFFL0IsSUFDQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDLEtBQUs7WUFDdkQsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxP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LGNBQWMsQ0FBQyxTQUFTO2dCQUNuQyxLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUs7Z0JBQzNCLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtnQkFDaEMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO2dCQUNoQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDMUYsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLENBQzFCO2FBQ3RCLEVBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FDYixDQUFDO1NBQ0Y7YUFBTSxJQUFJLGNBQWMsWUFBWSwwQkFBMEIsSUFBSSxjQUFjLFlBQVksV0FBVyxFQUFFO1lBQ3pHLE9BQU8sY0FBYyxDQUFDO1NBQ3RCO0lBQ0YsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmxvY2tUeXBlLCBDYXJkSWRzIH0gZnJvbSAnQGZpcmVzdG9uZS1ocy9yZWZlcmVuY2UtZGF0YSc7XHJcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XHJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vYWN0aW9uJztcclxuaW1wb3J0IHsgQXR0YWNoaW5nRW5jaGFudG1lbnRBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uL2F0dGFjaGluZy1lbmNoYW50bWVudC1hY3Rpb24nO1xyXG5pbXBvcnQgeyBDYXJkVGFyZ2V0QWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9jYXJkLXRhcmdldC1hY3Rpb24nO1xyXG5pbXBvcnQgeyBUcmFkZUFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vdHJhZGUtYWN0aW9uJztcclxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvZW50aXR5JztcclxuaW1wb3J0IHsgQWN0aW9uSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9hY3Rpb24taGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBBY3Rpb25CdXR0b25Vc2VkQWN0aW9uLCBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvbW9kZWxzJztcclxuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBBbGxDYXJkc1NlcnZpY2UgfSBmcm9tICcuLi9hbGwtY2FyZHMuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGlvbkhlbHBlciB9IGZyb20gJy4vYWN0aW9uLWhlbHBlcic7XHJcbmltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4vcGFyc2VyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDYXJkVGFyZ2V0UGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHtcclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGFsbENhcmRzOiBBbGxDYXJkc1NlcnZpY2UpIHt9XHJcblxyXG5cdHB1YmxpYyBhcHBsaWVzKGl0ZW06IEhpc3RvcnlJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gaXRlbSBpbnN0YW5jZW9mIEFjdGlvbkhpc3RvcnlJdGVtO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHBhcnNlKFxyXG5cdFx0aXRlbTogQWN0aW9uSGlzdG9yeUl0ZW0sXHJcblx0XHRjdXJyZW50VHVybjogbnVtYmVyLFxyXG5cdFx0ZW50aXRpZXNCZWZvcmVBY3Rpb246IE1hcDxudW1iZXIsIEVudGl0eT4sXHJcblx0XHRoaXN0b3J5OiByZWFkb25seSBIaXN0b3J5SXRlbVtdLFxyXG5cdCk6IEFjdGlvbltdIHtcclxuXHRcdGlmIChcclxuXHRcdFx0cGFyc2VJbnQoaXRlbS5ub2RlLmF0dHJpYnV0ZXMudHlwZSkgIT09IEJsb2NrVHlwZS5QT1dFUiAmJlxyXG5cdFx0XHRwYXJzZUludChpdGVtLm5vZGUuYXR0cmlidXRlcy50eXBlKSAhPT0gQmxvY2tUeXBlLlRSSUdHRVJcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRjb25zdCBvcmlnaW5JZCA9IHBhcnNlSW50KGl0ZW0ubm9kZS5hdHRyaWJ1dGVzLmVudGl0eSk7XHJcblx0XHRjb25zdCBlbnRpdHkgPSBlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQob3JpZ2luSWQpO1xyXG5cdFx0aWYgKCFlbnRpdHkpIHtcclxuXHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0fVxyXG5cdFx0Ly8gUmVtb3ZlIHRoZSBkdW1teSBlZmZlY3RzXHJcblx0XHRpZiAoXHJcblx0XHRcdFtcclxuXHRcdFx0XHQnREFMQV83NDRkJyxcclxuXHRcdFx0XHRDYXJkSWRzLkJsb29kR2VtTm9JbXBhY3RUb2tlbixcclxuXHRcdFx0XHRDYXJkSWRzLkJsb29kR2VtTm9JbXBhY3RGcm9tVGVhbW1hdGVEbnRfQkdEVU8yMF9HRU1fTm9fSW1wYWN0X0NvcHksXHJcblx0XHRcdF0uaW5jbHVkZXMoZW50aXR5LmNhcmRJRClcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gW107XHJcblx0XHR9XHJcblx0XHRjb25zdCB0YXJnZXRJZCA9IHBhcnNlSW50KGl0ZW0ubm9kZS5hdHRyaWJ1dGVzLnRhcmdldCk7XHJcblx0XHRpZiAodGFyZ2V0SWQgPiAwKSB7XHJcblx0XHRcdHJldHVybiBbXHJcblx0XHRcdFx0Q2FyZFRhcmdldEFjdGlvbi5jcmVhdGUoXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdHRpbWVzdGFtcDogaXRlbS50aW1lc3RhbXAsXHJcblx0XHRcdFx0XHRcdGluZGV4OiBpdGVtLmluZGV4LFxyXG5cdFx0XHRcdFx0XHRvcmlnaW5JZCxcclxuXHRcdFx0XHRcdFx0dGFyZ2V0SWRzOiBbdGFyZ2V0SWRdLFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdHRoaXMuYWxsQ2FyZHMsXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyByZWR1Y2UoYWN0aW9uczogcmVhZG9ubHkgQWN0aW9uW10pOiByZWFkb25seSBBY3Rpb25bXSB7XHJcblx0XHRyZXR1cm4gQWN0aW9uSGVscGVyLmNvbWJpbmVBY3Rpb25zPEFjdGlvbj4oXHJcblx0XHRcdGFjdGlvbnMsXHJcblx0XHRcdChwcmV2aW91cywgY3VycmVudCkgPT4gdGhpcy5zaG91bGRNZXJnZUFjdGlvbnMocHJldmlvdXMsIGN1cnJlbnQpLFxyXG5cdFx0XHQocHJldmlvdXMsIGN1cnJlbnQpID0+IHRoaXMubWVyZ2VBY3Rpb25zKHByZXZpb3VzLCBjdXJyZW50KSxcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHNob3VsZE1lcmdlQWN0aW9ucyhwcmV2aW91c0FjdGlvbjogQWN0aW9uLCBjdXJyZW50QWN0aW9uOiBBY3Rpb24pOiBib29sZWFuIHtcclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRUYXJnZXRBY3Rpb24gJiYgY3VycmVudEFjdGlvbiBpbnN0YW5jZW9mIENhcmRUYXJnZXRBY3Rpb24pIHtcclxuXHRcdFx0aWYgKChwcmV2aW91c0FjdGlvbiBhcyBDYXJkVGFyZ2V0QWN0aW9uKS5vcmlnaW5JZCA9PT0gKGN1cnJlbnRBY3Rpb24gYXMgQ2FyZFRhcmdldEFjdGlvbikub3JpZ2luSWQpIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uQnV0dG9uVXNlZEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb24uZW50aXR5SWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQ7XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBUcmFkZUFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb24ub3JpZ2luSWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQ7XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBBdHRhY2hpbmdFbmNoYW50bWVudEFjdGlvbiAmJiBjdXJyZW50QWN0aW9uIGluc3RhbmNlb2YgQ2FyZFRhcmdldEFjdGlvbikge1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24ub3JpZ2luSWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQgJiZcclxuXHRcdFx0XHRkZWVwRXF1YWwocHJldmlvdXNBY3Rpb24udGFyZ2V0SWRzID8/IFtdLCBjdXJyZW50QWN0aW9uLnRhcmdldElkcyA/PyBbXSlcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRQbGF5ZWRGcm9tSGFuZEFjdGlvbiAmJiBjdXJyZW50QWN0aW9uIGluc3RhbmNlb2YgQ2FyZFRhcmdldEFjdGlvbikge1xyXG5cdFx0XHRpZiAocHJldmlvdXNBY3Rpb24uZW50aXR5SWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQpIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBtZXJnZUFjdGlvbnMocHJldmlvdXNBY3Rpb246IEFjdGlvbiwgY3VycmVudEFjdGlvbjogQWN0aW9uKTogQWN0aW9uIHtcclxuXHRcdGlmIChjdXJyZW50QWN0aW9uIGluc3RhbmNlb2YgQXR0YWNoaW5nRW5jaGFudG1lbnRBY3Rpb24pIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKFxyXG5cdFx0XHRcdCdpbmNvcnJlY3QgQXR0YWNoaW5nRW5jaGFudG1lbnRBY3Rpb24gYXMgY3VycmVudCBhY3Rpb24gZm9yIGNhcmQtdGFyZ2V0LXBhcnNlcicsXHJcblx0XHRcdFx0Y3VycmVudEFjdGlvbixcclxuXHRcdFx0KTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uQnV0dG9uVXNlZEFjdGlvbikge1xyXG5cdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnbWVyZ2luZyBhY3Rpb25zJywgcHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24pO1xyXG5cdFx0XHRyZXR1cm4gQWN0aW9uSGVscGVyLm1lcmdlSW50b0ZpcnN0QWN0aW9uKHByZXZpb3VzQWN0aW9uLCBjdXJyZW50QWN0aW9uLCB7XHJcblx0XHRcdFx0ZW50aXRpZXM6IGN1cnJlbnRBY3Rpb24uZW50aXRpZXMsXHJcblx0XHRcdFx0ZW50aXR5SWQ6IHByZXZpb3VzQWN0aW9uLmVudGl0eUlkLFxyXG5cdFx0XHRcdG9yaWdpbklkOiBjdXJyZW50QWN0aW9uLm9yaWdpbklkLFxyXG5cdFx0XHRcdHRhcmdldElkczogWy4uLihwcmV2aW91c0FjdGlvbi50YXJnZXRJZHMgPz8gW10pLCAuLi4oY3VycmVudEFjdGlvbi50YXJnZXRJZHMgPz8gW10pXS5maWx0ZXIoXHJcblx0XHRcdFx0XHQoaWQsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YoaWQpID09PSBpbmRleCxcclxuXHRcdFx0XHQpIGFzIHJlYWRvbmx5IG51bWJlcltdLFxyXG5cdFx0XHR9IGFzIEFjdGlvbkJ1dHRvblVzZWRBY3Rpb24pO1xyXG5cdFx0fSBlbHNlIGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRQbGF5ZWRGcm9tSGFuZEFjdGlvbikge1xyXG5cdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnbWVyZ2luZyBhY3Rpb25zJywgcHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24pO1xyXG5cdFx0XHRyZXR1cm4gQWN0aW9uSGVscGVyLm1lcmdlSW50b0ZpcnN0QWN0aW9uKHByZXZpb3VzQWN0aW9uLCBjdXJyZW50QWN0aW9uLCB7XHJcblx0XHRcdFx0ZW50aXRpZXM6IGN1cnJlbnRBY3Rpb24uZW50aXRpZXMsXHJcblx0XHRcdFx0ZW50aXR5SWQ6IHByZXZpb3VzQWN0aW9uLmVudGl0eUlkLFxyXG5cdFx0XHRcdG9yaWdpbklkOiBjdXJyZW50QWN0aW9uLm9yaWdpbklkLFxyXG5cdFx0XHRcdHRhcmdldElkczogWy4uLihwcmV2aW91c0FjdGlvbi50YXJnZXRJZHMgPz8gW10pLCAuLi4oY3VycmVudEFjdGlvbi50YXJnZXRJZHMgPz8gW10pXS5maWx0ZXIoXHJcblx0XHRcdFx0XHQoaWQsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YoaWQpID09PSBpbmRleCxcclxuXHRcdFx0XHQpIGFzIHJlYWRvbmx5IG51bWJlcltdLFxyXG5cdFx0XHR9IGFzIENhcmRQbGF5ZWRGcm9tSGFuZEFjdGlvbik7XHJcblx0XHR9IGVsc2UgaWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQ2FyZFRhcmdldEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gQ2FyZFRhcmdldEFjdGlvbi5jcmVhdGUoXHJcblx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0dGltZXN0YW1wOiBwcmV2aW91c0FjdGlvbi50aW1lc3RhbXAsXHJcblx0XHRcdFx0XHRpbmRleDogcHJldmlvdXNBY3Rpb24uaW5kZXgsXHJcblx0XHRcdFx0XHRlbnRpdGllczogY3VycmVudEFjdGlvbi5lbnRpdGllcyxcclxuXHRcdFx0XHRcdG9yaWdpbklkOiBjdXJyZW50QWN0aW9uLm9yaWdpbklkLFxyXG5cdFx0XHRcdFx0dGFyZ2V0SWRzOiBbLi4uKHByZXZpb3VzQWN0aW9uLnRhcmdldElkcyA/PyBbXSksIC4uLihjdXJyZW50QWN0aW9uLnRhcmdldElkcyA/PyBbXSldLmZpbHRlcihcclxuXHRcdFx0XHRcdFx0KGlkLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKGlkKSA9PT0gaW5kZXgsXHJcblx0XHRcdFx0XHQpIGFzIHJlYWRvbmx5IG51bWJlcltdLFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0dGhpcy5hbGxDYXJkcyxcclxuXHRcdFx0KTtcclxuXHRcdH0gZWxzZSBpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBBdHRhY2hpbmdFbmNoYW50bWVudEFjdGlvbiB8fCBwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIFRyYWRlQWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiBwcmV2aW91c0FjdGlvbjtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIl19