@firestone-hs/replay-parser
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.
144 lines • 22.5 kB
JavaScript
import { BlockType, CardType, GameTag, MetaTags } from '@firestone-hs/reference-data';
import isEqual from 'lodash-es/isEqual';
import uniq from 'lodash-es/uniq';
import { AttachingEnchantmentAction } from '../../models/action/attaching-enchantment-action';
import { CardTargetAction } from '../../models/action/card-target-action';
import { PowerTargetAction } from '../../models/action/power-target-action';
import { ActionHistoryItem } from '../../models/history/action-history-item';
import { MetadataHistoryItem } from '../../models/history/metadata-history-item';
import { ActionButtonUsedAction, CardPlayedFromHandAction, SummonAction } from '../../models/models';
import { ActionHelper } from './action-helper';
export class PowerTargetParser {
constructor(allCards) {
this.allCards = allCards;
}
applies(item) {
if (!(item instanceof MetadataHistoryItem)) {
return false;
}
const meta = item.meta;
if (!meta.info && !meta.meta) {
return false;
}
if (meta.meta !== MetaTags[MetaTags.TARGET]) {
return false;
}
return true;
}
parse(item, currentTurn, entitiesBeforeAction, history) {
const meta = item.meta;
const parentAction = history
.filter(historyItem => historyItem.index === item.meta.parentIndex)
.filter(historyItem => historyItem instanceof ActionHistoryItem)
.map(historyItem => historyItem)[0];
if (parseInt(parentAction.node.attributes.type) !== BlockType.POWER &&
parseInt(parentAction.node.attributes.type) !== BlockType.TRIGGER) {
return;
}
// TODO: hard-code Malchezaar?
if (meta.info) {
// // console.log('building power action', parentAction.node, parentAction, entitiesBeforeAction.get(35)?.tags?.toJS())
return meta.info
.map(info => this.buildPowerActions(entitiesBeforeAction, parentAction, meta, info))
.reduce((a, b) => a.concat(b), []);
}
}
buildPowerActions(entities, item, meta, info) {
const entityId = parseInt(item.node.attributes.entity);
// Prevent a spell from targeting itself
if (entityId === info.entity &&
entities.get(entityId) &&
entities.get(entityId).getTag(GameTag.CARDTYPE) === CardType.SPELL) {
return [];
}
let target = info.entity;
if (!target && parseInt(item.node.attributes.target)) {
target = parseInt(item.node.attributes.target);
}
if (!target) {
return [];
}
return [
PowerTargetAction.create({
timestamp: item.timestamp,
index: meta.index,
originId: entityId,
targetIds: [target],
}, this.allCards),
];
}
reduce(actions) {
return ActionHelper.combineActions(actions, (previous, current) => this.shouldMergeActions(previous, current), (previous, current) => this.mergeActions(previous, current));
}
shouldMergeActions(previousAction, currentAction) {
if (!(currentAction instanceof PowerTargetAction)) {
return false;
}
if (previousAction instanceof PowerTargetAction) {
return previousAction.originId === currentAction.originId;
}
if (previousAction instanceof ActionButtonUsedAction) {
return previousAction.entityId === currentAction.originId;
}
// Spells that target would trigger twice otherwise
if (previousAction instanceof CardTargetAction) {
return previousAction.originId === currentAction.originId;
}
if (previousAction instanceof AttachingEnchantmentAction) {
if (previousAction.originId === currentAction.originId &&
isEqual(previousAction.targetIds, currentAction.targetIds)) {
return true;
}
}
if (previousAction instanceof CardPlayedFromHandAction) {
return previousAction.entityId === currentAction.originId;
}
if (previousAction instanceof SummonAction) {
return previousAction.originId === currentAction.originId;
}
return false;
}
mergeActions(previousAction, currentAction) {
if (!(currentAction instanceof PowerTargetAction)) {
console.warn('incorrect currentAction as current action for power-target-parser', currentAction);
return;
}
if (previousAction instanceof PowerTargetAction || previousAction instanceof CardTargetAction) {
return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, {
entities: currentAction.entities,
originId: currentAction.originId,
targetIds: uniq([
...uniq(previousAction.targetIds || []),
...uniq(currentAction.targetIds || []),
]),
});
}
else if (previousAction instanceof AttachingEnchantmentAction) {
return previousAction;
}
else if (previousAction instanceof SummonAction) {
return previousAction;
}
else if (previousAction instanceof ActionButtonUsedAction) {
return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, {
entities: currentAction.entities,
entityId: previousAction.entityId,
targetIds: uniq([
...uniq(previousAction.targetIds || []),
...uniq(currentAction.targetIds || []),
]),
});
}
else if (previousAction instanceof CardPlayedFromHandAction) {
return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, {
entities: currentAction.entities,
originId: previousAction.entityId,
targetIds: uniq([
...uniq(previousAction.targetIds || []),
...uniq(currentAction.targetIds || []),
]),
});
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG93ZXItdGFyZ2V0LXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vcG93ZXItdGFyZ2V0LXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdEYsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDOUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHdCQUF3QixFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSXJHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcvQyxNQUFNLE9BQU8saUJBQWlCO0lBQzdCLFlBQW9CLFFBQXlCO1FBQXpCLGFBQVEsR0FBUixRQUFRLENBQWlCO0lBQUcsQ0FBQztJQUUxQyxPQUFPLENBQUMsSUFBaUI7UUFDL0IsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLG1CQUFtQixDQUFDLEVBQUU7WUFDM0MsT0FBTyxLQUFLLENBQUM7U0FDYjtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzdCLE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM1QyxPQUFPLEtBQUssQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRU0sS0FBSyxDQUNYLElBQXlCLEVBQ3pCLFdBQW1CLEVBQ25CLG9CQUF5QyxFQUN6QyxPQUErQjtRQUUvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sWUFBWSxHQUFHLE9BQU87YUFDMUIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUNsRSxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLFlBQVksaUJBQWlCLENBQUM7YUFDL0QsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBZ0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQ0MsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLO1lBQy9ELFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUNoRTtZQUNELE9BQU87U0FDUDtRQUNELDhCQUE4QjtRQUM5QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCx1SEFBdUg7WUFDdkgsT0FBTyxJQUFJLENBQUMsSUFBSTtpQkFDZCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDbkYsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNwQztJQUNGLENBQUM7SUFFTyxpQkFBaUIsQ0FDeEIsUUFBNkIsRUFDN0IsSUFBdUIsRUFDdkIsSUFBYyxFQUNkLElBQVU7UUFFVixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsd0NBQXdDO1FBQ3hDLElBQ0MsUUFBUSxLQUFLLElBQUksQ0FBQyxNQUFNO1lBQ3hCLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ3RCLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLENBQUMsS0FBSyxFQUNqRTtZQUNELE9BQU8sRUFBRSxDQUFDO1NBQ1Y7UUFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3JELE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0M7UUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1osT0FBTyxFQUFFLENBQUM7U0FDVjtRQUNELE9BQU87WUFDTixpQkFBaUIsQ0FBQyxNQUFNLENBQ3ZCO2dCQUNDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixRQUFRLEVBQUUsUUFBUTtnQkFDbEIsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO2FBQ25CLEVBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FDYjtTQUNELENBQUM7SUFDSCxDQUFDO0lBRU0sTUFBTSxDQUFDLE9BQTBCO1FBQ3ZDLE9BQU8sWUFBWSxDQUFDLGNBQWMsQ0FDakMsT0FBTyxFQUNQLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFDakUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FDM0QsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxjQUFzQixFQUFFLGFBQXFCO1FBQ3ZFLElBQUksQ0FBQyxDQUFDLGFBQWEsWUFBWSxpQkFBaUIsQ0FBQyxFQUFFO1lBQ2xELE9BQU8sS0FBSyxDQUFDO1NBQ2I7UUFDRCxJQUFJLGNBQWMsWUFBWSxpQkFBaUIsRUFBRTtZQUNoRCxPQUFPLGNBQWMsQ0FBQyxRQUFRLEtBQUssYUFBYSxDQUFDLFFBQVEsQ0FBQztTQUMxRDtRQUNELElBQUksY0FBYyxZQUFZLHNCQUFzQixFQUFFO1lBQ3JELE9BQU8sY0FBYyxDQUFDLFFBQVEsS0FBSyxhQUFhLENBQUMsUUFBUSxDQUFDO1NBQzFEO1FBQ0QsbURBQW1EO1FBQ25ELElBQUksY0FBYyxZQUFZLGdCQUFnQixFQUFFO1lBQy9DLE9BQU8sY0FBYyxDQUFDLFFBQVEsS0FBSyxhQUFhLENBQUMsUUFBUSxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxjQUFjLFlBQVksMEJBQTBCLEVBQUU7WUFDekQsSUFDQyxjQUFjLENBQUMsUUFBUSxLQUFLLGFBQWEsQ0FBQyxRQUFRO2dCQUNsRCxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQ3pEO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ1o7U0FDRDtRQUNELElBQUksY0FBYyxZQUFZLHdCQUF3QixFQUFFO1lBQ3ZELE9BQU8sY0FBYyxDQUFDLFFBQVEsS0FBSyxhQUFhLENBQUMsUUFBUSxDQUFDO1NBQzFEO1FBQ0QsSUFBSSxjQUFjLFlBQVksWUFBWSxFQUFFO1lBQzNDLE9BQU8sY0FBYyxDQUFDLFFBQVEsS0FBSyxhQUFhLENBQUMsUUFBUSxDQUFDO1NBQzFEO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRU8sWUFBWSxDQUFDLGNBQXNCLEVBQUUsYUFBcUI7UUFDakUsSUFBSSxDQUFDLENBQUMsYUFBYSxZQUFZLGlCQUFpQixDQUFDLEVBQUU7WUFDbEQsT0FBTyxDQUFDLElBQUksQ0FBQyxtRUFBbUUsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNqRyxPQUFPO1NBQ1A7UUFDRCxJQUFJLGNBQWMsWUFBWSxpQkFBaUIsSUFBSSxjQUFjLFlBQVksZ0JBQWdCLEVBQUU7WUFDOUYsT0FBTyxZQUFZLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRTtnQkFDdkUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO2dCQUNoQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7Z0JBQ2hDLFNBQVMsRUFBRSxJQUFJLENBQUM7b0JBQ2YsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7b0JBQ3ZDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO2lCQUN0QyxDQUFzQjthQUNGLENBQUMsQ0FBQztTQUN4QjthQUFNLElBQUksY0FBYyxZQUFZLDBCQUEwQixFQUFFO1lBQ2hFLE9BQU8sY0FBYyxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxjQUFjLFlBQVksWUFBWSxFQUFFO1lBQ2xELE9BQU8sY0FBYyxDQUFDO1NBQ3RCO2FBQU0sSUFBSSxjQUFjLFlBQVksc0JBQXNCLEVBQUU7WUFDNUQsT0FBTyxZQUFZLENBQUMsb0JBQW9CLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRTtnQkFDdkUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO2dCQUNoQyxRQUFRLEVBQUUsY0FBYyxDQUFDLFFBQVE7Z0JBQ2pDLFNBQVMsRUFBRSxJQUFJLENBQUM7b0JBQ2YsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7b0JBQ3ZDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO2lCQUN0QyxDQUFzQjthQUNHLENBQUMsQ0FBQztTQUM3QjthQUFNLElBQUksY0FBYyxZQUFZLHdCQUF3QixFQUFFO1lBQzlELE9BQU8sWUFBWSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUU7Z0JBQ3ZFLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtnQkFDaEMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO2dCQUNqQyxTQUFTLEVBQUUsSUFBSSxDQUFDO29CQUNmLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO29CQUN2QyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztpQkFDdEMsQ0FBc0I7YUFDSyxDQUFDLENBQUM7U0FDL0I7SUFDRixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCbG9ja1R5cGUsIENhcmRUeXBlLCBHYW1lVGFnLCBNZXRhVGFncyB9IGZyb20gJ0BmaXJlc3RvbmUtaHMvcmVmZXJlbmNlLWRhdGEnO1xyXG5pbXBvcnQgeyBNYXAgfSBmcm9tICdpbW11dGFibGUnO1xyXG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gtZXMvaXNFcXVhbCc7XHJcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC1lcy91bmlxJztcclxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9hY3Rpb24nO1xyXG5pbXBvcnQgeyBBdHRhY2hpbmdFbmNoYW50bWVudEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vYXR0YWNoaW5nLWVuY2hhbnRtZW50LWFjdGlvbic7XHJcbmltcG9ydCB7IENhcmRUYXJnZXRBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uL2NhcmQtdGFyZ2V0LWFjdGlvbic7XHJcbmltcG9ydCB7IFBvd2VyVGFyZ2V0QWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9wb3dlci10YXJnZXQtYWN0aW9uJztcclxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvZW50aXR5JztcclxuaW1wb3J0IHsgQWN0aW9uSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9hY3Rpb24taGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBNZXRhZGF0YUhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hpc3RvcnkvbWV0YWRhdGEtaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgQWN0aW9uQnV0dG9uVXNlZEFjdGlvbiwgQ2FyZFBsYXllZEZyb21IYW5kQWN0aW9uLCBTdW1tb25BY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvbW9kZWxzJztcclxuaW1wb3J0IHsgSW5mbyB9IGZyb20gJy4uLy4uL21vZGVscy9wYXJzZXIvaW5mbyc7XHJcbmltcG9ydCB7IE1ldGFEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BhcnNlci9tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEFsbENhcmRzU2VydmljZSB9IGZyb20gJy4uL2FsbC1jYXJkcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWN0aW9uSGVscGVyIH0gZnJvbSAnLi9hY3Rpb24taGVscGVyJztcclxuaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSAnLi9wYXJzZXInO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBvd2VyVGFyZ2V0UGFyc2VyIGltcGxlbWVudHMgUGFyc2VyIHtcclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGFsbENhcmRzOiBBbGxDYXJkc1NlcnZpY2UpIHt9XHJcblxyXG5cdHB1YmxpYyBhcHBsaWVzKGl0ZW06IEhpc3RvcnlJdGVtKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIShpdGVtIGluc3RhbmNlb2YgTWV0YWRhdGFIaXN0b3J5SXRlbSkpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgbWV0YSA9IGl0ZW0ubWV0YTtcclxuXHRcdGlmICghbWV0YS5pbmZvICYmICFtZXRhLm1ldGEpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKG1ldGEubWV0YSAhPT0gTWV0YVRhZ3NbTWV0YVRhZ3MuVEFSR0VUXSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBwYXJzZShcclxuXHRcdGl0ZW06IE1ldGFkYXRhSGlzdG9yeUl0ZW0sXHJcblx0XHRjdXJyZW50VHVybjogbnVtYmVyLFxyXG5cdFx0ZW50aXRpZXNCZWZvcmVBY3Rpb246IE1hcDxudW1iZXIsIEVudGl0eT4sXHJcblx0XHRoaXN0b3J5OiByZWFkb25seSBIaXN0b3J5SXRlbVtdLFxyXG5cdCk6IEFjdGlvbltdIHtcclxuXHRcdGNvbnN0IG1ldGEgPSBpdGVtLm1ldGE7XHJcblx0XHRjb25zdCBwYXJlbnRBY3Rpb24gPSBoaXN0b3J5XHJcblx0XHRcdC5maWx0ZXIoaGlzdG9yeUl0ZW0gPT4gaGlzdG9yeUl0ZW0uaW5kZXggPT09IGl0ZW0ubWV0YS5wYXJlbnRJbmRleClcclxuXHRcdFx0LmZpbHRlcihoaXN0b3J5SXRlbSA9PiBoaXN0b3J5SXRlbSBpbnN0YW5jZW9mIEFjdGlvbkhpc3RvcnlJdGVtKVxyXG5cdFx0XHQubWFwKGhpc3RvcnlJdGVtID0+IGhpc3RvcnlJdGVtIGFzIEFjdGlvbkhpc3RvcnlJdGVtKVswXTtcclxuXHRcdGlmIChcclxuXHRcdFx0cGFyc2VJbnQocGFyZW50QWN0aW9uLm5vZGUuYXR0cmlidXRlcy50eXBlKSAhPT0gQmxvY2tUeXBlLlBPV0VSICYmXHJcblx0XHRcdHBhcnNlSW50KHBhcmVudEFjdGlvbi5ub2RlLmF0dHJpYnV0ZXMudHlwZSkgIT09IEJsb2NrVHlwZS5UUklHR0VSXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Ly8gVE9ETzogaGFyZC1jb2RlIE1hbGNoZXphYXI/XHJcblx0XHRpZiAobWV0YS5pbmZvKSB7XHJcblx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdidWlsZGluZyBwb3dlciBhY3Rpb24nLCBwYXJlbnRBY3Rpb24ubm9kZSwgcGFyZW50QWN0aW9uLCBlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoMzUpPy50YWdzPy50b0pTKCkpXHJcblx0XHRcdHJldHVybiBtZXRhLmluZm9cclxuXHRcdFx0XHQubWFwKGluZm8gPT4gdGhpcy5idWlsZFBvd2VyQWN0aW9ucyhlbnRpdGllc0JlZm9yZUFjdGlvbiwgcGFyZW50QWN0aW9uLCBtZXRhLCBpbmZvKSlcclxuXHRcdFx0XHQucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBidWlsZFBvd2VyQWN0aW9ucyhcclxuXHRcdGVudGl0aWVzOiBNYXA8bnVtYmVyLCBFbnRpdHk+LFxyXG5cdFx0aXRlbTogQWN0aW9uSGlzdG9yeUl0ZW0sXHJcblx0XHRtZXRhOiBNZXRhRGF0YSxcclxuXHRcdGluZm86IEluZm8sXHJcblx0KTogUG93ZXJUYXJnZXRBY3Rpb25bXSB7XHJcblx0XHRjb25zdCBlbnRpdHlJZCA9IHBhcnNlSW50KGl0ZW0ubm9kZS5hdHRyaWJ1dGVzLmVudGl0eSk7XHJcblx0XHQvLyBQcmV2ZW50IGEgc3BlbGwgZnJvbSB0YXJnZXRpbmcgaXRzZWxmXHJcblx0XHRpZiAoXHJcblx0XHRcdGVudGl0eUlkID09PSBpbmZvLmVudGl0eSAmJlxyXG5cdFx0XHRlbnRpdGllcy5nZXQoZW50aXR5SWQpICYmXHJcblx0XHRcdGVudGl0aWVzLmdldChlbnRpdHlJZCkuZ2V0VGFnKEdhbWVUYWcuQ0FSRFRZUEUpID09PSBDYXJkVHlwZS5TUEVMTFxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHRcdGxldCB0YXJnZXQgPSBpbmZvLmVudGl0eTtcclxuXHRcdGlmICghdGFyZ2V0ICYmIHBhcnNlSW50KGl0ZW0ubm9kZS5hdHRyaWJ1dGVzLnRhcmdldCkpIHtcclxuXHRcdFx0dGFyZ2V0ID0gcGFyc2VJbnQoaXRlbS5ub2RlLmF0dHJpYnV0ZXMudGFyZ2V0KTtcclxuXHRcdH1cclxuXHRcdGlmICghdGFyZ2V0KSB7XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBbXHJcblx0XHRcdFBvd2VyVGFyZ2V0QWN0aW9uLmNyZWF0ZShcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHR0aW1lc3RhbXA6IGl0ZW0udGltZXN0YW1wLFxyXG5cdFx0XHRcdFx0aW5kZXg6IG1ldGEuaW5kZXgsXHJcblx0XHRcdFx0XHRvcmlnaW5JZDogZW50aXR5SWQsXHJcblx0XHRcdFx0XHR0YXJnZXRJZHM6IFt0YXJnZXRdLFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0dGhpcy5hbGxDYXJkcyxcclxuXHRcdFx0KSxcclxuXHRcdF07XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgcmVkdWNlKGFjdGlvbnM6IHJlYWRvbmx5IEFjdGlvbltdKTogcmVhZG9ubHkgQWN0aW9uW10ge1xyXG5cdFx0cmV0dXJuIEFjdGlvbkhlbHBlci5jb21iaW5lQWN0aW9uczxBY3Rpb24+KFxyXG5cdFx0XHRhY3Rpb25zLFxyXG5cdFx0XHQocHJldmlvdXMsIGN1cnJlbnQpID0+IHRoaXMuc2hvdWxkTWVyZ2VBY3Rpb25zKHByZXZpb3VzLCBjdXJyZW50KSxcclxuXHRcdFx0KHByZXZpb3VzLCBjdXJyZW50KSA9PiB0aGlzLm1lcmdlQWN0aW9ucyhwcmV2aW91cywgY3VycmVudCksXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzaG91bGRNZXJnZUFjdGlvbnMocHJldmlvdXNBY3Rpb246IEFjdGlvbiwgY3VycmVudEFjdGlvbjogQWN0aW9uKTogYm9vbGVhbiB7XHJcblx0XHRpZiAoIShjdXJyZW50QWN0aW9uIGluc3RhbmNlb2YgUG93ZXJUYXJnZXRBY3Rpb24pKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIFBvd2VyVGFyZ2V0QWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiBwcmV2aW91c0FjdGlvbi5vcmlnaW5JZCA9PT0gY3VycmVudEFjdGlvbi5vcmlnaW5JZDtcclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIEFjdGlvbkJ1dHRvblVzZWRBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIHByZXZpb3VzQWN0aW9uLmVudGl0eUlkID09PSBjdXJyZW50QWN0aW9uLm9yaWdpbklkO1xyXG5cdFx0fVxyXG5cdFx0Ly8gU3BlbGxzIHRoYXQgdGFyZ2V0IHdvdWxkIHRyaWdnZXIgdHdpY2Ugb3RoZXJ3aXNlXHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBDYXJkVGFyZ2V0QWN0aW9uKSB7XHJcblx0XHRcdHJldHVybiBwcmV2aW91c0FjdGlvbi5vcmlnaW5JZCA9PT0gY3VycmVudEFjdGlvbi5vcmlnaW5JZDtcclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIEF0dGFjaGluZ0VuY2hhbnRtZW50QWN0aW9uKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRwcmV2aW91c0FjdGlvbi5vcmlnaW5JZCA9PT0gY3VycmVudEFjdGlvbi5vcmlnaW5JZCAmJlxyXG5cdFx0XHRcdGlzRXF1YWwocHJldmlvdXNBY3Rpb24udGFyZ2V0SWRzLCBjdXJyZW50QWN0aW9uLnRhcmdldElkcylcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRQbGF5ZWRGcm9tSGFuZEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb24uZW50aXR5SWQgPT09IGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQ7XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBTdW1tb25BY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIHByZXZpb3VzQWN0aW9uLm9yaWdpbklkID09PSBjdXJyZW50QWN0aW9uLm9yaWdpbklkO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBtZXJnZUFjdGlvbnMocHJldmlvdXNBY3Rpb246IEFjdGlvbiwgY3VycmVudEFjdGlvbjogQWN0aW9uKTogQWN0aW9uIHtcclxuXHRcdGlmICghKGN1cnJlbnRBY3Rpb24gaW5zdGFuY2VvZiBQb3dlclRhcmdldEFjdGlvbikpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdpbmNvcnJlY3QgY3VycmVudEFjdGlvbiBhcyBjdXJyZW50IGFjdGlvbiBmb3IgcG93ZXItdGFyZ2V0LXBhcnNlcicsIGN1cnJlbnRBY3Rpb24pO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0XHRpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBQb3dlclRhcmdldEFjdGlvbiB8fCBwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRUYXJnZXRBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIEFjdGlvbkhlbHBlci5tZXJnZUludG9GaXJzdEFjdGlvbihwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbiwge1xyXG5cdFx0XHRcdGVudGl0aWVzOiBjdXJyZW50QWN0aW9uLmVudGl0aWVzLFxyXG5cdFx0XHRcdG9yaWdpbklkOiBjdXJyZW50QWN0aW9uLm9yaWdpbklkLFxyXG5cdFx0XHRcdHRhcmdldElkczogdW5pcShbXHJcblx0XHRcdFx0XHQuLi51bmlxKHByZXZpb3VzQWN0aW9uLnRhcmdldElkcyB8fCBbXSksXHJcblx0XHRcdFx0XHQuLi51bmlxKGN1cnJlbnRBY3Rpb24udGFyZ2V0SWRzIHx8IFtdKSxcclxuXHRcdFx0XHRdKSBhcyByZWFkb25seSBudW1iZXJbXSxcclxuXHRcdFx0fSBhcyBQb3dlclRhcmdldEFjdGlvbik7XHJcblx0XHR9IGVsc2UgaWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQXR0YWNoaW5nRW5jaGFudG1lbnRBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIHByZXZpb3VzQWN0aW9uO1xyXG5cdFx0fSBlbHNlIGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIFN1bW1vbkFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gcHJldmlvdXNBY3Rpb247XHJcblx0XHR9IGVsc2UgaWYgKHByZXZpb3VzQWN0aW9uIGluc3RhbmNlb2YgQWN0aW9uQnV0dG9uVXNlZEFjdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gQWN0aW9uSGVscGVyLm1lcmdlSW50b0ZpcnN0QWN0aW9uKHByZXZpb3VzQWN0aW9uLCBjdXJyZW50QWN0aW9uLCB7XHJcblx0XHRcdFx0ZW50aXRpZXM6IGN1cnJlbnRBY3Rpb24uZW50aXRpZXMsXHJcblx0XHRcdFx0ZW50aXR5SWQ6IHByZXZpb3VzQWN0aW9uLmVudGl0eUlkLFxyXG5cdFx0XHRcdHRhcmdldElkczogdW5pcShbXHJcblx0XHRcdFx0XHQuLi51bmlxKHByZXZpb3VzQWN0aW9uLnRhcmdldElkcyB8fCBbXSksXHJcblx0XHRcdFx0XHQuLi51bmlxKGN1cnJlbnRBY3Rpb24udGFyZ2V0SWRzIHx8IFtdKSxcclxuXHRcdFx0XHRdKSBhcyByZWFkb25seSBudW1iZXJbXSxcclxuXHRcdFx0fSBhcyBBY3Rpb25CdXR0b25Vc2VkQWN0aW9uKTtcclxuXHRcdH0gZWxzZSBpZiAocHJldmlvdXNBY3Rpb24gaW5zdGFuY2VvZiBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24pIHtcclxuXHRcdFx0cmV0dXJuIEFjdGlvbkhlbHBlci5tZXJnZUludG9GaXJzdEFjdGlvbihwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbiwge1xyXG5cdFx0XHRcdGVudGl0aWVzOiBjdXJyZW50QWN0aW9uLmVudGl0aWVzLFxyXG5cdFx0XHRcdG9yaWdpbklkOiBwcmV2aW91c0FjdGlvbi5lbnRpdHlJZCxcclxuXHRcdFx0XHR0YXJnZXRJZHM6IHVuaXEoW1xyXG5cdFx0XHRcdFx0Li4udW5pcShwcmV2aW91c0FjdGlvbi50YXJnZXRJZHMgfHwgW10pLFxyXG5cdFx0XHRcdFx0Li4udW5pcShjdXJyZW50QWN0aW9uLnRhcmdldElkcyB8fCBbXSksXHJcblx0XHRcdFx0XSkgYXMgcmVhZG9ubHkgbnVtYmVyW10sXHJcblx0XHRcdH0gYXMgQ2FyZFBsYXllZEZyb21IYW5kQWN0aW9uKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIl19