valtech-components 4.0.610 → 4.0.612

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,132 @@
1
+ import { STARTING_GAME } from './christianity-catalog';
2
+ export const TUTORIAL_CHARACTER_LIMIT = 12;
3
+ export const TUTORIAL_OFFERING_LIMIT = 6;
4
+ export const TUTORIAL_OPENING_HAND_SIZE = 5;
5
+ export const TUTORIAL_LEADER_CHOICE_COUNT = 2;
6
+ export const TUTORIAL_LEADER_CHOICE_SECONDS = 15;
7
+ export const TUTORIAL_SEED = 20260728;
8
+ export function isClassicGalleryCard(card) {
9
+ return (card.frontTemplate ?? 'genesis-classic') === 'genesis-classic';
10
+ }
11
+ export function cardSortKey(card, nameResolver = c => c.name) {
12
+ const collector = card.collectorNumber ?? card.id;
13
+ return `${card.edition ?? ''}-${collector.padStart(8, '0')}-${nameResolver(card)}`;
14
+ }
15
+ export function tutorialLeaderCards(cards, nameResolver = c => c.name) {
16
+ const leaders = cards
17
+ .filter(card => card.type === 'leader' && isClassicGalleryCard(card))
18
+ .sort((a, b) => cardSortKey(a, nameResolver).localeCompare(cardSortKey(b, nameResolver), 'es'));
19
+ if (leaders.length >= 2)
20
+ return leaders.slice(0, 4);
21
+ return cards.filter(card => card.type === 'leader').slice(0, 4);
22
+ }
23
+ export function findCardByName(cards, namePart, nameResolver = c => c.name) {
24
+ return cards.find(card => nameResolver(card).toLowerCase().includes(namePart.toLowerCase()));
25
+ }
26
+ export function shuffleCards(cards, seed) {
27
+ const result = [...cards];
28
+ let state = seed >>> 0;
29
+ for (let i = result.length - 1; i > 0; i--) {
30
+ state = (state * 1664525 + 1013904223) >>> 0;
31
+ const j = state % (i + 1);
32
+ [result[i], result[j]] = [result[j], result[i]];
33
+ }
34
+ return result;
35
+ }
36
+ function ensureOpeningOffering(cards, start, size) {
37
+ const hand = cards.slice(start, start + size);
38
+ if (hand.some(card => card.type === 'offering'))
39
+ return;
40
+ const offeringIndex = cards.findIndex((card, i) => i >= start + size && card.type === 'offering');
41
+ if (offeringIndex < 0)
42
+ return;
43
+ [cards[start], cards[offeringIndex]] = [cards[offeringIndex], cards[start]];
44
+ }
45
+ export function prepareTutorialOpeningDeck(cards) {
46
+ const result = [...cards];
47
+ ensureOpeningOffering(result, 0, TUTORIAL_OPENING_HAND_SIZE);
48
+ ensureOpeningOffering(result, TUTORIAL_OPENING_HAND_SIZE, TUTORIAL_OPENING_HAND_SIZE);
49
+ return result;
50
+ }
51
+ export function createTutorialPlayer(seat, leader, hand, battleZone, nameResolver = c => c.name) {
52
+ const base = STARTING_GAME.players[seat];
53
+ const leaderLife = leader?.leaderLife ?? leader?.life ?? base.leaderMaxHp;
54
+ return {
55
+ ...structuredClone(base),
56
+ leaderCardId: leader?.id,
57
+ leaderName: leader ? nameResolver(leader) : base.leaderName,
58
+ leaderHp: leaderLife,
59
+ leaderMaxHp: leaderLife,
60
+ offerings: [],
61
+ offeringPlayedThisTurn: false,
62
+ hand,
63
+ handCount: hand ? undefined : 4,
64
+ battleZone,
65
+ };
66
+ }
67
+ export function createTutorialGame(cards, options = {}, context = {}) {
68
+ const nameResolver = context.nameResolver ?? (c => c.name);
69
+ const cardById = context.cardById;
70
+ const leaders = tutorialLeaderCards(cards, nameResolver);
71
+ const playerLeader = (cardById && options.playerLeaderId ? cardById(options.playerLeaderId) : undefined) ??
72
+ findCardByName(leaders, 'Adán', nameResolver) ??
73
+ findCardByName(leaders, 'Adan', nameResolver) ??
74
+ leaders[0];
75
+ const opponentLeader = (cardById && options.opponentLeaderId ? cardById(options.opponentLeaderId) : undefined) ??
76
+ findCardByName(leaders, 'Noé', nameResolver) ??
77
+ findCardByName(leaders, 'Noe', nameResolver) ??
78
+ leaders.find(c => c.id !== playerLeader?.id) ??
79
+ leaders[0];
80
+ const offerings = cards
81
+ .filter(c => c.type === 'offering' && isClassicGalleryCard(c))
82
+ .slice(0, TUTORIAL_OFFERING_LIMIT);
83
+ const places = cards.filter(c => c.type === 'place');
84
+ const characters = cards
85
+ .filter(c => c.type === 'character' &&
86
+ isClassicGalleryCard(c) &&
87
+ (c.cost ?? 0) <= 4 &&
88
+ (c.attack ?? 0) >= 0 &&
89
+ (c.life ?? 0) > 0)
90
+ .slice(0, TUTORIAL_CHARACTER_LIMIT);
91
+ const tutorialDeck = [...offerings, ...characters, ...offerings, ...characters.slice(0, 6)].slice(0, 28);
92
+ const shuffledDeck = prepareTutorialOpeningDeck(shuffleCards(tutorialDeck, options.seed ?? TUTORIAL_SEED));
93
+ const playerHand = shuffledDeck.slice(0, TUTORIAL_OPENING_HAND_SIZE).map(c => c.id);
94
+ const opponentHand = shuffledDeck
95
+ .slice(TUTORIAL_OPENING_HAND_SIZE, TUTORIAL_OPENING_HAND_SIZE * 2)
96
+ .map(c => c.id);
97
+ const sharedDeck = shuffledDeck.slice(TUTORIAL_OPENING_HAND_SIZE * 2).map(c => c.id);
98
+ const firstPlayer = options.firstPlayer ?? 'P1';
99
+ const firstPlayerName = firstPlayer === 'P1'
100
+ ? STARTING_GAME.players.P1.displayName
101
+ : STARTING_GAME.players.P2.displayName;
102
+ const messages = context.messages;
103
+ const log = messages
104
+ ? [`${messages.turnOf} ${firstPlayerName}.`, messages.tutorialLoaded]
105
+ : [`Turno de ${firstPlayerName}.`, 'Tutorial cargado.'];
106
+ return {
107
+ ...structuredClone(STARTING_GAME),
108
+ status: 'in_progress',
109
+ turnOwner: firstPlayer,
110
+ turnCount: 1,
111
+ matchScore: { P1: 0, P2: 0 },
112
+ sharedDeck,
113
+ placeZone: places[0] ? [places[0].id] : [],
114
+ historyZone: [],
115
+ players: {
116
+ P1: createTutorialPlayer('P1', playerLeader, playerHand, [], nameResolver),
117
+ P2: createTutorialPlayer('P2', opponentLeader, opponentHand, [], nameResolver),
118
+ },
119
+ log,
120
+ };
121
+ }
122
+ export function createTutorialSetup(leaders) {
123
+ const coinWinner = TUTORIAL_SEED % 2 === 0 ? 'P1' : 'P2';
124
+ const firstPlayer = coinWinner === 'P1' ? 'P2' : 'P1';
125
+ return {
126
+ coinWinner,
127
+ leaderPicker: coinWinner,
128
+ firstPlayer,
129
+ availableLeaders: leaders.slice(0, TUTORIAL_LEADER_CHOICE_COUNT).map(c => c.id),
130
+ };
131
+ }
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hyaXN0aWFuaXR5LXR1dG9yaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9taW5pLWdhbWVzL2NocmlzdGlhbml0eS10dXRvcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUF1QnZELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsQ0FBQztBQUM5QyxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxFQUFFLENBQUM7QUFDakQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFBZ0M7SUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksaUJBQWlCLENBQUMsS0FBSyxpQkFBaUIsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsSUFBZ0MsRUFDaEMsZUFBNkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtJQUV4RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbEQsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3JGLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEtBQW1D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RUFBRTtRQUNmLE9BQU8sRUFBRTtZQUNQLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDO1lBQzFFLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDO1NBQy9FO1FBQ0QsR0FBRztLQUNKLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxPQUFxQztJQUVyQyxNQUFNLFVBQVUsR0FBcUIsYUFBYSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNFLE1BQU0sV0FBVyxHQUFxQixVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4RSxPQUFPO1FBQ0wsVUFBVTtRQUNWLFlBQVksRUFBRSxVQUFVO1FBQ3hCLFdBQVc7UUFDWCxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDaEYsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgQ2hyaXN0aWFuaXR5UGxheWVyU3RhdGUsXG4gIENocmlzdGlhbml0eVNlYXQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU1RBUlRJTkdfR0FNRSB9IGZyb20gJy4vY2hyaXN0aWFuaXR5LWNhdGFsb2cnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENocmlzdGlhbml0eVR1dG9yaWFsU2V0dXAge1xuICBjb2luV2lubmVyOiBDaHJpc3RpYW5pdHlTZWF0O1xuICBsZWFkZXJQaWNrZXI6IENocmlzdGlhbml0eVNlYXQ7XG4gIGZpcnN0UGxheWVyOiBDaHJpc3RpYW5pdHlTZWF0O1xuICBhdmFpbGFibGVMZWFkZXJzOiBzdHJpbmdbXTtcbiAgcGxheWVyTGVhZGVySWQ/OiBzdHJpbmc7XG4gIG9wcG9uZW50TGVhZGVySWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHV0b3JpYWxHYW1lTWVzc2FnZXMge1xuICB0dXJuT2Y6IHN0cmluZztcbiAgdHV0b3JpYWxMb2FkZWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXRvcmlhbEdhbWVPcHRpb25zIHtcbiAgcGxheWVyTGVhZGVySWQ/OiBzdHJpbmc7XG4gIG9wcG9uZW50TGVhZGVySWQ/OiBzdHJpbmc7XG4gIGZpcnN0UGxheWVyPzogQ2hyaXN0aWFuaXR5U2VhdDtcbiAgc2VlZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFRVVE9SSUFMX0NIQVJBQ1RFUl9MSU1JVCA9IDEyO1xuZXhwb3J0IGNvbnN0IFRVVE9SSUFMX09GRkVSSU5HX0xJTUlUID0gNjtcbmV4cG9ydCBjb25zdCBUVVRPUklBTF9PUEVOSU5HX0hBTkRfU0laRSA9IDU7XG5leHBvcnQgY29uc3QgVFVUT1JJQUxfTEVBREVSX0NIT0lDRV9DT1VOVCA9IDI7XG5leHBvcnQgY29uc3QgVFVUT1JJQUxfTEVBREVSX0NIT0lDRV9TRUNPTkRTID0gMTU7XG5leHBvcnQgY29uc3QgVFVUT1JJQUxfU0VFRCA9IDIwMjYwNzI4O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDbGFzc2ljR2FsbGVyeUNhcmQoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChjYXJkLmZyb250VGVtcGxhdGUgPz8gJ2dlbmVzaXMtY2xhc3NpYycpID09PSAnZ2VuZXNpcy1jbGFzc2ljJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcmRTb3J0S2V5KFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgbmFtZVJlc29sdmVyOiAoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pID0+IHN0cmluZyA9IGMgPT4gYy5uYW1lXG4pOiBzdHJpbmcge1xuICBjb25zdCBjb2xsZWN0b3IgPSBjYXJkLmNvbGxlY3Rvck51bWJlciA/PyBjYXJkLmlkO1xuICByZXR1cm4gYCR7Y2FyZC5lZGl0aW9uID8/ICcnfS0ke2NvbGxlY3Rvci5wYWRTdGFydCg4LCAnMCcpfS0ke25hbWVSZXNvbHZlcihjYXJkKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHV0b3JpYWxMZWFkZXJDYXJkcyhcbiAgY2FyZHM6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW10sXG4gIG5hbWVSZXNvbHZlcjogKGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uKSA9PiBzdHJpbmcgPSBjID0+IGMubmFtZVxuKTogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXSB7XG4gIGNvbnN0IGxlYWRlcnMgPSBjYXJkc1xuICAgIC5maWx0ZXIoY2FyZCA9PiBjYXJkLnR5cGUgPT09ICdsZWFkZXInICYmIGlzQ2xhc3NpY0dhbGxlcnlDYXJkKGNhcmQpKVxuICAgIC5zb3J0KChhLCBiKSA9PiBjYXJkU29ydEtleShhLCBuYW1lUmVzb2x2ZXIpLmxvY2FsZUNvbXBhcmUoY2FyZFNvcnRLZXkoYiwgbmFtZVJlc29sdmVyKSwgJ2VzJykpO1xuICBpZiAobGVhZGVycy5sZW5ndGggPj0gMikgcmV0dXJuIGxlYWRlcnMuc2xpY2UoMCwgNCk7XG4gIHJldHVybiBjYXJkcy5maWx0ZXIoY2FyZCA9PiBjYXJkLnR5cGUgPT09ICdsZWFkZXInKS5zbGljZSgwLCA0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDYXJkQnlOYW1lKFxuICBjYXJkczogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXSxcbiAgbmFtZVBhcnQ6IHN0cmluZyxcbiAgbmFtZVJlc29sdmVyOiAoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pID0+IHN0cmluZyA9IGMgPT4gYy5uYW1lXG4pOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjYXJkcy5maW5kKGNhcmQgPT4gbmFtZVJlc29sdmVyKGNhcmQpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobmFtZVBhcnQudG9Mb3dlckNhc2UoKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZUNhcmRzKFxuICBjYXJkczogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25bXSxcbiAgc2VlZDogbnVtYmVyXG4pOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbltdIHtcbiAgY29uc3QgcmVzdWx0ID0gWy4uLmNhcmRzXTtcbiAgbGV0IHN0YXRlID0gc2VlZCA+Pj4gMDtcbiAgZm9yIChsZXQgaSA9IHJlc3VsdC5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgc3RhdGUgPSAoc3RhdGUgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMykgPj4+IDA7XG4gICAgY29uc3QgaiA9IHN0YXRlICUgKGkgKyAxKTtcbiAgICBbcmVzdWx0W2ldLCByZXN1bHRbal1dID0gW3Jlc3VsdFtqXSwgcmVzdWx0W2ldXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBlbnN1cmVPcGVuaW5nT2ZmZXJpbmcoXG4gIGNhcmRzOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbltdLFxuICBzdGFydDogbnVtYmVyLFxuICBzaXplOiBudW1iZXJcbik6IHZvaWQge1xuICBjb25zdCBoYW5kID0gY2FyZHMuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgc2l6ZSk7XG4gIGlmIChoYW5kLnNvbWUoY2FyZCA9PiBjYXJkLnR5cGUgPT09ICdvZmZlcmluZycpKSByZXR1cm47XG4gIGNvbnN0IG9mZmVyaW5nSW5kZXggPSBjYXJkcy5maW5kSW5kZXgoKGNhcmQsIGkpID0+IGkgPj0gc3RhcnQgKyBzaXplICYmIGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJyk7XG4gIGlmIChvZmZlcmluZ0luZGV4IDwgMCkgcmV0dXJuO1xuICBbY2FyZHNbc3RhcnRdLCBjYXJkc1tvZmZlcmluZ0luZGV4XV0gPSBbY2FyZHNbb2ZmZXJpbmdJbmRleF0sIGNhcmRzW3N0YXJ0XV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlVHV0b3JpYWxPcGVuaW5nRGVjayhcbiAgY2FyZHM6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW11cbik6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW10ge1xuICBjb25zdCByZXN1bHQgPSBbLi4uY2FyZHNdO1xuICBlbnN1cmVPcGVuaW5nT2ZmZXJpbmcocmVzdWx0LCAwLCBUVVRPUklBTF9PUEVOSU5HX0hBTkRfU0laRSk7XG4gIGVuc3VyZU9wZW5pbmdPZmZlcmluZyhyZXN1bHQsIFRVVE9SSUFMX09QRU5JTkdfSEFORF9TSVpFLCBUVVRPUklBTF9PUEVOSU5HX0hBTkRfU0laRSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUdXRvcmlhbFBsYXllcihcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgbGVhZGVyOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCxcbiAgaGFuZDogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gIGJhdHRsZVpvbmU6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlW10sXG4gIG5hbWVSZXNvbHZlcjogKGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uKSA9PiBzdHJpbmcgPSBjID0+IGMubmFtZVxuKTogQ2hyaXN0aWFuaXR5UGxheWVyU3RhdGUge1xuICBjb25zdCBiYXNlID0gU1RBUlRJTkdfR0FNRS5wbGF5ZXJzW3NlYXRdO1xuICBjb25zdCBsZWFkZXJMaWZlID0gbGVhZGVyPy5sZWFkZXJMaWZlID8/IGxlYWRlcj8ubGlmZSA/PyBiYXNlLmxlYWRlck1heEhwO1xuICByZXR1cm4ge1xuICAgIC4uLnN0cnVjdHVyZWRDbG9uZShiYXNlKSxcbiAgICBsZWFkZXJDYXJkSWQ6IGxlYWRlcj8uaWQsXG4gICAgbGVhZGVyTmFtZTogbGVhZGVyID8gbmFtZVJlc29sdmVyKGxlYWRlcikgOiBiYXNlLmxlYWRlck5hbWUsXG4gICAgbGVhZGVySHA6IGxlYWRlckxpZmUsXG4gICAgbGVhZGVyTWF4SHA6IGxlYWRlckxpZmUsXG4gICAgb2ZmZXJpbmdzOiBbXSxcbiAgICBvZmZlcmluZ1BsYXllZFRoaXNUdXJuOiBmYWxzZSxcbiAgICBoYW5kLFxuICAgIGhhbmRDb3VudDogaGFuZCA/IHVuZGVmaW5lZCA6IDQsXG4gICAgYmF0dGxlWm9uZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR1dG9yaWFsR2FtZShcbiAgY2FyZHM6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW10sXG4gIG9wdGlvbnM6IFR1dG9yaWFsR2FtZU9wdGlvbnMgPSB7fSxcbiAgY29udGV4dDoge1xuICAgIG1lc3NhZ2VzPzogVHV0b3JpYWxHYW1lTWVzc2FnZXM7XG4gICAgbmFtZVJlc29sdmVyPzogKGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uKSA9PiBzdHJpbmc7XG4gICAgY2FyZEJ5SWQ/OiAoaWQ6IHN0cmluZykgPT4gQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24gfCB1bmRlZmluZWQ7XG4gIH0gPSB7fVxuKTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlIHtcbiAgY29uc3QgbmFtZVJlc29sdmVyID0gY29udGV4dC5uYW1lUmVzb2x2ZXIgPz8gKGMgPT4gYy5uYW1lKTtcbiAgY29uc3QgY2FyZEJ5SWQgPSBjb250ZXh0LmNhcmRCeUlkO1xuICBjb25zdCBsZWFkZXJzID0gdHV0b3JpYWxMZWFkZXJDYXJkcyhjYXJkcywgbmFtZVJlc29sdmVyKTtcblxuICBjb25zdCBwbGF5ZXJMZWFkZXIgPVxuICAgIChjYXJkQnlJZCAmJiBvcHRpb25zLnBsYXllckxlYWRlcklkID8gY2FyZEJ5SWQob3B0aW9ucy5wbGF5ZXJMZWFkZXJJZCkgOiB1bmRlZmluZWQpID8/XG4gICAgZmluZENhcmRCeU5hbWUobGVhZGVycywgJ0Fkw6FuJywgbmFtZVJlc29sdmVyKSA/P1xuICAgIGZpbmRDYXJkQnlOYW1lKGxlYWRlcnMsICdBZGFuJywgbmFtZVJlc29sdmVyKSA/P1xuICAgIGxlYWRlcnNbMF07XG5cbiAgY29uc3Qgb3Bwb25lbnRMZWFkZXIgPVxuICAgIChjYXJkQnlJZCAmJiBvcHRpb25zLm9wcG9uZW50TGVhZGVySWQgPyBjYXJkQnlJZChvcHRpb25zLm9wcG9uZW50TGVhZGVySWQpIDogdW5kZWZpbmVkKSA/P1xuICAgIGZpbmRDYXJkQnlOYW1lKGxlYWRlcnMsICdOb8OpJywgbmFtZVJlc29sdmVyKSA/P1xuICAgIGZpbmRDYXJkQnlOYW1lKGxlYWRlcnMsICdOb2UnLCBuYW1lUmVzb2x2ZXIpID8/XG4gICAgbGVhZGVycy5maW5kKGMgPT4gYy5pZCAhPT0gcGxheWVyTGVhZGVyPy5pZCkgPz9cbiAgICBsZWFkZXJzWzBdO1xuXG4gIGNvbnN0IG9mZmVyaW5ncyA9IGNhcmRzXG4gICAgLmZpbHRlcihjID0+IGMudHlwZSA9PT0gJ29mZmVyaW5nJyAmJiBpc0NsYXNzaWNHYWxsZXJ5Q2FyZChjKSlcbiAgICAuc2xpY2UoMCwgVFVUT1JJQUxfT0ZGRVJJTkdfTElNSVQpO1xuXG4gIGNvbnN0IHBsYWNlcyA9IGNhcmRzLmZpbHRlcihjID0+IGMudHlwZSA9PT0gJ3BsYWNlJyk7XG5cbiAgY29uc3QgY2hhcmFjdGVycyA9IGNhcmRzXG4gICAgLmZpbHRlcihcbiAgICAgIGMgPT5cbiAgICAgICAgYy50eXBlID09PSAnY2hhcmFjdGVyJyAmJlxuICAgICAgICBpc0NsYXNzaWNHYWxsZXJ5Q2FyZChjKSAmJlxuICAgICAgICAoYy5jb3N0ID8/IDApIDw9IDQgJiZcbiAgICAgICAgKGMuYXR0YWNrID8/IDApID49IDAgJiZcbiAgICAgICAgKGMubGlmZSA/PyAwKSA+IDBcbiAgICApXG4gICAgLnNsaWNlKDAsIFRVVE9SSUFMX0NIQVJBQ1RFUl9MSU1JVCk7XG5cbiAgY29uc3QgdHV0b3JpYWxEZWNrID0gWy4uLm9mZmVyaW5ncywgLi4uY2hhcmFjdGVycywgLi4ub2ZmZXJpbmdzLCAuLi5jaGFyYWN0ZXJzLnNsaWNlKDAsIDYpXS5zbGljZShcbiAgICAwLFxuICAgIDI4XG4gICk7XG4gIGNvbnN0IHNodWZmbGVkRGVjayA9IHByZXBhcmVUdXRvcmlhbE9wZW5pbmdEZWNrKFxuICAgIHNodWZmbGVDYXJkcyh0dXRvcmlhbERlY2ssIG9wdGlvbnMuc2VlZCA/PyBUVVRPUklBTF9TRUVEKVxuICApO1xuXG4gIGNvbnN0IHBsYXllckhhbmQgPSBzaHVmZmxlZERlY2suc2xpY2UoMCwgVFVUT1JJQUxfT1BFTklOR19IQU5EX1NJWkUpLm1hcChjID0+IGMuaWQpO1xuICBjb25zdCBvcHBvbmVudEhhbmQgPSBzaHVmZmxlZERlY2tcbiAgICAuc2xpY2UoVFVUT1JJQUxfT1BFTklOR19IQU5EX1NJWkUsIFRVVE9SSUFMX09QRU5JTkdfSEFORF9TSVpFICogMilcbiAgICAubWFwKGMgPT4gYy5pZCk7XG4gIGNvbnN0IHNoYXJlZERlY2sgPSBzaHVmZmxlZERlY2suc2xpY2UoVFVUT1JJQUxfT1BFTklOR19IQU5EX1NJWkUgKiAyKS5tYXAoYyA9PiBjLmlkKTtcblxuICBjb25zdCBmaXJzdFBsYXllciA9IG9wdGlvbnMuZmlyc3RQbGF5ZXIgPz8gJ1AxJztcbiAgY29uc3QgZmlyc3RQbGF5ZXJOYW1lID1cbiAgICBmaXJzdFBsYXllciA9PT0gJ1AxJ1xuICAgICAgPyBTVEFSVElOR19HQU1FLnBsYXllcnMuUDEuZGlzcGxheU5hbWVcbiAgICAgIDogU1RBUlRJTkdfR0FNRS5wbGF5ZXJzLlAyLmRpc3BsYXlOYW1lO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gY29udGV4dC5tZXNzYWdlcztcbiAgY29uc3QgbG9nID0gbWVzc2FnZXNcbiAgICA/IFtgJHttZXNzYWdlcy50dXJuT2Z9ICR7Zmlyc3RQbGF5ZXJOYW1lfS5gLCBtZXNzYWdlcy50dXRvcmlhbExvYWRlZF1cbiAgICA6IFtgVHVybm8gZGUgJHtmaXJzdFBsYXllck5hbWV9LmAsICdUdXRvcmlhbCBjYXJnYWRvLiddO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RydWN0dXJlZENsb25lKFNUQVJUSU5HX0dBTUUpLFxuICAgIHN0YXR1czogJ2luX3Byb2dyZXNzJyxcbiAgICB0dXJuT3duZXI6IGZpcnN0UGxheWVyLFxuICAgIHR1cm5Db3VudDogMSxcbiAgICBtYXRjaFNjb3JlOiB7IFAxOiAwLCBQMjogMCB9LFxuICAgIHNoYXJlZERlY2ssXG4gICAgcGxhY2Vab25lOiBwbGFjZXNbMF0gPyBbcGxhY2VzWzBdLmlkXSA6IFtdLFxuICAgIGhpc3Rvcnlab25lOiBbXSxcbiAgICBwbGF5ZXJzOiB7XG4gICAgICBQMTogY3JlYXRlVHV0b3JpYWxQbGF5ZXIoJ1AxJywgcGxheWVyTGVhZGVyLCBwbGF5ZXJIYW5kLCBbXSwgbmFtZVJlc29sdmVyKSxcbiAgICAgIFAyOiBjcmVhdGVUdXRvcmlhbFBsYXllcignUDInLCBvcHBvbmVudExlYWRlciwgb3Bwb25lbnRIYW5kLCBbXSwgbmFtZVJlc29sdmVyKSxcbiAgICB9LFxuICAgIGxvZyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR1dG9yaWFsU2V0dXAoXG4gIGxlYWRlcnM6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uW11cbik6IENocmlzdGlhbml0eVR1dG9yaWFsU2V0dXAge1xuICBjb25zdCBjb2luV2lubmVyOiBDaHJpc3RpYW5pdHlTZWF0ID0gVFVUT1JJQUxfU0VFRCAlIDIgPT09IDAgPyAnUDEnIDogJ1AyJztcbiAgY29uc3QgZmlyc3RQbGF5ZXI6IENocmlzdGlhbml0eVNlYXQgPSBjb2luV2lubmVyID09PSAnUDEnID8gJ1AyJyA6ICdQMSc7XG4gIHJldHVybiB7XG4gICAgY29pbldpbm5lcixcbiAgICBsZWFkZXJQaWNrZXI6IGNvaW5XaW5uZXIsXG4gICAgZmlyc3RQbGF5ZXIsXG4gICAgYXZhaWxhYmxlTGVhZGVyczogbGVhZGVycy5zbGljZSgwLCBUVVRPUklBTF9MRUFERVJfQ0hPSUNFX0NPVU5UKS5tYXAoYyA9PiBjLmlkKSxcbiAgfTtcbn1cbiJdfQ==