angular-debug-recorder 1.0.0 → 1.0.1

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.
@@ -123,394 +123,394 @@ export class DebugPanelComponent {
123
123
  e.preventDefault();
124
124
  }
125
125
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DebugPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
126
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DebugPanelComponent, isStandalone: true, selector: "app-debug-panel", ngImport: i0, template: `
127
- <!-- Toggle FAB -->
128
- <button
129
- data-debug-panel
130
- class="debug-fab"
131
- [class.recording]="recorder.isRecording()"
132
- [class.pulse]="recorder.isRecording() && !recorder.isPaused()"
133
- (click)="togglePanel()"
134
- [title]="panelOpen() ? 'Debug Panel schließen' : 'Debug Panel öffnen'"
135
- >
136
- <span class="fab-icon">{{ recorder.isRecording() ? '⏺' : '🐛' }}</span>
137
- @if (recorder.isRecording() && recorder.actionCount() > 0) {
138
- <span class="fab-badge">{{ recorder.actionCount() }}</span>
139
- }
140
- </button>
141
-
142
- <!-- Main Panel -->
143
- @if (panelOpen()) {
144
- <div
145
- data-debug-panel
146
- class="debug-panel"
147
- [class]="'pos-' + position()"
148
- [style.width.px]="panelWidth()"
149
- >
150
- <!-- Header -->
151
- <div class="panel-header" (mousedown)="startDrag($event)">
152
- <div class="header-left">
153
- <span class="panel-icon">🐛</span>
154
- <span class="panel-title">Debug Recorder</span>
155
- @if (recorder.isRecording()) {
156
- <span class="rec-indicator" [class.paused]="recorder.isPaused()">
157
- {{ recorder.isPaused() ? '⏸ PAUSED' : '⏺ REC' }}
158
- </span>
159
- }
160
- </div>
161
- <div class="header-actions">
162
- <button class="icon-btn" title="Einstellungen" (click)="showSettings.set(true)">⚙️</button>
163
- <button class="icon-btn" title="Position wechseln" (click)="cyclePosition()">📌</button>
164
- <button class="icon-btn" title="Schließen" (click)="togglePanel()">✕</button>
165
- </div>
166
- </div>
167
-
168
- <!-- Session Name Input (only when not recording) -->
169
- @if (!recorder.isRecording()) {
170
- <div class="session-setup">
171
- <input
172
- data-debug-panel
173
- class="session-input"
174
- type="text"
175
- [(ngModel)]="sessionName"
176
- placeholder="Session-Name (optional)"
177
- />
178
- <textarea
179
- data-debug-panel
180
- class="session-desc"
181
- [(ngModel)]="sessionDesc"
182
- placeholder="Fehlerbeschreibung..."
183
- rows="2"
184
- ></textarea>
185
- </div>
186
- }
187
-
188
- <!-- Recording Controls -->
189
- <div class="recording-controls" data-debug-panel>
190
- @if (!recorder.isRecording()) {
191
- <button class="ctrl-btn start" (click)="startRecording()">
192
- ▶ Aufnahme starten
193
- </button>
194
- } @else {
195
- <button class="ctrl-btn pause" (click)="recorder.pauseRecording()">
196
- {{ recorder.isPaused() ? '▶ Fortsetzen' : '⏸ Pause' }}
197
- </button>
198
- <button class="ctrl-btn stop" (click)="stopRecording()">
199
- ⏹ Stoppen
200
- </button>
201
- <button class="ctrl-btn clear" title="Aktionen löschen" (click)="recorder.clearCurrentSession()">
202
- 🗑
203
- </button>
204
- }
205
-
206
- @if (hasActions()) {
207
- <button
208
- class="ctrl-btn generate"
209
- [disabled]="aiService.isGenerating() || !aiService.webhookUrl()"
210
- [title]="!aiService.webhookUrl() ? 'Webhook-URL in Einstellungen eintragen' : 'Cypress Test generieren'"
211
- (click)="generateTest()"
212
- >
213
- @if (aiService.isGenerating()) {
214
- <span class="spinner">⟳</span> Generiere...
215
- } @else {
216
- 🤖 → Cypress Test
217
- }
218
- </button>
219
- }
220
- </div>
221
-
222
- <!-- Error Banner -->
223
- @if (aiService.error()) {
224
- <div class="error-banner" data-debug-panel>
225
- ⚠️ {{ aiService.error() }}
226
- </div>
227
- }
228
-
229
- <!-- Tabs -->
230
- <div class="tab-bar" data-debug-panel>
231
- <button
232
- class="tab-btn"
233
- [class.active]="activeTab() === 'actions'"
234
- (click)="activeTab.set('actions')"
235
- >
236
- Aktionen
237
- @if (recorder.actionCount() > 0) {
238
- <span class="tab-badge">{{ recorder.actionCount() }}</span>
239
- }
240
- </button>
241
- <button
242
- class="tab-btn"
243
- [class.active]="activeTab() === 'replay'"
244
- (click)="activeTab.set('replay')"
245
- title="rrweb Session Replay"
246
- >
247
- 📽️ Replay
248
- @if (rrweb.events().length > 0) {
249
- <span class="tab-badge">{{ rrweb.events().length }}</span>
250
- }
251
- </button>
252
- <button
253
- class="tab-btn"
254
- [class.active]="activeTab() === 'test'"
255
- [disabled]="!aiService.lastTest()"
256
- (click)="activeTab.set('test')"
257
- >
258
- 🤖 Test
259
- @if (aiService.lastTest()) {
260
- <span class="tab-badge new">NEU</span>
261
- }
262
- </button>
263
- <button
264
- class="tab-btn"
265
- [class.active]="activeTab() === 'sessions'"
266
- [disabled]="recorder.sessions().length === 0"
267
- (click)="activeTab.set('sessions')"
268
- >
269
- Sessions ({{ recorder.sessions().length }})
270
- </button>
271
- </div>
272
-
273
- <!-- Tab Content -->
274
- <div class="tab-content">
275
- @if (activeTab() === 'actions') {
276
- <app-action-list
277
- [session]="recorder.currentSession()"
278
- (removeAction)="recorder.removeAction($event)"
279
- (addNote)="recorder.addNote($event.id, $event.note)"
280
- />
281
- }
282
-
283
- @if (activeTab() === 'replay') {
284
- <app-session-replay />
285
- }
286
-
287
- @if (activeTab() === 'test') {
288
- <app-test-preview [test]="aiService.lastTest()" />
289
- }
290
-
291
- @if (activeTab() === 'sessions') {
292
- <div class="sessions-list">
293
- @for (session of recorder.sessions(); track session.id) {
294
- <div class="session-card">
295
- <div class="session-card-header">
296
- <span class="session-name">{{ session.name }}</span>
297
- <span class="session-meta">{{ session.actions.length }} Aktionen</span>
298
- </div>
299
- <div class="session-card-actions">
300
- <button class="sm-btn" (click)="loadAndGenerate(session)">🤖 Neu generieren</button>
301
- <button class="sm-btn danger" (click)="recorder.deleteSession(session.id)">🗑</button>
302
- </div>
303
- </div>
304
- }
305
- </div>
306
- }
307
- </div>
308
-
309
- <!-- Resize Handle -->
310
- <div class="resize-handle" (mousedown)="startResize($event)">⠿</div>
311
- </div>
312
- }
313
-
314
- <!-- Settings Dialog -->
315
- @if (showSettings()) {
316
- <app-settings-dialog (close)="showSettings.set(false)" />
317
- }
126
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DebugPanelComponent, isStandalone: true, selector: "app-debug-panel", ngImport: i0, template: `
127
+ <!-- Toggle FAB -->
128
+ <button
129
+ data-debug-panel
130
+ class="debug-fab"
131
+ [class.recording]="recorder.isRecording()"
132
+ [class.pulse]="recorder.isRecording() && !recorder.isPaused()"
133
+ (click)="togglePanel()"
134
+ [title]="panelOpen() ? 'Debug Panel schließen' : 'Debug Panel öffnen'"
135
+ >
136
+ <span class="fab-icon">{{ recorder.isRecording() ? '⏺' : '🐛' }}</span>
137
+ @if (recorder.isRecording() && recorder.actionCount() > 0) {
138
+ <span class="fab-badge">{{ recorder.actionCount() }}</span>
139
+ }
140
+ </button>
141
+
142
+ <!-- Main Panel -->
143
+ @if (panelOpen()) {
144
+ <div
145
+ data-debug-panel
146
+ class="debug-panel"
147
+ [class]="'pos-' + position()"
148
+ [style.width.px]="panelWidth()"
149
+ >
150
+ <!-- Header -->
151
+ <div class="panel-header" (mousedown)="startDrag($event)">
152
+ <div class="header-left">
153
+ <span class="panel-icon">🐛</span>
154
+ <span class="panel-title">Debug Recorder</span>
155
+ @if (recorder.isRecording()) {
156
+ <span class="rec-indicator" [class.paused]="recorder.isPaused()">
157
+ {{ recorder.isPaused() ? '⏸ PAUSED' : '⏺ REC' }}
158
+ </span>
159
+ }
160
+ </div>
161
+ <div class="header-actions">
162
+ <button class="icon-btn" title="Einstellungen" (click)="showSettings.set(true)">⚙️</button>
163
+ <button class="icon-btn" title="Position wechseln" (click)="cyclePosition()">📌</button>
164
+ <button class="icon-btn" title="Schließen" (click)="togglePanel()">✕</button>
165
+ </div>
166
+ </div>
167
+
168
+ <!-- Session Name Input (only when not recording) -->
169
+ @if (!recorder.isRecording()) {
170
+ <div class="session-setup">
171
+ <input
172
+ data-debug-panel
173
+ class="session-input"
174
+ type="text"
175
+ [(ngModel)]="sessionName"
176
+ placeholder="Session-Name (optional)"
177
+ />
178
+ <textarea
179
+ data-debug-panel
180
+ class="session-desc"
181
+ [(ngModel)]="sessionDesc"
182
+ placeholder="Fehlerbeschreibung..."
183
+ rows="2"
184
+ ></textarea>
185
+ </div>
186
+ }
187
+
188
+ <!-- Recording Controls -->
189
+ <div class="recording-controls" data-debug-panel>
190
+ @if (!recorder.isRecording()) {
191
+ <button class="ctrl-btn start" (click)="startRecording()">
192
+ ▶ Aufnahme starten
193
+ </button>
194
+ } @else {
195
+ <button class="ctrl-btn pause" (click)="recorder.pauseRecording()">
196
+ {{ recorder.isPaused() ? '▶ Fortsetzen' : '⏸ Pause' }}
197
+ </button>
198
+ <button class="ctrl-btn stop" (click)="stopRecording()">
199
+ ⏹ Stoppen
200
+ </button>
201
+ <button class="ctrl-btn clear" title="Aktionen löschen" (click)="recorder.clearCurrentSession()">
202
+ 🗑
203
+ </button>
204
+ }
205
+
206
+ @if (hasActions()) {
207
+ <button
208
+ class="ctrl-btn generate"
209
+ [disabled]="aiService.isGenerating() || !aiService.webhookUrl()"
210
+ [title]="!aiService.webhookUrl() ? 'Webhook-URL in Einstellungen eintragen' : 'Cypress Test generieren'"
211
+ (click)="generateTest()"
212
+ >
213
+ @if (aiService.isGenerating()) {
214
+ <span class="spinner">⟳</span> Generiere...
215
+ } @else {
216
+ 🤖 → Cypress Test
217
+ }
218
+ </button>
219
+ }
220
+ </div>
221
+
222
+ <!-- Error Banner -->
223
+ @if (aiService.error()) {
224
+ <div class="error-banner" data-debug-panel>
225
+ ⚠️ {{ aiService.error() }}
226
+ </div>
227
+ }
228
+
229
+ <!-- Tabs -->
230
+ <div class="tab-bar" data-debug-panel>
231
+ <button
232
+ class="tab-btn"
233
+ [class.active]="activeTab() === 'actions'"
234
+ (click)="activeTab.set('actions')"
235
+ >
236
+ Aktionen
237
+ @if (recorder.actionCount() > 0) {
238
+ <span class="tab-badge">{{ recorder.actionCount() }}</span>
239
+ }
240
+ </button>
241
+ <button
242
+ class="tab-btn"
243
+ [class.active]="activeTab() === 'replay'"
244
+ (click)="activeTab.set('replay')"
245
+ title="rrweb Session Replay"
246
+ >
247
+ 📽️ Replay
248
+ @if (rrweb.eventCount() > 0) {
249
+ <span class="tab-badge">{{ rrweb.eventCount() }}</span>
250
+ }
251
+ </button>
252
+ <button
253
+ class="tab-btn"
254
+ [class.active]="activeTab() === 'test'"
255
+ [disabled]="!aiService.lastTest()"
256
+ (click)="activeTab.set('test')"
257
+ >
258
+ 🤖 Test
259
+ @if (aiService.lastTest()) {
260
+ <span class="tab-badge new">NEU</span>
261
+ }
262
+ </button>
263
+ <button
264
+ class="tab-btn"
265
+ [class.active]="activeTab() === 'sessions'"
266
+ [disabled]="recorder.sessions().length === 0"
267
+ (click)="activeTab.set('sessions')"
268
+ >
269
+ Sessions ({{ recorder.sessions().length }})
270
+ </button>
271
+ </div>
272
+
273
+ <!-- Tab Content -->
274
+ <div class="tab-content">
275
+ @if (activeTab() === 'actions') {
276
+ <app-action-list
277
+ [session]="recorder.currentSession()"
278
+ (removeAction)="recorder.removeAction($event)"
279
+ (addNote)="recorder.addNote($event.id, $event.note)"
280
+ />
281
+ }
282
+
283
+ @if (activeTab() === 'replay') {
284
+ <app-session-replay />
285
+ }
286
+
287
+ @if (activeTab() === 'test') {
288
+ <app-test-preview [test]="aiService.lastTest()" />
289
+ }
290
+
291
+ @if (activeTab() === 'sessions') {
292
+ <div class="sessions-list">
293
+ @for (session of recorder.sessions(); track session.id) {
294
+ <div class="session-card">
295
+ <div class="session-card-header">
296
+ <span class="session-name">{{ session.name }}</span>
297
+ <span class="session-meta">{{ session.actions.length }} Aktionen</span>
298
+ </div>
299
+ <div class="session-card-actions">
300
+ <button class="sm-btn" (click)="loadAndGenerate(session)">🤖 Neu generieren</button>
301
+ <button class="sm-btn danger" (click)="recorder.deleteSession(session.id)">🗑</button>
302
+ </div>
303
+ </div>
304
+ }
305
+ </div>
306
+ }
307
+ </div>
308
+
309
+ <!-- Resize Handle -->
310
+ <div class="resize-handle" (mousedown)="startResize($event)">⠿</div>
311
+ </div>
312
+ }
313
+
314
+ <!-- Settings Dialog -->
315
+ @if (showSettings()) {
316
+ <app-settings-dialog (close)="showSettings.set(false)" />
317
+ }
318
318
  `, isInline: true, styles: [".debug-fab{bottom:24px;right:24px;z-index:99999;width:52px;height:52px;border-radius:50%;border:none;background:#1e293b;color:#fff;font-size:22px;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 20px #0006;transition:transform .2s,background .2s;position:fixed}.debug-fab:hover{transform:scale(1.1);background:#334155}.debug-fab.recording{background:#dc2626}.debug-fab.pulse{animation:fabPulse 1.5s ease-in-out infinite}@keyframes fabPulse{0%,to{box-shadow:0 4px 20px #dc262666}50%{box-shadow:0 4px 30px #dc2626e6,0 0 0 8px #dc262626}}.fab-badge{position:absolute;top:-4px;right:-4px;background:#f59e0b;color:#000;font-size:10px;font-weight:700;min-width:18px;height:18px;border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 4px}.debug-panel{position:fixed;z-index:99998;width:420px;max-height:80vh;background:#0f172a;color:#e2e8f0;border-radius:12px;border:1px solid #1e3a5f;box-shadow:0 25px 60px #0009;display:flex;flex-direction:column;font-family:Segoe UI,system-ui,sans-serif;font-size:13px;overflow:hidden}.pos-bottom-right{bottom:88px;right:24px}.pos-bottom-left{bottom:88px;left:24px}.pos-top-right{top:24px;right:24px}.pos-top-left{top:24px;left:24px}.panel-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#1e293b;border-bottom:1px solid #334155;cursor:move;-webkit-user-select:none;user-select:none;flex-shrink:0}.header-left{display:flex;align-items:center;gap:8px}.panel-icon{font-size:16px}.panel-title{font-weight:600;font-size:14px;color:#f1f5f9}.rec-indicator{font-size:10px;font-weight:700;color:#ef4444;background:#ef444426;padding:2px 7px;border-radius:4px;animation:blink 1s step-end infinite}.rec-indicator.paused{color:#f59e0b;background:#f59e0b26;animation:none}@keyframes blink{50%{opacity:.4}}.header-actions{display:flex;gap:4px}.icon-btn{background:none;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;font-size:14px;line-height:1;transition:color .15s,background .15s}.icon-btn:hover{color:#f1f5f9;background:#334155}.session-setup{padding:10px 14px;border-bottom:1px solid #1e293b;display:flex;flex-direction:column;gap:6px;flex-shrink:0}.session-input,.session-desc{background:#1e293b;border:1px solid #334155;color:#e2e8f0;border-radius:6px;padding:6px 10px;font-size:12px;width:100%;box-sizing:border-box;resize:vertical}.session-input:focus,.session-desc:focus{outline:none;border-color:#3b82f6}.recording-controls{display:flex;gap:6px;padding:10px 14px;border-bottom:1px solid #1e293b;flex-wrap:wrap;flex-shrink:0}.ctrl-btn{border:none;border-radius:6px;padding:6px 14px;font-size:12px;font-weight:600;cursor:pointer;transition:filter .15s,transform .1s;display:flex;align-items:center;gap:5px}.ctrl-btn:hover:not(:disabled){filter:brightness(1.15);transform:translateY(-1px)}.ctrl-btn:active:not(:disabled){transform:translateY(0)}.ctrl-btn:disabled{opacity:.5;cursor:not-allowed}.ctrl-btn.start{background:#16a34a;color:#fff}.ctrl-btn.stop{background:#dc2626;color:#fff}.ctrl-btn.pause{background:#d97706;color:#fff}.ctrl-btn.generate{background:#7c3aed;color:#fff;flex:1;justify-content:center}.ctrl-btn.clear{background:#374151;color:#9ca3af;padding:6px 10px}.spinner{display:inline-block;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.error-banner{background:#dc262626;border-left:3px solid #dc2626;color:#fca5a5;padding:8px 14px;font-size:12px;flex-shrink:0}.tab-bar{display:flex;border-bottom:1px solid #1e293b;flex-shrink:0}.tab-btn{flex:1;background:none;border:none;color:#64748b;padding:8px 4px;font-size:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px;border-bottom:2px solid transparent;transition:color .15s}.tab-btn:hover:not(:disabled){color:#cbd5e1}.tab-btn.active{color:#60a5fa;border-bottom-color:#3b82f6}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.tab-badge{background:#334155;color:#94a3b8;font-size:10px;padding:1px 5px;border-radius:3px}.tab-badge.new{background:#7c3aed;color:#e9d5ff}.tab-content{overflow-y:auto;flex:1;min-height:0}.tab-content::-webkit-scrollbar{width:5px}.tab-content::-webkit-scrollbar-track{background:transparent}.tab-content::-webkit-scrollbar-thumb{background:#334155;border-radius:3px}.sessions-list{padding:10px 14px;display:flex;flex-direction:column;gap:8px}.session-card{background:#1e293b;border:1px solid #334155;border-radius:8px;padding:10px}.session-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.session-name{font-weight:600;color:#f1f5f9;font-size:13px}.session-meta{font-size:11px;color:#64748b}.session-card-actions{display:flex;gap:6px}.sm-btn{background:#334155;border:none;color:#cbd5e1;padding:4px 10px;border-radius:5px;font-size:11px;cursor:pointer;transition:background .15s}.sm-btn:hover{background:#475569}.sm-btn.danger{color:#fca5a5}.sm-btn.danger:hover{background:#dc262633}.resize-handle{text-align:center;color:#334155;cursor:ns-resize;font-size:16px;padding:2px;flex-shrink:0;background:#0f172a;-webkit-user-select:none;user-select:none}.resize-handle:hover{color:#64748b}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ActionListComponent, selector: "app-action-list", inputs: ["session"], outputs: ["removeAction", "addNote"] }, { kind: "component", type: TestPreviewComponent, selector: "app-test-preview", inputs: ["test"] }, { kind: "component", type: SettingsDialogComponent, selector: "app-settings-dialog", outputs: ["close"] }, { kind: "component", type: SessionReplayComponent, selector: "app-session-replay" }] }); }
319
319
  }
320
320
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DebugPanelComponent, decorators: [{
321
321
  type: Component,
322
- args: [{ selector: 'app-debug-panel', standalone: true, imports: [CommonModule, FormsModule, ActionListComponent, TestPreviewComponent, SettingsDialogComponent, SessionReplayComponent], template: `
323
- <!-- Toggle FAB -->
324
- <button
325
- data-debug-panel
326
- class="debug-fab"
327
- [class.recording]="recorder.isRecording()"
328
- [class.pulse]="recorder.isRecording() && !recorder.isPaused()"
329
- (click)="togglePanel()"
330
- [title]="panelOpen() ? 'Debug Panel schließen' : 'Debug Panel öffnen'"
331
- >
332
- <span class="fab-icon">{{ recorder.isRecording() ? '⏺' : '🐛' }}</span>
333
- @if (recorder.isRecording() && recorder.actionCount() > 0) {
334
- <span class="fab-badge">{{ recorder.actionCount() }}</span>
335
- }
336
- </button>
337
-
338
- <!-- Main Panel -->
339
- @if (panelOpen()) {
340
- <div
341
- data-debug-panel
342
- class="debug-panel"
343
- [class]="'pos-' + position()"
344
- [style.width.px]="panelWidth()"
345
- >
346
- <!-- Header -->
347
- <div class="panel-header" (mousedown)="startDrag($event)">
348
- <div class="header-left">
349
- <span class="panel-icon">🐛</span>
350
- <span class="panel-title">Debug Recorder</span>
351
- @if (recorder.isRecording()) {
352
- <span class="rec-indicator" [class.paused]="recorder.isPaused()">
353
- {{ recorder.isPaused() ? '⏸ PAUSED' : '⏺ REC' }}
354
- </span>
355
- }
356
- </div>
357
- <div class="header-actions">
358
- <button class="icon-btn" title="Einstellungen" (click)="showSettings.set(true)">⚙️</button>
359
- <button class="icon-btn" title="Position wechseln" (click)="cyclePosition()">📌</button>
360
- <button class="icon-btn" title="Schließen" (click)="togglePanel()">✕</button>
361
- </div>
362
- </div>
363
-
364
- <!-- Session Name Input (only when not recording) -->
365
- @if (!recorder.isRecording()) {
366
- <div class="session-setup">
367
- <input
368
- data-debug-panel
369
- class="session-input"
370
- type="text"
371
- [(ngModel)]="sessionName"
372
- placeholder="Session-Name (optional)"
373
- />
374
- <textarea
375
- data-debug-panel
376
- class="session-desc"
377
- [(ngModel)]="sessionDesc"
378
- placeholder="Fehlerbeschreibung..."
379
- rows="2"
380
- ></textarea>
381
- </div>
382
- }
383
-
384
- <!-- Recording Controls -->
385
- <div class="recording-controls" data-debug-panel>
386
- @if (!recorder.isRecording()) {
387
- <button class="ctrl-btn start" (click)="startRecording()">
388
- ▶ Aufnahme starten
389
- </button>
390
- } @else {
391
- <button class="ctrl-btn pause" (click)="recorder.pauseRecording()">
392
- {{ recorder.isPaused() ? '▶ Fortsetzen' : '⏸ Pause' }}
393
- </button>
394
- <button class="ctrl-btn stop" (click)="stopRecording()">
395
- ⏹ Stoppen
396
- </button>
397
- <button class="ctrl-btn clear" title="Aktionen löschen" (click)="recorder.clearCurrentSession()">
398
- 🗑
399
- </button>
400
- }
401
-
402
- @if (hasActions()) {
403
- <button
404
- class="ctrl-btn generate"
405
- [disabled]="aiService.isGenerating() || !aiService.webhookUrl()"
406
- [title]="!aiService.webhookUrl() ? 'Webhook-URL in Einstellungen eintragen' : 'Cypress Test generieren'"
407
- (click)="generateTest()"
408
- >
409
- @if (aiService.isGenerating()) {
410
- <span class="spinner">⟳</span> Generiere...
411
- } @else {
412
- 🤖 → Cypress Test
413
- }
414
- </button>
415
- }
416
- </div>
417
-
418
- <!-- Error Banner -->
419
- @if (aiService.error()) {
420
- <div class="error-banner" data-debug-panel>
421
- ⚠️ {{ aiService.error() }}
422
- </div>
423
- }
424
-
425
- <!-- Tabs -->
426
- <div class="tab-bar" data-debug-panel>
427
- <button
428
- class="tab-btn"
429
- [class.active]="activeTab() === 'actions'"
430
- (click)="activeTab.set('actions')"
431
- >
432
- Aktionen
433
- @if (recorder.actionCount() > 0) {
434
- <span class="tab-badge">{{ recorder.actionCount() }}</span>
435
- }
436
- </button>
437
- <button
438
- class="tab-btn"
439
- [class.active]="activeTab() === 'replay'"
440
- (click)="activeTab.set('replay')"
441
- title="rrweb Session Replay"
442
- >
443
- 📽️ Replay
444
- @if (rrweb.events().length > 0) {
445
- <span class="tab-badge">{{ rrweb.events().length }}</span>
446
- }
447
- </button>
448
- <button
449
- class="tab-btn"
450
- [class.active]="activeTab() === 'test'"
451
- [disabled]="!aiService.lastTest()"
452
- (click)="activeTab.set('test')"
453
- >
454
- 🤖 Test
455
- @if (aiService.lastTest()) {
456
- <span class="tab-badge new">NEU</span>
457
- }
458
- </button>
459
- <button
460
- class="tab-btn"
461
- [class.active]="activeTab() === 'sessions'"
462
- [disabled]="recorder.sessions().length === 0"
463
- (click)="activeTab.set('sessions')"
464
- >
465
- Sessions ({{ recorder.sessions().length }})
466
- </button>
467
- </div>
468
-
469
- <!-- Tab Content -->
470
- <div class="tab-content">
471
- @if (activeTab() === 'actions') {
472
- <app-action-list
473
- [session]="recorder.currentSession()"
474
- (removeAction)="recorder.removeAction($event)"
475
- (addNote)="recorder.addNote($event.id, $event.note)"
476
- />
477
- }
478
-
479
- @if (activeTab() === 'replay') {
480
- <app-session-replay />
481
- }
482
-
483
- @if (activeTab() === 'test') {
484
- <app-test-preview [test]="aiService.lastTest()" />
485
- }
486
-
487
- @if (activeTab() === 'sessions') {
488
- <div class="sessions-list">
489
- @for (session of recorder.sessions(); track session.id) {
490
- <div class="session-card">
491
- <div class="session-card-header">
492
- <span class="session-name">{{ session.name }}</span>
493
- <span class="session-meta">{{ session.actions.length }} Aktionen</span>
494
- </div>
495
- <div class="session-card-actions">
496
- <button class="sm-btn" (click)="loadAndGenerate(session)">🤖 Neu generieren</button>
497
- <button class="sm-btn danger" (click)="recorder.deleteSession(session.id)">🗑</button>
498
- </div>
499
- </div>
500
- }
501
- </div>
502
- }
503
- </div>
504
-
505
- <!-- Resize Handle -->
506
- <div class="resize-handle" (mousedown)="startResize($event)">⠿</div>
507
- </div>
508
- }
509
-
510
- <!-- Settings Dialog -->
511
- @if (showSettings()) {
512
- <app-settings-dialog (close)="showSettings.set(false)" />
513
- }
322
+ args: [{ selector: 'app-debug-panel', standalone: true, imports: [CommonModule, FormsModule, ActionListComponent, TestPreviewComponent, SettingsDialogComponent, SessionReplayComponent], template: `
323
+ <!-- Toggle FAB -->
324
+ <button
325
+ data-debug-panel
326
+ class="debug-fab"
327
+ [class.recording]="recorder.isRecording()"
328
+ [class.pulse]="recorder.isRecording() && !recorder.isPaused()"
329
+ (click)="togglePanel()"
330
+ [title]="panelOpen() ? 'Debug Panel schließen' : 'Debug Panel öffnen'"
331
+ >
332
+ <span class="fab-icon">{{ recorder.isRecording() ? '⏺' : '🐛' }}</span>
333
+ @if (recorder.isRecording() && recorder.actionCount() > 0) {
334
+ <span class="fab-badge">{{ recorder.actionCount() }}</span>
335
+ }
336
+ </button>
337
+
338
+ <!-- Main Panel -->
339
+ @if (panelOpen()) {
340
+ <div
341
+ data-debug-panel
342
+ class="debug-panel"
343
+ [class]="'pos-' + position()"
344
+ [style.width.px]="panelWidth()"
345
+ >
346
+ <!-- Header -->
347
+ <div class="panel-header" (mousedown)="startDrag($event)">
348
+ <div class="header-left">
349
+ <span class="panel-icon">🐛</span>
350
+ <span class="panel-title">Debug Recorder</span>
351
+ @if (recorder.isRecording()) {
352
+ <span class="rec-indicator" [class.paused]="recorder.isPaused()">
353
+ {{ recorder.isPaused() ? '⏸ PAUSED' : '⏺ REC' }}
354
+ </span>
355
+ }
356
+ </div>
357
+ <div class="header-actions">
358
+ <button class="icon-btn" title="Einstellungen" (click)="showSettings.set(true)">⚙️</button>
359
+ <button class="icon-btn" title="Position wechseln" (click)="cyclePosition()">📌</button>
360
+ <button class="icon-btn" title="Schließen" (click)="togglePanel()">✕</button>
361
+ </div>
362
+ </div>
363
+
364
+ <!-- Session Name Input (only when not recording) -->
365
+ @if (!recorder.isRecording()) {
366
+ <div class="session-setup">
367
+ <input
368
+ data-debug-panel
369
+ class="session-input"
370
+ type="text"
371
+ [(ngModel)]="sessionName"
372
+ placeholder="Session-Name (optional)"
373
+ />
374
+ <textarea
375
+ data-debug-panel
376
+ class="session-desc"
377
+ [(ngModel)]="sessionDesc"
378
+ placeholder="Fehlerbeschreibung..."
379
+ rows="2"
380
+ ></textarea>
381
+ </div>
382
+ }
383
+
384
+ <!-- Recording Controls -->
385
+ <div class="recording-controls" data-debug-panel>
386
+ @if (!recorder.isRecording()) {
387
+ <button class="ctrl-btn start" (click)="startRecording()">
388
+ ▶ Aufnahme starten
389
+ </button>
390
+ } @else {
391
+ <button class="ctrl-btn pause" (click)="recorder.pauseRecording()">
392
+ {{ recorder.isPaused() ? '▶ Fortsetzen' : '⏸ Pause' }}
393
+ </button>
394
+ <button class="ctrl-btn stop" (click)="stopRecording()">
395
+ ⏹ Stoppen
396
+ </button>
397
+ <button class="ctrl-btn clear" title="Aktionen löschen" (click)="recorder.clearCurrentSession()">
398
+ 🗑
399
+ </button>
400
+ }
401
+
402
+ @if (hasActions()) {
403
+ <button
404
+ class="ctrl-btn generate"
405
+ [disabled]="aiService.isGenerating() || !aiService.webhookUrl()"
406
+ [title]="!aiService.webhookUrl() ? 'Webhook-URL in Einstellungen eintragen' : 'Cypress Test generieren'"
407
+ (click)="generateTest()"
408
+ >
409
+ @if (aiService.isGenerating()) {
410
+ <span class="spinner">⟳</span> Generiere...
411
+ } @else {
412
+ 🤖 → Cypress Test
413
+ }
414
+ </button>
415
+ }
416
+ </div>
417
+
418
+ <!-- Error Banner -->
419
+ @if (aiService.error()) {
420
+ <div class="error-banner" data-debug-panel>
421
+ ⚠️ {{ aiService.error() }}
422
+ </div>
423
+ }
424
+
425
+ <!-- Tabs -->
426
+ <div class="tab-bar" data-debug-panel>
427
+ <button
428
+ class="tab-btn"
429
+ [class.active]="activeTab() === 'actions'"
430
+ (click)="activeTab.set('actions')"
431
+ >
432
+ Aktionen
433
+ @if (recorder.actionCount() > 0) {
434
+ <span class="tab-badge">{{ recorder.actionCount() }}</span>
435
+ }
436
+ </button>
437
+ <button
438
+ class="tab-btn"
439
+ [class.active]="activeTab() === 'replay'"
440
+ (click)="activeTab.set('replay')"
441
+ title="rrweb Session Replay"
442
+ >
443
+ 📽️ Replay
444
+ @if (rrweb.eventCount() > 0) {
445
+ <span class="tab-badge">{{ rrweb.eventCount() }}</span>
446
+ }
447
+ </button>
448
+ <button
449
+ class="tab-btn"
450
+ [class.active]="activeTab() === 'test'"
451
+ [disabled]="!aiService.lastTest()"
452
+ (click)="activeTab.set('test')"
453
+ >
454
+ 🤖 Test
455
+ @if (aiService.lastTest()) {
456
+ <span class="tab-badge new">NEU</span>
457
+ }
458
+ </button>
459
+ <button
460
+ class="tab-btn"
461
+ [class.active]="activeTab() === 'sessions'"
462
+ [disabled]="recorder.sessions().length === 0"
463
+ (click)="activeTab.set('sessions')"
464
+ >
465
+ Sessions ({{ recorder.sessions().length }})
466
+ </button>
467
+ </div>
468
+
469
+ <!-- Tab Content -->
470
+ <div class="tab-content">
471
+ @if (activeTab() === 'actions') {
472
+ <app-action-list
473
+ [session]="recorder.currentSession()"
474
+ (removeAction)="recorder.removeAction($event)"
475
+ (addNote)="recorder.addNote($event.id, $event.note)"
476
+ />
477
+ }
478
+
479
+ @if (activeTab() === 'replay') {
480
+ <app-session-replay />
481
+ }
482
+
483
+ @if (activeTab() === 'test') {
484
+ <app-test-preview [test]="aiService.lastTest()" />
485
+ }
486
+
487
+ @if (activeTab() === 'sessions') {
488
+ <div class="sessions-list">
489
+ @for (session of recorder.sessions(); track session.id) {
490
+ <div class="session-card">
491
+ <div class="session-card-header">
492
+ <span class="session-name">{{ session.name }}</span>
493
+ <span class="session-meta">{{ session.actions.length }} Aktionen</span>
494
+ </div>
495
+ <div class="session-card-actions">
496
+ <button class="sm-btn" (click)="loadAndGenerate(session)">🤖 Neu generieren</button>
497
+ <button class="sm-btn danger" (click)="recorder.deleteSession(session.id)">🗑</button>
498
+ </div>
499
+ </div>
500
+ }
501
+ </div>
502
+ }
503
+ </div>
504
+
505
+ <!-- Resize Handle -->
506
+ <div class="resize-handle" (mousedown)="startResize($event)">⠿</div>
507
+ </div>
508
+ }
509
+
510
+ <!-- Settings Dialog -->
511
+ @if (showSettings()) {
512
+ <app-settings-dialog (close)="showSettings.set(false)" />
513
+ }
514
514
  `, styles: [".debug-fab{bottom:24px;right:24px;z-index:99999;width:52px;height:52px;border-radius:50%;border:none;background:#1e293b;color:#fff;font-size:22px;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 20px #0006;transition:transform .2s,background .2s;position:fixed}.debug-fab:hover{transform:scale(1.1);background:#334155}.debug-fab.recording{background:#dc2626}.debug-fab.pulse{animation:fabPulse 1.5s ease-in-out infinite}@keyframes fabPulse{0%,to{box-shadow:0 4px 20px #dc262666}50%{box-shadow:0 4px 30px #dc2626e6,0 0 0 8px #dc262626}}.fab-badge{position:absolute;top:-4px;right:-4px;background:#f59e0b;color:#000;font-size:10px;font-weight:700;min-width:18px;height:18px;border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 4px}.debug-panel{position:fixed;z-index:99998;width:420px;max-height:80vh;background:#0f172a;color:#e2e8f0;border-radius:12px;border:1px solid #1e3a5f;box-shadow:0 25px 60px #0009;display:flex;flex-direction:column;font-family:Segoe UI,system-ui,sans-serif;font-size:13px;overflow:hidden}.pos-bottom-right{bottom:88px;right:24px}.pos-bottom-left{bottom:88px;left:24px}.pos-top-right{top:24px;right:24px}.pos-top-left{top:24px;left:24px}.panel-header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:#1e293b;border-bottom:1px solid #334155;cursor:move;-webkit-user-select:none;user-select:none;flex-shrink:0}.header-left{display:flex;align-items:center;gap:8px}.panel-icon{font-size:16px}.panel-title{font-weight:600;font-size:14px;color:#f1f5f9}.rec-indicator{font-size:10px;font-weight:700;color:#ef4444;background:#ef444426;padding:2px 7px;border-radius:4px;animation:blink 1s step-end infinite}.rec-indicator.paused{color:#f59e0b;background:#f59e0b26;animation:none}@keyframes blink{50%{opacity:.4}}.header-actions{display:flex;gap:4px}.icon-btn{background:none;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;font-size:14px;line-height:1;transition:color .15s,background .15s}.icon-btn:hover{color:#f1f5f9;background:#334155}.session-setup{padding:10px 14px;border-bottom:1px solid #1e293b;display:flex;flex-direction:column;gap:6px;flex-shrink:0}.session-input,.session-desc{background:#1e293b;border:1px solid #334155;color:#e2e8f0;border-radius:6px;padding:6px 10px;font-size:12px;width:100%;box-sizing:border-box;resize:vertical}.session-input:focus,.session-desc:focus{outline:none;border-color:#3b82f6}.recording-controls{display:flex;gap:6px;padding:10px 14px;border-bottom:1px solid #1e293b;flex-wrap:wrap;flex-shrink:0}.ctrl-btn{border:none;border-radius:6px;padding:6px 14px;font-size:12px;font-weight:600;cursor:pointer;transition:filter .15s,transform .1s;display:flex;align-items:center;gap:5px}.ctrl-btn:hover:not(:disabled){filter:brightness(1.15);transform:translateY(-1px)}.ctrl-btn:active:not(:disabled){transform:translateY(0)}.ctrl-btn:disabled{opacity:.5;cursor:not-allowed}.ctrl-btn.start{background:#16a34a;color:#fff}.ctrl-btn.stop{background:#dc2626;color:#fff}.ctrl-btn.pause{background:#d97706;color:#fff}.ctrl-btn.generate{background:#7c3aed;color:#fff;flex:1;justify-content:center}.ctrl-btn.clear{background:#374151;color:#9ca3af;padding:6px 10px}.spinner{display:inline-block;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.error-banner{background:#dc262626;border-left:3px solid #dc2626;color:#fca5a5;padding:8px 14px;font-size:12px;flex-shrink:0}.tab-bar{display:flex;border-bottom:1px solid #1e293b;flex-shrink:0}.tab-btn{flex:1;background:none;border:none;color:#64748b;padding:8px 4px;font-size:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px;border-bottom:2px solid transparent;transition:color .15s}.tab-btn:hover:not(:disabled){color:#cbd5e1}.tab-btn.active{color:#60a5fa;border-bottom-color:#3b82f6}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.tab-badge{background:#334155;color:#94a3b8;font-size:10px;padding:1px 5px;border-radius:3px}.tab-badge.new{background:#7c3aed;color:#e9d5ff}.tab-content{overflow-y:auto;flex:1;min-height:0}.tab-content::-webkit-scrollbar{width:5px}.tab-content::-webkit-scrollbar-track{background:transparent}.tab-content::-webkit-scrollbar-thumb{background:#334155;border-radius:3px}.sessions-list{padding:10px 14px;display:flex;flex-direction:column;gap:8px}.session-card{background:#1e293b;border:1px solid #334155;border-radius:8px;padding:10px}.session-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.session-name{font-weight:600;color:#f1f5f9;font-size:13px}.session-meta{font-size:11px;color:#64748b}.session-card-actions{display:flex;gap:6px}.sm-btn{background:#334155;border:none;color:#cbd5e1;padding:4px 10px;border-radius:5px;font-size:11px;cursor:pointer;transition:background .15s}.sm-btn:hover{background:#475569}.sm-btn.danger{color:#fca5a5}.sm-btn.danger:hover{background:#dc262633}.resize-handle{text-align:center;color:#334155;cursor:ns-resize;font-size:16px;padding:2px;flex-shrink:0;background:#0f172a;-webkit-user-select:none;user-select:none}.resize-handle:hover{color:#64748b}\n"] }]
515
515
  }] });
516
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWctcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVidWctcmVjb3JkZXIvc3JjL2xpYi9kZWJ1Zy1wYW5lbC9kZWJ1Zy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FDcEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFMUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7OztBQXVjcEYsTUFBTSxPQUFPLG1CQUFtQjtJQWxjaEM7UUFtY0UsYUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuQyxjQUFTLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdkMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXJDLGNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFHLE1BQU0sQ0FBVyxTQUFTLENBQUMsQ0FBQztRQUN4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QVcsRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxzQkFBc0IsQ0FBQyxZQUN0SDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ01UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBzaWduYWwsIGNvbXB1dGVkLCBpbmplY3QsIE9uSW5pdCwgT25EZXN0cm95LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJlY29yZGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3JlY29yZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWlHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWktZ2VuZXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnJ3ZWJSZWNvcmRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9ycndlYi1yZWNvcmRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlY29yZGluZ1Nlc3Npb24gfSBmcm9tICcuLi9tb2RlbHMvcmVjb3JkZWQtYWN0aW9uLm1vZGVsJztcbmltcG9ydCB7IEFjdGlvbkxpc3RDb21wb25lbnQgfSBmcm9tICcuLi9hY3Rpb24tbGlzdC9hY3Rpb24tbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGVzdFByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuLi90ZXN0LXByZXZpZXcvdGVzdC1wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL3NldHRpbmdzLWRpYWxvZy9zZXR0aW5ncy1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IFNlc3Npb25SZXBsYXlDb21wb25lbnQgfSBmcm9tICcuLi9zZXNzaW9uLXJlcGxheS9zZXNzaW9uLXJlcGxheS5jb21wb25lbnQnO1xuXG50eXBlIFBhbmVsVGFiID0gJ2FjdGlvbnMnIHwgJ3Rlc3QnIHwgJ3Nlc3Npb25zJyB8ICdyZXBsYXknO1xudHlwZSBQYW5lbFBvc2l0aW9uID0gJ2JvdHRvbS1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAndG9wLWxlZnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGVidWctcGFuZWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQWN0aW9uTGlzdENvbXBvbmVudCwgVGVzdFByZXZpZXdDb21wb25lbnQsIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50LCBTZXNzaW9uUmVwbGF5Q29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIFRvZ2dsZSBGQUIgLS0+XG4gICAgPGJ1dHRvblxuICAgICAgZGF0YS1kZWJ1Zy1wYW5lbFxuICAgICAgY2xhc3M9XCJkZWJ1Zy1mYWJcIlxuICAgICAgW2NsYXNzLnJlY29yZGluZ109XCJyZWNvcmRlci5pc1JlY29yZGluZygpXCJcbiAgICAgIFtjbGFzcy5wdWxzZV09XCJyZWNvcmRlci5pc1JlY29yZGluZygpICYmICFyZWNvcmRlci5pc1BhdXNlZCgpXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVQYW5lbCgpXCJcbiAgICAgIFt0aXRsZV09XCJwYW5lbE9wZW4oKSA/ICdEZWJ1ZyBQYW5lbCBzY2hsaWXDn2VuJyA6ICdEZWJ1ZyBQYW5lbCDDtmZmbmVuJ1wiXG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3M9XCJmYWItaWNvblwiPnt7IHJlY29yZGVyLmlzUmVjb3JkaW5nKCkgPyAn4o+6JyA6ICfwn5CbJyB9fTwvc3Bhbj5cbiAgICAgIEBpZiAocmVjb3JkZXIuaXNSZWNvcmRpbmcoKSAmJiByZWNvcmRlci5hY3Rpb25Db3VudCgpID4gMCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cImZhYi1iYWRnZVwiPnt7IHJlY29yZGVyLmFjdGlvbkNvdW50KCkgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9idXR0b24+XG5cbiAgICA8IS0tIE1haW4gUGFuZWwgLS0+XG4gICAgQGlmIChwYW5lbE9wZW4oKSkge1xuICAgICAgPGRpdlxuICAgICAgICBkYXRhLWRlYnVnLXBhbmVsXG4gICAgICAgIGNsYXNzPVwiZGVidWctcGFuZWxcIlxuICAgICAgICBbY2xhc3NdPVwiJ3Bvcy0nICsgcG9zaXRpb24oKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJwYW5lbFdpZHRoKClcIlxuICAgICAgPlxuICAgICAgICA8IS0tIEhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRlclwiIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZWwtaWNvblwiPvCfkJs8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmVsLXRpdGxlXCI+RGVidWcgUmVjb3JkZXI8L3NwYW4+XG4gICAgICAgICAgICBAaWYgKHJlY29yZGVyLmlzUmVjb3JkaW5nKCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWMtaW5kaWNhdG9yXCIgW2NsYXNzLnBhdXNlZF09XCJyZWNvcmRlci5pc1BhdXNlZCgpXCI+XG4gICAgICAgICAgICAgICAge3sgcmVjb3JkZXIuaXNQYXVzZWQoKSA/ICfij7ggUEFVU0VEJyA6ICfij7ogUkVDJyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIkVpbnN0ZWxsdW5nZW5cIiAoY2xpY2spPVwic2hvd1NldHRpbmdzLnNldCh0cnVlKVwiPuKame+4jzwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJQb3NpdGlvbiB3ZWNoc2VsblwiIChjbGljayk9XCJjeWNsZVBvc2l0aW9uKClcIj7wn5OMPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIlNjaGxpZcOfZW5cIiAoY2xpY2spPVwidG9nZ2xlUGFuZWwoKVwiPuKclTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNlc3Npb24gTmFtZSBJbnB1dCAob25seSB3aGVuIG5vdCByZWNvcmRpbmcpIC0tPlxuICAgICAgICBAaWYgKCFyZWNvcmRlci5pc1JlY29yZGluZygpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tc2V0dXBcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBkYXRhLWRlYnVnLXBhbmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1pbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZXNzaW9uTmFtZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2Vzc2lvbi1OYW1lIChvcHRpb25hbClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICBkYXRhLWRlYnVnLXBhbmVsXG4gICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1kZXNjXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZXNzaW9uRGVzY1wiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmVobGVyYmVzY2hyZWlidW5nLi4uXCJcbiAgICAgICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFJlY29yZGluZyBDb250cm9scyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZGluZy1jb250cm9sc1wiIGRhdGEtZGVidWctcGFuZWw+XG4gICAgICAgICAgQGlmICghcmVjb3JkZXIuaXNSZWNvcmRpbmcoKSkge1xuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIHN0YXJ0XCIgKGNsaWNrKT1cInN0YXJ0UmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAg4pa2IEF1Zm5haG1lIHN0YXJ0ZW5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIHBhdXNlXCIgKGNsaWNrKT1cInJlY29yZGVyLnBhdXNlUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAge3sgcmVjb3JkZXIuaXNQYXVzZWQoKSA/ICfilrYgRm9ydHNldHplbicgOiAn4o+4IFBhdXNlJyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY3RybC1idG4gc3RvcFwiIChjbGljayk9XCJzdG9wUmVjb3JkaW5nKClcIj5cbiAgICAgICAgICAgICAg4o+5IFN0b3BwZW5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIGNsZWFyXCIgdGl0bGU9XCJBa3Rpb25lbiBsw7ZzY2hlblwiIChjbGljayk9XCJyZWNvcmRlci5jbGVhckN1cnJlbnRTZXNzaW9uKClcIj5cbiAgICAgICAgICAgICAg8J+XkVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChoYXNBY3Rpb25zKCkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJjdHJsLWJ0biBnZW5lcmF0ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhaVNlcnZpY2UuaXNHZW5lcmF0aW5nKCkgfHwgIWFpU2VydmljZS53ZWJob29rVXJsKClcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIWFpU2VydmljZS53ZWJob29rVXJsKCkgPyAnV2ViaG9vay1VUkwgaW4gRWluc3RlbGx1bmdlbiBlaW50cmFnZW4nIDogJ0N5cHJlc3MgVGVzdCBnZW5lcmllcmVuJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVRlc3QoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAoYWlTZXJ2aWNlLmlzR2VuZXJhdGluZygpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyXCI+4p+zPC9zcGFuPiBHZW5lcmllcmUuLi5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAg8J+kliDihpIgQ3lwcmVzcyBUZXN0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBFcnJvciBCYW5uZXIgLS0+XG4gICAgICAgIEBpZiAoYWlTZXJ2aWNlLmVycm9yKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItYmFubmVyXCIgZGF0YS1kZWJ1Zy1wYW5lbD5cbiAgICAgICAgICAgIOKaoO+4jyB7eyBhaVNlcnZpY2UuZXJyb3IoKSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBUYWJzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhclwiIGRhdGEtZGVidWctcGFuZWw+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdhY3Rpb25zJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBBa3Rpb25lblxuICAgICAgICAgICAgQGlmIChyZWNvcmRlci5hY3Rpb25Db3VudCgpID4gMCkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhYi1iYWRnZVwiPnt7IHJlY29yZGVyLmFjdGlvbkNvdW50KCkgfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdyZXBsYXknXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVUYWIuc2V0KCdyZXBsYXknKVwiXG4gICAgICAgICAgICB0aXRsZT1cInJyd2ViIFNlc3Npb24gUmVwbGF5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDwn5O977iPIFJlcGxheVxuICAgICAgICAgICAgQGlmIChycndlYi5ldmVudHMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFiLWJhZGdlXCI+e3sgcnJ3ZWIuZXZlbnRzKCkubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAndGVzdCdcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhaVNlcnZpY2UubGFzdFRlc3QoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgndGVzdCcpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDwn6SWIFRlc3RcbiAgICAgICAgICAgIEBpZiAoYWlTZXJ2aWNlLmxhc3RUZXN0KCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWItYmFkZ2UgbmV3XCI+TkVVPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnc2Vzc2lvbnMnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZWNvcmRlci5zZXNzaW9ucygpLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnc2Vzc2lvbnMnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgU2Vzc2lvbnMgKHt7IHJlY29yZGVyLnNlc3Npb25zKCkubGVuZ3RoIH19KVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFRhYiBDb250ZW50IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIj5cbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAnYWN0aW9ucycpIHtcbiAgICAgICAgICAgIDxhcHAtYWN0aW9uLWxpc3RcbiAgICAgICAgICAgICAgW3Nlc3Npb25dPVwicmVjb3JkZXIuY3VycmVudFNlc3Npb24oKVwiXG4gICAgICAgICAgICAgIChyZW1vdmVBY3Rpb24pPVwicmVjb3JkZXIucmVtb3ZlQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAoYWRkTm90ZSk9XCJyZWNvcmRlci5hZGROb3RlKCRldmVudC5pZCwgJGV2ZW50Lm5vdGUpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ3JlcGxheScpIHtcbiAgICAgICAgICAgIDxhcHAtc2Vzc2lvbi1yZXBsYXkgLz5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAndGVzdCcpIHtcbiAgICAgICAgICAgIDxhcHAtdGVzdC1wcmV2aWV3IFt0ZXN0XT1cImFpU2VydmljZS5sYXN0VGVzdCgpXCIgLz5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAnc2Vzc2lvbnMnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbnMtbGlzdFwiPlxuICAgICAgICAgICAgICBAZm9yIChzZXNzaW9uIG9mIHJlY29yZGVyLnNlc3Npb25zKCk7IHRyYWNrIHNlc3Npb24uaWQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlc3Npb24tbmFtZVwiPnt7IHNlc3Npb24ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLW1ldGFcIj57eyBzZXNzaW9uLmFjdGlvbnMubGVuZ3RoIH19IEFrdGlvbmVuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNtLWJ0blwiIChjbGljayk9XCJsb2FkQW5kR2VuZXJhdGUoc2Vzc2lvbilcIj7wn6SWIE5ldSBnZW5lcmllcmVuPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzbS1idG4gZGFuZ2VyXCIgKGNsaWNrKT1cInJlY29yZGVyLmRlbGV0ZVNlc3Npb24oc2Vzc2lvbi5pZClcIj7wn5eRPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlc2l6ZSBIYW5kbGUgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUtaGFuZGxlXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQpXCI+4qC/PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIFNldHRpbmdzIERpYWxvZyAtLT5cbiAgICBAaWYgKHNob3dTZXR0aW5ncygpKSB7XG4gICAgICA8YXBwLXNldHRpbmdzLWRpYWxvZyAoY2xvc2UpPVwic2hvd1NldHRpbmdzLnNldChmYWxzZSlcIiAvPlxuICAgIH1cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5kZWJ1Zy1mYWIge1xuICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgYm90dG9tOiAyNHB4O1xuICAgICAgcmlnaHQ6IDI0cHg7XG4gICAgICB6LWluZGV4OiA5OTk5OTtcbiAgICAgIHdpZHRoOiA1MnB4O1xuICAgICAgaGVpZ2h0OiA1MnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYmFja2dyb3VuZDogIzFlMjkzYjtcbiAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgIGZvbnQtc2l6ZTogMjJweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMCwwLDAsMC40KTtcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzLCBiYWNrZ3JvdW5kIDAuMnM7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgfVxuICAgIC5kZWJ1Zy1mYWI6aG92ZXIgeyB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7IGJhY2tncm91bmQ6ICMzMzQxNTU7IH1cbiAgICAuZGVidWctZmFiLnJlY29yZGluZyB7IGJhY2tncm91bmQ6ICNkYzI2MjY7IH1cbiAgICAuZGVidWctZmFiLnB1bHNlIHsgYW5pbWF0aW9uOiBmYWJQdWxzZSAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlOyB9XG4gICAgQGtleWZyYW1lcyBmYWJQdWxzZSB7XG4gICAgICAwJSwgMTAwJSB7IGJveC1zaGFkb3c6IDAgNHB4IDIwcHggcmdiYSgyMjAsMzgsMzgsMC40KTsgfVxuICAgICAgNTAlIHsgYm94LXNoYWRvdzogMCA0cHggMzBweCByZ2JhKDIyMCwzOCwzOCwwLjkpLCAwIDAgMCA4cHggcmdiYSgyMjAsMzgsMzgsMC4xNSk7IH1cbiAgICB9XG4gICAgLmZhYi1iYWRnZSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IC00cHg7XG4gICAgICByaWdodDogLTRweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmNTllMGI7XG4gICAgICBjb2xvcjogIzAwMDtcbiAgICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBtaW4td2lkdGg6IDE4cHg7XG4gICAgICBoZWlnaHQ6IDE4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA5cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgcGFkZGluZzogMCA0cHg7XG4gICAgfVxuXG4gICAgLmRlYnVnLXBhbmVsIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHotaW5kZXg6IDk5OTk4O1xuICAgICAgd2lkdGg6IDQyMHB4O1xuICAgICAgbWF4LWhlaWdodDogODB2aDtcbiAgICAgIGJhY2tncm91bmQ6ICMwZjE3MmE7XG4gICAgICBjb2xvcjogI2UyZThmMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjMWUzYTVmO1xuICAgICAgYm94LXNoYWRvdzogMCAyNXB4IDYwcHggcmdiYSgwLDAsMCwwLjYpO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBmb250LWZhbWlseTogJ1NlZ29lIFVJJywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmO1xuICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG4gICAgLnBvcy1ib3R0b20tcmlnaHQgeyBib3R0b206IDg4cHg7IHJpZ2h0OiAyNHB4OyB9XG4gICAgLnBvcy1ib3R0b20tbGVmdCAgeyBib3R0b206IDg4cHg7IGxlZnQ6IDI0cHg7IH1cbiAgICAucG9zLXRvcC1yaWdodCAgICB7IHRvcDogMjRweDsgcmlnaHQ6IDI0cHg7IH1cbiAgICAucG9zLXRvcC1sZWZ0ICAgICB7IHRvcDogMjRweDsgbGVmdDogMjRweDsgfVxuXG4gICAgLnBhbmVsLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzNDE1NTtcbiAgICAgIGN1cnNvcjogbW92ZTtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC5oZWFkZXItbGVmdCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyB9XG4gICAgLnBhbmVsLWljb24geyBmb250LXNpemU6IDE2cHg7IH1cbiAgICAucGFuZWwtdGl0bGUgeyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiAjZjFmNWY5OyB9XG4gICAgLnJlYy1pbmRpY2F0b3Ige1xuICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjZWY0NDQ0O1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzksNjgsNjgsMC4xNSk7XG4gICAgICBwYWRkaW5nOiAycHggN3B4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgYW5pbWF0aW9uOiBibGluayAxcyBzdGVwLWVuZCBpbmZpbml0ZTtcbiAgICB9XG4gICAgLnJlYy1pbmRpY2F0b3IucGF1c2VkIHsgY29sb3I6ICNmNTllMGI7IGJhY2tncm91bmQ6IHJnYmEoMjQ1LDE1OCwxMSwwLjE1KTsgYW5pbWF0aW9uOiBub25lOyB9XG4gICAgQGtleWZyYW1lcyBibGluayB7IDUwJSB7IG9wYWNpdHk6IDAuNDsgfSB9XG4gICAgLmhlYWRlci1hY3Rpb25zIHsgZGlzcGxheTogZmxleDsgZ2FwOiA0cHg7IH1cbiAgICAuaWNvbi1idG4ge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGNvbG9yOiAjOTRhM2I4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgcGFkZGluZzogNHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cywgYmFja2dyb3VuZCAwLjE1cztcbiAgICB9XG4gICAgLmljb24tYnRuOmhvdmVyIHsgY29sb3I6ICNmMWY1Zjk7IGJhY2tncm91bmQ6ICMzMzQxNTU7IH1cblxuICAgIC5zZXNzaW9uLXNldHVwIHtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDZweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAuc2Vzc2lvbi1pbnB1dCwgLnNlc3Npb24tZGVzYyB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMWUyOTNiO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzNDE1NTtcbiAgICAgIGNvbG9yOiAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDEwcHg7XG4gICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICByZXNpemU6IHZlcnRpY2FsO1xuICAgIH1cbiAgICAuc2Vzc2lvbi1pbnB1dDpmb2N1cywgLnNlc3Npb24tZGVzYzpmb2N1cyB7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjM2I4MmY2O1xuICAgIH1cblxuICAgIC5yZWNvcmRpbmctY29udHJvbHMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgcGFkZGluZzogMTBweCAxNHB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMxZTI5M2I7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLmN0cmwtYnRuIHtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIHBhZGRpbmc6IDZweCAxNHB4O1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGZpbHRlciAwLjE1cywgdHJhbnNmb3JtIDAuMXM7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgIH1cbiAgICAuY3RybC1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgeyBmaWx0ZXI6IGJyaWdodG5lc3MoMS4xNSk7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsgfVxuICAgIC5jdHJsLWJ0bjphY3RpdmU6bm90KDpkaXNhYmxlZCkgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cbiAgICAuY3RybC1idG46ZGlzYWJsZWQgeyBvcGFjaXR5OiAwLjU7IGN1cnNvcjogbm90LWFsbG93ZWQ7IH1cbiAgICAuY3RybC1idG4uc3RhcnQgICAgeyBiYWNrZ3JvdW5kOiAjMTZhMzRhOyBjb2xvcjogI2ZmZjsgfVxuICAgIC5jdHJsLWJ0bi5zdG9wICAgICB7IGJhY2tncm91bmQ6ICNkYzI2MjY7IGNvbG9yOiAjZmZmOyB9XG4gICAgLmN0cmwtYnRuLnBhdXNlICAgIHsgYmFja2dyb3VuZDogI2Q5NzcwNjsgY29sb3I6ICNmZmY7IH1cbiAgICAuY3RybC1idG4uZ2VuZXJhdGUgeyBiYWNrZ3JvdW5kOiAjN2MzYWVkOyBjb2xvcjogI2ZmZjsgZmxleDogMTsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH1cbiAgICAuY3RybC1idG4uY2xlYXIgICAgeyBiYWNrZ3JvdW5kOiAjMzc0MTUxOyBjb2xvcjogIzljYTNhZjsgcGFkZGluZzogNnB4IDEwcHg7IH1cbiAgICAuc3Bpbm5lciB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYW5pbWF0aW9uOiBzcGluIDAuOHMgbGluZWFyIGluZmluaXRlOyB9XG4gICAgQGtleWZyYW1lcyBzcGluIHsgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH1cblxuICAgIC5lcnJvci1iYW5uZXIge1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyMjAsMzgsMzgsMC4xNSk7XG4gICAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNkYzI2MjY7XG4gICAgICBjb2xvcjogI2ZjYTVhNTtcbiAgICAgIHBhZGRpbmc6IDhweCAxNHB4O1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuXG4gICAgLnRhYi1iYXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC50YWItYnRuIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBwYWRkaW5nOiA4cHggNHB4O1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXM7XG4gICAgfVxuICAgIC50YWItYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsgY29sb3I6ICNjYmQ1ZTE7IH1cbiAgICAudGFiLWJ0bi5hY3RpdmUgeyBjb2xvcjogIzYwYTVmYTsgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzNiODJmNjsgfVxuICAgIC50YWItYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC40OyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9XG4gICAgLnRhYi1iYWRnZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMzM0MTU1O1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICBwYWRkaW5nOiAxcHggNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIH1cbiAgICAudGFiLWJhZGdlLm5ldyB7IGJhY2tncm91bmQ6ICM3YzNhZWQ7IGNvbG9yOiAjZTlkNWZmOyB9XG5cbiAgICAudGFiLWNvbnRlbnQge1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIGZsZXg6IDE7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgIH1cbiAgICAudGFiLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgd2lkdGg6IDVweDsgfVxuICAgIC50YWItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfVxuICAgIC50YWItY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kOiAjMzM0MTU1OyBib3JkZXItcmFkaXVzOiAzcHg7IH1cblxuICAgIC5zZXNzaW9ucy1saXN0IHsgcGFkZGluZzogMTBweCAxNHB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDsgfVxuICAgIC5zZXNzaW9uLWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogIzFlMjkzYjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzQxNTU7XG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgIH1cbiAgICAuc2Vzc2lvbi1jYXJkLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICB9XG4gICAgLnNlc3Npb24tbmFtZSB7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjZjFmNWY5OyBmb250LXNpemU6IDEzcHg7IH1cbiAgICAuc2Vzc2lvbi1tZXRhIHsgZm9udC1zaXplOiAxMXB4OyBjb2xvcjogIzY0NzQ4YjsgfVxuICAgIC5zZXNzaW9uLWNhcmQtYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyB9XG4gICAgLnNtLWJ0biB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMzM0MTU1O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICNjYmQ1ZTE7XG4gICAgICBwYWRkaW5nOiA0cHggMTBweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7XG4gICAgfVxuICAgIC5zbS1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiAjNDc1NTY5OyB9XG4gICAgLnNtLWJ0bi5kYW5nZXIgeyBjb2xvcjogI2ZjYTVhNTsgfVxuICAgIC5zbS1idG4uZGFuZ2VyOmhvdmVyIHsgYmFja2dyb3VuZDogcmdiYSgyMjAsMzgsMzgsMC4yKTsgfVxuXG4gICAgLnJlc2l6ZS1oYW5kbGUge1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICBjdXJzb3I6IG5zLXJlc2l6ZTtcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgIHBhZGRpbmc6IDJweDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgYmFja2dyb3VuZDogIzBmMTcyYTtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICAucmVzaXplLWhhbmRsZTpob3ZlciB7IGNvbG9yOiAjNjQ3NDhiOyB9XG4gIGBdLFxufSlcbmV4cG9ydCBjbGFzcyBEZWJ1Z1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICByZWNvcmRlciA9IGluamVjdChSZWNvcmRlclNlcnZpY2UpO1xuICBhaVNlcnZpY2UgPSBpbmplY3QoQWlHZW5lcmF0b3JTZXJ2aWNlKTtcbiAgcnJ3ZWIgPSBpbmplY3QoUnJ3ZWJSZWNvcmRlclNlcnZpY2UpO1xuXG4gIHBhbmVsT3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gIGFjdGl2ZVRhYiA9IHNpZ25hbDxQYW5lbFRhYj4oJ2FjdGlvbnMnKTtcbiAgcG9zaXRpb24gPSBzaWduYWw8UGFuZWxQb3NpdGlvbj4oJ2JvdHRvbS1yaWdodCcpO1xuICBwYW5lbFdpZHRoID0gc2lnbmFsKDQyMCk7XG4gIHNob3dTZXR0aW5ncyA9IHNpZ25hbChmYWxzZSk7XG4gIHNlc3Npb25OYW1lID0gJyc7XG4gIHNlc3Npb25EZXNjID0gJyc7XG5cbiAgaGFzQWN0aW9ucyA9IGNvbXB1dGVkKFxuICAgICgpID0+ICh0aGlzLnJlY29yZGVyLmN1cnJlbnRTZXNzaW9uKCk/LmFjdGlvbnMubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgICAgICh0aGlzLnJlY29yZGVyLnNlc3Npb25zKCkubGVuZ3RoID4gMClcbiAgKTtcblxuICBwcml2YXRlIHJlc2l6aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzaXplU3RhcnRZID0gMDtcbiAgcHJpdmF0ZSByZXNpemVTdGFydEggPSAwO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIEtleWJvYXJkIHNob3J0Y3V0OiBDdHJsK1NoaWZ0K0RcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVIb3RrZXkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlSG90a2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSG90a2V5ID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZS5jdHJsS2V5ICYmIGUuc2hpZnRLZXkgJiYgZS5rZXkgPT09ICdEJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy50b2dnbGVQYW5lbCgpO1xuICAgIH1cbiAgICBpZiAoZS5jdHJsS2V5ICYmIGUuc2hpZnRLZXkgJiYgZS5rZXkgPT09ICdSJykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHRoaXMucmVjb3JkZXIuaXNSZWNvcmRpbmcoKSkge1xuICAgICAgICB0aGlzLnN0b3BSZWNvcmRpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhcnRSZWNvcmRpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdG9nZ2xlUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5wYW5lbE9wZW4udXBkYXRlKHYgPT4gIXYpO1xuICAgIGlmICh0aGlzLnBhbmVsT3BlbigpICYmICF0aGlzLnJlY29yZGVyLmN1cnJlbnRTZXNzaW9uKCkpIHtcbiAgICAgIHRoaXMuYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpO1xuICAgIH1cbiAgfVxuXG4gIGN5Y2xlUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb25zOiBQYW5lbFBvc2l0aW9uW10gPSBbJ2JvdHRvbS1yaWdodCcsICdib3R0b20tbGVmdCcsICd0b3AtcmlnaHQnLCAndG9wLWxlZnQnXTtcbiAgICBjb25zdCBpZHggPSBwb3NpdGlvbnMuaW5kZXhPZih0aGlzLnBvc2l0aW9uKCkpO1xuICAgIHRoaXMucG9zaXRpb24uc2V0KHBvc2l0aW9uc1soaWR4ICsgMSkgJSBwb3NpdGlvbnMubGVuZ3RoXSk7XG4gIH1cblxuICBzdGFydFJlY29yZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZGVyLnN0YXJ0UmVjb3JkaW5nKFxuICAgICAgdGhpcy5zZXNzaW9uTmFtZSB8fCB1bmRlZmluZWQsXG4gICAgICB0aGlzLnNlc3Npb25EZXNjIHx8IHVuZGVmaW5lZFxuICAgICk7XG4gICAgLy8gU3RhcnQgcnJ3ZWIgaW4gcGFyYWxsZWwgZm9yIHZpc3VhbCByZXBsYXlcbiAgICB0aGlzLnJyd2ViLnN0YXJ0UmVjb3JkaW5nKCk7XG4gICAgdGhpcy5hY3RpdmVUYWIuc2V0KCdhY3Rpb25zJyk7XG4gIH1cblxuICBzdG9wUmVjb3JkaW5nKCk6IHZvaWQge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnJlY29yZGVyLnN0b3BSZWNvcmRpbmcoKTtcbiAgICB0aGlzLnJyd2ViLnN0b3BSZWNvcmRpbmcoKTtcbiAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgdGhpcy5hY3RpdmVUYWIuc2V0KCdhY3Rpb25zJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2VuZXJhdGVUZXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnJlY29yZGVyLmN1cnJlbnRTZXNzaW9uKCkgPz8gdGhpcy5yZWNvcmRlci5zZXNzaW9ucygpLmF0KC0xKTtcbiAgICBpZiAoIXNlc3Npb24pIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmFpU2VydmljZS5nZW5lcmF0ZUN5cHJlc3NUZXN0KHNlc3Npb24pO1xuICAgIHRoaXMuYWN0aXZlVGFiLnNldCgndGVzdCcpO1xuICB9XG5cbiAgYXN5bmMgbG9hZEFuZEdlbmVyYXRlKHNlc3Npb246IFJlY29yZGluZ1Nlc3Npb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmFpU2VydmljZS5nZW5lcmF0ZUN5cHJlc3NUZXN0KHNlc3Npb24pO1xuICAgIHRoaXMuYWN0aXZlVGFiLnNldCgndGVzdCcpO1xuICB9XG5cbiAgLy8gRHJhZyB0byByZXBvc2l0aW9uXG4gIHN0YXJ0RHJhZyhlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnYnV0dG9uJykpIHJldHVybjtcbiAgICBjb25zdCBwYW5lbCA9IChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQhO1xuICAgIGNvbnN0IHN0YXJ0WCA9IGUuY2xpZW50WCAtIHBhbmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgY29uc3Qgc3RhcnRZID0gZS5jbGllbnRZIC0gcGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBwYW5lbC5zdHlsZS5sZWZ0ID0gYCR7ZXYuY2xpZW50WCAtIHN0YXJ0WH1weGA7XG4gICAgICBwYW5lbC5zdHlsZS50b3AgID0gYCR7ZXYuY2xpZW50WSAtIHN0YXJ0WX1weGA7XG4gICAgICBwYW5lbC5zdHlsZS5yaWdodCA9ICdhdXRvJztcbiAgICAgIHBhbmVsLnN0eWxlLmJvdHRvbSA9ICdhdXRvJztcbiAgICB9O1xuICAgIGNvbnN0IG9uVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xuICAgIH07XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gIH1cblxuICAvLyBSZXNpemUgaGVpZ2h0XG4gIHN0YXJ0UmVzaXplKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwYW5lbCA9IChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQhO1xuICAgIHRoaXMucmVzaXplU3RhcnRZID0gZS5jbGllbnRZO1xuICAgIHRoaXMucmVzaXplU3RhcnRIID0gcGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgY29uc3Qgb25Nb3ZlID0gKGV2OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBuZXdIID0gTWF0aC5tYXgoMjUwLCB0aGlzLnJlc2l6ZVN0YXJ0SCArIChldi5jbGllbnRZIC0gdGhpcy5yZXNpemVTdGFydFkpKTtcbiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IGAke25ld0h9cHhgO1xuICAgIH07XG4gICAgY29uc3Qgb25VcCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XG4gICAgfTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cbiJdfQ==
516
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWctcGFuZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVidWctcmVjb3JkZXIvc3JjL2xpYi9kZWJ1Zy1wYW5lbC9kZWJ1Zy1wYW5lbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FDcEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFMUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7OztBQXVjcEYsTUFBTSxPQUFPLG1CQUFtQjtJQWxjaEM7UUFtY0UsYUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuQyxjQUFTLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdkMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXJDLGNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsY0FBUyxHQUFHLE1BQU0sQ0FBVyxTQUFTLENBQUMsQ0FBQztRQUN4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QVcsRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxzQkFBc0IsQ0FBQyxZQUN0SDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ01UIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsIHNpZ25hbCwgY29tcHV0ZWQsIGluamVjdCwgT25Jbml0LCBPbkRlc3Ryb3ksXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBSZWNvcmRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZWNvcmRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWlHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWktZ2VuZXJhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBScndlYlJlY29yZGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Jyd2ViLXJlY29yZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZWNvcmRpbmdTZXNzaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlY29yZGVkLWFjdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IEFjdGlvbkxpc3RDb21wb25lbnQgfSBmcm9tICcuLi9hY3Rpb24tbGlzdC9hY3Rpb24tbGlzdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUZXN0UHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uL3Rlc3QtcHJldmlldy90ZXN0LXByZXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2V0dGluZ3NEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9zZXR0aW5ncy1kaWFsb2cvc2V0dGluZ3MtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNlc3Npb25SZXBsYXlDb21wb25lbnQgfSBmcm9tICcuLi9zZXNzaW9uLXJlcGxheS9zZXNzaW9uLXJlcGxheS5jb21wb25lbnQnO1xyXG5cclxudHlwZSBQYW5lbFRhYiA9ICdhY3Rpb25zJyB8ICd0ZXN0JyB8ICdzZXNzaW9ucycgfCAncmVwbGF5JztcclxudHlwZSBQYW5lbFBvc2l0aW9uID0gJ2JvdHRvbS1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAndG9wLWxlZnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZGVidWctcGFuZWwnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEFjdGlvbkxpc3RDb21wb25lbnQsIFRlc3RQcmV2aWV3Q29tcG9uZW50LCBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudCwgU2Vzc2lvblJlcGxheUNvbXBvbmVudF0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDwhLS0gVG9nZ2xlIEZBQiAtLT5cclxuICAgIDxidXR0b25cclxuICAgICAgZGF0YS1kZWJ1Zy1wYW5lbFxyXG4gICAgICBjbGFzcz1cImRlYnVnLWZhYlwiXHJcbiAgICAgIFtjbGFzcy5yZWNvcmRpbmddPVwicmVjb3JkZXIuaXNSZWNvcmRpbmcoKVwiXHJcbiAgICAgIFtjbGFzcy5wdWxzZV09XCJyZWNvcmRlci5pc1JlY29yZGluZygpICYmICFyZWNvcmRlci5pc1BhdXNlZCgpXCJcclxuICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKClcIlxyXG4gICAgICBbdGl0bGVdPVwicGFuZWxPcGVuKCkgPyAnRGVidWcgUGFuZWwgc2NobGllw59lbicgOiAnRGVidWcgUGFuZWwgw7ZmZm5lbidcIlxyXG4gICAgPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImZhYi1pY29uXCI+e3sgcmVjb3JkZXIuaXNSZWNvcmRpbmcoKSA/ICfij7onIDogJ/CfkJsnIH19PC9zcGFuPlxyXG4gICAgICBAaWYgKHJlY29yZGVyLmlzUmVjb3JkaW5nKCkgJiYgcmVjb3JkZXIuYWN0aW9uQ291bnQoKSA+IDApIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZhYi1iYWRnZVwiPnt7IHJlY29yZGVyLmFjdGlvbkNvdW50KCkgfX08L3NwYW4+XHJcbiAgICAgIH1cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gTWFpbiBQYW5lbCAtLT5cclxuICAgIEBpZiAocGFuZWxPcGVuKCkpIHtcclxuICAgICAgPGRpdlxyXG4gICAgICAgIGRhdGEtZGVidWctcGFuZWxcclxuICAgICAgICBjbGFzcz1cImRlYnVnLXBhbmVsXCJcclxuICAgICAgICBbY2xhc3NdPVwiJ3Bvcy0nICsgcG9zaXRpb24oKVwiXHJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cInBhbmVsV2lkdGgoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8IS0tIEhlYWRlciAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGVyXCIgKG1vdXNlZG93bik9XCJzdGFydERyYWcoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZWwtaWNvblwiPvCfkJs8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZWwtdGl0bGVcIj5EZWJ1ZyBSZWNvcmRlcjwvc3Bhbj5cclxuICAgICAgICAgICAgQGlmIChyZWNvcmRlci5pc1JlY29yZGluZygpKSB7XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWMtaW5kaWNhdG9yXCIgW2NsYXNzLnBhdXNlZF09XCJyZWNvcmRlci5pc1BhdXNlZCgpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyByZWNvcmRlci5pc1BhdXNlZCgpID8gJ+KPuCBQQVVTRUQnIDogJ+KPuiBSRUMnIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIkVpbnN0ZWxsdW5nZW5cIiAoY2xpY2spPVwic2hvd1NldHRpbmdzLnNldCh0cnVlKVwiPuKame+4jzwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiB0aXRsZT1cIlBvc2l0aW9uIHdlY2hzZWxuXCIgKGNsaWNrKT1cImN5Y2xlUG9zaXRpb24oKVwiPvCfk4w8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgdGl0bGU9XCJTY2hsaWXDn2VuXCIgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKClcIj7inJU8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNlc3Npb24gTmFtZSBJbnB1dCAob25seSB3aGVuIG5vdCByZWNvcmRpbmcpIC0tPlxyXG4gICAgICAgIEBpZiAoIXJlY29yZGVyLmlzUmVjb3JkaW5nKCkpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLXNldHVwXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIGRhdGEtZGVidWctcGFuZWxcclxuICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24taW5wdXRcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlc3Npb25OYW1lXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlc3Npb24tTmFtZSAob3B0aW9uYWwpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICAgZGF0YS1kZWJ1Zy1wYW5lbFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1kZXNjXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlc3Npb25EZXNjXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZlaGxlcmJlc2NocmVpYnVuZy4uLlwiXHJcbiAgICAgICAgICAgICAgcm93cz1cIjJcIlxyXG4gICAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBSZWNvcmRpbmcgQ29udHJvbHMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY29yZGluZy1jb250cm9sc1wiIGRhdGEtZGVidWctcGFuZWw+XHJcbiAgICAgICAgICBAaWYgKCFyZWNvcmRlci5pc1JlY29yZGluZygpKSB7XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjdHJsLWJ0biBzdGFydFwiIChjbGljayk9XCJzdGFydFJlY29yZGluZygpXCI+XHJcbiAgICAgICAgICAgICAg4pa2IEF1Zm5haG1lIHN0YXJ0ZW5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIHBhdXNlXCIgKGNsaWNrKT1cInJlY29yZGVyLnBhdXNlUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICB7eyByZWNvcmRlci5pc1BhdXNlZCgpID8gJ+KWtiBGb3J0c2V0emVuJyA6ICfij7ggUGF1c2UnIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY3RybC1idG4gc3RvcFwiIChjbGljayk9XCJzdG9wUmVjb3JkaW5nKClcIj5cclxuICAgICAgICAgICAgICDij7kgU3RvcHBlblxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN0cmwtYnRuIGNsZWFyXCIgdGl0bGU9XCJBa3Rpb25lbiBsw7ZzY2hlblwiIChjbGljayk9XCJyZWNvcmRlci5jbGVhckN1cnJlbnRTZXNzaW9uKClcIj5cclxuICAgICAgICAgICAgICDwn5eRXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIEBpZiAoaGFzQWN0aW9ucygpKSB7XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICBjbGFzcz1cImN0cmwtYnRuIGdlbmVyYXRlXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWlTZXJ2aWNlLmlzR2VuZXJhdGluZygpIHx8ICFhaVNlcnZpY2Uud2ViaG9va1VybCgpXCJcclxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIWFpU2VydmljZS53ZWJob29rVXJsKCkgPyAnV2ViaG9vay1VUkwgaW4gRWluc3RlbGx1bmdlbiBlaW50cmFnZW4nIDogJ0N5cHJlc3MgVGVzdCBnZW5lcmllcmVuJ1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImdlbmVyYXRlVGVzdCgpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIEBpZiAoYWlTZXJ2aWNlLmlzR2VuZXJhdGluZygpKSB7XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNwaW5uZXJcIj7in7M8L3NwYW4+IEdlbmVyaWVyZS4uLlxyXG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAg8J+kliDihpIgQ3lwcmVzcyBUZXN0XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBFcnJvciBCYW5uZXIgLS0+XHJcbiAgICAgICAgQGlmIChhaVNlcnZpY2UuZXJyb3IoKSkge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yLWJhbm5lclwiIGRhdGEtZGVidWctcGFuZWw+XHJcbiAgICAgICAgICAgIOKaoO+4jyB7eyBhaVNlcnZpY2UuZXJyb3IoKSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8IS0tIFRhYnMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXJcIiBkYXRhLWRlYnVnLXBhbmVsPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cInRhYi1idG5cIlxyXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnYWN0aW9ucydcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgQWt0aW9uZW5cclxuICAgICAgICAgICAgQGlmIChyZWNvcmRlci5hY3Rpb25Db3VudCgpID4gMCkge1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFiLWJhZGdlXCI+e3sgcmVjb3JkZXIuYWN0aW9uQ291bnQoKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdyZXBsYXknXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZVRhYi5zZXQoJ3JlcGxheScpXCJcclxuICAgICAgICAgICAgdGl0bGU9XCJycndlYiBTZXNzaW9uIFJlcGxheVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIPCfk73vuI8gUmVwbGF5XHJcbiAgICAgICAgICAgIEBpZiAocnJ3ZWIuZXZlbnRDb3VudCgpID4gMCkge1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFiLWJhZGdlXCI+e3sgcnJ3ZWIuZXZlbnRDb3VudCgpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ3Rlc3QnXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhaVNlcnZpY2UubGFzdFRlc3QoKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVUYWIuc2V0KCd0ZXN0JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICDwn6SWIFRlc3RcclxuICAgICAgICAgICAgQGlmIChhaVNlcnZpY2UubGFzdFRlc3QoKSkge1xyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFiLWJhZGdlIG5ld1wiPk5FVTwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdzZXNzaW9ucydcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVjb3JkZXIuc2Vzc2lvbnMoKS5sZW5ndGggPT09IDBcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnc2Vzc2lvbnMnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIFNlc3Npb25zICh7eyByZWNvcmRlci5zZXNzaW9ucygpLmxlbmd0aCB9fSlcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFRhYiBDb250ZW50IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudFwiPlxyXG4gICAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ2FjdGlvbnMnKSB7XHJcbiAgICAgICAgICAgIDxhcHAtYWN0aW9uLWxpc3RcclxuICAgICAgICAgICAgICBbc2Vzc2lvbl09XCJyZWNvcmRlci5jdXJyZW50U2Vzc2lvbigpXCJcclxuICAgICAgICAgICAgICAocmVtb3ZlQWN0aW9uKT1cInJlY29yZGVyLnJlbW92ZUFjdGlvbigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoYWRkTm90ZSk9XCJyZWNvcmRlci5hZGROb3RlKCRldmVudC5pZCwgJGV2ZW50Lm5vdGUpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAncmVwbGF5Jykge1xyXG4gICAgICAgICAgICA8YXBwLXNlc3Npb24tcmVwbGF5IC8+XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ3Rlc3QnKSB7XHJcbiAgICAgICAgICAgIDxhcHAtdGVzdC1wcmV2aWV3IFt0ZXN0XT1cImFpU2VydmljZS5sYXN0VGVzdCgpXCIgLz5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAnc2Vzc2lvbnMnKSB7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9ucy1saXN0XCI+XHJcbiAgICAgICAgICAgICAgQGZvciAoc2Vzc2lvbiBvZiByZWNvcmRlci5zZXNzaW9ucygpOyB0cmFjayBzZXNzaW9uLmlkKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLW5hbWVcIj57eyBzZXNzaW9uLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLW1ldGFcIj57eyBzZXNzaW9uLmFjdGlvbnMubGVuZ3RoIH19IEFrdGlvbmVuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNtLWJ0blwiIChjbGljayk9XCJsb2FkQW5kR2VuZXJhdGUoc2Vzc2lvbilcIj7wn6SWIE5ldSBnZW5lcmllcmVuPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNtLWJ0biBkYW5nZXJcIiAoY2xpY2spPVwicmVjb3JkZXIuZGVsZXRlU2Vzc2lvbihzZXNzaW9uLmlkKVwiPvCfl5E8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFJlc2l6ZSBIYW5kbGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cInN0YXJ0UmVzaXplKCRldmVudClcIj7ioL88L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPCEtLSBTZXR0aW5ncyBEaWFsb2cgLS0+XHJcbiAgICBAaWYgKHNob3dTZXR0aW5ncygpKSB7XHJcbiAgICAgIDxhcHAtc2V0dGluZ3MtZGlhbG9nIChjbG9zZSk9XCJzaG93U2V0dGluZ3Muc2V0KGZhbHNlKVwiIC8+XHJcbiAgICB9XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgICAuZGVidWctZmFiIHtcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICBib3R0b206IDI0cHg7XHJcbiAgICAgIHJpZ2h0OiAyNHB4O1xyXG4gICAgICB6LWluZGV4OiA5OTk5OTtcclxuICAgICAgd2lkdGg6IDUycHg7XHJcbiAgICAgIGhlaWdodDogNTJweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XHJcbiAgICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgICAgZm9udC1zaXplOiAyMnB4O1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMCwwLDAsMC40KTtcclxuICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMsIGJhY2tncm91bmQgMC4ycztcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgfVxyXG4gICAgLmRlYnVnLWZhYjpob3ZlciB7IHRyYW5zZm9ybTogc2NhbGUoMS4xKTsgYmFja2dyb3VuZDogIzMzNDE1NTsgfVxyXG4gICAgLmRlYnVnLWZhYi5yZWNvcmRpbmcgeyBiYWNrZ3JvdW5kOiAjZGMyNjI2OyB9XHJcbiAgICAuZGVidWctZmFiLnB1bHNlIHsgYW5pbWF0aW9uOiBmYWJQdWxzZSAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlOyB9XHJcbiAgICBAa2V5ZnJhbWVzIGZhYlB1bHNlIHtcclxuICAgICAgMCUsIDEwMCUgeyBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMjIwLDM4LDM4LDAuNCk7IH1cclxuICAgICAgNTAlIHsgYm94LXNoYWRvdzogMCA0cHggMzBweCByZ2JhKDIyMCwzOCwzOCwwLjkpLCAwIDAgMCA4cHggcmdiYSgyMjAsMzgsMzgsMC4xNSk7IH1cclxuICAgIH1cclxuICAgIC5mYWItYmFkZ2Uge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHRvcDogLTRweDtcclxuICAgICAgcmlnaHQ6IC00cHg7XHJcbiAgICAgIGJhY2tncm91bmQ6ICNmNTllMGI7XHJcbiAgICAgIGNvbG9yOiAjMDAwO1xyXG4gICAgICBmb250LXNpemU6IDEwcHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XHJcbiAgICAgIG1pbi13aWR0aDogMThweDtcclxuICAgICAgaGVpZ2h0OiAxOHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA5cHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBwYWRkaW5nOiAwIDRweDtcclxuICAgIH1cclxuXHJcbiAgICAuZGVidWctcGFuZWwge1xyXG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgIHotaW5kZXg6IDk5OTk4O1xyXG4gICAgICB3aWR0aDogNDIwcHg7XHJcbiAgICAgIG1heC1oZWlnaHQ6IDgwdmg7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMwZjE3MmE7XHJcbiAgICAgIGNvbG9yOiAjZTJlOGYwO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiAxMnB4O1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjMWUzYTVmO1xyXG4gICAgICBib3gtc2hhZG93OiAwIDI1cHggNjBweCByZ2JhKDAsMCwwLDAuNik7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBzeXN0ZW0tdWksIHNhbnMtc2VyaWY7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIH1cclxuICAgIC5wb3MtYm90dG9tLXJpZ2h0IHsgYm90dG9tOiA4OHB4OyByaWdodDogMjRweDsgfVxyXG4gICAgLnBvcy1ib3R0b20tbGVmdCAgeyBib3R0b206IDg4cHg7IGxlZnQ6IDI0cHg7IH1cclxuICAgIC5wb3MtdG9wLXJpZ2h0ICAgIHsgdG9wOiAyNHB4OyByaWdodDogMjRweDsgfVxyXG4gICAgLnBvcy10b3AtbGVmdCAgICAgeyB0b3A6IDI0cHg7IGxlZnQ6IDI0cHg7IH1cclxuXHJcbiAgICAucGFuZWwtaGVhZGVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICBwYWRkaW5nOiAxMHB4IDE0cHg7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzM0MTU1O1xyXG4gICAgICBjdXJzb3I6IG1vdmU7XHJcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICBmbGV4LXNocmluazogMDtcclxuICAgIH1cclxuICAgIC5oZWFkZXItbGVmdCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyB9XHJcbiAgICAucGFuZWwtaWNvbiB7IGZvbnQtc2l6ZTogMTZweDsgfVxyXG4gICAgLnBhbmVsLXRpdGxlIHsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogI2YxZjVmOTsgfVxyXG4gICAgLnJlYy1pbmRpY2F0b3Ige1xyXG4gICAgICBmb250LXNpemU6IDEwcHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XHJcbiAgICAgIGNvbG9yOiAjZWY0NDQ0O1xyXG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSw2OCw2OCwwLjE1KTtcclxuICAgICAgcGFkZGluZzogMnB4IDdweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgICBhbmltYXRpb246IGJsaW5rIDFzIHN0ZXAtZW5kIGluZmluaXRlO1xyXG4gICAgfVxyXG4gICAgLnJlYy1pbmRpY2F0b3IucGF1c2VkIHsgY29sb3I6ICNmNTllMGI7IGJhY2tncm91bmQ6IHJnYmEoMjQ1LDE1OCwxMSwwLjE1KTsgYW5pbWF0aW9uOiBub25lOyB9XHJcbiAgICBAa2V5ZnJhbWVzIGJsaW5rIHsgNTAlIHsgb3BhY2l0eTogMC40OyB9IH1cclxuICAgIC5oZWFkZXItYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyB9XHJcbiAgICAuaWNvbi1idG4ge1xyXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGNvbG9yOiAjOTRhM2I4O1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDRweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xyXG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cywgYmFja2dyb3VuZCAwLjE1cztcclxuICAgIH1cclxuICAgIC5pY29uLWJ0bjpob3ZlciB7IGNvbG9yOiAjZjFmNWY5OyBiYWNrZ3JvdW5kOiAjMzM0MTU1OyB9XHJcblxyXG4gICAgLnNlc3Npb24tc2V0dXAge1xyXG4gICAgICBwYWRkaW5nOiAxMHB4IDE0cHg7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICBnYXA6IDZweDtcclxuICAgICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICB9XHJcbiAgICAuc2Vzc2lvbi1pbnB1dCwgLnNlc3Npb24tZGVzYyB7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMxZTI5M2I7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMzMzQxNTU7XHJcbiAgICAgIGNvbG9yOiAjZTJlOGYwO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICByZXNpemU6IHZlcnRpY2FsO1xyXG4gICAgfVxyXG4gICAgLnNlc3Npb24taW5wdXQ6Zm9jdXMsIC5zZXNzaW9uLWRlc2M6Zm9jdXMge1xyXG4gICAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgICBib3JkZXItY29sb3I6ICMzYjgyZjY7XHJcbiAgICB9XHJcblxyXG4gICAgLnJlY29yZGluZy1jb250cm9scyB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGdhcDogNnB4O1xyXG4gICAgICBwYWRkaW5nOiAxMHB4IDE0cHg7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xyXG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgfVxyXG4gICAgLmN0cmwtYnRuIHtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgICAgIHBhZGRpbmc6IDZweCAxNHB4O1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgdHJhbnNpdGlvbjogZmlsdGVyIDAuMTVzLCB0cmFuc2Zvcm0gMC4xcztcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiA1cHg7XHJcbiAgICB9XHJcbiAgICAuY3RybC1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgeyBmaWx0ZXI6IGJyaWdodG5lc3MoMS4xNSk7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsgfVxyXG4gICAgLmN0cmwtYnRuOmFjdGl2ZTpub3QoOmRpc2FibGVkKSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfVxyXG4gICAgLmN0cmwtYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC41OyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9XHJcbiAgICAuY3RybC1idG4uc3RhcnQgICAgeyBiYWNrZ3JvdW5kOiAjMTZhMzRhOyBjb2xvcjogI2ZmZjsgfVxyXG4gICAgLmN0cmwtYnRuLnN0b3AgICAgIHsgYmFja2dyb3VuZDogI2RjMjYyNjsgY29sb3I6ICNmZmY7IH1cclxuICAgIC5jdHJsLWJ0bi5wYXVzZSAgICB7IGJhY2tncm91bmQ6ICNkOTc3MDY7IGNvbG9yOiAjZmZmOyB9XHJcbiAgICAuY3RybC1idG4uZ2VuZXJhdGUgeyBiYWNrZ3JvdW5kOiAjN2MzYWVkOyBjb2xvcjogI2ZmZjsgZmxleDogMTsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH1cclxuICAgIC5jdHJsLWJ0bi5jbGVhciAgICB7IGJhY2tncm91bmQ6ICMzNzQxNTE7IGNvbG9yOiAjOWNhM2FmOyBwYWRkaW5nOiA2cHggMTBweDsgfVxyXG4gICAgLnNwaW5uZXIgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGFuaW1hdGlvbjogc3BpbiAwLjhzIGxpbmVhciBpbmZpbml0ZTsgfVxyXG4gICAgQGtleWZyYW1lcyBzcGluIHsgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH1cclxuXHJcbiAgICAuZXJyb3ItYmFubmVyIHtcclxuICAgICAgYmFja2dyb3VuZDogcmdiYSgyMjAsMzgsMzgsMC4xNSk7XHJcbiAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2RjMjYyNjtcclxuICAgICAgY29sb3I6ICNmY2E1YTU7XHJcbiAgICAgIHBhZGRpbmc6IDhweCAxNHB4O1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC50YWItYmFyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMxZTI5M2I7XHJcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgfVxyXG4gICAgLnRhYi1idG4ge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xyXG4gICAgICBwYWRkaW5nOiA4cHggNHB4O1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIGdhcDogNXB4O1xyXG4gICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzO1xyXG4gICAgfVxyXG4gICAgLnRhYi1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgeyBjb2xvcjogI2NiZDVlMTsgfVxyXG4gICAgLnRhYi1idG4uYWN0aXZlIHsgY29sb3I6ICM2MGE1ZmE7IGJvcmRlci1ib3R0b20tY29sb3I6ICMzYjgyZjY7IH1cclxuICAgIC50YWItYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC40OyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9XHJcbiAgICAudGFiLWJhZGdlIHtcclxuICAgICAgYmFja2dyb3VuZDogIzMzNDE1NTtcclxuICAgICAgY29sb3I6ICM5NGEzYjg7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICAgICAgcGFkZGluZzogMXB4IDVweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgfVxyXG4gICAgLnRhYi1iYWRnZS5uZXcgeyBiYWNrZ3JvdW5kOiAjN2MzYWVkOyBjb2xvcjogI2U5ZDVmZjsgfVxyXG5cclxuICAgIC50YWItY29udGVudCB7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICAgIGZsZXg6IDE7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XHJcbiAgICB9XHJcbiAgICAudGFiLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgd2lkdGg6IDVweDsgfVxyXG4gICAgLnRhYi1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9XHJcbiAgICAudGFiLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsgYmFja2dyb3VuZDogIzMzNDE1NTsgYm9yZGVyLXJhZGl1czogM3B4OyB9XHJcblxyXG4gICAgLnNlc3Npb25zLWxpc3QgeyBwYWRkaW5nOiAxMHB4IDE0cHg7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4OyB9XHJcbiAgICAuc2Vzc2lvbi1jYXJkIHtcclxuICAgICAgYmFja2dyb3VuZDogIzFlMjkzYjtcclxuICAgICAgYm9yZGVyOiAxcHggc29saWQgIzMzNDE1NTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgfVxyXG4gICAgLnNlc3Npb24tY2FyZC1oZWFkZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcclxuICAgIH1cclxuICAgIC5zZXNzaW9uLW5hbWUgeyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogI2YxZjVmOTsgZm9udC1zaXplOiAxM3B4OyB9XHJcbiAgICAuc2Vzc2lvbi1tZXRhIHsgZm9udC1zaXplOiAxMXB4OyBjb2xvcjogIzY0NzQ4YjsgfVxyXG4gICAgLnNlc3Npb24tY2FyZC1hY3Rpb25zIHsgZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7IH1cclxuICAgIC5zbS1idG4ge1xyXG4gICAgICBiYWNrZ3JvdW5kOiAjMzM0MTU1O1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGNvbG9yOiAjY2JkNWUxO1xyXG4gICAgICBwYWRkaW5nOiA0cHggMTBweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgICBmb250LXNpemU6IDExcHg7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cztcclxuICAgIH1cclxuICAgIC5zbS1idG46aG92ZXIgeyBiYWNrZ3JvdW5kOiAjNDc1NTY5OyB9XHJcbiAgICAuc20tYnRuLmRhbmdlciB7IGNvbG9yOiAjZmNhNWE1OyB9XHJcbiAgICAuc20tYnRuLmRhbmdlcjpob3ZlciB7IGJhY2tncm91bmQ6IHJnYmEoMjIwLDM4LDM4LDAuMik7IH1cclxuXHJcbiAgICAucmVzaXplLWhhbmRsZSB7XHJcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgICAgY29sb3I6ICMzMzQxNTU7XHJcbiAgICAgIGN1cnNvcjogbnMtcmVzaXplO1xyXG4gICAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICAgIHBhZGRpbmc6IDJweDtcclxuICAgICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICAgIGJhY2tncm91bmQ6ICMwZjE3MmE7XHJcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgfVxyXG4gICAgLnJlc2l6ZS1oYW5kbGU6aG92ZXIgeyBjb2xvcjogIzY0NzQ4YjsgfVxyXG4gIGBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGVidWdQYW5lbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICByZWNvcmRlciA9IGluamVjdChSZWNvcmRlclNlcnZpY2UpO1xyXG4gIGFpU2VydmljZSA9IGluamVjdChBaUdlbmVyYXRvclNlcnZpY2UpO1xyXG4gIHJyd2ViID0gaW5qZWN0KFJyd2ViUmVjb3JkZXJTZXJ2aWNlKTtcclxuXHJcbiAgcGFuZWxPcGVuID0gc2lnbmFsKGZhbHNlKTtcclxuICBhY3RpdmVUYWIgPSBzaWduYWw8UGFuZWxUYWI+KCdhY3Rpb25zJyk7XHJcbiAgcG9zaXRpb24gPSBzaWduYWw8UGFuZWxQb3NpdGlvbj4oJ2JvdHRvbS1yaWdodCcpO1xyXG4gIHBhbmVsV2lkdGggPSBzaWduYWwoNDIwKTtcclxuICBzaG93U2V0dGluZ3MgPSBzaWduYWwoZmFsc2UpO1xyXG4gIHNlc3Npb25OYW1lID0gJyc7XHJcbiAgc2Vzc2lvbkRlc2MgPSAnJztcclxuXHJcbiAgaGFzQWN0aW9ucyA9IGNvbXB1dGVkKFxyXG4gICAgKCkgPT4gKHRoaXMucmVjb3JkZXIuY3VycmVudFNlc3Npb24oKT8uYWN0aW9ucy5sZW5ndGggPz8gMCkgPiAwIHx8XHJcbiAgICAgICAgICAodGhpcy5yZWNvcmRlci5zZXNzaW9ucygpLmxlbmd0aCA+IDApXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSByZXNpemluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcmVzaXplU3RhcnRZID0gMDtcclxuICBwcml2YXRlIHJlc2l6ZVN0YXJ0SCA9IDA7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gS2V5Ym9hcmQgc2hvcnRjdXQ6IEN0cmwrU2hpZnQrRFxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlSG90a2V5KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlSG90a2V5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlSG90a2V5ID0gKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICAgIGlmIChlLmN0cmxLZXkgJiYgZS5zaGlmdEtleSAmJiBlLmtleSA9PT0gJ0QnKSB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy50b2dnbGVQYW5lbCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKGUuY3RybEtleSAmJiBlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSAnUicpIHtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBpZiAodGhpcy5yZWNvcmRlci5pc1JlY29yZGluZygpKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGFydFJlY29yZGluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgdG9nZ2xlUGFuZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhbmVsT3Blbi51cGRhdGUodiA9PiAhdik7XHJcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4oKSAmJiAhdGhpcy5yZWNvcmRlci5jdXJyZW50U2Vzc2lvbigpKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3ljbGVQb3NpdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uczogUGFuZWxQb3NpdGlvbltdID0gWydib3R0b20tcmlnaHQnLCAnYm90dG9tLWxlZnQnLCAndG9wLXJpZ2h0JywgJ3RvcC1sZWZ0J107XHJcbiAgICBjb25zdCBpZHggPSBwb3NpdGlvbnMuaW5kZXhPZih0aGlzLnBvc2l0aW9uKCkpO1xyXG4gICAgdGhpcy5wb3NpdGlvbi5zZXQocG9zaXRpb25zWyhpZHggKyAxKSAlIHBvc2l0aW9ucy5sZW5ndGhdKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0UmVjb3JkaW5nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWNvcmRlci5zdGFydFJlY29yZGluZyhcclxuICAgICAgdGhpcy5zZXNzaW9uTmFtZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIHRoaXMuc2Vzc2lvbkRlc2MgfHwgdW5kZWZpbmVkXHJcbiAgICApO1xyXG4gICAgLy8gU3RhcnQgcnJ3ZWIgaW4gcGFyYWxsZWwgZm9yIHZpc3VhbCByZXBsYXlcclxuICAgIHRoaXMucnJ3ZWIuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgIHRoaXMuYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpO1xyXG4gIH1cclxuXHJcbiAgc3RvcFJlY29yZGluZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnJlY29yZGVyLnN0b3BSZWNvcmRpbmcoKTtcclxuICAgIHRoaXMucnJ3ZWIuc3RvcFJlY29yZGluZygpO1xyXG4gICAgaWYgKHNlc3Npb24pIHtcclxuICAgICAgdGhpcy5hY3RpdmVUYWIuc2V0KCdhY3Rpb25zJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZW5lcmF0ZVRlc3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5yZWNvcmRlci5jdXJyZW50U2Vzc2lvbigpID8/IHRoaXMucmVjb3JkZXIuc2Vzc2lvbnMoKS5hdCgtMSk7XHJcbiAgICBpZiAoIXNlc3Npb24pIHJldHVybjtcclxuICAgIGF3YWl0IHRoaXMuYWlTZXJ2aWNlLmdlbmVyYXRlQ3lwcmVzc1Rlc3Qoc2Vzc2lvbik7XHJcbiAgICB0aGlzLmFjdGl2ZVRhYi5zZXQoJ3Rlc3QnKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWRBbmRHZW5lcmF0ZShzZXNzaW9uOiBSZWNvcmRpbmdTZXNzaW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmFpU2VydmljZS5nZW5lcmF0ZUN5cHJlc3NUZXN0KHNlc3Npb24pO1xyXG4gICAgdGhpcy5hY3RpdmVUYWIuc2V0KCd0ZXN0Jyk7XHJcbiAgfVxyXG5cclxuICAvLyBEcmFnIHRvIHJlcG9zaXRpb25cclxuICBzdGFydERyYWcoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnYnV0dG9uJykpIHJldHVybjtcclxuICAgIGNvbnN0IHBhbmVsID0gKGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkucGFyZW50RWxlbWVudCE7XHJcbiAgICBjb25zdCBzdGFydFggPSBlLmNsaWVudFggLSBwYW5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xyXG4gICAgY29uc3Qgc3RhcnRZID0gZS5jbGllbnRZIC0gcGFuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xyXG5cclxuICAgIGNvbnN0IG9uTW92ZSA9IChldjogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICBwYW5lbC5zdHlsZS5sZWZ0ID0gYCR7ZXYuY2xpZW50WCAtIHN0YXJ0WH1weGA7XHJcbiAgICAgIHBhbmVsLnN0eWxlLnRvcCAgPSBgJHtldi5jbGllbnRZIC0gc3RhcnRZfXB4YDtcclxuICAgICAgcGFuZWwuc3R5bGUucmlnaHQgPSAnYXV0byc7XHJcbiAgICAgIHBhbmVsLnN0eWxlLmJvdHRvbSA9ICdhdXRvJztcclxuICAgIH07XHJcbiAgICBjb25zdCBvblVwID0gKCkgPT4ge1xyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25VcCk7XHJcbiAgICB9O1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTtcclxuICB9XHJcblxyXG4gIC8vIFJlc2l6ZSBoZWlnaHRcclxuICBzdGFydFJlc2l6ZShlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBwYW5lbCA9IChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQhO1xyXG4gICAgdGhpcy5yZXNpemVTdGFydFkgPSBlLmNsaWVudFk7XHJcbiAgICB0aGlzLnJlc2l6ZVN0YXJ0SCA9IHBhbmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcclxuXHJcbiAgICBjb25zdCBvbk1vdmUgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgY29uc3QgbmV3SCA9IE1hdGgubWF4KDI1MCwgdGhpcy5yZXNpemVTdGFydEggKyAoZXYuY2xpZW50WSAtIHRoaXMucmVzaXplU3RhcnRZKSk7XHJcbiAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9IGAke25ld0h9cHhgO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IG9uVXAgPSAoKSA9PiB7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW92ZSk7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblVwKTtcclxuICAgIH07XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVXApO1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxufVxyXG4iXX0=