bways-report 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/core/services/index.mjs +2 -1
- package/esm2022/lib/core/services/report-storage.service.mjs +63 -0
- package/esm2022/lib/core/tokens/index.mjs +2 -1
- package/esm2022/lib/core/tokens/storage.token.mjs +128 -0
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +16 -44
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +3 -371
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +3 -1015
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +3 -679
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +3 -947
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +3 -549
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +10 -6
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +3 -421
- package/fesm2022/bways-report.mjs +1288 -5091
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/services/index.d.ts +1 -0
- package/lib/core/services/report-storage.service.d.ts +26 -0
- package/lib/core/tokens/index.d.ts +2 -0
- package/lib/core/tokens/storage.token.d.ts +48 -0
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +1 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -0
- package/package.json +9 -1
package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs
CHANGED
|
@@ -101,954 +101,10 @@ export class PropertyEditorGridComponent {
|
|
|
101
101
|
this.updateRowClickAction.emit({ ...current, parameterMapping: nextMapping });
|
|
102
102
|
}
|
|
103
103
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
104
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorGridComponent, isStandalone: true, selector: "rpt-property-editor-grid", inputs: { grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { addGrid: "addGrid", removeGrid: "removeGrid", addColumn: "addColumn", autoDetectColumns: "autoDetectColumns", removeColumn: "removeColumn", updateColumn: "updateColumn", updateOption: "updateOption", updateRowClickAction: "updateRowClickAction" }, ngImport: i0, template: `
|
|
105
|
-
@if (!grid()) {
|
|
106
|
-
<div class="empty-grid-card">
|
|
107
|
-
<div class="empty-grid-icon">
|
|
108
|
-
<rpt-icon name="table" [size]="28" />
|
|
109
|
-
</div>
|
|
110
|
-
<h4 class="empty-grid-title">No Result Grid Attached</h4>
|
|
111
|
-
<p class="empty-grid-desc">Attach an interactive Result Data Grid (or UltraGrid) to this report definition to render queries and stored procedure results.</p>
|
|
112
|
-
<button type="button" class="btn-create-grid-action" (click)="addGrid.emit()">
|
|
113
|
-
<rpt-icon name="plus" [size]="14" />
|
|
114
|
-
<span>+ Add Result Grid</span>
|
|
115
|
-
</button>
|
|
116
|
-
</div>
|
|
117
|
-
} @else {
|
|
118
|
-
<div class="props-form">
|
|
119
|
-
<div class="property-group">
|
|
120
|
-
<div class="group-header-with-btn">
|
|
121
|
-
<span class="group-title">Columns ({{ columns().length }})</span>
|
|
122
|
-
<div style="display: flex; gap: 4px;">
|
|
123
|
-
<button
|
|
124
|
-
type="button"
|
|
125
|
-
class="btn-add-col"
|
|
126
|
-
style="background: #eff6ff; color: #2563eb; border-color: #bfdbfe;"
|
|
127
|
-
(click)="autoDetectColumns.emit()"
|
|
128
|
-
title="Auto-detect all columns from procedure or data table"
|
|
129
|
-
>
|
|
130
|
-
<rpt-icon name="refresh" [size]="11" />
|
|
131
|
-
<span>Auto-Detect</span>
|
|
132
|
-
</button>
|
|
133
|
-
<button type="button" class="btn-add-col" (click)="addColumn.emit()">
|
|
134
|
-
<rpt-icon name="plus" [size]="12" />
|
|
135
|
-
<span>Add Column</span>
|
|
136
|
-
</button>
|
|
137
|
-
</div>
|
|
138
|
-
</div>
|
|
139
|
-
|
|
140
|
-
<div class="columns-editor-list">
|
|
141
|
-
@for (col of columns(); track col.field; let idx = $index) {
|
|
142
|
-
<div class="col-edit-card">
|
|
143
|
-
<div class="col-card-header">
|
|
144
|
-
<div class="col-header-title-group">
|
|
145
|
-
<span class="col-drag-dots">⋮⋮</span>
|
|
146
|
-
<span class="col-idx-badge">#{{ idx + 1 }}</span>
|
|
147
|
-
<input
|
|
148
|
-
type="text"
|
|
149
|
-
class="col-title-input"
|
|
150
|
-
placeholder="Column Label"
|
|
151
|
-
[ngModel]="col.label"
|
|
152
|
-
(ngModelChange)="onUpdateCol(idx, 'label', $event)"
|
|
153
|
-
/>
|
|
154
|
-
</div>
|
|
155
|
-
<div class="col-card-actions">
|
|
156
|
-
<span class="col-type-pill">{{ col.dataType || 'string' }}</span>
|
|
157
|
-
<button
|
|
158
|
-
type="button"
|
|
159
|
-
class="col-action-btn btn-delete"
|
|
160
|
-
(click)="removeColumn.emit(idx)"
|
|
161
|
-
title="Remove Column"
|
|
162
|
-
>
|
|
163
|
-
<rpt-icon name="trash" [size]="12" />
|
|
164
|
-
</button>
|
|
165
|
-
</div>
|
|
166
|
-
</div>
|
|
167
|
-
|
|
168
|
-
<div class="col-card-body">
|
|
169
|
-
<div class="col-edit-fields">
|
|
170
|
-
<div class="col-field-item">
|
|
171
|
-
<span class="mini-label">Field</span>
|
|
172
|
-
<input
|
|
173
|
-
type="text"
|
|
174
|
-
class="col-mini-input"
|
|
175
|
-
placeholder="field"
|
|
176
|
-
[ngModel]="col.field"
|
|
177
|
-
(ngModelChange)="onUpdateCol(idx, 'field', $event)"
|
|
178
|
-
/>
|
|
179
|
-
</div>
|
|
180
|
-
<div class="col-field-item">
|
|
181
|
-
<span class="mini-label">Type</span>
|
|
182
|
-
<select
|
|
183
|
-
class="col-mini-select"
|
|
184
|
-
[ngModel]="col.dataType || 'string'"
|
|
185
|
-
(ngModelChange)="onUpdateCol(idx, 'dataType', $event)"
|
|
186
|
-
>
|
|
187
|
-
<option value="string">String</option>
|
|
188
|
-
<option value="number">Number</option>
|
|
189
|
-
<option value="currency">Currency</option>
|
|
190
|
-
<option value="date">Date</option>
|
|
191
|
-
<option value="boolean">Boolean</option>
|
|
192
|
-
</select>
|
|
193
|
-
</div>
|
|
194
|
-
<div class="col-field-item">
|
|
195
|
-
<span class="mini-label">Format</span>
|
|
196
|
-
<input
|
|
197
|
-
type="text"
|
|
198
|
-
class="col-mini-input"
|
|
199
|
-
placeholder="e.g. dd/MM/yyyy"
|
|
200
|
-
[ngModel]="col.format"
|
|
201
|
-
(ngModelChange)="onUpdateCol(idx, 'format', $event)"
|
|
202
|
-
/>
|
|
203
|
-
</div>
|
|
204
|
-
<div class="col-field-item">
|
|
205
|
-
<span class="mini-label">Align</span>
|
|
206
|
-
<select
|
|
207
|
-
class="col-mini-select"
|
|
208
|
-
[ngModel]="col.align || 'left'"
|
|
209
|
-
(ngModelChange)="onUpdateCol(idx, 'align', $event)"
|
|
210
|
-
>
|
|
211
|
-
<option value="left">Left</option>
|
|
212
|
-
<option value="center">Center</option>
|
|
213
|
-
<option value="right">Right</option>
|
|
214
|
-
</select>
|
|
215
|
-
</div>
|
|
216
|
-
<div class="col-field-item">
|
|
217
|
-
<span class="mini-label">Aggregate</span>
|
|
218
|
-
<select
|
|
219
|
-
class="col-mini-select"
|
|
220
|
-
[ngModel]="col.aggregate || 'none'"
|
|
221
|
-
(ngModelChange)="onUpdateCol(idx, 'aggregate', $event === 'none' ? undefined : $event)"
|
|
222
|
-
>
|
|
223
|
-
<option value="none">None</option>
|
|
224
|
-
<option value="sum">Sum</option>
|
|
225
|
-
<option value="avg">Average</option>
|
|
226
|
-
<option value="count">Count</option>
|
|
227
|
-
<option value="min">Min</option>
|
|
228
|
-
<option value="max">Max</option>
|
|
229
|
-
</select>
|
|
230
|
-
</div>
|
|
231
|
-
<div class="col-field-item">
|
|
232
|
-
<span class="mini-label">Width</span>
|
|
233
|
-
<input
|
|
234
|
-
type="text"
|
|
235
|
-
class="col-mini-input"
|
|
236
|
-
placeholder="auto"
|
|
237
|
-
[ngModel]="col.width || ''"
|
|
238
|
-
(ngModelChange)="onUpdateCol(idx, 'width', $event || undefined)"
|
|
239
|
-
/>
|
|
240
|
-
</div>
|
|
241
|
-
</div>
|
|
242
|
-
|
|
243
|
-
<div class="col-card-footer">
|
|
244
|
-
<label class="col-checkbox-toggle">
|
|
245
|
-
<input
|
|
246
|
-
type="checkbox"
|
|
247
|
-
[ngModel]="col.visible !== false"
|
|
248
|
-
(ngModelChange)="onUpdateCol(idx, 'visible', $event)"
|
|
249
|
-
/>
|
|
250
|
-
<span>Visible</span>
|
|
251
|
-
</label>
|
|
252
|
-
<label class="col-checkbox-toggle">
|
|
253
|
-
<input
|
|
254
|
-
type="checkbox"
|
|
255
|
-
[ngModel]="col.checkboxSelection ?? false"
|
|
256
|
-
(ngModelChange)="onUpdateCol(idx, 'checkboxSelection', $event)"
|
|
257
|
-
/>
|
|
258
|
-
<span>Checkbox</span>
|
|
259
|
-
</label>
|
|
260
|
-
</div>
|
|
261
|
-
</div>
|
|
262
|
-
</div>
|
|
263
|
-
}
|
|
264
|
-
</div>
|
|
265
|
-
</div>
|
|
266
|
-
|
|
267
|
-
<!-- Grid Table Options Group -->
|
|
268
|
-
<div class="property-group">
|
|
269
|
-
<div class="group-title">Table Options</div>
|
|
270
|
-
|
|
271
|
-
<div class="field-row">
|
|
272
|
-
<label class="checkbox-toggle">
|
|
273
|
-
<input
|
|
274
|
-
type="checkbox"
|
|
275
|
-
[ngModel]="grid()?.options?.sideBar !== false"
|
|
276
|
-
(ngModelChange)="updateOption.emit({ field: 'sideBar', value: $event })"
|
|
277
|
-
/>
|
|
278
|
-
<span>Enable Side Panel (Tool Panels)</span>
|
|
279
|
-
</label>
|
|
280
|
-
</div>
|
|
281
|
-
|
|
282
|
-
<div class="field-row">
|
|
283
|
-
<label class="checkbox-toggle">
|
|
284
|
-
<input
|
|
285
|
-
type="checkbox"
|
|
286
|
-
[ngModel]="grid()?.options?.globalSearch !== false"
|
|
287
|
-
(ngModelChange)="updateOption.emit({ field: 'globalSearch', value: $event })"
|
|
288
|
-
/>
|
|
289
|
-
<span>Global Search Box</span>
|
|
290
|
-
</label>
|
|
291
|
-
</div>
|
|
292
|
-
|
|
293
|
-
<div class="field-row">
|
|
294
|
-
<label class="checkbox-toggle">
|
|
295
|
-
<input
|
|
296
|
-
type="checkbox"
|
|
297
|
-
[ngModel]="grid()?.options?.statusBar !== false"
|
|
298
|
-
(ngModelChange)="updateOption.emit({ field: 'statusBar', value: $event })"
|
|
299
|
-
/>
|
|
300
|
-
<span>Status Bar</span>
|
|
301
|
-
</label>
|
|
302
|
-
</div>
|
|
303
|
-
|
|
304
|
-
<div class="field-row">
|
|
305
|
-
<label class="checkbox-toggle">
|
|
306
|
-
<input
|
|
307
|
-
type="checkbox"
|
|
308
|
-
[ngModel]="grid()?.options?.pagination ?? true"
|
|
309
|
-
(ngModelChange)="updateOption.emit({ field: 'pagination', value: $event })"
|
|
310
|
-
/>
|
|
311
|
-
<span>Enable Pagination</span>
|
|
312
|
-
</label>
|
|
313
|
-
</div>
|
|
314
|
-
|
|
315
|
-
<div class="field-row">
|
|
316
|
-
<label class="checkbox-toggle">
|
|
317
|
-
<input
|
|
318
|
-
type="checkbox"
|
|
319
|
-
[ngModel]="grid()?.options?.selectable ?? false"
|
|
320
|
-
(ngModelChange)="updateOption.emit({ field: 'selectable', value: $event })"
|
|
321
|
-
/>
|
|
322
|
-
<span>Row Selection</span>
|
|
323
|
-
</label>
|
|
324
|
-
</div>
|
|
325
|
-
|
|
326
|
-
@if (grid()?.options?.selectable) {
|
|
327
|
-
<div class="field-row">
|
|
328
|
-
<label class="field-label">Selection Mode</label>
|
|
329
|
-
<select
|
|
330
|
-
class="field-input"
|
|
331
|
-
[ngModel]="grid()?.options?.selectionMode ?? 'multiple'"
|
|
332
|
-
(ngModelChange)="updateOption.emit({ field: 'selectionMode', value: $event })"
|
|
333
|
-
>
|
|
334
|
-
<option value="multiple">Multiple Rows</option>
|
|
335
|
-
<option value="single">Single Row</option>
|
|
336
|
-
</select>
|
|
337
|
-
</div>
|
|
338
|
-
|
|
339
|
-
<div class="field-row">
|
|
340
|
-
<label class="checkbox-toggle">
|
|
341
|
-
<input
|
|
342
|
-
type="checkbox"
|
|
343
|
-
[ngModel]="grid()?.options?.checkboxSelection ?? true"
|
|
344
|
-
(ngModelChange)="updateOption.emit({ field: 'checkboxSelection', value: $event })"
|
|
345
|
-
/>
|
|
346
|
-
<span>Checkbox Selection</span>
|
|
347
|
-
</label>
|
|
348
|
-
</div>
|
|
349
|
-
|
|
350
|
-
@if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {
|
|
351
|
-
<div class="field-row">
|
|
352
|
-
<label class="checkbox-toggle">
|
|
353
|
-
<input
|
|
354
|
-
type="checkbox"
|
|
355
|
-
[ngModel]="grid()?.options?.headerCheckboxSelection ?? true"
|
|
356
|
-
(ngModelChange)="updateOption.emit({ field: 'headerCheckboxSelection', value: $event })"
|
|
357
|
-
/>
|
|
358
|
-
<span>Header Select All Checkbox</span>
|
|
359
|
-
</label>
|
|
360
|
-
</div>
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
<div class="field-row">
|
|
365
|
-
<label class="checkbox-toggle">
|
|
366
|
-
<input
|
|
367
|
-
type="checkbox"
|
|
368
|
-
[ngModel]="grid()?.options?.allowColumnReorder ?? true"
|
|
369
|
-
(ngModelChange)="updateOption.emit({ field: 'allowColumnReorder', value: $event })"
|
|
370
|
-
/>
|
|
371
|
-
<span>Allow Column Reorder</span>
|
|
372
|
-
</label>
|
|
373
|
-
</div>
|
|
374
|
-
|
|
375
|
-
<div class="field-row">
|
|
376
|
-
<label class="checkbox-toggle">
|
|
377
|
-
<input
|
|
378
|
-
type="checkbox"
|
|
379
|
-
[ngModel]="grid()?.options?.allowExport ?? true"
|
|
380
|
-
(ngModelChange)="updateOption.emit({ field: 'allowExport', value: $event })"
|
|
381
|
-
/>
|
|
382
|
-
<span>Allow Export</span>
|
|
383
|
-
</label>
|
|
384
|
-
</div>
|
|
385
|
-
|
|
386
|
-
<div class="field-row">
|
|
387
|
-
<label class="field-label">Page Size</label>
|
|
388
|
-
<input
|
|
389
|
-
type="number"
|
|
390
|
-
class="field-input"
|
|
391
|
-
min="5"
|
|
392
|
-
max="100"
|
|
393
|
-
[ngModel]="grid()?.options?.pageSize ?? 10"
|
|
394
|
-
(ngModelChange)="updateOption.emit({ field: 'pageSize', value: +$event })"
|
|
395
|
-
/>
|
|
396
|
-
</div>
|
|
397
|
-
|
|
398
|
-
<div class="field-row">
|
|
399
|
-
<label class="checkbox-toggle">
|
|
400
|
-
<input
|
|
401
|
-
type="checkbox"
|
|
402
|
-
[ngModel]="grid()?.options?.showRowNumbers ?? true"
|
|
403
|
-
(ngModelChange)="updateOption.emit({ field: 'showRowNumbers', value: $event })"
|
|
404
|
-
/>
|
|
405
|
-
<span>Show Row Numbers</span>
|
|
406
|
-
</label>
|
|
407
|
-
</div>
|
|
408
|
-
|
|
409
|
-
<div class="field-row">
|
|
410
|
-
<label class="checkbox-toggle">
|
|
411
|
-
<input
|
|
412
|
-
type="checkbox"
|
|
413
|
-
[ngModel]="grid()?.options?.showFooter ?? true"
|
|
414
|
-
(ngModelChange)="updateOption.emit({ field: 'showFooter', value: $event })"
|
|
415
|
-
/>
|
|
416
|
-
<span>Show Footer Totals</span>
|
|
417
|
-
</label>
|
|
418
|
-
</div>
|
|
419
|
-
</div>
|
|
420
|
-
|
|
421
|
-
<!-- Row Click & Drill-Down Action Group -->
|
|
422
|
-
<div class="property-group">
|
|
423
|
-
<div class="group-title">Row Click & Drill-Down</div>
|
|
424
|
-
|
|
425
|
-
<div class="field-row">
|
|
426
|
-
<label class="checkbox-toggle">
|
|
427
|
-
<input
|
|
428
|
-
type="checkbox"
|
|
429
|
-
[ngModel]="hasRowClickAction()"
|
|
430
|
-
(ngModelChange)="toggleRowClickAction($event)"
|
|
431
|
-
/>
|
|
432
|
-
<span>Enable Row Click Action</span>
|
|
433
|
-
</label>
|
|
434
|
-
</div>
|
|
435
|
-
|
|
436
|
-
@if (hasRowClickAction()) {
|
|
437
|
-
<div class="field-row">
|
|
438
|
-
<label class="field-label">Action Type</label>
|
|
439
|
-
<select
|
|
440
|
-
class="field-input field-select"
|
|
441
|
-
[ngModel]="rowClickAction()?.type || 'open-drawer'"
|
|
442
|
-
(ngModelChange)="updateRowActionField('type', $event)"
|
|
443
|
-
>
|
|
444
|
-
<option value="open-drawer">Slide-Over Detail Drawer</option>
|
|
445
|
-
<option value="drilldown-report">Drill-Down Report (Host Event)</option>
|
|
446
|
-
<option value="navigate">Navigate to URL</option>
|
|
447
|
-
<option value="emit-custom">Emit Custom Action</option>
|
|
448
|
-
</select>
|
|
449
|
-
</div>
|
|
450
|
-
|
|
451
|
-
@if (rowClickAction()?.type === 'open-drawer' || rowClickAction()?.type === 'drilldown-report') {
|
|
452
|
-
<div class="field-row">
|
|
453
|
-
<label class="field-label">Target Report ID</label>
|
|
454
|
-
<input
|
|
455
|
-
type="text"
|
|
456
|
-
class="field-input"
|
|
457
|
-
placeholder="e.g. order-details"
|
|
458
|
-
[ngModel]="rowClickAction()?.targetReportId || ''"
|
|
459
|
-
(ngModelChange)="updateRowActionField('targetReportId', $event)"
|
|
460
|
-
/>
|
|
461
|
-
</div>
|
|
462
|
-
|
|
463
|
-
<div class="field-row">
|
|
464
|
-
<label class="field-label">Drawer Title</label>
|
|
465
|
-
<input
|
|
466
|
-
type="text"
|
|
467
|
-
class="field-input"
|
|
468
|
-
placeholder="e.g. Order Details"
|
|
469
|
-
[ngModel]="rowClickAction()?.drawerTitle || ''"
|
|
470
|
-
(ngModelChange)="updateRowActionField('drawerTitle', $event)"
|
|
471
|
-
/>
|
|
472
|
-
</div>
|
|
473
|
-
|
|
474
|
-
<div class="field-row">
|
|
475
|
-
<label class="field-label">Drawer Width</label>
|
|
476
|
-
<input
|
|
477
|
-
type="text"
|
|
478
|
-
class="field-input"
|
|
479
|
-
placeholder="e.g. 760px, 80%, 900px"
|
|
480
|
-
[ngModel]="rowClickAction()?.drawerWidth || '760px'"
|
|
481
|
-
(ngModelChange)="updateRowActionField('drawerWidth', $event)"
|
|
482
|
-
/>
|
|
483
|
-
</div>
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
@if (rowClickAction()?.type === 'navigate') {
|
|
487
|
-
<div class="field-row">
|
|
488
|
-
<label class="field-label">Target URL</label>
|
|
489
|
-
<input
|
|
490
|
-
type="text"
|
|
491
|
-
class="field-input"
|
|
492
|
-
[placeholder]="'/orders/{{row.orderId}} or https://...'"
|
|
493
|
-
[ngModel]="rowClickAction()?.targetUrl || ''"
|
|
494
|
-
(ngModelChange)="updateRowActionField('targetUrl', $event)"
|
|
495
|
-
/>
|
|
496
|
-
</div>
|
|
497
|
-
<div class="field-row">
|
|
498
|
-
<label class="checkbox-toggle">
|
|
499
|
-
<input
|
|
500
|
-
type="checkbox"
|
|
501
|
-
[ngModel]="rowClickAction()?.openNewTab ?? false"
|
|
502
|
-
(ngModelChange)="updateRowActionField('openNewTab', $event)"
|
|
503
|
-
/>
|
|
504
|
-
<span>Open in New Tab</span>
|
|
505
|
-
</label>
|
|
506
|
-
</div>
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
@if (rowClickAction()?.type === 'emit-custom') {
|
|
510
|
-
<div class="field-row">
|
|
511
|
-
<label class="field-label">Custom Action Name</label>
|
|
512
|
-
<input
|
|
513
|
-
type="text"
|
|
514
|
-
class="field-input"
|
|
515
|
-
placeholder="e.g. view-audit-trail"
|
|
516
|
-
[ngModel]="rowClickAction()?.customActionName || ''"
|
|
517
|
-
(ngModelChange)="updateRowActionField('customActionName', $event)"
|
|
518
|
-
/>
|
|
519
|
-
</div>
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
<div class="field-row">
|
|
523
|
-
<div class="field-label-row">
|
|
524
|
-
<label class="field-label">Parameter Mapping</label>
|
|
525
|
-
<button
|
|
526
|
-
type="button"
|
|
527
|
-
class="btn-add-mapping"
|
|
528
|
-
(click)="addParameterMapping()"
|
|
529
|
-
>
|
|
530
|
-
+ Add Mapping
|
|
531
|
-
</button>
|
|
532
|
-
</div>
|
|
533
|
-
|
|
534
|
-
@for (mapping of parameterMappings(); track mapping.key; let mIdx = $index) {
|
|
535
|
-
<div class="mapping-pair-row">
|
|
536
|
-
<input
|
|
537
|
-
type="text"
|
|
538
|
-
class="col-mini-input"
|
|
539
|
-
style="flex: 1;"
|
|
540
|
-
placeholder="Target (e.g. customerId)"
|
|
541
|
-
[ngModel]="mapping.key"
|
|
542
|
-
(ngModelChange)="updateMappingKey(mIdx, $event)"
|
|
543
|
-
/>
|
|
544
|
-
<span style="font-size: 0.75rem; color: #94a3b8;">←</span>
|
|
545
|
-
<input
|
|
546
|
-
type="text"
|
|
547
|
-
class="col-mini-input"
|
|
548
|
-
style="flex: 1;"
|
|
549
|
-
placeholder="Source (e.g. row.id)"
|
|
550
|
-
[ngModel]="mapping.value"
|
|
551
|
-
(ngModelChange)="updateMappingValue(mIdx, $event)"
|
|
552
|
-
/>
|
|
553
|
-
<button
|
|
554
|
-
type="button"
|
|
555
|
-
class="col-action-btn btn-delete"
|
|
556
|
-
(click)="removeMapping(mIdx)"
|
|
557
|
-
title="Remove mapping"
|
|
558
|
-
>
|
|
559
|
-
<rpt-icon name="trash" [size]="11" />
|
|
560
|
-
</button>
|
|
561
|
-
</div>
|
|
562
|
-
}
|
|
563
|
-
</div>
|
|
564
|
-
}
|
|
565
|
-
</div>
|
|
566
|
-
|
|
567
|
-
<!-- Remove Grid Action -->
|
|
568
|
-
<div class="grid-danger-zone">
|
|
569
|
-
<button type="button" class="btn-remove-grid-action" (click)="removeGrid.emit()">
|
|
570
|
-
<rpt-icon name="trash" [size]="13" />
|
|
571
|
-
<span>Remove Grid from Report</span>
|
|
572
|
-
</button>
|
|
573
|
-
</div>
|
|
574
|
-
</div>
|
|
575
|
-
}
|
|
576
|
-
`, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
104
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorGridComponent, isStandalone: true, selector: "rpt-property-editor-grid", inputs: { grid: { classPropertyName: "grid", publicName: "grid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { addGrid: "addGrid", removeGrid: "removeGrid", addColumn: "addColumn", autoDetectColumns: "autoDetectColumns", removeColumn: "removeColumn", updateColumn: "updateColumn", updateOption: "updateOption", updateRowClickAction: "updateRowClickAction" }, ngImport: i0, template: " @if (!grid()) {\n <div class=\"empty-grid-card\">\n <div class=\"empty-grid-icon\">\n <rpt-icon name=\"table\" [size]=\"28\" />\n </div>\n <h4 class=\"empty-grid-title\">No Result Grid Attached</h4>\n <p class=\"empty-grid-desc\">Attach an interactive Result Data Grid (or UltraGrid) to this report definition to render queries and stored procedure results.</p>\n <button type=\"button\" class=\"btn-create-grid-action\" (click)=\"addGrid.emit()\">\n <rpt-icon name=\"plus\" [size]=\"14\" />\n <span>+ Add Result Grid</span>\n </button>\n </div>\n } @else {\n <div class=\"props-form\">\n <div class=\"property-group\">\n <div class=\"group-header-with-btn\">\n <span class=\"group-title\">Columns ({{ columns().length }})</span>\n <div style=\"display: flex; gap: 4px;\">\n <button\n type=\"button\"\n class=\"btn-add-col\"\n style=\"background: #eff6ff; color: #2563eb; border-color: #bfdbfe;\"\n (click)=\"autoDetectColumns.emit()\"\n title=\"Auto-detect all columns from procedure or data table\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Auto-Detect</span>\n </button>\n <button type=\"button\" class=\"btn-add-col\" (click)=\"addColumn.emit()\">\n <rpt-icon name=\"plus\" [size]=\"12\" />\n <span>Add Column</span>\n </button>\n </div>\n </div>\n\n <div class=\"columns-editor-list\">\n @for (col of columns(); track col.field; let idx = $index) {\n <div class=\"col-edit-card\">\n <div class=\"col-card-header\">\n <div class=\"col-header-title-group\">\n <span class=\"col-drag-dots\">\u22EE\u22EE</span>\n <span class=\"col-idx-badge\">#{{ idx + 1 }}</span>\n <input\n type=\"text\"\n class=\"col-title-input\"\n placeholder=\"Column Label\"\n [ngModel]=\"col.label\"\n (ngModelChange)=\"onUpdateCol(idx, 'label', $event)\"\n />\n </div>\n <div class=\"col-card-actions\">\n <span class=\"col-type-pill\">{{ col.dataType || 'string' }}</span>\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeColumn.emit(idx)\"\n title=\"Remove Column\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n </div>\n\n <div class=\"col-card-body\">\n <div class=\"col-edit-fields\">\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Field</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"field\"\n [ngModel]=\"col.field\"\n (ngModelChange)=\"onUpdateCol(idx, 'field', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Type</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.dataType || 'string'\"\n (ngModelChange)=\"onUpdateCol(idx, 'dataType', $event)\"\n >\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"currency\">Currency</option>\n <option value=\"date\">Date</option>\n <option value=\"boolean\">Boolean</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Format</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"e.g. dd/MM/yyyy\"\n [ngModel]=\"col.format\"\n (ngModelChange)=\"onUpdateCol(idx, 'format', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Align</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.align || 'left'\"\n (ngModelChange)=\"onUpdateCol(idx, 'align', $event)\"\n >\n <option value=\"left\">Left</option>\n <option value=\"center\">Center</option>\n <option value=\"right\">Right</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Aggregate</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.aggregate || 'none'\"\n (ngModelChange)=\"onUpdateCol(idx, 'aggregate', $event === 'none' ? undefined : $event)\"\n >\n <option value=\"none\">None</option>\n <option value=\"sum\">Sum</option>\n <option value=\"avg\">Average</option>\n <option value=\"count\">Count</option>\n <option value=\"min\">Min</option>\n <option value=\"max\">Max</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Width</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"auto\"\n [ngModel]=\"col.width || ''\"\n (ngModelChange)=\"onUpdateCol(idx, 'width', $event || undefined)\"\n />\n </div>\n </div>\n\n <div class=\"col-card-footer\">\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.visible !== false\"\n (ngModelChange)=\"onUpdateCol(idx, 'visible', $event)\"\n />\n <span>Visible</span>\n </label>\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.checkboxSelection ?? false\"\n (ngModelChange)=\"onUpdateCol(idx, 'checkboxSelection', $event)\"\n />\n <span>Checkbox</span>\n </label>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Grid Table Options Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Table Options</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.sideBar !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'sideBar', value: $event })\"\n />\n <span>Enable Side Panel (Tool Panels)</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.globalSearch !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'globalSearch', value: $event })\"\n />\n <span>Global Search Box</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.statusBar !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'statusBar', value: $event })\"\n />\n <span>Status Bar</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.pagination ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'pagination', value: $event })\"\n />\n <span>Enable Pagination</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.selectable ?? false\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectable', value: $event })\"\n />\n <span>Row Selection</span>\n </label>\n </div>\n\n @if (grid()?.options?.selectable) {\n <div class=\"field-row\">\n <label class=\"field-label\">Selection Mode</label>\n <select\n class=\"field-input\"\n [ngModel]=\"grid()?.options?.selectionMode ?? 'multiple'\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectionMode', value: $event })\"\n >\n <option value=\"multiple\">Multiple Rows</option>\n <option value=\"single\">Single Row</option>\n </select>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.checkboxSelection ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'checkboxSelection', value: $event })\"\n />\n <span>Checkbox Selection</span>\n </label>\n </div>\n\n @if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.headerCheckboxSelection ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'headerCheckboxSelection', value: $event })\"\n />\n <span>Header Select All Checkbox</span>\n </label>\n </div>\n }\n }\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowColumnReorder ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowColumnReorder', value: $event })\"\n />\n <span>Allow Column Reorder</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowExport ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowExport', value: $event })\"\n />\n <span>Allow Export</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Page Size</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"5\"\n max=\"100\"\n [ngModel]=\"grid()?.options?.pageSize ?? 10\"\n (ngModelChange)=\"updateOption.emit({ field: 'pageSize', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showRowNumbers ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showRowNumbers', value: $event })\"\n />\n <span>Show Row Numbers</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showFooter ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showFooter', value: $event })\"\n />\n <span>Show Footer Totals</span>\n </label>\n </div>\n </div>\n\n <!-- Row Click & Drill-Down Action Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Row Click & Drill-Down</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"hasRowClickAction()\"\n (ngModelChange)=\"toggleRowClickAction($event)\"\n />\n <span>Enable Row Click Action</span>\n </label>\n </div>\n\n @if (hasRowClickAction()) {\n <div class=\"field-row\">\n <label class=\"field-label\">Action Type</label>\n <select\n class=\"field-input field-select\"\n [ngModel]=\"rowClickAction()?.type || 'open-drawer'\"\n (ngModelChange)=\"updateRowActionField('type', $event)\"\n >\n <option value=\"open-drawer\">Slide-Over Detail Drawer</option>\n <option value=\"drilldown-report\">Drill-Down Report (Host Event)</option>\n <option value=\"navigate\">Navigate to URL</option>\n <option value=\"emit-custom\">Emit Custom Action</option>\n </select>\n </div>\n\n @if (rowClickAction()?.type === 'open-drawer' || rowClickAction()?.type === 'drilldown-report') {\n <div class=\"field-row\">\n <label class=\"field-label\">Target Report ID</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. order-details\"\n [ngModel]=\"rowClickAction()?.targetReportId || ''\"\n (ngModelChange)=\"updateRowActionField('targetReportId', $event)\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Drawer Title</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. Order Details\"\n [ngModel]=\"rowClickAction()?.drawerTitle || ''\"\n (ngModelChange)=\"updateRowActionField('drawerTitle', $event)\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Drawer Width</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 760px, 80%, 900px\"\n [ngModel]=\"rowClickAction()?.drawerWidth || '760px'\"\n (ngModelChange)=\"updateRowActionField('drawerWidth', $event)\"\n />\n </div>\n }\n\n @if (rowClickAction()?.type === 'navigate') {\n <div class=\"field-row\">\n <label class=\"field-label\">Target URL</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [placeholder]=\"'/orders/{{row.orderId}} or https://...'\"\n [ngModel]=\"rowClickAction()?.targetUrl || ''\"\n (ngModelChange)=\"updateRowActionField('targetUrl', $event)\"\n />\n </div>\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"rowClickAction()?.openNewTab ?? false\"\n (ngModelChange)=\"updateRowActionField('openNewTab', $event)\"\n />\n <span>Open in New Tab</span>\n </label>\n </div>\n }\n\n @if (rowClickAction()?.type === 'emit-custom') {\n <div class=\"field-row\">\n <label class=\"field-label\">Custom Action Name</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. view-audit-trail\"\n [ngModel]=\"rowClickAction()?.customActionName || ''\"\n (ngModelChange)=\"updateRowActionField('customActionName', $event)\"\n />\n </div>\n }\n\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Parameter Mapping</label>\n <button\n type=\"button\"\n class=\"btn-add-mapping\"\n (click)=\"addParameterMapping()\"\n >\n + Add Mapping\n </button>\n </div>\n\n @for (mapping of parameterMappings(); track mapping.key; let mIdx = $index) {\n <div class=\"mapping-pair-row\">\n <input\n type=\"text\"\n class=\"col-mini-input\"\n style=\"flex: 1;\"\n placeholder=\"Target (e.g. customerId)\"\n [ngModel]=\"mapping.key\"\n (ngModelChange)=\"updateMappingKey(mIdx, $event)\"\n />\n <span style=\"font-size: 0.75rem; color: #94a3b8;\">\u2190</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n style=\"flex: 1;\"\n placeholder=\"Source (e.g. row.id)\"\n [ngModel]=\"mapping.value\"\n (ngModelChange)=\"updateMappingValue(mIdx, $event)\"\n />\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeMapping(mIdx)\"\n title=\"Remove mapping\"\n >\n <rpt-icon name=\"trash\" [size]=\"11\" />\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Remove Grid Action -->\n <div class=\"grid-danger-zone\">\n <button type=\"button\" class=\"btn-remove-grid-action\" (click)=\"removeGrid.emit()\">\n <rpt-icon name=\"trash\" [size]=\"13\" />\n <span>Remove Grid from Report</span>\n </button>\n </div>\n </div>\n }", styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
577
105
|
}
|
|
578
106
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorGridComponent, decorators: [{
|
|
579
107
|
type: Component,
|
|
580
|
-
args: [{ selector: 'rpt-property-editor-grid', standalone: true, imports: [CommonModule, FormsModule, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
581
|
-
@if (!grid()) {
|
|
582
|
-
<div class="empty-grid-card">
|
|
583
|
-
<div class="empty-grid-icon">
|
|
584
|
-
<rpt-icon name="table" [size]="28" />
|
|
585
|
-
</div>
|
|
586
|
-
<h4 class="empty-grid-title">No Result Grid Attached</h4>
|
|
587
|
-
<p class="empty-grid-desc">Attach an interactive Result Data Grid (or UltraGrid) to this report definition to render queries and stored procedure results.</p>
|
|
588
|
-
<button type="button" class="btn-create-grid-action" (click)="addGrid.emit()">
|
|
589
|
-
<rpt-icon name="plus" [size]="14" />
|
|
590
|
-
<span>+ Add Result Grid</span>
|
|
591
|
-
</button>
|
|
592
|
-
</div>
|
|
593
|
-
} @else {
|
|
594
|
-
<div class="props-form">
|
|
595
|
-
<div class="property-group">
|
|
596
|
-
<div class="group-header-with-btn">
|
|
597
|
-
<span class="group-title">Columns ({{ columns().length }})</span>
|
|
598
|
-
<div style="display: flex; gap: 4px;">
|
|
599
|
-
<button
|
|
600
|
-
type="button"
|
|
601
|
-
class="btn-add-col"
|
|
602
|
-
style="background: #eff6ff; color: #2563eb; border-color: #bfdbfe;"
|
|
603
|
-
(click)="autoDetectColumns.emit()"
|
|
604
|
-
title="Auto-detect all columns from procedure or data table"
|
|
605
|
-
>
|
|
606
|
-
<rpt-icon name="refresh" [size]="11" />
|
|
607
|
-
<span>Auto-Detect</span>
|
|
608
|
-
</button>
|
|
609
|
-
<button type="button" class="btn-add-col" (click)="addColumn.emit()">
|
|
610
|
-
<rpt-icon name="plus" [size]="12" />
|
|
611
|
-
<span>Add Column</span>
|
|
612
|
-
</button>
|
|
613
|
-
</div>
|
|
614
|
-
</div>
|
|
615
|
-
|
|
616
|
-
<div class="columns-editor-list">
|
|
617
|
-
@for (col of columns(); track col.field; let idx = $index) {
|
|
618
|
-
<div class="col-edit-card">
|
|
619
|
-
<div class="col-card-header">
|
|
620
|
-
<div class="col-header-title-group">
|
|
621
|
-
<span class="col-drag-dots">⋮⋮</span>
|
|
622
|
-
<span class="col-idx-badge">#{{ idx + 1 }}</span>
|
|
623
|
-
<input
|
|
624
|
-
type="text"
|
|
625
|
-
class="col-title-input"
|
|
626
|
-
placeholder="Column Label"
|
|
627
|
-
[ngModel]="col.label"
|
|
628
|
-
(ngModelChange)="onUpdateCol(idx, 'label', $event)"
|
|
629
|
-
/>
|
|
630
|
-
</div>
|
|
631
|
-
<div class="col-card-actions">
|
|
632
|
-
<span class="col-type-pill">{{ col.dataType || 'string' }}</span>
|
|
633
|
-
<button
|
|
634
|
-
type="button"
|
|
635
|
-
class="col-action-btn btn-delete"
|
|
636
|
-
(click)="removeColumn.emit(idx)"
|
|
637
|
-
title="Remove Column"
|
|
638
|
-
>
|
|
639
|
-
<rpt-icon name="trash" [size]="12" />
|
|
640
|
-
</button>
|
|
641
|
-
</div>
|
|
642
|
-
</div>
|
|
643
|
-
|
|
644
|
-
<div class="col-card-body">
|
|
645
|
-
<div class="col-edit-fields">
|
|
646
|
-
<div class="col-field-item">
|
|
647
|
-
<span class="mini-label">Field</span>
|
|
648
|
-
<input
|
|
649
|
-
type="text"
|
|
650
|
-
class="col-mini-input"
|
|
651
|
-
placeholder="field"
|
|
652
|
-
[ngModel]="col.field"
|
|
653
|
-
(ngModelChange)="onUpdateCol(idx, 'field', $event)"
|
|
654
|
-
/>
|
|
655
|
-
</div>
|
|
656
|
-
<div class="col-field-item">
|
|
657
|
-
<span class="mini-label">Type</span>
|
|
658
|
-
<select
|
|
659
|
-
class="col-mini-select"
|
|
660
|
-
[ngModel]="col.dataType || 'string'"
|
|
661
|
-
(ngModelChange)="onUpdateCol(idx, 'dataType', $event)"
|
|
662
|
-
>
|
|
663
|
-
<option value="string">String</option>
|
|
664
|
-
<option value="number">Number</option>
|
|
665
|
-
<option value="currency">Currency</option>
|
|
666
|
-
<option value="date">Date</option>
|
|
667
|
-
<option value="boolean">Boolean</option>
|
|
668
|
-
</select>
|
|
669
|
-
</div>
|
|
670
|
-
<div class="col-field-item">
|
|
671
|
-
<span class="mini-label">Format</span>
|
|
672
|
-
<input
|
|
673
|
-
type="text"
|
|
674
|
-
class="col-mini-input"
|
|
675
|
-
placeholder="e.g. dd/MM/yyyy"
|
|
676
|
-
[ngModel]="col.format"
|
|
677
|
-
(ngModelChange)="onUpdateCol(idx, 'format', $event)"
|
|
678
|
-
/>
|
|
679
|
-
</div>
|
|
680
|
-
<div class="col-field-item">
|
|
681
|
-
<span class="mini-label">Align</span>
|
|
682
|
-
<select
|
|
683
|
-
class="col-mini-select"
|
|
684
|
-
[ngModel]="col.align || 'left'"
|
|
685
|
-
(ngModelChange)="onUpdateCol(idx, 'align', $event)"
|
|
686
|
-
>
|
|
687
|
-
<option value="left">Left</option>
|
|
688
|
-
<option value="center">Center</option>
|
|
689
|
-
<option value="right">Right</option>
|
|
690
|
-
</select>
|
|
691
|
-
</div>
|
|
692
|
-
<div class="col-field-item">
|
|
693
|
-
<span class="mini-label">Aggregate</span>
|
|
694
|
-
<select
|
|
695
|
-
class="col-mini-select"
|
|
696
|
-
[ngModel]="col.aggregate || 'none'"
|
|
697
|
-
(ngModelChange)="onUpdateCol(idx, 'aggregate', $event === 'none' ? undefined : $event)"
|
|
698
|
-
>
|
|
699
|
-
<option value="none">None</option>
|
|
700
|
-
<option value="sum">Sum</option>
|
|
701
|
-
<option value="avg">Average</option>
|
|
702
|
-
<option value="count">Count</option>
|
|
703
|
-
<option value="min">Min</option>
|
|
704
|
-
<option value="max">Max</option>
|
|
705
|
-
</select>
|
|
706
|
-
</div>
|
|
707
|
-
<div class="col-field-item">
|
|
708
|
-
<span class="mini-label">Width</span>
|
|
709
|
-
<input
|
|
710
|
-
type="text"
|
|
711
|
-
class="col-mini-input"
|
|
712
|
-
placeholder="auto"
|
|
713
|
-
[ngModel]="col.width || ''"
|
|
714
|
-
(ngModelChange)="onUpdateCol(idx, 'width', $event || undefined)"
|
|
715
|
-
/>
|
|
716
|
-
</div>
|
|
717
|
-
</div>
|
|
718
|
-
|
|
719
|
-
<div class="col-card-footer">
|
|
720
|
-
<label class="col-checkbox-toggle">
|
|
721
|
-
<input
|
|
722
|
-
type="checkbox"
|
|
723
|
-
[ngModel]="col.visible !== false"
|
|
724
|
-
(ngModelChange)="onUpdateCol(idx, 'visible', $event)"
|
|
725
|
-
/>
|
|
726
|
-
<span>Visible</span>
|
|
727
|
-
</label>
|
|
728
|
-
<label class="col-checkbox-toggle">
|
|
729
|
-
<input
|
|
730
|
-
type="checkbox"
|
|
731
|
-
[ngModel]="col.checkboxSelection ?? false"
|
|
732
|
-
(ngModelChange)="onUpdateCol(idx, 'checkboxSelection', $event)"
|
|
733
|
-
/>
|
|
734
|
-
<span>Checkbox</span>
|
|
735
|
-
</label>
|
|
736
|
-
</div>
|
|
737
|
-
</div>
|
|
738
|
-
</div>
|
|
739
|
-
}
|
|
740
|
-
</div>
|
|
741
|
-
</div>
|
|
742
|
-
|
|
743
|
-
<!-- Grid Table Options Group -->
|
|
744
|
-
<div class="property-group">
|
|
745
|
-
<div class="group-title">Table Options</div>
|
|
746
|
-
|
|
747
|
-
<div class="field-row">
|
|
748
|
-
<label class="checkbox-toggle">
|
|
749
|
-
<input
|
|
750
|
-
type="checkbox"
|
|
751
|
-
[ngModel]="grid()?.options?.sideBar !== false"
|
|
752
|
-
(ngModelChange)="updateOption.emit({ field: 'sideBar', value: $event })"
|
|
753
|
-
/>
|
|
754
|
-
<span>Enable Side Panel (Tool Panels)</span>
|
|
755
|
-
</label>
|
|
756
|
-
</div>
|
|
757
|
-
|
|
758
|
-
<div class="field-row">
|
|
759
|
-
<label class="checkbox-toggle">
|
|
760
|
-
<input
|
|
761
|
-
type="checkbox"
|
|
762
|
-
[ngModel]="grid()?.options?.globalSearch !== false"
|
|
763
|
-
(ngModelChange)="updateOption.emit({ field: 'globalSearch', value: $event })"
|
|
764
|
-
/>
|
|
765
|
-
<span>Global Search Box</span>
|
|
766
|
-
</label>
|
|
767
|
-
</div>
|
|
768
|
-
|
|
769
|
-
<div class="field-row">
|
|
770
|
-
<label class="checkbox-toggle">
|
|
771
|
-
<input
|
|
772
|
-
type="checkbox"
|
|
773
|
-
[ngModel]="grid()?.options?.statusBar !== false"
|
|
774
|
-
(ngModelChange)="updateOption.emit({ field: 'statusBar', value: $event })"
|
|
775
|
-
/>
|
|
776
|
-
<span>Status Bar</span>
|
|
777
|
-
</label>
|
|
778
|
-
</div>
|
|
779
|
-
|
|
780
|
-
<div class="field-row">
|
|
781
|
-
<label class="checkbox-toggle">
|
|
782
|
-
<input
|
|
783
|
-
type="checkbox"
|
|
784
|
-
[ngModel]="grid()?.options?.pagination ?? true"
|
|
785
|
-
(ngModelChange)="updateOption.emit({ field: 'pagination', value: $event })"
|
|
786
|
-
/>
|
|
787
|
-
<span>Enable Pagination</span>
|
|
788
|
-
</label>
|
|
789
|
-
</div>
|
|
790
|
-
|
|
791
|
-
<div class="field-row">
|
|
792
|
-
<label class="checkbox-toggle">
|
|
793
|
-
<input
|
|
794
|
-
type="checkbox"
|
|
795
|
-
[ngModel]="grid()?.options?.selectable ?? false"
|
|
796
|
-
(ngModelChange)="updateOption.emit({ field: 'selectable', value: $event })"
|
|
797
|
-
/>
|
|
798
|
-
<span>Row Selection</span>
|
|
799
|
-
</label>
|
|
800
|
-
</div>
|
|
801
|
-
|
|
802
|
-
@if (grid()?.options?.selectable) {
|
|
803
|
-
<div class="field-row">
|
|
804
|
-
<label class="field-label">Selection Mode</label>
|
|
805
|
-
<select
|
|
806
|
-
class="field-input"
|
|
807
|
-
[ngModel]="grid()?.options?.selectionMode ?? 'multiple'"
|
|
808
|
-
(ngModelChange)="updateOption.emit({ field: 'selectionMode', value: $event })"
|
|
809
|
-
>
|
|
810
|
-
<option value="multiple">Multiple Rows</option>
|
|
811
|
-
<option value="single">Single Row</option>
|
|
812
|
-
</select>
|
|
813
|
-
</div>
|
|
814
|
-
|
|
815
|
-
<div class="field-row">
|
|
816
|
-
<label class="checkbox-toggle">
|
|
817
|
-
<input
|
|
818
|
-
type="checkbox"
|
|
819
|
-
[ngModel]="grid()?.options?.checkboxSelection ?? true"
|
|
820
|
-
(ngModelChange)="updateOption.emit({ field: 'checkboxSelection', value: $event })"
|
|
821
|
-
/>
|
|
822
|
-
<span>Checkbox Selection</span>
|
|
823
|
-
</label>
|
|
824
|
-
</div>
|
|
825
|
-
|
|
826
|
-
@if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {
|
|
827
|
-
<div class="field-row">
|
|
828
|
-
<label class="checkbox-toggle">
|
|
829
|
-
<input
|
|
830
|
-
type="checkbox"
|
|
831
|
-
[ngModel]="grid()?.options?.headerCheckboxSelection ?? true"
|
|
832
|
-
(ngModelChange)="updateOption.emit({ field: 'headerCheckboxSelection', value: $event })"
|
|
833
|
-
/>
|
|
834
|
-
<span>Header Select All Checkbox</span>
|
|
835
|
-
</label>
|
|
836
|
-
</div>
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
<div class="field-row">
|
|
841
|
-
<label class="checkbox-toggle">
|
|
842
|
-
<input
|
|
843
|
-
type="checkbox"
|
|
844
|
-
[ngModel]="grid()?.options?.allowColumnReorder ?? true"
|
|
845
|
-
(ngModelChange)="updateOption.emit({ field: 'allowColumnReorder', value: $event })"
|
|
846
|
-
/>
|
|
847
|
-
<span>Allow Column Reorder</span>
|
|
848
|
-
</label>
|
|
849
|
-
</div>
|
|
850
|
-
|
|
851
|
-
<div class="field-row">
|
|
852
|
-
<label class="checkbox-toggle">
|
|
853
|
-
<input
|
|
854
|
-
type="checkbox"
|
|
855
|
-
[ngModel]="grid()?.options?.allowExport ?? true"
|
|
856
|
-
(ngModelChange)="updateOption.emit({ field: 'allowExport', value: $event })"
|
|
857
|
-
/>
|
|
858
|
-
<span>Allow Export</span>
|
|
859
|
-
</label>
|
|
860
|
-
</div>
|
|
861
|
-
|
|
862
|
-
<div class="field-row">
|
|
863
|
-
<label class="field-label">Page Size</label>
|
|
864
|
-
<input
|
|
865
|
-
type="number"
|
|
866
|
-
class="field-input"
|
|
867
|
-
min="5"
|
|
868
|
-
max="100"
|
|
869
|
-
[ngModel]="grid()?.options?.pageSize ?? 10"
|
|
870
|
-
(ngModelChange)="updateOption.emit({ field: 'pageSize', value: +$event })"
|
|
871
|
-
/>
|
|
872
|
-
</div>
|
|
873
|
-
|
|
874
|
-
<div class="field-row">
|
|
875
|
-
<label class="checkbox-toggle">
|
|
876
|
-
<input
|
|
877
|
-
type="checkbox"
|
|
878
|
-
[ngModel]="grid()?.options?.showRowNumbers ?? true"
|
|
879
|
-
(ngModelChange)="updateOption.emit({ field: 'showRowNumbers', value: $event })"
|
|
880
|
-
/>
|
|
881
|
-
<span>Show Row Numbers</span>
|
|
882
|
-
</label>
|
|
883
|
-
</div>
|
|
884
|
-
|
|
885
|
-
<div class="field-row">
|
|
886
|
-
<label class="checkbox-toggle">
|
|
887
|
-
<input
|
|
888
|
-
type="checkbox"
|
|
889
|
-
[ngModel]="grid()?.options?.showFooter ?? true"
|
|
890
|
-
(ngModelChange)="updateOption.emit({ field: 'showFooter', value: $event })"
|
|
891
|
-
/>
|
|
892
|
-
<span>Show Footer Totals</span>
|
|
893
|
-
</label>
|
|
894
|
-
</div>
|
|
895
|
-
</div>
|
|
896
|
-
|
|
897
|
-
<!-- Row Click & Drill-Down Action Group -->
|
|
898
|
-
<div class="property-group">
|
|
899
|
-
<div class="group-title">Row Click & Drill-Down</div>
|
|
900
|
-
|
|
901
|
-
<div class="field-row">
|
|
902
|
-
<label class="checkbox-toggle">
|
|
903
|
-
<input
|
|
904
|
-
type="checkbox"
|
|
905
|
-
[ngModel]="hasRowClickAction()"
|
|
906
|
-
(ngModelChange)="toggleRowClickAction($event)"
|
|
907
|
-
/>
|
|
908
|
-
<span>Enable Row Click Action</span>
|
|
909
|
-
</label>
|
|
910
|
-
</div>
|
|
911
|
-
|
|
912
|
-
@if (hasRowClickAction()) {
|
|
913
|
-
<div class="field-row">
|
|
914
|
-
<label class="field-label">Action Type</label>
|
|
915
|
-
<select
|
|
916
|
-
class="field-input field-select"
|
|
917
|
-
[ngModel]="rowClickAction()?.type || 'open-drawer'"
|
|
918
|
-
(ngModelChange)="updateRowActionField('type', $event)"
|
|
919
|
-
>
|
|
920
|
-
<option value="open-drawer">Slide-Over Detail Drawer</option>
|
|
921
|
-
<option value="drilldown-report">Drill-Down Report (Host Event)</option>
|
|
922
|
-
<option value="navigate">Navigate to URL</option>
|
|
923
|
-
<option value="emit-custom">Emit Custom Action</option>
|
|
924
|
-
</select>
|
|
925
|
-
</div>
|
|
926
|
-
|
|
927
|
-
@if (rowClickAction()?.type === 'open-drawer' || rowClickAction()?.type === 'drilldown-report') {
|
|
928
|
-
<div class="field-row">
|
|
929
|
-
<label class="field-label">Target Report ID</label>
|
|
930
|
-
<input
|
|
931
|
-
type="text"
|
|
932
|
-
class="field-input"
|
|
933
|
-
placeholder="e.g. order-details"
|
|
934
|
-
[ngModel]="rowClickAction()?.targetReportId || ''"
|
|
935
|
-
(ngModelChange)="updateRowActionField('targetReportId', $event)"
|
|
936
|
-
/>
|
|
937
|
-
</div>
|
|
938
|
-
|
|
939
|
-
<div class="field-row">
|
|
940
|
-
<label class="field-label">Drawer Title</label>
|
|
941
|
-
<input
|
|
942
|
-
type="text"
|
|
943
|
-
class="field-input"
|
|
944
|
-
placeholder="e.g. Order Details"
|
|
945
|
-
[ngModel]="rowClickAction()?.drawerTitle || ''"
|
|
946
|
-
(ngModelChange)="updateRowActionField('drawerTitle', $event)"
|
|
947
|
-
/>
|
|
948
|
-
</div>
|
|
949
|
-
|
|
950
|
-
<div class="field-row">
|
|
951
|
-
<label class="field-label">Drawer Width</label>
|
|
952
|
-
<input
|
|
953
|
-
type="text"
|
|
954
|
-
class="field-input"
|
|
955
|
-
placeholder="e.g. 760px, 80%, 900px"
|
|
956
|
-
[ngModel]="rowClickAction()?.drawerWidth || '760px'"
|
|
957
|
-
(ngModelChange)="updateRowActionField('drawerWidth', $event)"
|
|
958
|
-
/>
|
|
959
|
-
</div>
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
@if (rowClickAction()?.type === 'navigate') {
|
|
963
|
-
<div class="field-row">
|
|
964
|
-
<label class="field-label">Target URL</label>
|
|
965
|
-
<input
|
|
966
|
-
type="text"
|
|
967
|
-
class="field-input"
|
|
968
|
-
[placeholder]="'/orders/{{row.orderId}} or https://...'"
|
|
969
|
-
[ngModel]="rowClickAction()?.targetUrl || ''"
|
|
970
|
-
(ngModelChange)="updateRowActionField('targetUrl', $event)"
|
|
971
|
-
/>
|
|
972
|
-
</div>
|
|
973
|
-
<div class="field-row">
|
|
974
|
-
<label class="checkbox-toggle">
|
|
975
|
-
<input
|
|
976
|
-
type="checkbox"
|
|
977
|
-
[ngModel]="rowClickAction()?.openNewTab ?? false"
|
|
978
|
-
(ngModelChange)="updateRowActionField('openNewTab', $event)"
|
|
979
|
-
/>
|
|
980
|
-
<span>Open in New Tab</span>
|
|
981
|
-
</label>
|
|
982
|
-
</div>
|
|
983
|
-
}
|
|
984
|
-
|
|
985
|
-
@if (rowClickAction()?.type === 'emit-custom') {
|
|
986
|
-
<div class="field-row">
|
|
987
|
-
<label class="field-label">Custom Action Name</label>
|
|
988
|
-
<input
|
|
989
|
-
type="text"
|
|
990
|
-
class="field-input"
|
|
991
|
-
placeholder="e.g. view-audit-trail"
|
|
992
|
-
[ngModel]="rowClickAction()?.customActionName || ''"
|
|
993
|
-
(ngModelChange)="updateRowActionField('customActionName', $event)"
|
|
994
|
-
/>
|
|
995
|
-
</div>
|
|
996
|
-
}
|
|
997
|
-
|
|
998
|
-
<div class="field-row">
|
|
999
|
-
<div class="field-label-row">
|
|
1000
|
-
<label class="field-label">Parameter Mapping</label>
|
|
1001
|
-
<button
|
|
1002
|
-
type="button"
|
|
1003
|
-
class="btn-add-mapping"
|
|
1004
|
-
(click)="addParameterMapping()"
|
|
1005
|
-
>
|
|
1006
|
-
+ Add Mapping
|
|
1007
|
-
</button>
|
|
1008
|
-
</div>
|
|
1009
|
-
|
|
1010
|
-
@for (mapping of parameterMappings(); track mapping.key; let mIdx = $index) {
|
|
1011
|
-
<div class="mapping-pair-row">
|
|
1012
|
-
<input
|
|
1013
|
-
type="text"
|
|
1014
|
-
class="col-mini-input"
|
|
1015
|
-
style="flex: 1;"
|
|
1016
|
-
placeholder="Target (e.g. customerId)"
|
|
1017
|
-
[ngModel]="mapping.key"
|
|
1018
|
-
(ngModelChange)="updateMappingKey(mIdx, $event)"
|
|
1019
|
-
/>
|
|
1020
|
-
<span style="font-size: 0.75rem; color: #94a3b8;">←</span>
|
|
1021
|
-
<input
|
|
1022
|
-
type="text"
|
|
1023
|
-
class="col-mini-input"
|
|
1024
|
-
style="flex: 1;"
|
|
1025
|
-
placeholder="Source (e.g. row.id)"
|
|
1026
|
-
[ngModel]="mapping.value"
|
|
1027
|
-
(ngModelChange)="updateMappingValue(mIdx, $event)"
|
|
1028
|
-
/>
|
|
1029
|
-
<button
|
|
1030
|
-
type="button"
|
|
1031
|
-
class="col-action-btn btn-delete"
|
|
1032
|
-
(click)="removeMapping(mIdx)"
|
|
1033
|
-
title="Remove mapping"
|
|
1034
|
-
>
|
|
1035
|
-
<rpt-icon name="trash" [size]="11" />
|
|
1036
|
-
</button>
|
|
1037
|
-
</div>
|
|
1038
|
-
}
|
|
1039
|
-
</div>
|
|
1040
|
-
}
|
|
1041
|
-
</div>
|
|
1042
|
-
|
|
1043
|
-
<!-- Remove Grid Action -->
|
|
1044
|
-
<div class="grid-danger-zone">
|
|
1045
|
-
<button type="button" class="btn-remove-grid-action" (click)="removeGrid.emit()">
|
|
1046
|
-
<rpt-icon name="trash" [size]="13" />
|
|
1047
|
-
<span>Remove Grid from Report</span>
|
|
1048
|
-
</button>
|
|
1049
|
-
</div>
|
|
1050
|
-
</div>
|
|
1051
|
-
}
|
|
1052
|
-
`, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\n"] }]
|
|
108
|
+
args: [{ selector: 'rpt-property-editor-grid', standalone: true, imports: [CommonModule, FormsModule, RptIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: " @if (!grid()) {\n <div class=\"empty-grid-card\">\n <div class=\"empty-grid-icon\">\n <rpt-icon name=\"table\" [size]=\"28\" />\n </div>\n <h4 class=\"empty-grid-title\">No Result Grid Attached</h4>\n <p class=\"empty-grid-desc\">Attach an interactive Result Data Grid (or UltraGrid) to this report definition to render queries and stored procedure results.</p>\n <button type=\"button\" class=\"btn-create-grid-action\" (click)=\"addGrid.emit()\">\n <rpt-icon name=\"plus\" [size]=\"14\" />\n <span>+ Add Result Grid</span>\n </button>\n </div>\n } @else {\n <div class=\"props-form\">\n <div class=\"property-group\">\n <div class=\"group-header-with-btn\">\n <span class=\"group-title\">Columns ({{ columns().length }})</span>\n <div style=\"display: flex; gap: 4px;\">\n <button\n type=\"button\"\n class=\"btn-add-col\"\n style=\"background: #eff6ff; color: #2563eb; border-color: #bfdbfe;\"\n (click)=\"autoDetectColumns.emit()\"\n title=\"Auto-detect all columns from procedure or data table\"\n >\n <rpt-icon name=\"refresh\" [size]=\"11\" />\n <span>Auto-Detect</span>\n </button>\n <button type=\"button\" class=\"btn-add-col\" (click)=\"addColumn.emit()\">\n <rpt-icon name=\"plus\" [size]=\"12\" />\n <span>Add Column</span>\n </button>\n </div>\n </div>\n\n <div class=\"columns-editor-list\">\n @for (col of columns(); track col.field; let idx = $index) {\n <div class=\"col-edit-card\">\n <div class=\"col-card-header\">\n <div class=\"col-header-title-group\">\n <span class=\"col-drag-dots\">\u22EE\u22EE</span>\n <span class=\"col-idx-badge\">#{{ idx + 1 }}</span>\n <input\n type=\"text\"\n class=\"col-title-input\"\n placeholder=\"Column Label\"\n [ngModel]=\"col.label\"\n (ngModelChange)=\"onUpdateCol(idx, 'label', $event)\"\n />\n </div>\n <div class=\"col-card-actions\">\n <span class=\"col-type-pill\">{{ col.dataType || 'string' }}</span>\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeColumn.emit(idx)\"\n title=\"Remove Column\"\n >\n <rpt-icon name=\"trash\" [size]=\"12\" />\n </button>\n </div>\n </div>\n\n <div class=\"col-card-body\">\n <div class=\"col-edit-fields\">\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Field</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"field\"\n [ngModel]=\"col.field\"\n (ngModelChange)=\"onUpdateCol(idx, 'field', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Type</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.dataType || 'string'\"\n (ngModelChange)=\"onUpdateCol(idx, 'dataType', $event)\"\n >\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"currency\">Currency</option>\n <option value=\"date\">Date</option>\n <option value=\"boolean\">Boolean</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Format</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"e.g. dd/MM/yyyy\"\n [ngModel]=\"col.format\"\n (ngModelChange)=\"onUpdateCol(idx, 'format', $event)\"\n />\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Align</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.align || 'left'\"\n (ngModelChange)=\"onUpdateCol(idx, 'align', $event)\"\n >\n <option value=\"left\">Left</option>\n <option value=\"center\">Center</option>\n <option value=\"right\">Right</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Aggregate</span>\n <select\n class=\"col-mini-select\"\n [ngModel]=\"col.aggregate || 'none'\"\n (ngModelChange)=\"onUpdateCol(idx, 'aggregate', $event === 'none' ? undefined : $event)\"\n >\n <option value=\"none\">None</option>\n <option value=\"sum\">Sum</option>\n <option value=\"avg\">Average</option>\n <option value=\"count\">Count</option>\n <option value=\"min\">Min</option>\n <option value=\"max\">Max</option>\n </select>\n </div>\n <div class=\"col-field-item\">\n <span class=\"mini-label\">Width</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n placeholder=\"auto\"\n [ngModel]=\"col.width || ''\"\n (ngModelChange)=\"onUpdateCol(idx, 'width', $event || undefined)\"\n />\n </div>\n </div>\n\n <div class=\"col-card-footer\">\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.visible !== false\"\n (ngModelChange)=\"onUpdateCol(idx, 'visible', $event)\"\n />\n <span>Visible</span>\n </label>\n <label class=\"col-checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"col.checkboxSelection ?? false\"\n (ngModelChange)=\"onUpdateCol(idx, 'checkboxSelection', $event)\"\n />\n <span>Checkbox</span>\n </label>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Grid Table Options Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Table Options</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.sideBar !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'sideBar', value: $event })\"\n />\n <span>Enable Side Panel (Tool Panels)</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.globalSearch !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'globalSearch', value: $event })\"\n />\n <span>Global Search Box</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.statusBar !== false\"\n (ngModelChange)=\"updateOption.emit({ field: 'statusBar', value: $event })\"\n />\n <span>Status Bar</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.pagination ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'pagination', value: $event })\"\n />\n <span>Enable Pagination</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.selectable ?? false\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectable', value: $event })\"\n />\n <span>Row Selection</span>\n </label>\n </div>\n\n @if (grid()?.options?.selectable) {\n <div class=\"field-row\">\n <label class=\"field-label\">Selection Mode</label>\n <select\n class=\"field-input\"\n [ngModel]=\"grid()?.options?.selectionMode ?? 'multiple'\"\n (ngModelChange)=\"updateOption.emit({ field: 'selectionMode', value: $event })\"\n >\n <option value=\"multiple\">Multiple Rows</option>\n <option value=\"single\">Single Row</option>\n </select>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.checkboxSelection ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'checkboxSelection', value: $event })\"\n />\n <span>Checkbox Selection</span>\n </label>\n </div>\n\n @if ((grid()?.options?.selectionMode ?? 'multiple') === 'multiple') {\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.headerCheckboxSelection ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'headerCheckboxSelection', value: $event })\"\n />\n <span>Header Select All Checkbox</span>\n </label>\n </div>\n }\n }\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowColumnReorder ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowColumnReorder', value: $event })\"\n />\n <span>Allow Column Reorder</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.allowExport ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'allowExport', value: $event })\"\n />\n <span>Allow Export</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Page Size</label>\n <input\n type=\"number\"\n class=\"field-input\"\n min=\"5\"\n max=\"100\"\n [ngModel]=\"grid()?.options?.pageSize ?? 10\"\n (ngModelChange)=\"updateOption.emit({ field: 'pageSize', value: +$event })\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showRowNumbers ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showRowNumbers', value: $event })\"\n />\n <span>Show Row Numbers</span>\n </label>\n </div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"grid()?.options?.showFooter ?? true\"\n (ngModelChange)=\"updateOption.emit({ field: 'showFooter', value: $event })\"\n />\n <span>Show Footer Totals</span>\n </label>\n </div>\n </div>\n\n <!-- Row Click & Drill-Down Action Group -->\n <div class=\"property-group\">\n <div class=\"group-title\">Row Click & Drill-Down</div>\n\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"hasRowClickAction()\"\n (ngModelChange)=\"toggleRowClickAction($event)\"\n />\n <span>Enable Row Click Action</span>\n </label>\n </div>\n\n @if (hasRowClickAction()) {\n <div class=\"field-row\">\n <label class=\"field-label\">Action Type</label>\n <select\n class=\"field-input field-select\"\n [ngModel]=\"rowClickAction()?.type || 'open-drawer'\"\n (ngModelChange)=\"updateRowActionField('type', $event)\"\n >\n <option value=\"open-drawer\">Slide-Over Detail Drawer</option>\n <option value=\"drilldown-report\">Drill-Down Report (Host Event)</option>\n <option value=\"navigate\">Navigate to URL</option>\n <option value=\"emit-custom\">Emit Custom Action</option>\n </select>\n </div>\n\n @if (rowClickAction()?.type === 'open-drawer' || rowClickAction()?.type === 'drilldown-report') {\n <div class=\"field-row\">\n <label class=\"field-label\">Target Report ID</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. order-details\"\n [ngModel]=\"rowClickAction()?.targetReportId || ''\"\n (ngModelChange)=\"updateRowActionField('targetReportId', $event)\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Drawer Title</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. Order Details\"\n [ngModel]=\"rowClickAction()?.drawerTitle || ''\"\n (ngModelChange)=\"updateRowActionField('drawerTitle', $event)\"\n />\n </div>\n\n <div class=\"field-row\">\n <label class=\"field-label\">Drawer Width</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. 760px, 80%, 900px\"\n [ngModel]=\"rowClickAction()?.drawerWidth || '760px'\"\n (ngModelChange)=\"updateRowActionField('drawerWidth', $event)\"\n />\n </div>\n }\n\n @if (rowClickAction()?.type === 'navigate') {\n <div class=\"field-row\">\n <label class=\"field-label\">Target URL</label>\n <input\n type=\"text\"\n class=\"field-input\"\n [placeholder]=\"'/orders/{{row.orderId}} or https://...'\"\n [ngModel]=\"rowClickAction()?.targetUrl || ''\"\n (ngModelChange)=\"updateRowActionField('targetUrl', $event)\"\n />\n </div>\n <div class=\"field-row\">\n <label class=\"checkbox-toggle\">\n <input\n type=\"checkbox\"\n [ngModel]=\"rowClickAction()?.openNewTab ?? false\"\n (ngModelChange)=\"updateRowActionField('openNewTab', $event)\"\n />\n <span>Open in New Tab</span>\n </label>\n </div>\n }\n\n @if (rowClickAction()?.type === 'emit-custom') {\n <div class=\"field-row\">\n <label class=\"field-label\">Custom Action Name</label>\n <input\n type=\"text\"\n class=\"field-input\"\n placeholder=\"e.g. view-audit-trail\"\n [ngModel]=\"rowClickAction()?.customActionName || ''\"\n (ngModelChange)=\"updateRowActionField('customActionName', $event)\"\n />\n </div>\n }\n\n <div class=\"field-row\">\n <div class=\"field-label-row\">\n <label class=\"field-label\">Parameter Mapping</label>\n <button\n type=\"button\"\n class=\"btn-add-mapping\"\n (click)=\"addParameterMapping()\"\n >\n + Add Mapping\n </button>\n </div>\n\n @for (mapping of parameterMappings(); track mapping.key; let mIdx = $index) {\n <div class=\"mapping-pair-row\">\n <input\n type=\"text\"\n class=\"col-mini-input\"\n style=\"flex: 1;\"\n placeholder=\"Target (e.g. customerId)\"\n [ngModel]=\"mapping.key\"\n (ngModelChange)=\"updateMappingKey(mIdx, $event)\"\n />\n <span style=\"font-size: 0.75rem; color: #94a3b8;\">\u2190</span>\n <input\n type=\"text\"\n class=\"col-mini-input\"\n style=\"flex: 1;\"\n placeholder=\"Source (e.g. row.id)\"\n [ngModel]=\"mapping.value\"\n (ngModelChange)=\"updateMappingValue(mIdx, $event)\"\n />\n <button\n type=\"button\"\n class=\"col-action-btn btn-delete\"\n (click)=\"removeMapping(mIdx)\"\n title=\"Remove mapping\"\n >\n <rpt-icon name=\"trash\" [size]=\"11\" />\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Remove Grid Action -->\n <div class=\"grid-danger-zone\">\n <button type=\"button\" class=\"btn-remove-grid-action\" (click)=\"removeGrid.emit()\">\n <rpt-icon name=\"trash\" [size]=\"13\" />\n <span>Remove Grid from Report</span>\n </button>\n </div>\n </div>\n }", styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".empty-grid-card{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 16px;text-align:center;border:2px dashed #cbd5e1;border-radius:8px;background:#fff;margin:10px 0}.empty-grid-icon{width:48px;height:48px;border-radius:10px;background:#eff6ff;color:#2563eb;display:flex;align-items:center;justify-content:center;margin-bottom:12px}.empty-grid-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0 0 6px}.empty-grid-desc{font-size:.775rem;color:#64748b;margin:0 0 18px;line-height:1.4;max-width:280px}.btn-create-grid-action{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;background:#2563eb;color:#fff;font-size:.775rem;font-weight:600;border:none;border-radius:6px;cursor:pointer;box-shadow:0 2px 4px #2563eb33;transition:all .15s ease}.btn-create-grid-action:hover{background:#1d4ed8;box-shadow:0 4px 8px #2563eb40}.grid-danger-zone{margin-top:10px;padding-top:16px;border-top:1px dashed #e2e8f0;display:flex;justify-content:center}.btn-remove-grid-action{display:inline-flex;align-items:center;gap:6px;background:#fee2e2;border:1px solid #fecaca;color:#dc2626;font-size:.75rem;font-weight:600;padding:6px 12px;border-radius:6px;cursor:pointer;transition:all .15s ease}.btn-remove-grid-action:hover{background:#fecaca;border-color:#f87171;color:#b91c1c}.props-form{display:flex;flex-direction:column;gap:20px}.group-header-with-btn{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:8px;margin-bottom:4px}.btn-add-col{display:inline-flex;align-items:center;gap:5px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:4px;padding:4px 10px;font-size:.725rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);cursor:pointer;transition:all .15s ease}.btn-add-col:hover{background:var(--rpt-color-primary, #2563eb);color:#fff;border-color:var(--rpt-color-primary, #2563eb)}.columns-editor-list{display:flex;flex-direction:column;gap:10px}.col-edit-card{background:#fff;border:1.5px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);box-shadow:var(--rpt-box-shadow, 0 1px 2px rgba(0, 0, 0, .05));box-sizing:border-box;transition:all var(--rpt-transition-speed, .15s) ease;position:relative;overflow:hidden;display:flex;flex-direction:column}.col-edit-card:hover{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 4px 6px -1px #2563eb1a}.col-card-header{display:flex;align-items:center;justify-content:space-between;gap:6px;padding:5px 8px;background:var(--rpt-color-surface, #f8fafc);border-bottom:1px solid var(--rpt-color-border, #e2e8f0);min-height:32px;box-sizing:border-box}.col-header-title-group{display:flex;align-items:center;gap:5px;min-width:0;flex:1}.col-drag-dots{color:#94a3b8;font-size:.8rem;cursor:grab;-webkit-user-select:none;user-select:none;line-height:1;padding-left:2px}.col-idx-badge{font-size:.65rem;font-weight:700;color:#64748b;background:#e2e8f0;padding:1px 5px;border-radius:3px;letter-spacing:.02em}.col-title-input{flex:1;border:1px solid transparent;background:transparent;font-size:.75rem;font-weight:600;color:var(--rpt-color-text, #0f172a);padding:2px 6px;border-radius:4px;outline:none;transition:all .15s ease}.col-title-input:hover{border-color:#cbd5e1;background:#fff}.col-title-input:focus{border-color:var(--rpt-color-primary, #2563eb);background:#fff;box-shadow:0 0 0 2px #2563eb26}.col-card-actions{display:flex;align-items:center;gap:4px}.col-type-pill{font-size:.625rem;font-weight:700;color:#1e40af;background:#dbeafe;border:1px solid #bfdbfe;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.col-action-btn{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.col-action-btn.btn-delete:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.col-card-body{padding:8px 10px;display:flex;flex-direction:column;gap:6px;background:#fff}.col-edit-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px 8px}.col-field-item{display:flex;flex-direction:column;gap:2px;min-width:0}.mini-label{font-size:.625rem;font-weight:600;color:#64748b;letter-spacing:.02em}.col-mini-input,.col-mini-select{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:3px;padding:3px 5px;font-size:.7rem;color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all .12s ease}.col-mini-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 4px center;background-size:10px 10px;padding-right:16px;cursor:pointer}.col-mini-input:focus,.col-mini-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px #2563eb26}.col-card-footer{display:flex;align-items:center;justify-content:flex-end;gap:12px;padding-top:4px;border-top:1px dashed #e2e8f0;margin-top:2px}.col-checkbox-toggle{display:inline-flex;align-items:center;gap:5px;font-size:.675rem;font-weight:500;color:#475569;cursor:pointer;-webkit-user-select:none;user-select:none}.btn-add-mapping{display:inline-flex;align-items:center;background:#eff6ff;border:1px solid #bfdbfe;color:#2563eb;font-size:.65rem;font-weight:600;padding:2px 6px;border-radius:4px;cursor:pointer;transition:all .12s ease}.btn-add-mapping:hover{background:#dbeafe}.mapping-pair-row{display:flex;align-items:center;gap:6px;margin-top:4px}\n"] }]
|
|
1053
109
|
}] });
|
|
1054
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQzs7O0FBNnhCN0YsTUFBTSxPQUFPLDJCQUEyQjtJQUM3QixJQUFJLEdBQUcsS0FBSyxFQUFvQyxDQUFDO0lBRWpELE9BQU8sR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUN6QixVQUFVLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFDNUIsU0FBUyxHQUFHLE1BQU0sRUFBUSxDQUFDO0lBQzNCLGlCQUFpQixHQUFHLE1BQU0sRUFBUSxDQUFDO0lBQ25DLFlBQVksR0FBRyxNQUFNLEVBQVUsQ0FBQztJQUNoQyxZQUFZLEdBQUcsTUFBTSxFQUFvRCxDQUFDO0lBQzFFLFlBQVksR0FBRyxNQUFNLEVBQXFDLENBQUM7SUFDM0Qsb0JBQW9CLEdBQUcsTUFBTSxFQUFrQyxDQUFDO0lBRWhFLE9BQU8sR0FBRyxRQUFRLENBQXlCLEdBQUcsRUFBRTtRQUN2RCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBRU0sY0FBYyxHQUFHLFFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdkVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGVmaW5pdGlvbiwgR3JpZFJvd0NsaWNrQWN0aW9uLCBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcHJvcGVydHktZWRpdG9yLWdyaWQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcyddLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoIWdyaWQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LWdyaWQtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktZ3JpZC1pY29uXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0YWJsZVwiIFtzaXplXT1cIjI4XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxoNCBjbGFzcz1cImVtcHR5LWdyaWQtdGl0bGVcIj5ObyBSZXN1bHQgR3JpZCBBdHRhY2hlZDwvaDQ+XG4gICAgICAgIDxwIGNsYXNzPVwiZW1wdHktZ3JpZC1kZXNjXCI+QXR0YWNoIGFuIGludGVyYWN0aXZlIFJlc3VsdCBEYXRhIEdyaWQgKG9yIFVsdHJhR3JpZCkgdG8gdGhpcyByZXBvcnQgZGVmaW5pdGlvbiB0byByZW5kZXIgcXVlcmllcyBhbmQgc3RvcmVkIHByb2NlZHVyZSByZXN1bHRzLjwvcD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY3JlYXRlLWdyaWQtYWN0aW9uXCIgKGNsaWNrKT1cImFkZEdyaWQuZW1pdCgpXCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgIDxzcGFuPisgQWRkIFJlc3VsdCBHcmlkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInByb3BzLWZvcm1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtaGVhZGVyLXdpdGgtYnRuXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJncm91cC10aXRsZVwiPkNvbHVtbnMgKHt7IGNvbHVtbnMoKS5sZW5ndGggfX0pPC9zcGFuPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDRweDtcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFkZC1jb2xcIlxuICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6ICNlZmY2ZmY7IGNvbG9yOiAjMjU2M2ViOyBib3JkZXItY29sb3I6ICNiZmRiZmU7XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImF1dG9EZXRlY3RDb2x1bW5zLmVtaXQoKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQXV0by1kZXRlY3QgYWxsIGNvbHVtbnMgZnJvbSBwcm9jZWR1cmUgb3IgZGF0YSB0YWJsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicmVmcmVzaFwiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+QXV0by1EZXRlY3Q8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWFkZC1jb2xcIiAoY2xpY2spPVwiYWRkQ29sdW1uLmVtaXQoKVwiPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInBsdXNcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuPkFkZCBDb2x1bW48L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMtZWRpdG9yLWxpc3RcIj5cbiAgICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1ucygpOyB0cmFjayBjb2wuZmllbGQ7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1jYXJkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWhlYWRlci10aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtZHJhZy1kb3RzXCI+4ouu4ouuPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtaWR4LWJhZGdlXCI+I3t7IGlkeCArIDEgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC10aXRsZS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ29sdW1uIExhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnbGFiZWwnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1jYXJkLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sLXR5cGUtcGlsbFwiPnt7IGNvbC5kYXRhVHlwZSB8fCAnc3RyaW5nJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWFjdGlvbi1idG4gYnRuLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDb2x1bW4uZW1pdChpZHgpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZW1vdmUgQ29sdW1uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0cmFzaFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZWRpdC1maWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5GaWVsZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnZmllbGQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmRhdGFUeXBlIHx8ICdzdHJpbmcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdkYXRhVHlwZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN0cmluZ1wiPlN0cmluZzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJudW1iZXJcIj5OdW1iZXI8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3VycmVuY3lcIj5DdXJyZW5jeTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkYXRlXCI+RGF0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib29sZWFuXCI+Qm9vbGVhbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkZvcm1hdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBkZC9NTS95eXl5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wuZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdmb3JtYXQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkFsaWduPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWluaS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5hbGlnbiB8fCAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FsaWduJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibGVmdFwiPkxlZnQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2VudGVyXCI+Q2VudGVyPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJpZ2h0XCI+UmlnaHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5BZ2dyZWdhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmFnZ3JlZ2F0ZSB8fCAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2FnZ3JlZ2F0ZScsICRldmVudCA9PT0gJ25vbmUnID8gdW5kZWZpbmVkIDogJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiPk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3VtXCI+U3VtPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImF2Z1wiPkF2ZXJhZ2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY291bnRcIj5Db3VudDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtaW5cIj5NaW48L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibWF4XCI+TWF4PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWZpZWxkLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLWxhYmVsXCI+V2lkdGg8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC53aWR0aCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnd2lkdGgnLCAkZXZlbnQgfHwgdW5kZWZpbmVkKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1jaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wudmlzaWJsZSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ3Zpc2libGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+VmlzaWJsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmNoZWNrYm94U2VsZWN0aW9uID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdjaGVja2JveFNlbGVjdGlvbicsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5DaGVja2JveDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEdyaWQgVGFibGUgT3B0aW9ucyBHcm91cCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj5UYWJsZSBPcHRpb25zPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uc2lkZUJhciAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2lkZUJhcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkVuYWJsZSBTaWRlIFBhbmVsIChUb29sIFBhbmVscyk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uZ2xvYmFsU2VhcmNoICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdnbG9iYWxTZWFyY2gnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5HbG9iYWwgU2VhcmNoIEJveDwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zdGF0dXNCYXIgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3N0YXR1c0JhcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlN0YXR1cyBCYXI8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8ucGFnaW5hdGlvbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3BhZ2luYXRpb24nLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5FbmFibGUgUGFnaW5hdGlvbjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3RhYmxlID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3NlbGVjdGFibGUnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5Sb3cgU2VsZWN0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5TZWxlY3Rpb24gTW9kZTwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnNlbGVjdGlvbk1vZGUgPz8gJ211bHRpcGxlJ1wiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdzZWxlY3Rpb25Nb2RlJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtdWx0aXBsZVwiPk11bHRpcGxlIFJvd3M8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInNpbmdsZVwiPlNpbmdsZSBSb3c8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5jaGVja2JveFNlbGVjdGlvbiA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnY2hlY2tib3hTZWxlY3Rpb24nLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+Q2hlY2tib3ggU2VsZWN0aW9uPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAoKGdyaWQoKT8ub3B0aW9ucz8uc2VsZWN0aW9uTW9kZSA/PyAnbXVsdGlwbGUnKSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LmhlYWRlckNoZWNrYm94U2VsZWN0aW9uID8/IHRydWVcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2hlYWRlckNoZWNrYm94U2VsZWN0aW9uJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj5IZWFkZXIgU2VsZWN0IEFsbCBDaGVja2JveDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LmFsbG93Q29sdW1uUmVvcmRlciA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2FsbG93Q29sdW1uUmVvcmRlcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkFsbG93IENvbHVtbiBSZW9yZGVyPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LmFsbG93RXhwb3J0ID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnYWxsb3dFeHBvcnQnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5BbGxvdyBFeHBvcnQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+UGFnZSBTaXplPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICBtaW49XCI1XCJcbiAgICAgICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnBhZ2VTaXplID8/IDEwXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdwYWdlU2l6ZScsIHZhbHVlOiArJGV2ZW50IH0pXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Um93TnVtYmVycyA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3Nob3dSb3dOdW1iZXJzJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+U2hvdyBSb3cgTnVtYmVyczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaG93Rm9vdGVyID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2hvd0Zvb3RlcicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlNob3cgRm9vdGVyIFRvdGFsczwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJvdyBDbGljayAmIERyaWxsLURvd24gQWN0aW9uIEdyb3VwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC10aXRsZVwiPlJvdyBDbGljayAmIERyaWxsLURvd248L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaGFzUm93Q2xpY2tBY3Rpb24oKVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInRvZ2dsZVJvd0NsaWNrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkVuYWJsZSBSb3cgQ2xpY2sgQWN0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIEBpZiAoaGFzUm93Q2xpY2tBY3Rpb24oKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+QWN0aW9uIFR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IGZpZWxkLXNlbGVjdFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LnR5cGUgfHwgJ29wZW4tZHJhd2VyJ1wiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJvd0FjdGlvbkZpZWxkKCd0eXBlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJvcGVuLWRyYXdlclwiPlNsaWRlLU92ZXIgRGV0YWlsIERyYXdlcjwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZHJpbGxkb3duLXJlcG9ydFwiPkRyaWxsLURvd24gUmVwb3J0IChIb3N0IEV2ZW50KTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibmF2aWdhdGVcIj5OYXZpZ2F0ZSB0byBVUkw8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVtaXQtY3VzdG9tXCI+RW1pdCBDdXN0b20gQWN0aW9uPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ29wZW4tZHJhd2VyJyB8fCByb3dDbGlja0FjdGlvbigpPy50eXBlID09PSAnZHJpbGxkb3duLXJlcG9ydCcpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5UYXJnZXQgUmVwb3J0IElEPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBvcmRlci1kZXRhaWxzXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy50YXJnZXRSZXBvcnRJZCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ3RhcmdldFJlcG9ydElkJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkRyYXdlciBUaXRsZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gT3JkZXIgRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8uZHJhd2VyVGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJvd0FjdGlvbkZpZWxkKCdkcmF3ZXJUaXRsZScsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5EcmF3ZXIgV2lkdGg8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIDc2MHB4LCA4MCUsIDkwMHB4XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy5kcmF3ZXJXaWR0aCB8fCAnNzYwcHgnXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVSb3dBY3Rpb25GaWVsZCgnZHJhd2VyV2lkdGgnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ25hdmlnYXRlJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlRhcmdldCBVUkw8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIicvb3JkZXJzL3t7cm93Lm9yZGVySWR9fSBvciBodHRwczovLy4uLidcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LnRhcmdldFVybCB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ3RhcmdldFVybCcsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/Lm9wZW5OZXdUYWIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ29wZW5OZXdUYWInLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPk9wZW4gaW4gTmV3IFRhYjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAocm93Q2xpY2tBY3Rpb24oKT8udHlwZSA9PT0gJ2VtaXQtY3VzdG9tJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkN1c3RvbSBBY3Rpb24gTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gdmlldy1hdWRpdC10cmFpbFwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8uY3VzdG9tQWN0aW9uTmFtZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ2N1c3RvbUFjdGlvbk5hbWUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5QYXJhbWV0ZXIgTWFwcGluZzwvbGFiZWw+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1hZGQtbWFwcGluZ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFBhcmFtZXRlck1hcHBpbmcoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICArIEFkZCBNYXBwaW5nXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIEBmb3IgKG1hcHBpbmcgb2YgcGFyYW1ldGVyTWFwcGluZ3MoKTsgdHJhY2sgbWFwcGluZy5rZXk7IGxldCBtSWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXBwaW5nLXBhaXItcm93XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUYXJnZXQgKGUuZy4gY3VzdG9tZXJJZClcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibWFwcGluZy5rZXlcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlTWFwcGluZ0tleShtSWR4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogIzk0YTNiODtcIj7ihpA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTtcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTb3VyY2UgKGUuZy4gcm93LmlkKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJtYXBwaW5nLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU1hcHBpbmdWYWx1ZShtSWR4LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtYWN0aW9uLWJ0biBidG4tZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVNYXBwaW5nKG1JZHgpXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUmVtb3ZlIG1hcHBpbmdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidHJhc2hcIiBbc2l6ZV09XCIxMVwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBSZW1vdmUgR3JpZCBBY3Rpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1kYW5nZXItem9uZVwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1yZW1vdmUtZ3JpZC1hY3Rpb25cIiAoY2xpY2spPVwicmVtb3ZlR3JpZC5lbWl0KClcIj5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRyYXNoXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPlJlbW92ZSBHcmlkIGZyb20gUmVwb3J0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5lbXB0eS1ncmlkLWNhcmQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA0MHB4IDE2cHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBib3JkZXI6IDJweCBkYXNoZWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBtYXJnaW46IDEwcHggMDtcbiAgICB9XG4gICAgLmVtcHR5LWdyaWQtaWNvbiB7XG4gICAgICB3aWR0aDogNDhweDtcbiAgICAgIGhlaWdodDogNDhweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgICB9XG4gICAgLmVtcHR5LWdyaWQtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjk1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgbWFyZ2luOiAwIDAgNnB4IDA7XG4gICAgfVxuICAgIC5lbXB0eS1ncmlkLWRlc2Mge1xuICAgICAgZm9udC1zaXplOiAwLjc3NXJlbTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgbWFyZ2luOiAwIDAgMThweCAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICAgIG1heC13aWR0aDogMjgwcHg7XG4gICAgfVxuICAgIC5idG4tY3JlYXRlLWdyaWQtYWN0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjMjU2M2ViO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjIpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5idG4tY3JlYXRlLWdyaWQtYWN0aW9uOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICMxZDRlZDg7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgzNywgOTksIDIzNSwgMC4yNSk7XG4gICAgfVxuICAgIC5ncmlkLWRhbmdlci16b25lIHtcbiAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICBwYWRkaW5nLXRvcDogMTZweDtcbiAgICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI2UyZThmMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gICAgLmJ0bi1yZW1vdmUtZ3JpZC1hY3Rpb24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZlY2FjYTtcbiAgICAgIGNvbG9yOiAjZGMyNjI2O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDZweCAxMnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5idG4tcmVtb3ZlLWdyaWQtYWN0aW9uOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZWNhY2E7XG4gICAgICBib3JkZXItY29sb3I6ICNmODcxNzE7XG4gICAgICBjb2xvcjogI2I5MWMxYztcbiAgICB9XG4gICAgLnByb3BzLWZvcm0ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDIwcHg7XG4gICAgfVxuICAgIC5ncm91cC1oZWFkZXItd2l0aC1idG4ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgIH1cbiAgICAuYnRuLWFkZC1jb2wge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHBhZGRpbmc6IDRweCAxMHB4O1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5idG4tYWRkLWNvbDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgIH1cbiAgICAuY29sdW1ucy1lZGl0b3ItbGlzdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMTBweDtcbiAgICB9XG4gICAgLmNvbC1lZGl0LWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMS41cHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLXJwdC1ib3gtc2hhZG93LCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KSk7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB9XG4gICAgLmNvbC1lZGl0LWNhcmQ6aG92ZXIge1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2JhKDM3LCA5OSwgMjM1LCAwLjEpO1xuICAgIH1cbiAgICAuY29sLWNhcmQtaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwYWRkaW5nOiA1cHggOHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmOGZhZmMpO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgICAgbWluLWhlaWdodDogMzJweDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5jb2wtaGVhZGVyLXRpdGxlLWdyb3VwIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBtaW4td2lkdGg6IDA7XG4gICAgICBmbGV4OiAxO1xuICAgIH1cbiAgICAuY29sLWRyYWctZG90cyB7XG4gICAgICBjb2xvcjogIzk0YTNiODtcbiAgICAgIGZvbnQtc2l6ZTogMC44cmVtO1xuICAgICAgY3Vyc29yOiBncmFiO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgIHBhZGRpbmctbGVmdDogMnB4O1xuICAgIH1cbiAgICAuY29sLWlkeC1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgICAgcGFkZGluZzogMXB4IDVweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG4gICAgfVxuICAgIC5jb2wtdGl0bGUtaW5wdXQge1xuICAgICAgZmxleDogMTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5jb2wtdGl0bGUtaW5wdXQ6aG92ZXIge1xuICAgICAgYm9yZGVyLWNvbG9yOiAjY2JkNWUxO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICB9XG4gICAgLmNvbC10aXRsZS1pbnB1dDpmb2N1cyB7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgzNywgOTksIDIzNSwgMC4xNSk7XG4gICAgfVxuICAgIC5jb2wtY2FyZC1hY3Rpb25zIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgfVxuICAgIC5jb2wtdHlwZS1waWxsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6ICMxZTQwYWY7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIHBhZGRpbmc6IDFweCA1cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTtcbiAgICB9XG4gICAgLmNvbC1hY3Rpb24tYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiAzcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmNvbC1hY3Rpb24tYnRuLmJ0bi1kZWxldGU6aG92ZXIge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1kYW5nZXIsICNlZjQ0NDQpO1xuICAgICAgYmFja2dyb3VuZDogI2ZlZTJlMjtcbiAgICB9XG4gICAgLmNvbC1jYXJkLWJvZHkge1xuICAgICAgcGFkZGluZzogOHB4IDEwcHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICB9XG4gICAgLmNvbC1lZGl0LWZpZWxkcyB7XG4gICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgbWlubWF4KDAsIDFmcikpO1xuICAgICAgZ2FwOiA2cHggOHB4O1xuICAgIH1cbiAgICAuY29sLWZpZWxkLWl0ZW0ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDJweDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICB9XG4gICAgLm1pbmktbGFiZWwge1xuICAgICAgZm9udC1zaXplOiAwLjYyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG4gICAgfVxuICAgIC5jb2wtbWluaS1pbnB1dCwgLmNvbC1taW5pLXNlbGVjdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgIHBhZGRpbmc6IDNweCA1cHg7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAuY29sLW1pbmktc2VsZWN0IHtcbiAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBzdHJva2U9JyUyMzY0NzQ4Yicgc3Ryb2tlLXdpZHRoPScyLjInIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgc3Ryb2tlLWxpbmVqb2luPSdyb3VuZCclM0UlM0Nwb2x5bGluZSBwb2ludHM9JzYgOSAxMiAxNSAxOCA5JyUzRSUzQy9wb2x5bGluZSUzRSUzQy9zdmclM0VcIik7XG4gICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgNHB4IGNlbnRlcjtcbiAgICAgIGJhY2tncm91bmQtc2l6ZTogMTBweCAxMHB4O1xuICAgICAgcGFkZGluZy1yaWdodDogMTZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB9XG4gICAgLmNvbC1taW5pLWlucHV0OmZvY3VzLCAuY29sLW1pbmktc2VsZWN0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMTUpO1xuICAgIH1cbiAgICAuY29sLWNhcmQtZm9vdGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIHBhZGRpbmctdG9wOiA0cHg7XG4gICAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkICNlMmU4ZjA7XG4gICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgfVxuICAgIC5jb2wtY2hlY2tib3gtdG9nZ2xlIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgZm9udC1zaXplOiAwLjY3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogIzQ3NTU2OTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICAuYnRuLWFkZC1tYXBwaW5nIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmZkYmZlO1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAuYnRuLWFkZC1tYXBwaW5nOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNkYmVhZmU7XG4gICAgfVxuICAgIC5tYXBwaW5nLXBhaXItcm93IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgfVxuICBgXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgZ3JpZCA9IGlucHV0PFJlcG9ydEdyaWREZWZpbml0aW9uIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGFkZEdyaWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlR3JpZCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBhZGRDb2x1bW4gPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgYXV0b0RldGVjdENvbHVtbnMgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlQ29sdW1uID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlQ29sdW1uID0gb3V0cHV0PHsgaW5kZXg6IG51bWJlcjsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlT3B0aW9uID0gb3V0cHV0PHsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlUm93Q2xpY2tBY3Rpb24gPSBvdXRwdXQ8R3JpZFJvd0NsaWNrQWN0aW9uIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGNvbHVtbnMgPSBjb21wdXRlZDxHcmlkQ29sdW1uRGVmaW5pdGlvbltdPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZCgpPy5jb2x1bW5zID8/IFtdO1xuICB9KTtcblxuICByZWFkb25seSByb3dDbGlja0FjdGlvbiA9IGNvbXB1dGVkPEdyaWRSb3dDbGlja0FjdGlvbiB8IHVuZGVmaW5lZD4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmdyaWQoKT8ucm93Q2xpY2tBY3Rpb24gPz8gdGhpcy5ncmlkKCk/Lm9wdGlvbnM/LnJvd0NsaWNrQWN0aW9uO1xuICB9KTtcblxuICByZWFkb25seSBoYXNSb3dDbGlja0FjdGlvbiA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gISF0aGlzLnJvd0NsaWNrQWN0aW9uKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHBhcmFtZXRlck1hcHBpbmdzID0gY29tcHV0ZWQ8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10+KCgpID0+IHtcbiAgICBjb25zdCBtYXBwaW5nID0gdGhpcy5yb3dDbGlja0FjdGlvbigpPy5wYXJhbWV0ZXJNYXBwaW5nO1xuICAgIGlmICghbWFwcGluZykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwaW5nKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZSB9KSk7XG4gIH0pO1xuXG4gIG9uVXBkYXRlQ29sKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDb2x1bW4uZW1pdCh7IGluZGV4LCBmaWVsZCwgdmFsdWUgfSk7XG4gIH1cblxuICB0b2dnbGVSb3dDbGlja0FjdGlvbihlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh7XG4gICAgICAgIHR5cGU6ICdvcGVuLWRyYXdlcicsXG4gICAgICAgIGRyYXdlclRpdGxlOiAnRGV0YWlscycsXG4gICAgICAgIGRyYXdlcldpZHRoOiAnNzYwcHgnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVJvd0FjdGlvbkZpZWxkKGZpZWxkOiBrZXlvZiBHcmlkUm93Q2xpY2tBY3Rpb24sIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBuZXh0ID0geyAuLi5jdXJyZW50LCBbZmllbGRdOiB2YWx1ZSB9O1xuICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdChuZXh0KTtcbiAgfVxuXG4gIGFkZFBhcmFtZXRlck1hcHBpbmcoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBtYXBwaW5nID0geyAuLi4oY3VycmVudC5wYXJhbWV0ZXJNYXBwaW5nID8/IHt9KSB9O1xuICAgIGxldCBpZHggPSBPYmplY3Qua2V5cyhtYXBwaW5nKS5sZW5ndGggKyAxO1xuICAgIGxldCBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIHdoaWxlIChrZXkgaW4gbWFwcGluZykge1xuICAgICAgaWR4Kys7XG4gICAgICBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIH1cbiAgICBtYXBwaW5nW2tleV0gPSAncm93LmlkJztcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBtYXBwaW5nIH0pO1xuICB9XG5cbiAgdXBkYXRlTWFwcGluZ0tleShpbmRleDogbnVtYmVyLCBuZXdLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCBrID0gaSA9PT0gaW5kZXggPyBuZXdLZXkgOiBwLmtleTtcbiAgICAgIGlmIChrLnRyaW0oKSkge1xuICAgICAgICBuZXh0TWFwcGluZ1trLnRyaW0oKV0gPSBwLnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICB1cGRhdGVNYXBwaW5nVmFsdWUoaW5kZXg6IG51bWJlciwgbmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCB2ID0gaSA9PT0gaW5kZXggPyBuZXdWYWx1ZSA6IHAudmFsdWU7XG4gICAgICBpZiAocC5rZXkudHJpbSgpKSB7XG4gICAgICAgIG5leHRNYXBwaW5nW3Aua2V5LnRyaW0oKV0gPSB2O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICByZW1vdmVNYXBwaW5nKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYWlycyA9IHRoaXMucGFyYW1ldGVyTWFwcGluZ3MoKTtcbiAgICBjb25zdCBuZXh0TWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIHBhaXJzLmZvckVhY2goKHAsIGkpID0+IHtcbiAgICAgIGlmIChpICE9PSBpbmRleCAmJiBwLmtleS50cmltKCkpIHtcbiAgICAgICAgbmV4dE1hcHBpbmdbcC5rZXkudHJpbSgpXSA9IHAudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBuZXh0TWFwcGluZyB9KTtcbiAgfVxufVxuXG4iXX0=
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9wcm9wZXJ0eS1lZGl0b3IvcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7QUFVN0YsTUFBTSxPQUFPLDJCQUEyQjtJQUM3QixJQUFJLEdBQUcsS0FBSyxFQUFvQyxDQUFDO0lBRWpELE9BQU8sR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUN6QixVQUFVLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFDNUIsU0FBUyxHQUFHLE1BQU0sRUFBUSxDQUFDO0lBQzNCLGlCQUFpQixHQUFHLE1BQU0sRUFBUSxDQUFDO0lBQ25DLFlBQVksR0FBRyxNQUFNLEVBQVUsQ0FBQztJQUNoQyxZQUFZLEdBQUcsTUFBTSxFQUFvRCxDQUFDO0lBQzFFLFlBQVksR0FBRyxNQUFNLEVBQXFDLENBQUM7SUFDM0Qsb0JBQW9CLEdBQUcsTUFBTSxFQUFrQyxD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QUFDO3dHQXZHVSwyQkFBMkI7NEZBQTNCLDJCQUEyQix3ZENkeEMsdXFsQkFzZEsscW1RRDdjTyxZQUFZLDhCQUFFLFdBQVcsbXREQUFFLGdCQUFnQjs7NEZBSzFDLDJCQUEyQjtrQkFSdkMsU0FBUzsrQkFDRSwwQkFBMEIsY0FDeEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFDckMsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGVmaW5pdGlvbiwgR3JpZFJvd0NsaWNrQWN0aW9uLCBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcHJvcGVydHktZWRpdG9yLWdyaWQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcycsICcuL3Byb3BlcnR5LWVkaXRvci1ncmlkLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgZ3JpZCA9IGlucHV0PFJlcG9ydEdyaWREZWZpbml0aW9uIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGFkZEdyaWQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlR3JpZCA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBhZGRDb2x1bW4gPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgYXV0b0RldGVjdENvbHVtbnMgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVtb3ZlQ29sdW1uID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlQ29sdW1uID0gb3V0cHV0PHsgaW5kZXg6IG51bWJlcjsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlT3B0aW9uID0gb3V0cHV0PHsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlUm93Q2xpY2tBY3Rpb24gPSBvdXRwdXQ8R3JpZFJvd0NsaWNrQWN0aW9uIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGNvbHVtbnMgPSBjb21wdXRlZDxHcmlkQ29sdW1uRGVmaW5pdGlvbltdPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZCgpPy5jb2x1bW5zID8/IFtdO1xuICB9KTtcblxuICByZWFkb25seSByb3dDbGlja0FjdGlvbiA9IGNvbXB1dGVkPEdyaWRSb3dDbGlja0FjdGlvbiB8IHVuZGVmaW5lZD4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmdyaWQoKT8ucm93Q2xpY2tBY3Rpb24gPz8gdGhpcy5ncmlkKCk/Lm9wdGlvbnM/LnJvd0NsaWNrQWN0aW9uO1xuICB9KTtcblxuICByZWFkb25seSBoYXNSb3dDbGlja0FjdGlvbiA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gISF0aGlzLnJvd0NsaWNrQWN0aW9uKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHBhcmFtZXRlck1hcHBpbmdzID0gY29tcHV0ZWQ8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10+KCgpID0+IHtcbiAgICBjb25zdCBtYXBwaW5nID0gdGhpcy5yb3dDbGlja0FjdGlvbigpPy5wYXJhbWV0ZXJNYXBwaW5nO1xuICAgIGlmICghbWFwcGluZykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwaW5nKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZSB9KSk7XG4gIH0pO1xuXG4gIG9uVXBkYXRlQ29sKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDb2x1bW4uZW1pdCh7IGluZGV4LCBmaWVsZCwgdmFsdWUgfSk7XG4gIH1cblxuICB0b2dnbGVSb3dDbGlja0FjdGlvbihlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh7XG4gICAgICAgIHR5cGU6ICdvcGVuLWRyYXdlcicsXG4gICAgICAgIGRyYXdlclRpdGxlOiAnRGV0YWlscycsXG4gICAgICAgIGRyYXdlcldpZHRoOiAnNzYwcHgnLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdCh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVJvd0FjdGlvbkZpZWxkKGZpZWxkOiBrZXlvZiBHcmlkUm93Q2xpY2tBY3Rpb24sIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBuZXh0ID0geyAuLi5jdXJyZW50LCBbZmllbGRdOiB2YWx1ZSB9O1xuICAgIHRoaXMudXBkYXRlUm93Q2xpY2tBY3Rpb24uZW1pdChuZXh0KTtcbiAgfVxuXG4gIGFkZFBhcmFtZXRlck1hcHBpbmcoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICBjb25zdCBtYXBwaW5nID0geyAuLi4oY3VycmVudC5wYXJhbWV0ZXJNYXBwaW5nID8/IHt9KSB9O1xuICAgIGxldCBpZHggPSBPYmplY3Qua2V5cyhtYXBwaW5nKS5sZW5ndGggKyAxO1xuICAgIGxldCBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIHdoaWxlIChrZXkgaW4gbWFwcGluZykge1xuICAgICAgaWR4Kys7XG4gICAgICBrZXkgPSBgcGFyYW0ke2lkeH1gO1xuICAgIH1cbiAgICBtYXBwaW5nW2tleV0gPSAncm93LmlkJztcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBtYXBwaW5nIH0pO1xuICB9XG5cbiAgdXBkYXRlTWFwcGluZ0tleShpbmRleDogbnVtYmVyLCBuZXdLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCBrID0gaSA9PT0gaW5kZXggPyBuZXdLZXkgOiBwLmtleTtcbiAgICAgIGlmIChrLnRyaW0oKSkge1xuICAgICAgICBuZXh0TWFwcGluZ1trLnRyaW0oKV0gPSBwLnZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICB1cGRhdGVNYXBwaW5nVmFsdWUoaW5kZXg6IG51bWJlciwgbmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhaXJzID0gdGhpcy5wYXJhbWV0ZXJNYXBwaW5ncygpO1xuICAgIGlmICghcGFpcnNbaW5kZXhdKSByZXR1cm47XG4gICAgY29uc3QgbmV4dE1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBwYWlycy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICBjb25zdCB2ID0gaSA9PT0gaW5kZXggPyBuZXdWYWx1ZSA6IHAudmFsdWU7XG4gICAgICBpZiAocC5rZXkudHJpbSgpKSB7XG4gICAgICAgIG5leHRNYXBwaW5nW3Aua2V5LnRyaW0oKV0gPSB2O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJvd0NsaWNrQWN0aW9uKCkgPz8geyB0eXBlOiAnb3Blbi1kcmF3ZXInIH07XG4gICAgdGhpcy51cGRhdGVSb3dDbGlja0FjdGlvbi5lbWl0KHsgLi4uY3VycmVudCwgcGFyYW1ldGVyTWFwcGluZzogbmV4dE1hcHBpbmcgfSk7XG4gIH1cblxuICByZW1vdmVNYXBwaW5nKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYWlycyA9IHRoaXMucGFyYW1ldGVyTWFwcGluZ3MoKTtcbiAgICBjb25zdCBuZXh0TWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIHBhaXJzLmZvckVhY2goKHAsIGkpID0+IHtcbiAgICAgIGlmIChpICE9PSBpbmRleCAmJiBwLmtleS50cmltKCkpIHtcbiAgICAgICAgbmV4dE1hcHBpbmdbcC5rZXkudHJpbSgpXSA9IHAudmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucm93Q2xpY2tBY3Rpb24oKSA/PyB7IHR5cGU6ICdvcGVuLWRyYXdlcicgfTtcbiAgICB0aGlzLnVwZGF0ZVJvd0NsaWNrQWN0aW9uLmVtaXQoeyAuLi5jdXJyZW50LCBwYXJhbWV0ZXJNYXBwaW5nOiBuZXh0TWFwcGluZyB9KTtcbiAgfVxufVxuXG4iLCIgICAgQGlmICghZ3JpZCgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktZ3JpZC1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1ncmlkLWljb25cIj5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRhYmxlXCIgW3NpemVdPVwiMjhcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGg0IGNsYXNzPVwiZW1wdHktZ3JpZC10aXRsZVwiPk5vIFJlc3VsdCBHcmlkIEF0dGFjaGVkPC9oND5cbiAgICAgICAgPHAgY2xhc3M9XCJlbXB0eS1ncmlkLWRlc2NcIj5BdHRhY2ggYW4gaW50ZXJhY3RpdmUgUmVzdWx0IERhdGEgR3JpZCAob3IgVWx0cmFHcmlkKSB0byB0aGlzIHJlcG9ydCBkZWZpbml0aW9uIHRvIHJlbmRlciBxdWVyaWVzIGFuZCBzdG9yZWQgcHJvY2VkdXJlIHJlc3VsdHMuPC9wPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jcmVhdGUtZ3JpZC1hY3Rpb25cIiAoY2xpY2spPVwiYWRkR3JpZC5lbWl0KClcIj5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInBsdXNcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPHNwYW4+KyBBZGQgUmVzdWx0IEdyaWQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvcHMtZm9ybVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC1oZWFkZXItd2l0aC1idG5cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImdyb3VwLXRpdGxlXCI+Q29sdW1ucyAoe3sgY29sdW1ucygpLmxlbmd0aCB9fSk8L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4O1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4tYWRkLWNvbFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogI2VmZjZmZjsgY29sb3I6ICMyNTYzZWI7IGJvcmRlci1jb2xvcjogI2JmZGJmZTtcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXV0b0RldGVjdENvbHVtbnMuZW1pdCgpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJBdXRvLWRldGVjdCBhbGwgY29sdW1ucyBmcm9tIHByb2NlZHVyZSBvciBkYXRhIHRhYmxlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJyZWZyZXNoXCIgW3NpemVdPVwiMTFcIiAvPlxuICAgICAgICAgICAgICA8c3Bhbj5BdXRvLURldGVjdDwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tYWRkLWNvbFwiIChjbGljayk9XCJhZGRDb2x1bW4uZW1pdCgpXCI+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicGx1c1wiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4+QWRkIENvbHVtbjwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucy1lZGl0b3ItbGlzdFwiPlxuICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zKCk7IHRyYWNrIGNvbC5maWVsZDsgbGV0IGlkeCA9ICRpbmRleCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1lZGl0LWNhcmRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1jYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtaGVhZGVyLXRpdGxlLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbC1kcmFnLWRvdHNcIj7ii67ii648L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbC1pZHgtYmFkZ2VcIj4je3sgaWR4ICsgMSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLXRpdGxlLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb2x1bW4gTGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdsYWJlbCcsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWNhcmQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2wtdHlwZS1waWxsXCI+e3sgY29sLmRhdGFUeXBlIHx8ICdzdHJpbmcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtYWN0aW9uLWJ0biBidG4tZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNvbHVtbi5lbWl0KGlkeClcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlJlbW92ZSBDb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRyYXNoXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtY2FyZC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1lZGl0LWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkZpZWxkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWluaS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJmaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICdmaWVsZCcsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWZpZWxkLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLWxhYmVsXCI+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wuZGF0YVR5cGUgfHwgJ3N0cmluZydcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2RhdGFUeXBlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic3RyaW5nXCI+U3RyaW5nPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm51bWJlclwiPk51bWJlcjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjdXJyZW5jeVwiPkN1cnJlbmN5PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImRhdGVcIj5EYXRlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJvb2xlYW5cIj5Cb29sZWFuPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWZpZWxkLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLWxhYmVsXCI+Rm9ybWF0PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbWluaS1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIGRkL01NL3l5eXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC5mb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2Zvcm1hdCcsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWZpZWxkLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLWxhYmVsXCI+QWxpZ248L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1taW5pLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLmFsaWduIHx8ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnYWxpZ24nLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJsZWZ0XCI+TGVmdDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjZW50ZXJcIj5DZW50ZXI8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmlnaHRcIj5SaWdodDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1maWVsZC1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWluaS1sYWJlbFwiPkFnZ3JlZ2F0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wuYWdncmVnYXRlIHx8ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAnYWdncmVnYXRlJywgJGV2ZW50ID09PSAnbm9uZScgPyB1bmRlZmluZWQgOiAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJub25lXCI+Tm9uZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzdW1cIj5TdW08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXZnXCI+QXZlcmFnZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjb3VudFwiPkNvdW50PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1pblwiPk1pbjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtYXhcIj5NYXg8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtZmllbGQtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbmktbGFiZWxcIj5XaWR0aDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiY29sLndpZHRoIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZUNvbChpZHgsICd3aWR0aCcsICRldmVudCB8fCB1bmRlZmluZWQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1jYXJkLWZvb3RlclwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbC52aXNpYmxlICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVDb2woaWR4LCAndmlzaWJsZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5WaXNpYmxlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1jaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjb2wuY2hlY2tib3hTZWxlY3Rpb24gPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlQ29sKGlkeCwgJ2NoZWNrYm94U2VsZWN0aW9uJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkNoZWNrYm94PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gR3JpZCBUYWJsZSBPcHRpb25zIEdyb3VwIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm91cC10aXRsZVwiPlRhYmxlIE9wdGlvbnM8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5zaWRlQmFyICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdzaWRlQmFyJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+RW5hYmxlIFNpZGUgUGFuZWwgKFRvb2wgUGFuZWxzKTwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5nbG9iYWxTZWFyY2ggIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ2dsb2JhbFNlYXJjaCcsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkdsb2JhbCBTZWFyY2ggQm94PC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnN0YXR1c0JhciAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc3RhdHVzQmFyJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+U3RhdHVzIEJhcjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ3JpZCgpPy5vcHRpb25zPy5wYWdpbmF0aW9uID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAncGFnaW5hdGlvbicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkVuYWJsZSBQYWdpbmF0aW9uPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnNlbGVjdGFibGUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2VsZWN0YWJsZScsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPlJvdyBTZWxlY3Rpb248L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChncmlkKCk/Lm9wdGlvbnM/LnNlbGVjdGFibGUpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlNlbGVjdGlvbiBNb2RlPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uc2VsZWN0aW9uTW9kZSA/PyAnbXVsdGlwbGUnXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3NlbGVjdGlvbk1vZGUnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm11bHRpcGxlXCI+TXVsdGlwbGUgUm93czwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2luZ2xlXCI+U2luZ2xlIFJvdzwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LmNoZWNrYm94U2VsZWN0aW9uID8/IHRydWVcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdjaGVja2JveFNlbGVjdGlvbicsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj5DaGVja2JveCBTZWxlY3Rpb248L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgQGlmICgoZ3JpZCgpPy5vcHRpb25zPy5zZWxlY3Rpb25Nb2RlID8/ICdtdWx0aXBsZScpID09PSAnbXVsdGlwbGUnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uaGVhZGVyQ2hlY2tib3hTZWxlY3Rpb24gPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnaGVhZGVyQ2hlY2tib3hTZWxlY3Rpb24nLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPkhlYWRlciBTZWxlY3QgQWxsIENoZWNrYm94PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uYWxsb3dDb2x1bW5SZW9yZGVyID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnYWxsb3dDb2x1bW5SZW9yZGVyJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+QWxsb3cgQ29sdW1uIFJlb3JkZXI8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LXRvZ2dsZVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8uYWxsb3dFeHBvcnQgPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdhbGxvd0V4cG9ydCcsIHZhbHVlOiAkZXZlbnQgfSlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuPkFsbG93IEV4cG9ydDwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5QYWdlIFNpemU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgIG1pbj1cIjVcIlxuICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImdyaWQoKT8ub3B0aW9ucz8ucGFnZVNpemUgPz8gMTBcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uLmVtaXQoeyBmaWVsZDogJ3BhZ2VTaXplJywgdmFsdWU6ICskZXZlbnQgfSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnNob3dSb3dOdW1iZXJzID8/IHRydWVcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVPcHRpb24uZW1pdCh7IGZpZWxkOiAnc2hvd1Jvd051bWJlcnMnLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3Bhbj5TaG93IFJvdyBOdW1iZXJzPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJncmlkKCk/Lm9wdGlvbnM/LnNob3dGb290ZXIgPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZU9wdGlvbi5lbWl0KHsgZmllbGQ6ICdzaG93Rm9vdGVyJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+U2hvdyBGb290ZXIgVG90YWxzPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUm93IENsaWNrICYgRHJpbGwtRG93biBBY3Rpb24gR3JvdXAgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktZ3JvdXBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXRpdGxlXCI+Um93IENsaWNrICYgRHJpbGwtRG93bjwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC10b2dnbGVcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJoYXNSb3dDbGlja0FjdGlvbigpXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlUm93Q2xpY2tBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4+RW5hYmxlIFJvdyBDbGljayBBY3Rpb248L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChoYXNSb3dDbGlja0FjdGlvbigpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5BY3Rpb24gVHlwZTwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXQgZmllbGQtc2VsZWN0XCJcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8udHlwZSB8fCAnb3Blbi1kcmF3ZXInXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ3R5cGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm9wZW4tZHJhd2VyXCI+U2xpZGUtT3ZlciBEZXRhaWwgRHJhd2VyPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkcmlsbGRvd24tcmVwb3J0XCI+RHJpbGwtRG93biBSZXBvcnQgKEhvc3QgRXZlbnQpPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJuYXZpZ2F0ZVwiPk5hdmlnYXRlIHRvIFVSTDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZW1pdC1jdXN0b21cIj5FbWl0IEN1c3RvbSBBY3Rpb248L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgQGlmIChyb3dDbGlja0FjdGlvbigpPy50eXBlID09PSAnb3Blbi1kcmF3ZXInIHx8IHJvd0NsaWNrQWN0aW9uKCk/LnR5cGUgPT09ICdkcmlsbGRvd24tcmVwb3J0Jykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlRhcmdldCBSZXBvcnQgSUQ8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIG9yZGVyLWRldGFpbHNcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LnRhcmdldFJlcG9ydElkIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVSb3dBY3Rpb25GaWVsZCgndGFyZ2V0UmVwb3J0SWQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+RHJhd2VyIFRpdGxlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBPcmRlciBEZXRhaWxzXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy5kcmF3ZXJUaXRsZSB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUm93QWN0aW9uRmllbGQoJ2RyYXdlclRpdGxlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkRyYXdlciBXaWR0aDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gNzYwcHgsIDgwJSwgOTAwcHhcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJvd0NsaWNrQWN0aW9uKCk/LmRyYXdlcldpZHRoIHx8ICc3NjBweCdcIlxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJvd0FjdGlvbkZpZWxkKCdkcmF3ZXJXaWR0aCcsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChyb3dDbGlja0FjdGlvbigpPy50eXBlID09PSAnbmF2aWdhdGUnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+VGFyZ2V0IFVSTDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJy9vcmRlcnMve3tyb3cub3JkZXJJZH19IG9yIGh0dHBzOi8vLi4uJ1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8udGFyZ2V0VXJsIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVSb3dBY3Rpb25GaWVsZCgndGFyZ2V0VXJsJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicm93Q2xpY2tBY3Rpb24oKT8ub3Blbk5ld1RhYiA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVSb3dBY3Rpb25GaWVsZCgnb3Blbk5ld1RhYicsICRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+T3BlbiBpbiBOZXcgVGFiPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQGlmIChyb3dDbGlja0FjdGlvbigpPy50eXBlID09PSAnZW1pdC1jdXN0b20nKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+Q3VzdG9tIEFjdGlvbiBOYW1lPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtaW5wdXRcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiB2aWV3LWF1ZGl0LXRyYWlsXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJyb3dDbGlja0FjdGlvbigpPy5jdXN0b21BY3Rpb25OYW1lIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVSb3dBY3Rpb25GaWVsZCgnY3VzdG9tQWN0aW9uTmFtZScsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsLXJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlBhcmFtZXRlciBNYXBwaW5nPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWFkZC1tYXBwaW5nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkUGFyYW1ldGVyTWFwcGluZygpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICsgQWRkIE1hcHBpbmdcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgQGZvciAobWFwcGluZyBvZiBwYXJhbWV0ZXJNYXBwaW5ncygpOyB0cmFjayBtYXBwaW5nLmtleTsgbGV0IG1JZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcHBpbmctcGFpci1yb3dcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxO1wiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlRhcmdldCAoZS5nLiBjdXN0b21lcklkKVwiXG4gICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJtYXBwaW5nLmtleVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVNYXBwaW5nS2V5KG1JZHgsICRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiAjOTRhM2I4O1wiPuKGkDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLW1pbmktaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxO1wiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNvdXJjZSAoZS5nLiByb3cuaWQpXCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIm1hcHBpbmcudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlTWFwcGluZ1ZhbHVlKG1JZHgsICRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1hY3Rpb24tYnRuIGJ0bi1kZWxldGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZU1hcHBpbmcobUlkeClcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZW1vdmUgbWFwcGluZ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJ0cmFzaFwiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJlbW92ZSBHcmlkIEFjdGlvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWRhbmdlci16b25lXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLXJlbW92ZS1ncmlkLWFjdGlvblwiIChjbGljayk9XCJyZW1vdmVHcmlkLmVtaXQoKVwiPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidHJhc2hcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPHNwYW4+UmVtb3ZlIEdyaWQgZnJvbSBSZXBvcnQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgfSJdfQ==
|