valtech-components 4.0.580 → 4.0.583
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.
- package/esm2022/lib/components/organisms/mini-games/chessimals-adventure-data.mjs +279 -0
- package/esm2022/lib/components/organisms/mini-games/chessimals-adventure-progress.service.mjs +79 -0
- package/esm2022/lib/components/organisms/mini-games/chessimals-adventure.component.mjs +234 -0
- package/esm2022/lib/components/organisms/mini-games/chessimals-game.component.mjs +76 -5
- package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +103 -3
- package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/mini-games/public-api.mjs +49 -7
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/valtech-components-mini-games.mjs +49 -7
- package/fesm2022/valtech-components-mini-games.mjs.map +1 -1
- package/fesm2022/valtech-components.mjs +3072 -2326
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/mini-games/chessimals-adventure-data.d.ts +4 -0
- package/lib/components/organisms/mini-games/chessimals-adventure-progress.service.d.ts +16 -0
- package/lib/components/organisms/mini-games/chessimals-adventure.component.d.ts +30 -0
- package/lib/components/organisms/mini-games/chessimals-game.component.d.ts +14 -2
- package/lib/components/organisms/mini-games/types.d.ts +36 -0
- package/lib/version.d.ts +1 -1
- package/mini-games/public-api.d.ts +11 -0
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { NgClass } from '@angular/common';
|
|
2
|
+
import { Component, computed, inject, signal } from '@angular/core';
|
|
3
|
+
import { Router } from '@angular/router';
|
|
4
|
+
import { IonBadge, IonButton, IonIcon } from '@ionic/angular/standalone';
|
|
5
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
|
6
|
+
import { I18nService } from '../../../services/i18n';
|
|
7
|
+
import { MINI_GAMES_I18N } from './mini-games.i18n';
|
|
8
|
+
import { CHESSIMALS_ADVENTURE_ACTS, adventureActIsUnlocked, adventureNodeIsAvailable, } from './chessimals-adventure-data';
|
|
9
|
+
import { ChessimalsAdventureProgressService } from './chessimals-adventure-progress.service';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
const ADVENTURE_ROUTE_BASE = '/mini-games/chessimals';
|
|
12
|
+
export class ChessimalsAdventureComponent {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.i18n = inject(I18nService);
|
|
15
|
+
this.router = inject(Router);
|
|
16
|
+
this.progressService = inject(ChessimalsAdventureProgressService);
|
|
17
|
+
this.progress = toSignal(this.progressService.watchProgress(), {
|
|
18
|
+
initialValue: undefined,
|
|
19
|
+
});
|
|
20
|
+
this.selectedActId = signal('act1');
|
|
21
|
+
this.totalStars = computed(() => this.progress()?.totalStars ?? 0);
|
|
22
|
+
this.actViews = computed(() => {
|
|
23
|
+
const prog = this.progress();
|
|
24
|
+
const completed = prog?.completedNodes ?? {};
|
|
25
|
+
return CHESSIMALS_ADVENTURE_ACTS.map(act => {
|
|
26
|
+
const unlocked = adventureActIsUnlocked(act.id, completed);
|
|
27
|
+
const nodes = act.nodes.map(node => {
|
|
28
|
+
const result = completed[node.id];
|
|
29
|
+
let status;
|
|
30
|
+
if (result) {
|
|
31
|
+
status = 'completed';
|
|
32
|
+
}
|
|
33
|
+
else if (!unlocked || !adventureNodeIsAvailable(node.id, completed)) {
|
|
34
|
+
status = 'locked';
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
status = 'available';
|
|
38
|
+
}
|
|
39
|
+
return { node, status, stars: result?.stars ?? 0 };
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
act,
|
|
43
|
+
unlocked,
|
|
44
|
+
nodes,
|
|
45
|
+
completedCount: nodes.filter(n => n.status === 'completed').length,
|
|
46
|
+
totalCount: nodes.length,
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
if (!this.i18n.hasNamespace('MiniGames')) {
|
|
51
|
+
this.i18n.registerContent('MiniGames', MINI_GAMES_I18N);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
t(key) {
|
|
55
|
+
return this.i18n.t(key, 'MiniGames');
|
|
56
|
+
}
|
|
57
|
+
nodeIcon(type) {
|
|
58
|
+
switch (type) {
|
|
59
|
+
case 'battle':
|
|
60
|
+
return '⚔️';
|
|
61
|
+
case 'boss':
|
|
62
|
+
return '💀';
|
|
63
|
+
case 'rest':
|
|
64
|
+
return '🏕️';
|
|
65
|
+
case 'mystery':
|
|
66
|
+
return '❓';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
onNodeTap(nodeView) {
|
|
70
|
+
if (nodeView.status === 'locked')
|
|
71
|
+
return;
|
|
72
|
+
if (nodeView.node.type === 'rest' || nodeView.node.type === 'mystery')
|
|
73
|
+
return;
|
|
74
|
+
void this.router.navigate([ADVENTURE_ROUTE_BASE], {
|
|
75
|
+
queryParams: {
|
|
76
|
+
adventureNode: nodeView.node.id,
|
|
77
|
+
profileId: nodeView.node.profileId,
|
|
78
|
+
difficulty: nodeView.node.difficulty,
|
|
79
|
+
boardSize: nodeView.node.boardSize ?? 6,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChessimalsAdventureComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
84
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChessimalsAdventureComponent, isStandalone: true, selector: "val-chessimals-adventure", ngImport: i0, template: `
|
|
85
|
+
<div class="adventure-hub">
|
|
86
|
+
<header class="adventure-hub__header">
|
|
87
|
+
<p class="adventure-hub__eyebrow">{{ t('chessimalsAdventureEyebrow') }}</p>
|
|
88
|
+
<h1 class="adventure-hub__title">{{ t('chessimalsAdventureTitle') }}</h1>
|
|
89
|
+
<p class="adventure-hub__subtitle">{{ t('chessimalsAdventureSubtitle') }}</p>
|
|
90
|
+
<div class="adventure-hub__stars">
|
|
91
|
+
<ion-icon name="star" />
|
|
92
|
+
<span>{{ totalStars() }}</span>
|
|
93
|
+
</div>
|
|
94
|
+
</header>
|
|
95
|
+
|
|
96
|
+
<div class="adventure-hub__acts">
|
|
97
|
+
@for (actView of actViews(); track actView.act.id) {
|
|
98
|
+
<section
|
|
99
|
+
class="adventure-act"
|
|
100
|
+
[ngClass]="{
|
|
101
|
+
'adventure-act--locked': !actView.unlocked,
|
|
102
|
+
'adventure-act--done': actView.completedCount === actView.totalCount && actView.unlocked,
|
|
103
|
+
}"
|
|
104
|
+
>
|
|
105
|
+
<div class="adventure-act__head">
|
|
106
|
+
<span class="adventure-act__emoji">{{ actView.act.emoji }}</span>
|
|
107
|
+
<div class="adventure-act__meta">
|
|
108
|
+
<h2 class="adventure-act__name">{{ t(actView.act.titleKey) }}</h2>
|
|
109
|
+
<p class="adventure-act__desc">{{ t(actView.act.descriptionKey) }}</p>
|
|
110
|
+
</div>
|
|
111
|
+
@if (!actView.unlocked) {
|
|
112
|
+
<ion-icon name="lock-closed-outline" class="adventure-act__lock" />
|
|
113
|
+
} @else {
|
|
114
|
+
<span class="adventure-act__progress"> {{ actView.completedCount }}/{{ actView.totalCount }} </span>
|
|
115
|
+
}
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
@if (actView.unlocked) {
|
|
119
|
+
<div class="adventure-act__nodes">
|
|
120
|
+
@for (nodeView of actView.nodes; track nodeView.node.id) {
|
|
121
|
+
<button
|
|
122
|
+
class="adventure-node"
|
|
123
|
+
[ngClass]="{
|
|
124
|
+
'adventure-node--available': nodeView.status === 'available',
|
|
125
|
+
'adventure-node--completed': nodeView.status === 'completed',
|
|
126
|
+
'adventure-node--locked': nodeView.status === 'locked',
|
|
127
|
+
}"
|
|
128
|
+
[disabled]="nodeView.status === 'locked'"
|
|
129
|
+
(click)="onNodeTap(nodeView)"
|
|
130
|
+
type="button"
|
|
131
|
+
>
|
|
132
|
+
<span class="adventure-node__icon">{{ nodeIcon(nodeView.node.type) }}</span>
|
|
133
|
+
<span class="adventure-node__label">{{ t(nodeView.node.titleKey) }}</span>
|
|
134
|
+
<span class="adventure-node__stars">
|
|
135
|
+
@for (i of [0, 1, 2]; track i) {
|
|
136
|
+
<ion-icon
|
|
137
|
+
[name]="nodeView.stars > i ? 'star' : 'star-outline'"
|
|
138
|
+
class="adventure-node__star"
|
|
139
|
+
[ngClass]="{ 'adventure-node__star--filled': nodeView.stars > i }"
|
|
140
|
+
/>
|
|
141
|
+
}
|
|
142
|
+
</span>
|
|
143
|
+
@if (nodeView.node.type === 'boss') {
|
|
144
|
+
<ion-badge color="warning" class="adventure-node__badge">
|
|
145
|
+
{{ t('chessimalsAdventureBoss') }}
|
|
146
|
+
</ion-badge>
|
|
147
|
+
}
|
|
148
|
+
</button>
|
|
149
|
+
}
|
|
150
|
+
</div>
|
|
151
|
+
}
|
|
152
|
+
</section>
|
|
153
|
+
}
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
`, isInline: true, styles: [".adventure-hub{padding:0 0 40px}.adventure-hub__header{padding:20px 16px 24px;text-align:center}.adventure-hub__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--ion-color-medium);margin:0 0 6px}.adventure-hub__title{font-size:1.75rem;font-weight:800;margin:0 0 6px;color:var(--ion-text-color)}.adventure-hub__subtitle{font-size:.9rem;color:var(--ion-color-medium);margin:0 0 12px}.adventure-hub__stars{display:inline-flex;align-items:center;gap:4px;background:var(--ion-card-background, var(--ion-background-color));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:20px;padding:4px 14px;font-weight:700;font-size:.95rem;color:var(--ion-color-warning)}.adventure-hub__stars ion-icon{color:var(--ion-color-warning);font-size:1rem}.adventure-hub__acts{display:flex;flex-direction:column;gap:16px;padding:0 12px}.adventure-act{border-radius:16px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color));overflow:hidden}.adventure-act--locked{opacity:.5}.adventure-act--done{border-color:var(--ion-color-success)}.adventure-act__head{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}.adventure-act__emoji{font-size:1.75rem;line-height:1;flex-shrink:0}.adventure-act__meta{flex:1;min-width:0}.adventure-act__name{font-size:1rem;font-weight:700;margin:0 0 2px;color:var(--ion-text-color)}.adventure-act__desc{font-size:.8rem;color:var(--ion-color-medium);margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.adventure-act__lock{color:var(--ion-color-medium);font-size:1.25rem;flex-shrink:0}.adventure-act__progress{font-size:.8rem;font-weight:700;color:var(--ion-color-medium);flex-shrink:0}.adventure-act__nodes{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px;padding:12px}.adventure-node{position:relative;display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 8px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-background-color, #f8f8f8);cursor:pointer;text-align:center;transition:transform .12s ease,border-color .12s ease}.adventure-node:active{transform:scale(.97)}.adventure-node--available{border-color:var(--ion-color-primary);background:color-mix(in srgb,var(--ion-color-primary) 6%,transparent)}.adventure-node--completed{border-color:var(--ion-color-success);background:color-mix(in srgb,var(--ion-color-success) 6%,transparent)}.adventure-node--locked{opacity:.4;cursor:default}.adventure-node__icon{font-size:1.5rem;line-height:1}.adventure-node__label{font-size:.75rem;font-weight:600;color:var(--ion-text-color);line-height:1.2}.adventure-node__stars{display:flex;gap:1px}.adventure-node__star{font-size:.7rem;color:var(--ion-color-medium)}.adventure-node__star--filled{color:var(--ion-color-warning)}.adventure-node__badge{position:absolute;top:-4px;right:-4px;font-size:.6rem;padding:2px 5px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonBadge, selector: "ion-badge", inputs: ["color", "mode"] }] }); }
|
|
157
|
+
}
|
|
158
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChessimalsAdventureComponent, decorators: [{
|
|
159
|
+
type: Component,
|
|
160
|
+
args: [{ selector: 'val-chessimals-adventure', standalone: true, imports: [NgClass, IonButton, IonIcon, IonBadge], template: `
|
|
161
|
+
<div class="adventure-hub">
|
|
162
|
+
<header class="adventure-hub__header">
|
|
163
|
+
<p class="adventure-hub__eyebrow">{{ t('chessimalsAdventureEyebrow') }}</p>
|
|
164
|
+
<h1 class="adventure-hub__title">{{ t('chessimalsAdventureTitle') }}</h1>
|
|
165
|
+
<p class="adventure-hub__subtitle">{{ t('chessimalsAdventureSubtitle') }}</p>
|
|
166
|
+
<div class="adventure-hub__stars">
|
|
167
|
+
<ion-icon name="star" />
|
|
168
|
+
<span>{{ totalStars() }}</span>
|
|
169
|
+
</div>
|
|
170
|
+
</header>
|
|
171
|
+
|
|
172
|
+
<div class="adventure-hub__acts">
|
|
173
|
+
@for (actView of actViews(); track actView.act.id) {
|
|
174
|
+
<section
|
|
175
|
+
class="adventure-act"
|
|
176
|
+
[ngClass]="{
|
|
177
|
+
'adventure-act--locked': !actView.unlocked,
|
|
178
|
+
'adventure-act--done': actView.completedCount === actView.totalCount && actView.unlocked,
|
|
179
|
+
}"
|
|
180
|
+
>
|
|
181
|
+
<div class="adventure-act__head">
|
|
182
|
+
<span class="adventure-act__emoji">{{ actView.act.emoji }}</span>
|
|
183
|
+
<div class="adventure-act__meta">
|
|
184
|
+
<h2 class="adventure-act__name">{{ t(actView.act.titleKey) }}</h2>
|
|
185
|
+
<p class="adventure-act__desc">{{ t(actView.act.descriptionKey) }}</p>
|
|
186
|
+
</div>
|
|
187
|
+
@if (!actView.unlocked) {
|
|
188
|
+
<ion-icon name="lock-closed-outline" class="adventure-act__lock" />
|
|
189
|
+
} @else {
|
|
190
|
+
<span class="adventure-act__progress"> {{ actView.completedCount }}/{{ actView.totalCount }} </span>
|
|
191
|
+
}
|
|
192
|
+
</div>
|
|
193
|
+
|
|
194
|
+
@if (actView.unlocked) {
|
|
195
|
+
<div class="adventure-act__nodes">
|
|
196
|
+
@for (nodeView of actView.nodes; track nodeView.node.id) {
|
|
197
|
+
<button
|
|
198
|
+
class="adventure-node"
|
|
199
|
+
[ngClass]="{
|
|
200
|
+
'adventure-node--available': nodeView.status === 'available',
|
|
201
|
+
'adventure-node--completed': nodeView.status === 'completed',
|
|
202
|
+
'adventure-node--locked': nodeView.status === 'locked',
|
|
203
|
+
}"
|
|
204
|
+
[disabled]="nodeView.status === 'locked'"
|
|
205
|
+
(click)="onNodeTap(nodeView)"
|
|
206
|
+
type="button"
|
|
207
|
+
>
|
|
208
|
+
<span class="adventure-node__icon">{{ nodeIcon(nodeView.node.type) }}</span>
|
|
209
|
+
<span class="adventure-node__label">{{ t(nodeView.node.titleKey) }}</span>
|
|
210
|
+
<span class="adventure-node__stars">
|
|
211
|
+
@for (i of [0, 1, 2]; track i) {
|
|
212
|
+
<ion-icon
|
|
213
|
+
[name]="nodeView.stars > i ? 'star' : 'star-outline'"
|
|
214
|
+
class="adventure-node__star"
|
|
215
|
+
[ngClass]="{ 'adventure-node__star--filled': nodeView.stars > i }"
|
|
216
|
+
/>
|
|
217
|
+
}
|
|
218
|
+
</span>
|
|
219
|
+
@if (nodeView.node.type === 'boss') {
|
|
220
|
+
<ion-badge color="warning" class="adventure-node__badge">
|
|
221
|
+
{{ t('chessimalsAdventureBoss') }}
|
|
222
|
+
</ion-badge>
|
|
223
|
+
}
|
|
224
|
+
</button>
|
|
225
|
+
}
|
|
226
|
+
</div>
|
|
227
|
+
}
|
|
228
|
+
</section>
|
|
229
|
+
}
|
|
230
|
+
</div>
|
|
231
|
+
</div>
|
|
232
|
+
`, styles: [".adventure-hub{padding:0 0 40px}.adventure-hub__header{padding:20px 16px 24px;text-align:center}.adventure-hub__eyebrow{font-size:.75rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--ion-color-medium);margin:0 0 6px}.adventure-hub__title{font-size:1.75rem;font-weight:800;margin:0 0 6px;color:var(--ion-text-color)}.adventure-hub__subtitle{font-size:.9rem;color:var(--ion-color-medium);margin:0 0 12px}.adventure-hub__stars{display:inline-flex;align-items:center;gap:4px;background:var(--ion-card-background, var(--ion-background-color));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:20px;padding:4px 14px;font-weight:700;font-size:.95rem;color:var(--ion-color-warning)}.adventure-hub__stars ion-icon{color:var(--ion-color-warning);font-size:1rem}.adventure-hub__acts{display:flex;flex-direction:column;gap:16px;padding:0 12px}.adventure-act{border-radius:16px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color));overflow:hidden}.adventure-act--locked{opacity:.5}.adventure-act--done{border-color:var(--ion-color-success)}.adventure-act__head{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}.adventure-act__emoji{font-size:1.75rem;line-height:1;flex-shrink:0}.adventure-act__meta{flex:1;min-width:0}.adventure-act__name{font-size:1rem;font-weight:700;margin:0 0 2px;color:var(--ion-text-color)}.adventure-act__desc{font-size:.8rem;color:var(--ion-color-medium);margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.adventure-act__lock{color:var(--ion-color-medium);font-size:1.25rem;flex-shrink:0}.adventure-act__progress{font-size:.8rem;font-weight:700;color:var(--ion-color-medium);flex-shrink:0}.adventure-act__nodes{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px;padding:12px}.adventure-node{position:relative;display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 8px;border-radius:12px;border:1.5px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-background-color, #f8f8f8);cursor:pointer;text-align:center;transition:transform .12s ease,border-color .12s ease}.adventure-node:active{transform:scale(.97)}.adventure-node--available{border-color:var(--ion-color-primary);background:color-mix(in srgb,var(--ion-color-primary) 6%,transparent)}.adventure-node--completed{border-color:var(--ion-color-success);background:color-mix(in srgb,var(--ion-color-success) 6%,transparent)}.adventure-node--locked{opacity:.4;cursor:default}.adventure-node__icon{font-size:1.5rem;line-height:1}.adventure-node__label{font-size:.75rem;font-weight:600;color:var(--ion-text-color);line-height:1.2}.adventure-node__stars{display:flex;gap:1px}.adventure-node__star{font-size:.7rem;color:var(--ion-color-medium)}.adventure-node__star--filled{color:var(--ion-color-warning)}.adventure-node__badge{position:absolute;top:-4px;right:-4px;font-size:.6rem;padding:2px 5px}\n"] }]
|
|
233
|
+
}], ctorParameters: () => [] });
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlc3NpbWFscy1hZHZlbnR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9taW5pLWdhbWVzL2NoZXNzaW1hbHMtYWR2ZW50dXJlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXRELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsd0JBQXdCLEdBQ3pCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7O0FBc0I3RixNQUFNLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO0FBdVJ0RCxNQUFNLE9BQU8sNEJBQTRCO0lBd0N2QztRQXZDaUIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQixXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLG9CQUFlLEdBQUcsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFFN0QsYUFBUSxHQUFHLFFBQVEsQ0FBMEMsSUFBSSxDQUFD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Q0FBQyxRQUFRLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQ2hELFdBQVcsRUFBRTtnQkFDWCxhQUFhLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvQixTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTO2dCQUNsQyxVQUFVLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVO2dCQUNwQyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQzthQUN4QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBMUVVLDRCQUE0QjttR0FBNUIsNEJBQTRCLG9GQWpSN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdFVCxxakdBekVTLE9BQU8sb0ZBQWEsT0FBTywySkFBRSxRQUFROzs0RkFrUnBDLDRCQUE0QjtrQkFyUnhDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxZQUN0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0VUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElvbkJhZGdlLCBJb25CdXR0b24sIElvbkljb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgTUlOSV9HQU1FU19JMThOIH0gZnJvbSAnLi9taW5pLWdhbWVzLmkxOG4nO1xuaW1wb3J0IHtcbiAgQ0hFU1NJTUFMU19BRFZFTlRVUkVfQUNUUyxcbiAgYWR2ZW50dXJlQWN0SXNVbmxvY2tlZCxcbiAgYWR2ZW50dXJlTm9kZUlzQXZhaWxhYmxlLFxufSBmcm9tICcuL2NoZXNzaW1hbHMtYWR2ZW50dXJlLWRhdGEnO1xuaW1wb3J0IHsgQ2hlc3NpbWFsc0FkdmVudHVyZVByb2dyZXNzU2VydmljZSB9IGZyb20gJy4vY2hlc3NpbWFscy1hZHZlbnR1cmUtcHJvZ3Jlc3Muc2VydmljZSc7XG5pbXBvcnQge1xuICBDaGVzc2ltYWxzQWR2ZW50dXJlQWN0LFxuICBDaGVzc2ltYWxzQWR2ZW50dXJlTm9kZSxcbiAgQ2hlc3NpbWFsc0FkdmVudHVyZU5vZGVTdGF0dXMsXG4gIENoZXNzaW1hbHNBZHZlbnR1cmVQcm9ncmVzcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmludGVyZmFjZSBBZHZlbnR1cmVOb2RlVmlldyB7XG4gIG5vZGU6IENoZXNzaW1hbHNBZHZlbnR1cmVOb2RlO1xuICBzdGF0dXM6IENoZXNzaW1hbHNBZHZlbnR1cmVOb2RlU3RhdHVzO1xuICBzdGFyczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQWR2ZW50dXJlQWN0VmlldyB7XG4gIGFjdDogQ2hlc3NpbWFsc0FkdmVudHVyZUFjdDtcbiAgdW5sb2NrZWQ6IGJvb2xlYW47XG4gIG5vZGVzOiBBZHZlbnR1cmVOb2RlVmlld1tdO1xuICBjb21wbGV0ZWRDb3VudDogbnVtYmVyO1xuICB0b3RhbENvdW50OiBudW1iZXI7XG59XG5cbmNvbnN0IEFEVkVOVFVSRV9ST1VURV9CQVNFID0gJy9taW5pLWdhbWVzL2NoZXNzaW1hbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtY2hlc3NpbWFscy1hZHZlbnR1cmUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdDbGFzcywgSW9uQnV0dG9uLCBJb25JY29uLCBJb25CYWRnZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImFkdmVudHVyZS1odWJcIj5cbiAgICAgIDxoZWFkZXIgY2xhc3M9XCJhZHZlbnR1cmUtaHViX19oZWFkZXJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJhZHZlbnR1cmUtaHViX19leWVicm93XCI+e3sgdCgnY2hlc3NpbWFsc0FkdmVudHVyZUV5ZWJyb3cnKSB9fTwvcD5cbiAgICAgICAgPGgxIGNsYXNzPVwiYWR2ZW50dXJlLWh1Yl9fdGl0bGVcIj57eyB0KCdjaGVzc2ltYWxzQWR2ZW50dXJlVGl0bGUnKSB9fTwvaDE+XG4gICAgICAgIDxwIGNsYXNzPVwiYWR2ZW50dXJlLWh1Yl9fc3VidGl0bGVcIj57eyB0KCdjaGVzc2ltYWxzQWR2ZW50dXJlU3VidGl0bGUnKSB9fTwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFkdmVudHVyZS1odWJfX3N0YXJzXCI+XG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzdGFyXCIgLz5cbiAgICAgICAgICA8c3Bhbj57eyB0b3RhbFN0YXJzKCkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9oZWFkZXI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJhZHZlbnR1cmUtaHViX19hY3RzXCI+XG4gICAgICAgIEBmb3IgKGFjdFZpZXcgb2YgYWN0Vmlld3MoKTsgdHJhY2sgYWN0Vmlldy5hY3QuaWQpIHtcbiAgICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICAgY2xhc3M9XCJhZHZlbnR1cmUtYWN0XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ2FkdmVudHVyZS1hY3QtLWxvY2tlZCc6ICFhY3RWaWV3LnVubG9ja2VkLFxuICAgICAgICAgICAgICAnYWR2ZW50dXJlLWFjdC0tZG9uZSc6IGFjdFZpZXcuY29tcGxldGVkQ291bnQgPT09IGFjdFZpZXcudG90YWxDb3VudCAmJiBhY3RWaWV3LnVubG9ja2VkLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkdmVudHVyZS1hY3RfX2hlYWRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZHZlbnR1cmUtYWN0X19lbW9qaVwiPnt7IGFjdFZpZXcuYWN0LmVtb2ppIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWR2ZW50dXJlLWFjdF9fbWV0YVwiPlxuICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cImFkdmVudHVyZS1hY3RfX25hbWVcIj57eyB0KGFjdFZpZXcuYWN0LnRpdGxlS2V5KSB9fTwvaDI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhZHZlbnR1cmUtYWN0X19kZXNjXCI+e3sgdChhY3RWaWV3LmFjdC5kZXNjcmlwdGlvbktleSkgfX08L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKCFhY3RWaWV3LnVubG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJsb2NrLWNsb3NlZC1vdXRsaW5lXCIgY2xhc3M9XCJhZHZlbnR1cmUtYWN0X19sb2NrXCIgLz5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZHZlbnR1cmUtYWN0X19wcm9ncmVzc1wiPiB7eyBhY3RWaWV3LmNvbXBsZXRlZENvdW50IH19L3t7IGFjdFZpZXcudG90YWxDb3VudCB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYgKGFjdFZpZXcudW5sb2NrZWQpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkdmVudHVyZS1hY3RfX25vZGVzXCI+XG4gICAgICAgICAgICAgICAgQGZvciAobm9kZVZpZXcgb2YgYWN0Vmlldy5ub2RlczsgdHJhY2sgbm9kZVZpZXcubm9kZS5pZCkge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFkdmVudHVyZS1ub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICdhZHZlbnR1cmUtbm9kZS0tYXZhaWxhYmxlJzogbm9kZVZpZXcuc3RhdHVzID09PSAnYXZhaWxhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAnYWR2ZW50dXJlLW5vZGUtLWNvbXBsZXRlZCc6IG5vZGVWaWV3LnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgJ2FkdmVudHVyZS1ub2RlLS1sb2NrZWQnOiBub2RlVmlldy5zdGF0dXMgPT09ICdsb2NrZWQnLFxuICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5vZGVWaWV3LnN0YXR1cyA9PT0gJ2xvY2tlZCdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ob2RlVGFwKG5vZGVWaWV3KVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkdmVudHVyZS1ub2RlX19pY29uXCI+e3sgbm9kZUljb24obm9kZVZpZXcubm9kZS50eXBlKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZHZlbnR1cmUtbm9kZV9fbGFiZWxcIj57eyB0KG5vZGVWaWV3Lm5vZGUudGl0bGVLZXkpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkdmVudHVyZS1ub2RlX19zdGFyc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGkgb2YgWzAsIDEsIDJdOyB0cmFjayBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwibm9kZVZpZXcuc3RhcnMgPiBpID8gJ3N0YXInIDogJ3N0YXItb3V0bGluZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFkdmVudHVyZS1ub2RlX19zdGFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnYWR2ZW50dXJlLW5vZGVfX3N0YXItLWZpbGxlZCc6IG5vZGVWaWV3LnN0YXJzID4gaSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobm9kZVZpZXcubm9kZS50eXBlID09PSAnYm9zcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8aW9uLWJhZGdlIGNvbG9yPVwid2FybmluZ1wiIGNsYXNzPVwiYWR2ZW50dXJlLW5vZGVfX2JhZGdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB0KCdjaGVzc2ltYWxzQWR2ZW50dXJlQm9zcycpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9pb24tYmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmFkdmVudHVyZS1odWIge1xuICAgICAgICBwYWRkaW5nOiAwIDAgNDBweDtcbiAgICAgIH1cblxuICAgICAgLmFkdmVudHVyZS1odWJfX2hlYWRlciB7XG4gICAgICAgIHBhZGRpbmc6IDIwcHggMTZweCAyNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtaHViX19leWVicm93IHtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wOGVtO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIG1hcmdpbjogMCAwIDZweDtcbiAgICAgIH1cblxuICAgICAgLmFkdmVudHVyZS1odWJfX3RpdGxlIHtcbiAgICAgICAgZm9udC1zaXplOiAxLjc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogODAwO1xuICAgICAgICBtYXJnaW46IDAgMCA2cHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tdGV4dC1jb2xvcik7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtaHViX19zdWJ0aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIG1hcmdpbjogMCAwIDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtaHViX19zdGFycyB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDRweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNhcmQtYmFja2dyb3VuZCwgdmFyKC0taW9uLWJhY2tncm91bmQtY29sb3IpKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjEpKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMjBweDtcbiAgICAgICAgcGFkZGluZzogNHB4IDE0cHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci13YXJuaW5nKTtcbiAgICAgIH1cblxuICAgICAgLmFkdmVudHVyZS1odWJfX3N0YXJzIGlvbi1pY29uIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci13YXJuaW5nKTtcbiAgICAgICAgZm9udC1zaXplOiAxcmVtO1xuICAgICAgfVxuXG4gICAgICAuYWR2ZW50dXJlLWh1Yl9fYWN0cyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTZweDtcbiAgICAgICAgcGFkZGluZzogMCAxMnB4O1xuICAgICAgfVxuXG4gICAgICAuYWR2ZW50dXJlLWFjdCB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yKSk7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtYWN0LS1sb2NrZWQge1xuICAgICAgICBvcGFjaXR5OiAwLjU7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtYWN0LS1kb25lIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pb24tY29sb3Itc3VjY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtYWN0X19oZWFkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBwYWRkaW5nOiAxNHB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTtcbiAgICAgIH1cblxuICAgICAgLmFkdmVudHVyZS1hY3RfX2Vtb2ppIHtcbiAgICAgICAgZm9udC1zaXplOiAxLjc1cmVtO1xuICAgICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtYWN0X19tZXRhIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgfVxuXG4gICAgICAuYWR2ZW50dXJlLWFjdF9fbmFtZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgbWFyZ2luOiAwIDAgMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLXRleHQtY29sb3IpO1xuICAgICAgfVxuXG4gICAgICAuYWR2ZW50dXJlLWFjdF9fZGVzYyB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtYWN0X19sb2NrIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pO1xuICAgICAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuYWR2ZW50dXJlLWFjdF9fcHJvZ3Jlc3Mge1xuICAgICAgICBmb250LXNpemU6IDAuOHJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pO1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIH1cblxuICAgICAgLmFkdmVudHVyZS1hY3RfX25vZGVzIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTQwcHgsIDFmcikpO1xuICAgICAgICBnYXA6IDEwcHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtbm9kZSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA0cHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHggOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xuICAgICAgICBib3JkZXI6IDEuNXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZjhmOGY4KTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIHRyYW5zaXRpb246XG4gICAgICAgICAgdHJhbnNmb3JtIDAuMTJzIGVhc2UsXG4gICAgICAgICAgYm9yZGVyLWNvbG9yIDAuMTJzIGVhc2U7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtbm9kZTphY3RpdmUge1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTcpO1xuICAgICAgfVxuXG4gICAgICAuYWR2ZW50dXJlLW5vZGUtLWF2YWlsYWJsZSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnkpO1xuICAgICAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0taW9uLWNvbG9yLXByaW1hcnkpIDYlLCB0cmFuc3BhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtbm9kZS0tY29tcGxldGVkIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pb24tY29sb3Itc3VjY2Vzcyk7XG4gICAgICAgIGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1pb24tY29sb3Itc3VjY2VzcykgNiUsIHRyYW5zcGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgLmFkdmVudHVyZS1ub2RlLS1sb2NrZWQge1xuICAgICAgICBvcGFjaXR5OiAwLjQ7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgLmFkdmVudHVyZS1ub2RlX19pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAxLjVyZW07XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgfVxuXG4gICAgICAuYWR2ZW50dXJlLW5vZGVfX2xhYmVsIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLXRleHQtY29sb3IpO1xuICAgICAgICBsaW5lLWhlaWdodDogMS4yO1xuICAgICAgfVxuXG4gICAgICAuYWR2ZW50dXJlLW5vZGVfX3N0YXJzIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAxcHg7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtbm9kZV9fc3RhciB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICB9XG5cbiAgICAgIC5hZHZlbnR1cmUtbm9kZV9fc3Rhci0tZmlsbGVkIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci13YXJuaW5nKTtcbiAgICAgIH1cblxuICAgICAgLmFkdmVudHVyZS1ub2RlX19iYWRnZSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAtNHB4O1xuICAgICAgICByaWdodDogLTRweDtcbiAgICAgICAgZm9udC1zaXplOiAwLjZyZW07XG4gICAgICAgIHBhZGRpbmc6IDJweCA1cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2hlc3NpbWFsc0FkdmVudHVyZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvZ3Jlc3NTZXJ2aWNlID0gaW5qZWN0KENoZXNzaW1hbHNBZHZlbnR1cmVQcm9ncmVzc1NlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvZ3Jlc3MgPSB0b1NpZ25hbDxDaGVzc2ltYWxzQWR2ZW50dXJlUHJvZ3Jlc3MgfCB1bmRlZmluZWQ+KHRoaXMucHJvZ3Jlc3NTZXJ2aWNlLndhdGNoUHJvZ3Jlc3MoKSwge1xuICAgIGluaXRpYWxWYWx1ZTogdW5kZWZpbmVkLFxuICB9KTtcblxuICByZWFkb25seSBzZWxlY3RlZEFjdElkID0gc2lnbmFsPHN0cmluZz4oJ2FjdDEnKTtcblxuICByZWFkb25seSB0b3RhbFN0YXJzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wcm9ncmVzcygpPy50b3RhbFN0YXJzID8/IDApO1xuXG4gIHJlYWRvbmx5IGFjdFZpZXdzID0gY29tcHV0ZWQ8QWR2ZW50dXJlQWN0Vmlld1tdPigoKSA9PiB7XG4gICAgY29uc3QgcHJvZyA9IHRoaXMucHJvZ3Jlc3MoKTtcbiAgICBjb25zdCBjb21wbGV0ZWQgPSBwcm9nPy5jb21wbGV0ZWROb2RlcyA/PyB7fTtcbiAgICByZXR1cm4gQ0hFU1NJTUFMU19BRFZFTlRVUkVfQUNUUy5tYXAoYWN0ID0+IHtcbiAgICAgIGNvbnN0IHVubG9ja2VkID0gYWR2ZW50dXJlQWN0SXNVbmxvY2tlZChhY3QuaWQsIGNvbXBsZXRlZCk7XG4gICAgICBjb25zdCBub2RlczogQWR2ZW50dXJlTm9kZVZpZXdbXSA9IGFjdC5ub2Rlcy5tYXAobm9kZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXRlZFtub2RlLmlkXTtcbiAgICAgICAgbGV0IHN0YXR1czogQ2hlc3NpbWFsc0FkdmVudHVyZU5vZGVTdGF0dXM7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBzdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgICAgfSBlbHNlIGlmICghdW5sb2NrZWQgfHwgIWFkdmVudHVyZU5vZGVJc0F2YWlsYWJsZShub2RlLmlkLCBjb21wbGV0ZWQpKSB7XG4gICAgICAgICAgc3RhdHVzID0gJ2xvY2tlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdHVzID0gJ2F2YWlsYWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbm9kZSwgc3RhdHVzLCBzdGFyczogcmVzdWx0Py5zdGFycyA/PyAwIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdCxcbiAgICAgICAgdW5sb2NrZWQsXG4gICAgICAgIG5vZGVzLFxuICAgICAgICBjb21wbGV0ZWRDb3VudDogbm9kZXMuZmlsdGVyKG4gPT4gbi5zdGF0dXMgPT09ICdjb21wbGV0ZWQnKS5sZW5ndGgsXG4gICAgICAgIHRvdGFsQ291bnQ6IG5vZGVzLmxlbmd0aCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZSgnTWluaUdhbWVzJykpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckNvbnRlbnQoJ01pbmlHYW1lcycsIE1JTklfR0FNRVNfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgJ01pbmlHYW1lcycpO1xuICB9XG5cbiAgbm9kZUljb24odHlwZTogQ2hlc3NpbWFsc0FkdmVudHVyZU5vZGVbJ3R5cGUnXSk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdiYXR0bGUnOlxuICAgICAgICByZXR1cm4gJ+KalO+4jyc7XG4gICAgICBjYXNlICdib3NzJzpcbiAgICAgICAgcmV0dXJuICfwn5KAJztcbiAgICAgIGNhc2UgJ3Jlc3QnOlxuICAgICAgICByZXR1cm4gJ/Cfj5XvuI8nO1xuICAgICAgY2FzZSAnbXlzdGVyeSc6XG4gICAgICAgIHJldHVybiAn4p2TJztcbiAgICB9XG4gIH1cblxuICBvbk5vZGVUYXAobm9kZVZpZXc6IEFkdmVudHVyZU5vZGVWaWV3KTogdm9pZCB7XG4gICAgaWYgKG5vZGVWaWV3LnN0YXR1cyA9PT0gJ2xvY2tlZCcpIHJldHVybjtcbiAgICBpZiAobm9kZVZpZXcubm9kZS50eXBlID09PSAncmVzdCcgfHwgbm9kZVZpZXcubm9kZS50eXBlID09PSAnbXlzdGVyeScpIHJldHVybjtcbiAgICB2b2lkIHRoaXMucm91dGVyLm5hdmlnYXRlKFtBRFZFTlRVUkVfUk9VVEVfQkFTRV0sIHtcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgIGFkdmVudHVyZU5vZGU6IG5vZGVWaWV3Lm5vZGUuaWQsXG4gICAgICAgIHByb2ZpbGVJZDogbm9kZVZpZXcubm9kZS5wcm9maWxlSWQsXG4gICAgICAgIGRpZmZpY3VsdHk6IG5vZGVWaWV3Lm5vZGUuZGlmZmljdWx0eSxcbiAgICAgICAgYm9hcmRTaXplOiBub2RlVmlldy5ub2RlLmJvYXJkU2l6ZSA/PyA2LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|