bways-report 0.1.2 → 0.1.4

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.
Files changed (107) hide show
  1. package/README.md +150 -51
  2. package/esm2022/lib/core/errors/reporting-errors.mjs +2 -2
  3. package/esm2022/lib/core/index.mjs +3 -1
  4. package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
  5. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  6. package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
  7. package/esm2022/lib/core/services/report-session-context.service.mjs +50 -5
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +56 -0
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +180 -0
  10. package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +82 -0
  11. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +34 -9
  12. package/esm2022/lib/data-access/adapters/http-masterdata.adapter.mjs +38 -0
  13. package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +217 -0
  14. package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +3 -1
  15. package/esm2022/lib/data-access/adapters/index.mjs +8 -3
  16. package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +167 -0
  17. package/esm2022/lib/data-access/adapters/mock-datasource.adapter.mjs +60 -0
  18. package/esm2022/lib/data-access/contracts/api-dtos.mjs +6 -0
  19. package/esm2022/lib/data-access/contracts/index.mjs +2 -1
  20. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +24 -3
  21. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +572 -102
  22. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +225 -25
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +568 -12
  25. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +238 -11
  26. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +191 -25
  27. package/esm2022/lib/features/designer/designer.component.mjs +245 -27
  28. package/esm2022/lib/features/designer/index.mjs +4 -1
  29. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
  30. package/esm2022/lib/features/designer/services/designer-state.service.mjs +18 -10
  31. package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
  32. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
  33. package/esm2022/lib/features/export/index.mjs +2 -2
  34. package/esm2022/lib/features/export/models/export.models.mjs +1 -1
  35. package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
  36. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
  37. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +239 -33
  38. package/esm2022/lib/features/runtime/index.mjs +2 -1
  39. package/esm2022/lib/features/runtime/report-execution.service.mjs +56 -0
  40. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +423 -30
  41. package/esm2022/lib/features/runtime/report-runtime.component.mjs +349 -7
  42. package/esm2022/lib/features/runtime/rpt-report.component.mjs +545 -0
  43. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +19 -8
  44. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
  45. package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +3 -3
  46. package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +3 -3
  47. package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
  48. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +728 -74
  49. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +30 -1
  50. package/esm2022/lib/primitives/components/index.mjs +2 -1
  51. package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +3 -3
  52. package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +3 -3
  53. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +3 -3
  54. package/esm2022/lib/primitives/register-builtins.mjs +51 -2
  55. package/esm2022/lib/provide-reporting.mjs +145 -24
  56. package/fesm2022/bways-report.mjs +7797 -921
  57. package/fesm2022/bways-report.mjs.map +1 -1
  58. package/lib/core/index.d.ts +2 -0
  59. package/lib/core/models/report-datasource.model.d.ts +9 -0
  60. package/lib/core/models/report-definition.model.d.ts +2 -0
  61. package/lib/core/models/report-grid.model.d.ts +67 -1
  62. package/lib/core/services/report-session-context.service.d.ts +6 -1
  63. package/lib/core/utils/data-normalization.util.d.ts +15 -0
  64. package/lib/core/utils/report-parameter.util.d.ts +35 -0
  65. package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
  66. package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
  67. package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
  68. package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
  69. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
  70. package/lib/data-access/adapters/index.d.ts +7 -2
  71. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
  72. package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
  73. package/lib/data-access/contracts/api-dtos.d.ts +67 -0
  74. package/lib/data-access/contracts/index.d.ts +1 -0
  75. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +2 -1
  76. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +22 -0
  77. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
  78. package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
  79. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +13 -0
  80. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +16 -2
  81. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +9 -1
  82. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +12 -1
  83. package/lib/features/designer/designer.component.d.ts +11 -0
  84. package/lib/features/designer/index.d.ts +4 -0
  85. package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
  86. package/lib/features/designer/services/designer-state.service.d.ts +1 -1
  87. package/lib/features/designer/services/report-template.service.d.ts +32 -0
  88. package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
  89. package/lib/features/export/index.d.ts +2 -2
  90. package/lib/features/export/models/export.models.d.ts +23 -0
  91. package/lib/features/export/services/report-export.service.d.ts +31 -2
  92. package/lib/features/runtime/dynamic-renderer.component.d.ts +42 -2
  93. package/lib/features/runtime/index.d.ts +2 -0
  94. package/lib/features/runtime/report-execution.service.d.ts +16 -0
  95. package/lib/features/runtime/report-grid-bridge.component.d.ts +171 -6
  96. package/lib/features/runtime/report-runtime.component.d.ts +86 -1
  97. package/lib/features/runtime/rpt-report.component.d.ts +69 -0
  98. package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
  99. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
  100. package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
  101. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
  102. package/lib/primitives/components/index.d.ts +2 -0
  103. package/lib/provide-reporting.d.ts +79 -26
  104. package/package.json +2 -1
  105. package/schematics/collection.json +10 -0
  106. package/schematics/ng-add/index.js +45 -0
  107. package/schematics/ng-add/schema.json +17 -0
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, computed, inject, signal, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, inject, output, signal, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { DesignerStateService } from '../../services/designer-state.service';
4
4
  import { ComponentRegistry } from '../../../../core/registry/component-registry';
@@ -9,6 +9,9 @@ import { PropertyEditorValidationComponent } from './property-editor-validation.
9
9
  import { PropertyEditorGridComponent } from './property-editor-grid.component';
10
10
  import { PropertyEditorReportComponent } from './property-editor-report.component';
11
11
  import { PropertyEditorDatasourceComponent } from './property-editor-datasource.component';
12
+ import { PropertyEditorActionComponent } from './property-editor-action.component';
13
+ import { ReportSchemaDiscoveryAdapter } from '../../../../data-access/contracts/schema-discovery.contract';
14
+ import { humanizeIdentifier } from '../../../../core/utils/identifier-humanizer';
12
15
  import * as i0 from "@angular/core";
13
16
  /**
14
17
  * Property Editor coordinator component.
@@ -19,9 +22,11 @@ import * as i0 from "@angular/core";
19
22
  export class PropertyEditorComponent {
20
23
  designerState = inject(DesignerStateService);
21
24
  registry = inject(ComponentRegistry);
25
+ discoveryAdapter = inject(ReportSchemaDiscoveryAdapter, { optional: true });
22
26
  definition = this.designerState.definition;
23
27
  activeTab = this.designerState.activeTab;
24
28
  selectedComponent = this.designerState.selectedComponent;
29
+ collapseRequested = output();
25
30
  maxColumns = computed(() => this.definition().layout.columns || 12);
26
31
  allComponents = computed(() => this.definition().components);
27
32
  propertySchema = computed(() => {
@@ -40,6 +45,12 @@ export class PropertyEditorComponent {
40
45
  deselect() {
41
46
  this.designerState.selectComponent(null);
42
47
  }
48
+ duplicateComponent(id) {
49
+ this.designerState.duplicateComponent(id);
50
+ }
51
+ deleteComponent(id) {
52
+ this.designerState.removeComponent(id);
53
+ }
43
54
  updateComp(field, value) {
44
55
  const comp = this.selectedComponent();
45
56
  if (comp) {
@@ -103,6 +114,9 @@ export class PropertyEditorComponent {
103
114
  pageSize: 25,
104
115
  showRowNumbers: true,
105
116
  showFooter: true,
117
+ sideBar: true,
118
+ globalSearch: true,
119
+ statusBar: true,
106
120
  },
107
121
  };
108
122
  this.designerState.updateGridSettings(defaultGrid);
@@ -165,8 +179,67 @@ export class PropertyEditorComponent {
165
179
  options: nextOptions,
166
180
  });
167
181
  }
182
+ updateGridRowClickAction(action) {
183
+ const current = this.definition().grid;
184
+ if (!current)
185
+ return;
186
+ this.designerState.updateGridSettings({
187
+ ...current,
188
+ rowClickAction: action,
189
+ });
190
+ }
191
+ autoDetectGridColumns() {
192
+ if (!this.discoveryAdapter)
193
+ return;
194
+ const currentGrid = this.definition().grid;
195
+ let targetEntity = '';
196
+ let targetType = 'stored_procedure';
197
+ const gridDs = this.definition().dataSources?.find((d) => d.id === currentGrid?.dataSourceId);
198
+ if (gridDs && gridDs.endpoint) {
199
+ targetEntity = gridDs.endpoint;
200
+ if (gridDs.method === 'GET') {
201
+ targetType = 'table';
202
+ }
203
+ }
204
+ else {
205
+ const compWithEntity = this.definition().components.find((c) => c.dataSource?.entityName);
206
+ if (compWithEntity?.dataSource?.entityName) {
207
+ targetEntity = compWithEntity.dataSource.entityName;
208
+ if (compWithEntity.dataSource.sourceType === 'table') {
209
+ targetType = 'table';
210
+ }
211
+ }
212
+ }
213
+ if (!targetEntity) {
214
+ console.warn('[PropertyEditor] No procedure or table entity found to auto-detect columns from.');
215
+ return;
216
+ }
217
+ this.discoveryAdapter.getColumns(targetEntity, 'dbo', targetType).subscribe({
218
+ next: (cols) => {
219
+ if (!cols || cols.length === 0)
220
+ return;
221
+ const mappedCols = cols.map((c) => ({
222
+ field: c.field,
223
+ label: humanizeIdentifier(c.label || c.field),
224
+ dataType: c.dataType || 'string',
225
+ visible: true,
226
+ sortable: true,
227
+ align: c.dataType === 'number' ? 'right' : 'left',
228
+ }));
229
+ this.designerState.updateGridSettings({
230
+ ...(currentGrid ?? {
231
+ dataSourceId: 'default',
232
+ options: { pagination: true, pageSize: 25, showRowNumbers: true, showFooter: true },
233
+ }),
234
+ columns: mappedCols,
235
+ });
236
+ },
237
+ error: (err) => console.error('[PropertyEditor] Auto-detect columns failed:', err),
238
+ });
239
+ }
168
240
  expandedSections = signal({
169
241
  datasource: true,
242
+ action: true,
170
243
  general: true,
171
244
  layout: false,
172
245
  validation: false,
@@ -180,6 +253,27 @@ export class PropertyEditorComponent {
180
253
  isSectionExpanded(section) {
181
254
  return !!this.expandedSections()[section];
182
255
  }
256
+ getActionBadge(comp) {
257
+ const act = comp.properties?.['action'] || 'execute-report';
258
+ switch (act) {
259
+ case 'execute-report':
260
+ return 'Run Report';
261
+ case 'reset':
262
+ return 'Reset Form';
263
+ case 'export': {
264
+ const fmt = comp.properties?.['actionParams']?.['format'] || 'excel';
265
+ return `Export (${fmt.toUpperCase()})`;
266
+ }
267
+ case 'print-report':
268
+ return 'Print (.Rpt)';
269
+ case 'navigate':
270
+ return 'Navigate';
271
+ case 'custom-event':
272
+ return 'Custom Event';
273
+ default:
274
+ return act;
275
+ }
276
+ }
183
277
  getDatasourceBadge(comp) {
184
278
  const ds = comp.dataSource;
185
279
  if (!ds || ds.sourceType === 'static')
@@ -200,7 +294,7 @@ export class PropertyEditorComponent {
200
294
  return comp.validation?.required ? 'Required' : 'Optional';
201
295
  }
202
296
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
203
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorComponent, isStandalone: true, selector: "rpt-property-editor", ngImport: i0, template: `
297
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorComponent, isStandalone: true, selector: "rpt-property-editor", outputs: { collapseRequested: "collapseRequested" }, ngImport: i0, template: `
204
298
  <div class="editor-container">
205
299
  <!-- Editor Header & Tabs -->
206
300
  <div class="editor-tabs">
@@ -232,6 +326,18 @@ export class PropertyEditorComponent {
232
326
  <rpt-icon name="table" [size]="13" />
233
327
  <span>Grid</span>
234
328
  </button>
329
+
330
+ <div style="flex: 1;"></div>
331
+
332
+ <button
333
+ type="button"
334
+ class="tab-btn btn-collapse-inspector"
335
+ (click)="collapseRequested.emit()"
336
+ title="Collapse Property Editor"
337
+ aria-label="Collapse Property Editor"
338
+ >
339
+ <rpt-icon name="chevron-right" [size]="13" />
340
+ </button>
235
341
  </div>
236
342
 
237
343
  <!-- Editor Body -->
@@ -246,9 +352,32 @@ export class PropertyEditorComponent {
246
352
  <span class="badge-type">{{ comp.type }}</span>
247
353
  <span class="badge-id">{{ comp.id }}</span>
248
354
  </div>
249
- <button type="button" class="btn-deselect" (click)="deselect()" title="Deselect component">
250
- <rpt-icon name="close" [size]="13" />
251
- </button>
355
+ <div class="badge-header-actions">
356
+ <button
357
+ type="button"
358
+ class="btn-badge-action"
359
+ (click)="duplicateComponent(comp.id)"
360
+ title="Duplicate component"
361
+ >
362
+ <rpt-icon name="copy" [size]="13" />
363
+ </button>
364
+ <button
365
+ type="button"
366
+ class="btn-badge-action btn-badge-delete"
367
+ (click)="deleteComponent(comp.id)"
368
+ title="Delete component"
369
+ >
370
+ <rpt-icon name="trash" [size]="13" />
371
+ </button>
372
+ <button
373
+ type="button"
374
+ class="btn-deselect"
375
+ (click)="deselect()"
376
+ title="Deselect component"
377
+ >
378
+ <rpt-icon name="close" [size]="13" />
379
+ </button>
380
+ </div>
252
381
  </div>
253
382
 
254
383
  <!-- Accordion Container -->
@@ -284,6 +413,35 @@ export class PropertyEditorComponent {
284
413
  </div>
285
414
  }
286
415
 
416
+ <!-- BUTTON ACTION ACCORDION (FIRST for Button) -->
417
+ @if (comp.type === 'button') {
418
+ <div class="accordion-item" [class.is-expanded]="isSectionExpanded('action')">
419
+ <button
420
+ type="button"
421
+ class="accordion-header"
422
+ (click)="toggleSection('action')"
423
+ title="Toggle Button Action section"
424
+ >
425
+ <div class="header-left">
426
+ <rpt-icon name="lightning" [size]="14" />
427
+ <span class="header-title">Button Action</span>
428
+ <span class="header-badge">{{ getActionBadge(comp) }}</span>
429
+ </div>
430
+ <div class="header-right">
431
+ <rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
432
+ </div>
433
+ </button>
434
+ @if (isSectionExpanded('action')) {
435
+ <div class="accordion-content">
436
+ <rpt-property-editor-action
437
+ [comp]="comp"
438
+ (updateProperty)="updateProp(comp.id, $event.key, $event.value)"
439
+ />
440
+ </div>
441
+ }
442
+ </div>
443
+ }
444
+
287
445
  <!-- 2. GENERAL PROPERTIES ACCORDION -->
288
446
  <div class="accordion-item" [class.is-expanded]="isSectionExpanded('general')">
289
447
  <button
@@ -400,14 +558,16 @@ export class PropertyEditorComponent {
400
558
  (addGrid)="addResultGrid()"
401
559
  (removeGrid)="removeResultGrid()"
402
560
  (addColumn)="addColumn()"
561
+ (autoDetectColumns)="autoDetectGridColumns()"
403
562
  (removeColumn)="removeColumn($event)"
404
563
  (updateColumn)="updateColumn($event.index, $event.field, $event.value)"
405
564
  (updateOption)="updateGridOption($event.field, $event.value)"
565
+ (updateRowClickAction)="updateGridRowClickAction($event)"
406
566
  />
407
567
  }
408
568
  </div>
409
569
  </div>
410
- `, isInline: true, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.btn-deselect{background:none;border:none;display:flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: PropertyEditorGeneralComponent, selector: "rpt-property-editor-general", inputs: ["comp", "propertySchema"], outputs: ["update", "updateProperty", "deselect"] }, { kind: "component", type: PropertyEditorLayoutComponent, selector: "rpt-property-editor-layout", inputs: ["comp", "maxColumns"], outputs: ["updateLayout", "updateHeight", "resetDimensions"] }, { kind: "component", type: PropertyEditorValidationComponent, selector: "rpt-property-editor-validation", inputs: ["comp"], outputs: ["updateValidation"] }, { kind: "component", type: PropertyEditorGridComponent, selector: "rpt-property-editor-grid", inputs: ["grid"], outputs: ["addGrid", "removeGrid", "addColumn", "removeColumn", "updateColumn", "updateOption"] }, { kind: "component", type: PropertyEditorReportComponent, selector: "rpt-property-editor-report", inputs: ["definition"], outputs: ["updateReport", "updateLayout"] }, { kind: "component", type: PropertyEditorDatasourceComponent, selector: "rpt-property-editor-datasource", inputs: ["comp", "allComponents"], outputs: ["updateDataSource", "updateProperty"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
570
+ `, isInline: true, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }, { kind: "component", type: PropertyEditorGeneralComponent, selector: "rpt-property-editor-general", inputs: ["comp", "propertySchema"], outputs: ["update", "updateProperty", "deselect"] }, { kind: "component", type: PropertyEditorLayoutComponent, selector: "rpt-property-editor-layout", inputs: ["comp", "maxColumns"], outputs: ["updateLayout", "updateHeight", "resetDimensions"] }, { kind: "component", type: PropertyEditorValidationComponent, selector: "rpt-property-editor-validation", inputs: ["comp"], outputs: ["updateValidation"] }, { kind: "component", type: PropertyEditorGridComponent, selector: "rpt-property-editor-grid", inputs: ["grid"], outputs: ["addGrid", "removeGrid", "addColumn", "autoDetectColumns", "removeColumn", "updateColumn", "updateOption", "updateRowClickAction"] }, { kind: "component", type: PropertyEditorReportComponent, selector: "rpt-property-editor-report", inputs: ["definition"], outputs: ["updateReport", "updateLayout"] }, { kind: "component", type: PropertyEditorDatasourceComponent, selector: "rpt-property-editor-datasource", inputs: ["comp", "allComponents"], outputs: ["updateDataSource", "updateProperty"] }, { kind: "component", type: PropertyEditorActionComponent, selector: "rpt-property-editor-action", inputs: ["comp"], outputs: ["updateProperty"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
411
571
  }
412
572
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorComponent, decorators: [{
413
573
  type: Component,
@@ -420,6 +580,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
420
580
  PropertyEditorGridComponent,
421
581
  PropertyEditorReportComponent,
422
582
  PropertyEditorDatasourceComponent,
583
+ PropertyEditorActionComponent,
423
584
  ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
424
585
  <div class="editor-container">
425
586
  <!-- Editor Header & Tabs -->
@@ -452,6 +613,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
452
613
  <rpt-icon name="table" [size]="13" />
453
614
  <span>Grid</span>
454
615
  </button>
616
+
617
+ <div style="flex: 1;"></div>
618
+
619
+ <button
620
+ type="button"
621
+ class="tab-btn btn-collapse-inspector"
622
+ (click)="collapseRequested.emit()"
623
+ title="Collapse Property Editor"
624
+ aria-label="Collapse Property Editor"
625
+ >
626
+ <rpt-icon name="chevron-right" [size]="13" />
627
+ </button>
455
628
  </div>
456
629
 
457
630
  <!-- Editor Body -->
@@ -466,9 +639,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
466
639
  <span class="badge-type">{{ comp.type }}</span>
467
640
  <span class="badge-id">{{ comp.id }}</span>
468
641
  </div>
469
- <button type="button" class="btn-deselect" (click)="deselect()" title="Deselect component">
470
- <rpt-icon name="close" [size]="13" />
471
- </button>
642
+ <div class="badge-header-actions">
643
+ <button
644
+ type="button"
645
+ class="btn-badge-action"
646
+ (click)="duplicateComponent(comp.id)"
647
+ title="Duplicate component"
648
+ >
649
+ <rpt-icon name="copy" [size]="13" />
650
+ </button>
651
+ <button
652
+ type="button"
653
+ class="btn-badge-action btn-badge-delete"
654
+ (click)="deleteComponent(comp.id)"
655
+ title="Delete component"
656
+ >
657
+ <rpt-icon name="trash" [size]="13" />
658
+ </button>
659
+ <button
660
+ type="button"
661
+ class="btn-deselect"
662
+ (click)="deselect()"
663
+ title="Deselect component"
664
+ >
665
+ <rpt-icon name="close" [size]="13" />
666
+ </button>
667
+ </div>
472
668
  </div>
473
669
 
474
670
  <!-- Accordion Container -->
@@ -504,6 +700,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
504
700
  </div>
505
701
  }
506
702
 
703
+ <!-- BUTTON ACTION ACCORDION (FIRST for Button) -->
704
+ @if (comp.type === 'button') {
705
+ <div class="accordion-item" [class.is-expanded]="isSectionExpanded('action')">
706
+ <button
707
+ type="button"
708
+ class="accordion-header"
709
+ (click)="toggleSection('action')"
710
+ title="Toggle Button Action section"
711
+ >
712
+ <div class="header-left">
713
+ <rpt-icon name="lightning" [size]="14" />
714
+ <span class="header-title">Button Action</span>
715
+ <span class="header-badge">{{ getActionBadge(comp) }}</span>
716
+ </div>
717
+ <div class="header-right">
718
+ <rpt-icon name="chevron-down" [size]="13" class="accordion-chevron" />
719
+ </div>
720
+ </button>
721
+ @if (isSectionExpanded('action')) {
722
+ <div class="accordion-content">
723
+ <rpt-property-editor-action
724
+ [comp]="comp"
725
+ (updateProperty)="updateProp(comp.id, $event.key, $event.value)"
726
+ />
727
+ </div>
728
+ }
729
+ </div>
730
+ }
731
+
507
732
  <!-- 2. GENERAL PROPERTIES ACCORDION -->
508
733
  <div class="accordion-item" [class.is-expanded]="isSectionExpanded('general')">
509
734
  <button
@@ -620,13 +845,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
620
845
  (addGrid)="addResultGrid()"
621
846
  (removeGrid)="removeResultGrid()"
622
847
  (addColumn)="addColumn()"
848
+ (autoDetectColumns)="autoDetectGridColumns()"
623
849
  (removeColumn)="removeColumn($event)"
624
850
  (updateColumn)="updateColumn($event.index, $event.field, $event.value)"
625
851
  (updateOption)="updateGridOption($event.field, $event.value)"
852
+ (updateRowClickAction)="updateGridRowClickAction($event)"
626
853
  />
627
854
  }
628
855
  </div>
629
856
  </div>
630
- `, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.btn-deselect{background:none;border:none;display:flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;padding:3px;border-radius:4px;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"] }]
857
+ `, styles: [":host{display:block;height:100%;background:#fff;border-left:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.editor-container{display:flex;flex-direction:column;height:100%}.editor-tabs{display:flex;flex-shrink:0;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.tab-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:12px 8px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:600;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tab-btn:hover:not(:disabled){color:var(--rpt-color-text, #0f172a)}.tab-btn.active{color:var(--rpt-color-primary, #2563eb);border-bottom-color:var(--rpt-color-primary, #2563eb);background:#fff}.tab-btn:disabled{opacity:.4;cursor:not-allowed}.editor-body{flex:1;overflow-y:auto;padding:12px 14px}.component-sections-wrapper{display:flex;flex-direction:column;gap:12px}.comp-badge-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--rpt-color-surface, #f8fafc);border-radius:6px;border:1px solid var(--rpt-color-border, #e2e8f0)}.badge-title{display:flex;align-items:center}.badge-type{font-size:.75rem;font-weight:700;color:var(--rpt-color-primary, #2563eb);text-transform:uppercase;margin-right:8px}.badge-id{font-size:.7rem;color:var(--rpt-color-text-muted, #94a3b8);font-family:monospace}.badge-header-actions{display:flex;align-items:center;gap:4px}.btn-badge-action{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .12s ease}.btn-badge-action:hover{background:var(--rpt-color-surface-hover, #f1f5f9);color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.btn-badge-action.btn-badge-delete:hover{background:#fee2e2;color:#ef4444;border-color:#fca5a5}.btn-deselect{background:none;border:1px solid transparent;display:inline-flex;align-items:center;justify-content:center;color:var(--rpt-color-text-muted, #64748b);cursor:pointer;width:24px;height:24px;border-radius:4px;padding:0;transition:all .15s ease}.btn-deselect:hover{color:var(--rpt-color-danger, #ef4444);background:#fee2e2;border-color:#fca5a5}.property-accordion{display:flex;flex-direction:column;gap:10px}.accordion-item{border:1px solid var(--rpt-color-border, #e2e8f0);border-radius:6px;background:#fff;overflow:hidden;transition:all .15s ease}.accordion-item.is-expanded{border-color:#cbd5e1;box-shadow:0 1px 3px #0000000a}.accordion-header{width:100%;display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:var(--rpt-color-surface, #f8fafc);border:none;cursor:pointer;text-align:left;-webkit-user-select:none;user-select:none;transition:background .15s ease}.accordion-header:hover{background:#f1f5f9}.accordion-item.is-expanded .accordion-header{background:#f8fafc;border-bottom:1px solid var(--rpt-color-border, #e2e8f0)}.header-left{display:flex;align-items:center;gap:8px;min-width:0;flex:1}.header-title{font-size:.72rem;font-weight:700;color:var(--rpt-color-text, #0f172a);text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.header-badge{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:120px}.header-right{display:flex;align-items:center;color:var(--rpt-color-text-muted, #64748b);margin-left:8px}.accordion-chevron{transition:transform .2s ease}.accordion-item.is-expanded .accordion-chevron{transform:rotate(180deg)}.accordion-content{padding:12px;display:flex;flex-direction:column;gap:12px}::ng-deep .accordion-content .group-title{display:none}::ng-deep .accordion-content .comp-badge-header{display:none}.empty-selection{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;box-sizing:border-box}.empty-icon-wrap{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:50%;background:#f1f5f9;margin-bottom:16px;box-shadow:0 1px 3px #0000000a}.empty-text{font-size:.8125rem;line-height:1.5;max-width:220px;margin:0;color:var(--rpt-color-text-muted, #64748b)}\n"] }]
631
858
  }] });
632
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3Byb3BlcnR5LWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBcUIsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNoRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUlqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUM3RixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNyRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7QUFNM0Y7Ozs7O0dBS0c7QUF1YkgsTUFBTSxPQUFPLHVCQUF1QjtJQUNqQixhQUFhLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDN0MsUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRTdDLFVBQVUs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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStNVCw4NEhBek5DLFlBQVksK0JBQ1osZ0JBQWdCLHVHQUNoQiw4QkFBOEIsK0pBQzlCLDZCQUE2QixxS0FDN0IsaUNBQWlDLDRIQUNqQywyQkFBMkIsd0xBQzNCLDZCQUE2QiwwSUFDN0IsaUNBQWlDOzs0RkEyYXhCLHVCQUF1QjtrQkF0Ym5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGdCQUFnQjt3QkFDaEIsOEJBQThCO3dCQUM5Qiw2QkFBNkI7d0JBQzdCLGlDQUFpQzt3QkFDakMsMkJBQTJCO3dCQUMzQiw2QkFBNkI7d0JBQzdCLGlDQUFpQztxQkFDbEMsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStNVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGVzaWduZXJBY3RpdmVUYWIsIERlc2lnbmVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVzaWduZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBDb21wb25lbnRSZWdpc3RyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcmVnaXN0cnkvY29tcG9uZW50LXJlZ2lzdHJ5JztcbmltcG9ydCB7IFByb3BlcnR5RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcmVnaXN0cnkvcHJvcGVydHktZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBDb21wb25lbnRMYXlvdXREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWxheW91dC5tb2RlbCc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGVmaW5pdGlvbiwgUmVwb3J0R3JpZERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBScHRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJpbWl0aXZlcy9jb21wb25lbnRzL2ljb24vcnB0LWljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yR2VuZXJhbENvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWdlbmVyYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yTGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvclZhbGlkYXRpb25Db21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci12YWxpZGF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckdyaWRDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvclJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLXJlcG9ydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JEYXRhc291cmNlQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItZGF0YXNvdXJjZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YVNvdXJjZURlZmluaXRpb24sXG4gIFJlcG9ydENvbXBvbmVudERlZmluaXRpb24sXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuXG4vKipcbiAqIFByb3BlcnR5IEVkaXRvciBjb29yZGluYXRvciBjb21wb25lbnQuXG4gKlxuICogRGVjb21wb3NlZCBpbnRvIGZvY3VzZWQgY2hpbGQgcHJlc2VudGF0aW9uYWwgY29tcG9uZW50cyBwZXIgUnVsZSAxOCAmIDE5IChDb21wb3NpdGlvbiBPdmVyIEdpYW50IENvbXBvbmVudHMpXG4gKiBhbmQgUnVsZSAzMiAoQXZvaWQgR29kIENvbXBvbmVudHMpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcHJvcGVydHktZWRpdG9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBScHRJY29uQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yR2VuZXJhbENvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvckxheW91dENvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvclZhbGlkYXRpb25Db21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yUmVwb3J0Q29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yRGF0YXNvdXJjZUNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDwhLS0gRWRpdG9yIEhlYWRlciAmIFRhYnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ3Byb3BlcnRpZXMnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdwcm9wZXJ0aWVzJylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRDb21wb25lbnQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImVkaXRcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPHNwYW4+UHJvcGVydGllczwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRhYi1idG5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdyZXBvcnQnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdyZXBvcnQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRlc2lnblwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICA8c3Bhbj5MYXlvdXQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnZ3JpZCdcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRUYWIoJ2dyaWQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRhYmxlXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPkdyaWQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRWRpdG9yIEJvZHkgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWJvZHlcIj5cbiAgICAgICAgPCEtLSAxLiBDT01QT05FTlQgUFJPUEVSVElFUyBUQUIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlVGFiKCkgPT09ICdwcm9wZXJ0aWVzJykge1xuICAgICAgICAgIEBpZiAoc2VsZWN0ZWRDb21wb25lbnQoKTsgYXMgY29tcCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1zZWN0aW9ucy13cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDwhLS0gQ29tcG9uZW50IElkZW50aWZpZXIgSGVhZGVyIChQaW5uZWQgYXQgVG9wKSAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXAtYmFkZ2UtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlLXR5cGVcIj57eyBjb21wLnR5cGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlLWlkXCI+e3sgY29tcC5pZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1kZXNlbGVjdFwiIChjbGljayk9XCJkZXNlbGVjdCgpXCIgdGl0bGU9XCJEZXNlbGVjdCBjb21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2xvc2VcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gQWNjb3JkaW9uIENvbnRhaW5lciAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWFjY29yZGlvblwiPlxuICAgICAgICAgICAgICAgIDwhLS0gMS4gT1BUSU9OUyBEQVRBIFNPVVJDRSBBQ0NPUkRJT04gKEZJUlNUIGZvciBEcm9wZG93bikgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjb21wLnR5cGUgPT09ICdkcm9wZG93bicpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiIFtjbGFzcy5pcy1leHBhbmRlZF09XCJpc1NlY3Rpb25FeHBhbmRlZCgnZGF0YXNvdXJjZScpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCdkYXRhc291cmNlJylcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIE9wdGlvbnMgRGF0YSBTb3VyY2Ugc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZGF0YWJhc2VcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPk9wdGlvbnMgRGF0YSBTb3VyY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldERhdGFzb3VyY2VCYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdkYXRhc291cmNlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxDb21wb25lbnRzXT1cImFsbENvbXBvbmVudHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVEYXRhU291cmNlKT1cInVwZGF0ZUNvbXBEYXRhU291cmNlKGNvbXAuaWQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlUHJvcGVydHkpPVwidXBkYXRlUHJvcChjb21wLmlkLCAkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gMi4gR0VORVJBTCBQUk9QRVJUSUVTIEFDQ09SRElPTiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2dlbmVyYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ2dlbmVyYWwnKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIEdlbmVyYWwgUHJvcGVydGllcyBzZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJlZGl0XCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+R2VuZXJhbCBQcm9wZXJ0aWVzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29tcC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBjb21wLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdnZW5lcmFsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItZ2VuZXJhbFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlTY2hlbWFdPVwicHJvcGVydHlTY2hlbWEoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlKT1cInVwZGF0ZUNvbXAoJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVQcm9wZXJ0eSk9XCJ1cGRhdGVQcm9wKGNvbXAuaWQsICRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2VsZWN0KT1cImRlc2VsZWN0KClcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSAzLiBMQVlPVVQgJiBHUklEIEFDQ09SRElPTiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2xheW91dCcpXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbignbGF5b3V0JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBMYXlvdXQgJiBEaW1lbnNpb25zIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRlc2lnblwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPkxheW91dCAmIEdyaWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBnZXRMYXlvdXRCYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdsYXlvdXQnKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci1sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21heENvbHVtbnNdPVwibWF4Q29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVMYXlvdXQpPVwidXBkYXRlTGF5b3V0KCRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZUhlaWdodCk9XCJ1cGRhdGVDb21wb25lbnRIZWlnaHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzZXREaW1lbnNpb25zKT1cInJlc2V0Q29tcG9uZW50RGltZW5zaW9ucyhjb21wLmlkLCBjb21wLnR5cGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gNC4gVkFMSURBVElPTiBBQ0NPUkRJT04gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCd2YWxpZGF0aW9uJylcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCd2YWxpZGF0aW9uJylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBWYWxpZGF0aW9uIFJ1bGVzIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+VmFsaWRhdGlvbiBSdWxlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldFZhbGlkYXRpb25CYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCd2YWxpZGF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItdmFsaWRhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlVmFsaWRhdGlvbik9XCJ1cGRhdGVWYWxpZGF0aW9uKCRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNlbGVjdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktaWNvbi13cmFwXCI+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjdXJzb3JcIiBbc2l6ZV09XCIyNFwiIGNvbG9yPVwiIzY0NzQ4YlwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImVtcHR5LXRleHRcIj5TZWxlY3QgYSBjb21wb25lbnQgb24gdGhlIGNhbnZhcyB0byBjb25maWd1cmUgaXRzIHByb3BlcnRpZXMuPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAyLiBSRVBPUlQgU0VUVElOR1MgVEFCIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAncmVwb3J0Jykge1xuICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLXJlcG9ydFxuICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiZGVmaW5pdGlvbigpXCJcbiAgICAgICAgICAgICh1cGRhdGVSZXBvcnQpPVwidXBkYXRlUmVwb3J0KCRldmVudC5maWVsZCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAodXBkYXRlTGF5b3V0KT1cInVwZGF0ZUxheW91dFByb3AoJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAzLiBSRVNVTFQgR1JJRCBTRVRUSU5HUyBUQUIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlVGFiKCkgPT09ICdncmlkJykge1xuICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWdyaWRcbiAgICAgICAgICAgIFtncmlkXT1cImRlZmluaXRpb24oKS5ncmlkXCJcbiAgICAgICAgICAgIChhZGRHcmlkKT1cImFkZFJlc3VsdEdyaWQoKVwiXG4gICAgICAgICAgICAocmVtb3ZlR3JpZCk9XCJyZW1vdmVSZXN1bHRHcmlkKClcIlxuICAgICAgICAgICAgKGFkZENvbHVtbik9XCJhZGRDb2x1bW4oKVwiXG4gICAgICAgICAgICAocmVtb3ZlQ29sdW1uKT1cInJlbW92ZUNvbHVtbigkZXZlbnQpXCJcbiAgICAgICAgICAgICh1cGRhdGVDb2x1bW4pPVwidXBkYXRlQ29sdW1uKCRldmVudC5pbmRleCwgJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICh1cGRhdGVPcHRpb24pPVwidXBkYXRlR3JpZE9wdGlvbigkZXZlbnQuZmllbGQsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0tcnB0LWZvbnQtZmFtaWx5LCBpbmhlcml0KTtcbiAgICB9XG4gICAgLmVkaXRvci1jb250YWluZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgfVxuICAgIC5lZGl0b3ItdGFicyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2Y4ZmFmYyk7XG4gICAgfVxuICAgIC50YWItYnRuIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgcGFkZGluZzogMTJweCA4cHg7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtc20sIDAuNzVyZW0pO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1ycHQtdHJhbnNpdGlvbi1zcGVlZCwgMTUwbXMpIGVhc2U7XG4gICAgfVxuICAgIC50YWItYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgfVxuICAgIC50YWItYnRuLmFjdGl2ZSB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICB9XG4gICAgLnRhYi1idG46ZGlzYWJsZWQge1xuICAgICAgb3BhY2l0eTogMC40O1xuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICB9XG4gICAgLmVkaXRvci1ib2R5IHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgIH1cbiAgICAuY29tcG9uZW50LXNlY3Rpb25zLXdyYXBwZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDEycHg7XG4gICAgfVxuICAgIC5jb21wLWJhZGdlLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDhweCAxMnB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmOGZhZmMpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2UyZThmMCk7XG4gICAgfVxuICAgIC5iYWRnZS10aXRsZSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICB9XG4gICAgLmJhZGdlLXR5cGUge1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbWFyZ2luLXJpZ2h0OiA4cHg7XG4gICAgfVxuICAgIC5iYWRnZS1pZCB7XG4gICAgICBmb250LXNpemU6IDAuN3JlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzk0YTNiOCk7XG4gICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICAgIH1cbiAgICAuYnRuLWRlc2VsZWN0IHtcbiAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHBhZGRpbmc6IDNweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBlYXNlO1xuICAgIH1cbiAgICAuYnRuLWRlc2VsZWN0OmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItZGFuZ2VyLCAjZWY0NDQ0KTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZWUyZTI7XG4gICAgfVxuICAgIC5wcm9wZXJ0eS1hY2NvcmRpb24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBnYXA6IDEwcHg7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taXRlbSB7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjZTJlOGYwKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taXRlbS5pcy1leHBhbmRlZCB7XG4gICAgICBib3JkZXItY29sb3I6ICNjYmQ1ZTE7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjA0KTtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1oZWFkZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMTJweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1zdXJmYWNlLCAjZjhmYWZjKTtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1oZWFkZXI6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1pdGVtLmlzLWV4cGFuZGVkIC5hY2NvcmRpb24taGVhZGVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2UyZThmMCk7XG4gICAgfVxuICAgIC5oZWFkZXItbGVmdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgZmxleDogMTtcbiAgICB9XG4gICAgLmhlYWRlci10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDAuNzJyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB9XG4gICAgLmhlYWRlci1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJhY2tncm91bmQ6ICNlZmY2ZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmZkYmZlO1xuICAgICAgcGFkZGluZzogMXB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICBtYXgtd2lkdGg6IDEyMHB4O1xuICAgIH1cbiAgICAuaGVhZGVyLXJpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG4gICAgfVxuICAgIC5hY2NvcmRpb24tY2hldnJvbiB7XG4gICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMjAwbXMgZWFzZTtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1pdGVtLmlzLWV4cGFuZGVkIC5hY2NvcmRpb24tY2hldnJvbiB7XG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWNvbnRlbnQge1xuICAgICAgcGFkZGluZzogMTJweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgIH1cbiAgICA6Om5nLWRlZXAgLmFjY29yZGlvbi1jb250ZW50IC5ncm91cC10aXRsZSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgICA6Om5nLWRlZXAgLmFjY29yZGlvbi1jb250ZW50IC5jb21wLWJhZGdlLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgICAuZW1wdHktc2VsZWN0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgcGFkZGluZzogNjBweCAyMHB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICB9XG4gICAgLmVtcHR5LWljb24td3JhcCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHdpZHRoOiA1MnB4O1xuICAgICAgaGVpZ2h0OiA1MnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTtcbiAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjA0KTtcbiAgICB9XG4gICAgLmVtcHR5LXRleHQge1xuICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICBsaW5lLWhlaWdodDogMS41O1xuICAgICAgbWF4LXdpZHRoOiAyMjBweDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgfVxuICBgXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvcGVydHlFZGl0b3JDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc2lnbmVyU3RhdGUgPSBpbmplY3QoRGVzaWduZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gaW5qZWN0KENvbXBvbmVudFJlZ2lzdHJ5KTtcblxuICByZWFkb25seSBkZWZpbml0aW9uID0gdGhpcy5kZXNpZ25lclN0YXRlLmRlZmluaXRpb247XG4gIHJlYWRvbmx5IGFjdGl2ZVRhYiA9IHRoaXMuZGVzaWduZXJTdGF0ZS5hY3RpdmVUYWI7XG4gIHJlYWRvbmx5IHNlbGVjdGVkQ29tcG9uZW50ID0gdGhpcy5kZXNpZ25lclN0YXRlLnNlbGVjdGVkQ29tcG9uZW50O1xuXG4gIHJlYWRvbmx5IG1heENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRlZmluaXRpb24oKS5sYXlvdXQuY29sdW1ucyB8fCAxMik7XG4gIHJlYWRvbmx5IGFsbENvbXBvbmVudHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzKTtcblxuICByZWFkb25seSBwcm9wZXJ0eVNjaGVtYSA9IGNvbXB1dGVkPFByb3BlcnR5RGVmaW5pdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQoKTtcbiAgICBpZiAoIWNvbXApIHJldHVybiBbXTtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5yZWdpc3RyeS5yZXNvbHZlKGNvbXAudHlwZSk7XG4gICAgcmV0dXJuIG1ldGE/LnByb3BlcnR5U2NoZW1hID8/IFtdO1xuICB9KTtcblxuICBzZXRUYWIodGFiOiBEZXNpZ25lckFjdGl2ZVRhYik6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZXRBY3RpdmVUYWIodGFiKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbXBEYXRhU291cmNlKGlkOiBzdHJpbmcsIGRhdGFTb3VyY2U6IENvbXBvbmVudERhdGFTb3VyY2VEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudChpZCwgeyBkYXRhU291cmNlIH0pO1xuICB9XG5cbiAgZGVzZWxlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnNlbGVjdENvbXBvbmVudChudWxsKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbXAoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50KGNvbXAuaWQsIHsgW2ZpZWxkXTogdmFsdWUgfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlUHJvcChpZDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50UHJvcGVydHkoaWQsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgdXBkYXRlTGF5b3V0KGtleToga2V5b2YgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbiwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50TGF5b3V0KGNvbXAuaWQsIHsgW2tleV06IHZhbHVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbXBvbmVudEhlaWdodCh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKCFjb21wKSByZXR1cm47XG4gICAgY29uc3QgaGVpZ2h0ID0gIXZhbCB8fCB2YWwgPT09ICdhdXRvJyB8fCAhdmFsLnRyaW0oKSA/IHVuZGVmaW5lZCA6IHZhbC50cmltKCk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudExheW91dChjb21wLmlkLCB7XG4gICAgICBoZWlnaHQsXG4gICAgICBtaW5IZWlnaHQ6IGhlaWdodCxcbiAgICB9KTtcbiAgfVxuXG4gIHJlc2V0Q29tcG9uZW50RGltZW5zaW9ucyhpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0U3BhbiA9IHR5cGUgPT09ICdidXR0b24nID8gMiA6IDQ7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudExheW91dChpZCwge1xuICAgICAgY29sdW1uU3BhbjogZGVmYXVsdFNwYW4sXG4gICAgICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgIG1pbkhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVZhbGlkYXRpb24oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQoKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgbmV4dFZhbGlkYXRpb24gPSB7IC4uLihjb21wLnZhbGlkYXRpb24gPz8ge30pLCBba2V5XTogdmFsdWUgfTtcbiAgICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnQoY29tcC5pZCwgeyB2YWxpZGF0aW9uOiBuZXh0VmFsaWRhdGlvbiB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVSZXBvcnQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZVJlcG9ydFNldHRpbmdzKHsgW2tleV06IHZhbHVlIH0pO1xuICB9XG5cbiAgdXBkYXRlTGF5b3V0UHJvcChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gdGhpcy5kZWZpbml0aW9uKCkubGF5b3V0O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVSZXBvcnRTZXR0aW5ncyh7XG4gICAgICBsYXlvdXQ6IHsgLi4uY3VycmVudExheW91dCwgW2tleV06IHZhbHVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBhZGRSZXN1bHRHcmlkKCk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nRHMgPSB0aGlzLmRlZmluaXRpb24oKS5kYXRhU291cmNlc1swXTtcbiAgICBjb25zdCBkZWZhdWx0R3JpZDogUmVwb3J0R3JpZERlZmluaXRpb24gPSB7XG4gICAgICBkYXRhU291cmNlSWQ6IGV4aXN0aW5nRHM/LmlkID8/ICdkZWZhdWx0JyxcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBmaWVsZDogJ2lkJywgbGFiZWw6ICdJRCcsIGRhdGFUeXBlOiAnbnVtYmVyJywgdmlzaWJsZTogdHJ1ZSwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBmaWVsZDogJ25hbWUnLCBsYWJlbDogJ05hbWUnLCBkYXRhVHlwZTogJ3N0cmluZycsIHZpc2libGU6IHRydWUsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICBdLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBwYWdpbmF0aW9uOiB0cnVlLFxuICAgICAgICBwYWdlU2l6ZTogMjUsXG4gICAgICAgIHNob3dSb3dOdW1iZXJzOiB0cnVlLFxuICAgICAgICBzaG93Rm9vdGVyOiB0cnVlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3MoZGVmYXVsdEdyaWQpO1xuICB9XG5cbiAgcmVtb3ZlUmVzdWx0R3JpZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHVuZGVmaW5lZCk7XG4gIH1cblxuICBhZGRDb2x1bW4oKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZGVmaW5pdGlvbigpLmdyaWQgPz8ge1xuICAgICAgZGF0YVNvdXJjZUlkOiAnZGVmYXVsdCcsXG4gICAgICBjb2x1bW5zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IGNvbENvdW50ID0gY3VycmVudC5jb2x1bW5zLmxlbmd0aCArIDE7XG4gICAgY29uc3QgbmV3Q29sOiBHcmlkQ29sdW1uRGVmaW5pdGlvbiA9IHtcbiAgICAgIGZpZWxkOiBgZmllbGRfJHtjb2xDb3VudH1gLFxuICAgICAgbGFiZWw6IGBDb2x1bW4gJHtjb2xDb3VudH1gLFxuICAgICAgZGF0YVR5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBhbGlnbjogJ2xlZnQnLFxuICAgIH07XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgY29sdW1uczogWy4uLmN1cnJlbnQuY29sdW1ucywgbmV3Q29sXSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUNvbHVtbihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZGVmaW5pdGlvbigpLmdyaWQ7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG4gICAgY29uc3QgbmV4dENvbHMgPSBbLi4uY3VycmVudC5jb2x1bW5zXTtcbiAgICBuZXh0Q29scy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIGNvbHVtbnM6IG5leHRDb2xzLFxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlQ29sdW1uKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZGVmaW5pdGlvbigpLmdyaWQ7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG4gICAgY29uc3QgbmV4dENvbHMgPSBjdXJyZW50LmNvbHVtbnMubWFwKChjLCBpZHgpID0+IHtcbiAgICAgIGlmIChpZHggPT09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiB7IC4uLmMsIFtmaWVsZF06IHZhbHVlIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9KTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBjb2x1bW5zOiBuZXh0Q29scyxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRPcHRpb24oZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZCA/PyB7XG4gICAgICBkYXRhU291cmNlSWQ6ICdkZWZhdWx0JyxcbiAgICAgIGNvbHVtbnM6IFtdLFxuICAgIH07XG4gICAgY29uc3QgbmV4dE9wdGlvbnMgPSB7IC4uLihjdXJyZW50Lm9wdGlvbnMgPz8ge30pLCBbZmllbGRdOiB2YWx1ZSB9O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIG9wdGlvbnM6IG5leHRPcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgZXhwYW5kZWRTZWN0aW9ucyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe1xuICAgIGRhdGFzb3VyY2U6IHRydWUsXG4gICAgZ2VuZXJhbDogdHJ1ZSxcbiAgICBsYXlvdXQ6IGZhbHNlLFxuICAgIHZhbGlkYXRpb246IGZhbHNlLFxuICB9KTtcblxuICB0b2dnbGVTZWN0aW9uKHNlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRTZWN0aW9ucy51cGRhdGUoKHByZXYpID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgW3NlY3Rpb25dOiAhcHJldltzZWN0aW9uXSxcbiAgICB9KSk7XG4gIH1cblxuICBpc1NlY3Rpb25FeHBhbmRlZChzZWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmV4cGFuZGVkU2VjdGlvbnMoKVtzZWN0aW9uXTtcbiAgfVxuXG4gIGdldERhdGFzb3VyY2VCYWRnZShjb21wOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBkcyA9IGNvbXAuZGF0YVNvdXJjZTtcbiAgICBpZiAoIWRzIHx8IGRzLnNvdXJjZVR5cGUgPT09ICdzdGF0aWMnKSByZXR1cm4gJ1N0YXRpYyBMaXN0JztcbiAgICBpZiAoZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyB8fCBkcy5lbnRpdHlOYW1lKSB7XG4gICAgICByZXR1cm4gZHMuZW50aXR5TmFtZSA/IGBUYWJsZTogJHtkcy5lbnRpdHlOYW1lfWAgOiAnVGFibGUgLyBWaWV3JztcbiAgICB9XG4gICAgaWYgKGRzLnNvdXJjZVR5cGUgPT09ICdwcm9jZWR1cmUnKSB7XG4gICAgICByZXR1cm4gZHMuZW50aXR5TmFtZSA/IGBTUDogJHtkcy5lbnRpdHlOYW1lfWAgOiAnU3RvcmVkIFByb2MnO1xuICAgIH1cbiAgICByZXR1cm4gJ1N0YXRpYyBMaXN0JztcbiAgfVxuXG4gIGdldExheW91dEJhZGdlKGNvbXA6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYW4gPSBjb21wLmxheW91dD8uY29sdW1uU3BhbiB8fCAoY29tcC50eXBlID09PSAnYnV0dG9uJyA/IDIgOiA0KTtcbiAgICByZXR1cm4gYCR7c3Bhbn0vJHt0aGlzLm1heENvbHVtbnMoKX0gY29sc2A7XG4gIH1cblxuICBnZXRWYWxpZGF0aW9uQmFkZ2UoY29tcDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbXAudmFsaWRhdGlvbj8ucmVxdWlyZWQgPyAnUmVxdWlyZWQnIDogJ09wdGlvbmFsJztcbiAgfVxufVxuIl19
859
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL2ZlYXR1cmVzL2Rlc2lnbmVyL2NvbXBvbmVudHMvcHJvcGVydHktZWRpdG9yL3Byb3BlcnR5LWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXFCLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFJakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFDN0YsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDM0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDM0YsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFLbkYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDM0csT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkNB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Q3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpUlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGVzaWduZXJBY3RpdmVUYWIsIERlc2lnbmVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVzaWduZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBDb21wb25lbnRSZWdpc3RyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcmVnaXN0cnkvY29tcG9uZW50LXJlZ2lzdHJ5JztcbmltcG9ydCB7IFByb3BlcnR5RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvcmVnaXN0cnkvcHJvcGVydHktZGVmaW5pdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBDb21wb25lbnRMYXlvdXREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWxheW91dC5tb2RlbCc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGVmaW5pdGlvbiwgR3JpZFJvd0NsaWNrQWN0aW9uLCBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JHZW5lcmFsQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItZ2VuZXJhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvcGVydHlFZGl0b3JMYXlvdXRDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1sYXlvdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yVmFsaWRhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLXZhbGlkYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yR3JpZENvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWdyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IFByb3BlcnR5RWRpdG9yUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi9wcm9wZXJ0eS1lZGl0b3ItcmVwb3J0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckRhdGFzb3VyY2VDb21wb25lbnQgfSBmcm9tICcuL3Byb3BlcnR5LWVkaXRvci1kYXRhc291cmNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9wZXJ0eUVkaXRvckFjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vcHJvcGVydHktZWRpdG9yLWFjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YVNvdXJjZURlZmluaXRpb24sXG4gIFJlcG9ydENvbXBvbmVudERlZmluaXRpb24sXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0U2NoZW1hRGlzY292ZXJ5QWRhcHRlciB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEtYWNjZXNzL2NvbnRyYWN0cy9zY2hlbWEtZGlzY292ZXJ5LmNvbnRyYWN0JztcbmltcG9ydCB7IGh1bWFuaXplSWRlbnRpZmllciB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvdXRpbHMvaWRlbnRpZmllci1odW1hbml6ZXInO1xuXG4vKipcbiAqIFByb3BlcnR5IEVkaXRvciBjb29yZGluYXRvciBjb21wb25lbnQuXG4gKlxuICogRGVjb21wb3NlZCBpbnRvIGZvY3VzZWQgY2hpbGQgcHJlc2VudGF0aW9uYWwgY29tcG9uZW50cyBwZXIgUnVsZSAxOCAmIDE5IChDb21wb3NpdGlvbiBPdmVyIEdpYW50IENvbXBvbmVudHMpXG4gKiBhbmQgUnVsZSAzMiAoQXZvaWQgR29kIENvbXBvbmVudHMpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtcHJvcGVydHktZWRpdG9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBScHRJY29uQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yR2VuZXJhbENvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvckxheW91dENvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvclZhbGlkYXRpb25Db21wb25lbnQsXG4gICAgUHJvcGVydHlFZGl0b3JHcmlkQ29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yUmVwb3J0Q29tcG9uZW50LFxuICAgIFByb3BlcnR5RWRpdG9yRGF0YXNvdXJjZUNvbXBvbmVudCxcbiAgICBQcm9wZXJ0eUVkaXRvckFjdGlvbkNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDwhLS0gRWRpdG9yIEhlYWRlciAmIFRhYnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidGFiLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ3Byb3BlcnRpZXMnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdwcm9wZXJ0aWVzJylcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRDb21wb25lbnQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImVkaXRcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPHNwYW4+UHJvcGVydGllczwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRhYi1idG5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdyZXBvcnQnXCJcbiAgICAgICAgICAoY2xpY2spPVwic2V0VGFiKCdyZXBvcnQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRlc2lnblwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICA8c3Bhbj5MYXlvdXQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0YWItYnRuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnZ3JpZCdcIlxuICAgICAgICAgIChjbGljayk9XCJzZXRUYWIoJ2dyaWQnKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRhYmxlXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDxzcGFuPkdyaWQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPjwvZGl2PlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRhYi1idG4gYnRuLWNvbGxhcHNlLWluc3BlY3RvclwiXG4gICAgICAgICAgKGNsaWNrKT1cImNvbGxhcHNlUmVxdWVzdGVkLmVtaXQoKVwiXG4gICAgICAgICAgdGl0bGU9XCJDb2xsYXBzZSBQcm9wZXJ0eSBFZGl0b3JcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb2xsYXBzZSBQcm9wZXJ0eSBFZGl0b3JcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGV2cm9uLXJpZ2h0XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVkaXRvciBCb2R5IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVkaXRvci1ib2R5XCI+XG4gICAgICAgIDwhLS0gMS4gQ09NUE9ORU5UIFBST1BFUlRJRVMgVEFCIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAncHJvcGVydGllcycpIHtcbiAgICAgICAgICBAaWYgKHNlbGVjdGVkQ29tcG9uZW50KCk7IGFzIGNvbXApIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc2VjdGlvbnMtd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8IS0tIENvbXBvbmVudCBJZGVudGlmaWVyIEhlYWRlciAoUGlubmVkIGF0IFRvcCkgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wLWJhZGdlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS10eXBlXCI+e3sgY29tcC50eXBlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS1pZFwiPnt7IGNvbXAuaWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlLWhlYWRlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1iYWRnZS1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlQ29tcG9uZW50KGNvbXAuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEdXBsaWNhdGUgY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjb3B5XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1iYWRnZS1hY3Rpb24gYnRuLWJhZGdlLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb21wb25lbnQoY29tcC5pZClcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkRlbGV0ZSBjb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRyYXNoXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1kZXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZXNlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEZXNlbGVjdCBjb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNsb3NlXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gQWNjb3JkaW9uIENvbnRhaW5lciAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWFjY29yZGlvblwiPlxuICAgICAgICAgICAgICAgIDwhLS0gMS4gT1BUSU9OUyBEQVRBIFNPVVJDRSBBQ0NPUkRJT04gKEZJUlNUIGZvciBEcm9wZG93bikgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjb21wLnR5cGUgPT09ICdkcm9wZG93bicpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiIFtjbGFzcy5pcy1leHBhbmRlZF09XCJpc1NlY3Rpb25FeHBhbmRlZCgnZGF0YXNvdXJjZScpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCdkYXRhc291cmNlJylcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIE9wdGlvbnMgRGF0YSBTb3VyY2Ugc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZGF0YWJhc2VcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPk9wdGlvbnMgRGF0YSBTb3VyY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldERhdGFzb3VyY2VCYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdkYXRhc291cmNlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWRhdGFzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxDb21wb25lbnRzXT1cImFsbENvbXBvbmVudHMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVEYXRhU291cmNlKT1cInVwZGF0ZUNvbXBEYXRhU291cmNlKGNvbXAuaWQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlUHJvcGVydHkpPVwidXBkYXRlUHJvcChjb21wLmlkLCAkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gQlVUVE9OIEFDVElPTiBBQ0NPUkRJT04gKEZJUlNUIGZvciBCdXR0b24pIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29tcC50eXBlID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCdhY3Rpb24nKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbignYWN0aW9uJylcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIEJ1dHRvbiBBY3Rpb24gc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlnaHRuaW5nXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5CdXR0b24gQWN0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBnZXRBY3Rpb25CYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdhY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlUHJvcGVydHkpPVwidXBkYXRlUHJvcChjb21wLmlkLCAkZXZlbnQua2V5LCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gMi4gR0VORVJBTCBQUk9QRVJUSUVTIEFDQ09SRElPTiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2dlbmVyYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ2dlbmVyYWwnKVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIEdlbmVyYWwgUHJvcGVydGllcyBzZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJlZGl0XCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+R2VuZXJhbCBQcm9wZXJ0aWVzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29tcC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBjb21wLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdnZW5lcmFsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItZ2VuZXJhbFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlTY2hlbWFdPVwicHJvcGVydHlTY2hlbWEoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlKT1cInVwZGF0ZUNvbXAoJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVQcm9wZXJ0eSk9XCJ1cGRhdGVQcm9wKGNvbXAuaWQsICRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2VsZWN0KT1cImRlc2VsZWN0KClcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSAzLiBMQVlPVVQgJiBHUklEIEFDQ09SRElPTiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNTZWN0aW9uRXhwYW5kZWQoJ2xheW91dCcpXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbignbGF5b3V0JylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBMYXlvdXQgJiBEaW1lbnNpb25zIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRlc2lnblwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci10aXRsZVwiPkxheW91dCAmIEdyaWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXItYmFkZ2VcIj57eyBnZXRMYXlvdXRCYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCdsYXlvdXQnKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LXByb3BlcnR5LWVkaXRvci1sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wXT1cImNvbXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21heENvbHVtbnNdPVwibWF4Q29sdW1ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGVMYXlvdXQpPVwidXBkYXRlTGF5b3V0KCRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZUhlaWdodCk9XCJ1cGRhdGVDb21wb25lbnRIZWlnaHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzZXREaW1lbnNpb25zKT1cInJlc2V0Q29tcG9uZW50RGltZW5zaW9ucyhjb21wLmlkLCBjb21wLnR5cGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gNC4gVkFMSURBVElPTiBBQ0NPUkRJT04gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzU2VjdGlvbkV4cGFuZGVkKCd2YWxpZGF0aW9uJylcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCd2YWxpZGF0aW9uJylcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBWYWxpZGF0aW9uIFJ1bGVzIHNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+VmFsaWRhdGlvbiBSdWxlczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlci1iYWRnZVwiPnt7IGdldFZhbGlkYXRpb25CYWRnZShjb21wKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEzXCIgY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICBAaWYgKGlzU2VjdGlvbkV4cGFuZGVkKCd2YWxpZGF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJwdC1wcm9wZXJ0eS1lZGl0b3ItdmFsaWRhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBdPVwiY29tcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlVmFsaWRhdGlvbik9XCJ1cGRhdGVWYWxpZGF0aW9uKCRldmVudC5rZXksICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LXNlbGVjdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1wdHktaWNvbi13cmFwXCI+XG4gICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjdXJzb3JcIiBbc2l6ZV09XCIyNFwiIGNvbG9yPVwiIzY0NzQ4YlwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImVtcHR5LXRleHRcIj5TZWxlY3QgYSBjb21wb25lbnQgb24gdGhlIGNhbnZhcyB0byBjb25maWd1cmUgaXRzIHByb3BlcnRpZXMuPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAyLiBSRVBPUlQgU0VUVElOR1MgVEFCIC0tPlxuICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAncmVwb3J0Jykge1xuICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLXJlcG9ydFxuICAgICAgICAgICAgW2RlZmluaXRpb25dPVwiZGVmaW5pdGlvbigpXCJcbiAgICAgICAgICAgICh1cGRhdGVSZXBvcnQpPVwidXBkYXRlUmVwb3J0KCRldmVudC5maWVsZCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAodXBkYXRlTGF5b3V0KT1cInVwZGF0ZUxheW91dFByb3AoJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSAzLiBSRVNVTFQgR1JJRCBTRVRUSU5HUyBUQUIgLS0+XG4gICAgICAgIEBpZiAoYWN0aXZlVGFiKCkgPT09ICdncmlkJykge1xuICAgICAgICAgIDxycHQtcHJvcGVydHktZWRpdG9yLWdyaWRcbiAgICAgICAgICAgIFtncmlkXT1cImRlZmluaXRpb24oKS5ncmlkXCJcbiAgICAgICAgICAgIChhZGRHcmlkKT1cImFkZFJlc3VsdEdyaWQoKVwiXG4gICAgICAgICAgICAocmVtb3ZlR3JpZCk9XCJyZW1vdmVSZXN1bHRHcmlkKClcIlxuICAgICAgICAgICAgKGFkZENvbHVtbik9XCJhZGRDb2x1bW4oKVwiXG4gICAgICAgICAgICAoYXV0b0RldGVjdENvbHVtbnMpPVwiYXV0b0RldGVjdEdyaWRDb2x1bW5zKClcIlxuICAgICAgICAgICAgKHJlbW92ZUNvbHVtbik9XCJyZW1vdmVDb2x1bW4oJGV2ZW50KVwiXG4gICAgICAgICAgICAodXBkYXRlQ29sdW1uKT1cInVwZGF0ZUNvbHVtbigkZXZlbnQuaW5kZXgsICRldmVudC5maWVsZCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAodXBkYXRlT3B0aW9uKT1cInVwZGF0ZUdyaWRPcHRpb24oJGV2ZW50LmZpZWxkLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICh1cGRhdGVSb3dDbGlja0FjdGlvbik9XCJ1cGRhdGVHcmlkUm93Q2xpY2tBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ycHQtZm9udC1mYW1pbHksIGluaGVyaXQpO1xuICAgIH1cbiAgICAuZWRpdG9yLWNvbnRhaW5lciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG4gICAgLmVkaXRvci10YWJzIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1zdXJmYWNlLCAjZjhmYWZjKTtcbiAgICB9XG4gICAgLnRhYi1idG4ge1xuICAgICAgZmxleDogMTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwYWRkaW5nOiAxMnB4IDhweDtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1zbSwgMC43NXJlbSk7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICB9XG4gICAgLnRhYi1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICB9XG4gICAgLnRhYi1idG4uYWN0aXZlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgIH1cbiAgICAudGFiLWJ0bjpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjQ7XG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgIH1cbiAgICAuZWRpdG9yLWJvZHkge1xuICAgICAgZmxleDogMTtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBwYWRkaW5nOiAxMnB4IDE0cHg7XG4gICAgfVxuICAgIC5jb21wb25lbnQtc2VjdGlvbnMtd3JhcHBlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMTJweDtcbiAgICB9XG4gICAgLmNvbXAtYmFkZ2UtaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgcGFkZGluZzogOHB4IDEycHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2Y4ZmFmYyk7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjZTJlOGYwKTtcbiAgICB9XG4gICAgLmJhZGdlLXRpdGxlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbiAgICAuYmFkZ2UtdHlwZSB7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDhweDtcbiAgICB9XG4gICAgLmJhZGdlLWlkIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjOTRhM2I4KTtcbiAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgfVxuICAgIC5iYWRnZS1oZWFkZXItYWN0aW9ucyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNHB4O1xuICAgIH1cbiAgICAuYnRuLWJhZGdlLWFjdGlvbiB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB3aWR0aDogMjRweDtcbiAgICAgIGhlaWdodDogMjRweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLmJ0bi1iYWRnZS1hY3Rpb246aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UtaG92ZXIsICNmMWY1ZjkpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgIH1cbiAgICAuYnRuLWJhZGdlLWFjdGlvbi5idG4tYmFkZ2UtZGVsZXRlOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZWUyZTI7XG4gICAgICBjb2xvcjogI2VmNDQ0NDtcbiAgICAgIGJvcmRlci1jb2xvcjogI2ZjYTVhNTtcbiAgICB9XG4gICAgLmJ0bi1kZXNlbGVjdCB7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB3aWR0aDogMjRweDtcbiAgICAgIGhlaWdodDogMjRweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLmJ0bi1kZXNlbGVjdDpob3ZlciB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLWRhbmdlciwgI2VmNDQ0NCk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjZmNhNWE1O1xuICAgIH1cbiAgICAucHJvcGVydHktYWNjb3JkaW9uIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiAxMHB4O1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWl0ZW0ge1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2UyZThmMCk7XG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxNTBtcyBlYXNlO1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWl0ZW0uaXMtZXhwYW5kZWQge1xuICAgICAgYm9yZGVyLWNvbG9yOiAjY2JkNWUxO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wNCk7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taGVhZGVyIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2Y4ZmFmYyk7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taGVhZGVyOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taXRlbS5pcy1leHBhbmRlZCAuYWNjb3JkaW9uLWhlYWRlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNlMmU4ZjApO1xuICAgIH1cbiAgICAuaGVhZGVyLWxlZnQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuICAgIC5oZWFkZXItdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAwLjcycmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDNlbTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgfVxuICAgIC5oZWFkZXItYmFkZ2Uge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JmZGJmZTtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgbWF4LXdpZHRoOiAxMjBweDtcbiAgICB9XG4gICAgLmhlYWRlci1yaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIH1cbiAgICAuYWNjb3JkaW9uLWNoZXZyb24ge1xuICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDIwMG1zIGVhc2U7XG4gICAgfVxuICAgIC5hY2NvcmRpb24taXRlbS5pcy1leHBhbmRlZCAuYWNjb3JkaW9uLWNoZXZyb24ge1xuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICB9XG4gICAgLmFjY29yZGlvbi1jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogMTJweDtcbiAgICB9XG4gICAgOjpuZy1kZWVwIC5hY2NvcmRpb24tY29udGVudCAuZ3JvdXAtdGl0bGUge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgOjpuZy1kZWVwIC5hY2NvcmRpb24tY29udGVudCAuY29tcC1iYWRnZS1oZWFkZXIge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgLmVtcHR5LXNlbGVjdGlvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6IDYwcHggMjBweDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5lbXB0eS1pY29uLXdyYXAge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB3aWR0aDogNTJweDtcbiAgICAgIGhlaWdodDogNTJweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJhY2tncm91bmQ6ICNmMWY1Zjk7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wNCk7XG4gICAgfVxuICAgIC5lbXB0eS10ZXh0IHtcbiAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgICAgIG1heC13aWR0aDogMjIwcHg7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgIH1cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lclN0YXRlID0gaW5qZWN0KERlc2lnbmVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeSA9IGluamVjdChDb21wb25lbnRSZWdpc3RyeSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzY292ZXJ5QWRhcHRlciA9IGluamVjdChSZXBvcnRTY2hlbWFEaXNjb3ZlcnlBZGFwdGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGRlZmluaXRpb24gPSB0aGlzLmRlc2lnbmVyU3RhdGUuZGVmaW5pdGlvbjtcbiAgcmVhZG9ubHkgYWN0aXZlVGFiID0gdGhpcy5kZXNpZ25lclN0YXRlLmFjdGl2ZVRhYjtcbiAgcmVhZG9ubHkgc2VsZWN0ZWRDb21wb25lbnQgPSB0aGlzLmRlc2lnbmVyU3RhdGUuc2VsZWN0ZWRDb21wb25lbnQ7XG5cbiAgcmVhZG9ubHkgY29sbGFwc2VSZXF1ZXN0ZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICByZWFkb25seSBtYXhDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZWZpbml0aW9uKCkubGF5b3V0LmNvbHVtbnMgfHwgMTIpO1xuICByZWFkb25seSBhbGxDb21wb25lbnRzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZWZpbml0aW9uKCkuY29tcG9uZW50cyk7XG5cbiAgcmVhZG9ubHkgcHJvcGVydHlTY2hlbWEgPSBjb21wdXRlZDxQcm9wZXJ0eURlZmluaXRpb25bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKCFjb21wKSByZXR1cm4gW107XG4gICAgY29uc3QgbWV0YSA9IHRoaXMucmVnaXN0cnkucmVzb2x2ZShjb21wLnR5cGUpO1xuICAgIHJldHVybiBtZXRhPy5wcm9wZXJ0eVNjaGVtYSA/PyBbXTtcbiAgfSk7XG5cbiAgc2V0VGFiKHRhYjogRGVzaWduZXJBY3RpdmVUYWIpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2V0QWN0aXZlVGFiKHRhYik7XG4gIH1cblxuICB1cGRhdGVDb21wRGF0YVNvdXJjZShpZDogc3RyaW5nLCBkYXRhU291cmNlOiBDb21wb25lbnREYXRhU291cmNlRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnQoaWQsIHsgZGF0YVNvdXJjZSB9KTtcbiAgfVxuXG4gIGRlc2VsZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZWxlY3RDb21wb25lbnQobnVsbCk7XG4gIH1cblxuICBkdXBsaWNhdGVDb21wb25lbnQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5kdXBsaWNhdGVDb21wb25lbnQoaWQpO1xuICB9XG5cbiAgZGVsZXRlQ29tcG9uZW50KGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUucmVtb3ZlQ29tcG9uZW50KGlkKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbXAoZmllbGQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50KGNvbXAuaWQsIHsgW2ZpZWxkXTogdmFsdWUgfSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlUHJvcChpZDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50UHJvcGVydHkoaWQsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgdXBkYXRlTGF5b3V0KGtleToga2V5b2YgQ29tcG9uZW50TGF5b3V0RGVmaW5pdGlvbiwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudCgpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlQ29tcG9uZW50TGF5b3V0KGNvbXAuaWQsIHsgW2tleV06IHZhbHVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbXBvbmVudEhlaWdodCh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50KCk7XG4gICAgaWYgKCFjb21wKSByZXR1cm47XG4gICAgY29uc3QgaGVpZ2h0ID0gIXZhbCB8fCB2YWwgPT09ICdhdXRvJyB8fCAhdmFsLnRyaW0oKSA/IHVuZGVmaW5lZCA6IHZhbC50cmltKCk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudExheW91dChjb21wLmlkLCB7XG4gICAgICBoZWlnaHQsXG4gICAgICBtaW5IZWlnaHQ6IGhlaWdodCxcbiAgICB9KTtcbiAgfVxuXG4gIHJlc2V0Q29tcG9uZW50RGltZW5zaW9ucyhpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0U3BhbiA9IHR5cGUgPT09ICdidXR0b24nID8gMiA6IDQ7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUNvbXBvbmVudExheW91dChpZCwge1xuICAgICAgY29sdW1uU3BhbjogZGVmYXVsdFNwYW4sXG4gICAgICBoZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgIG1pbkhlaWdodDogdW5kZWZpbmVkLFxuICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVZhbGlkYXRpb24oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQoKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgbmV4dFZhbGlkYXRpb24gPSB7IC4uLihjb21wLnZhbGlkYXRpb24gPz8ge30pLCBba2V5XTogdmFsdWUgfTtcbiAgICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVDb21wb25lbnQoY29tcC5pZCwgeyB2YWxpZGF0aW9uOiBuZXh0VmFsaWRhdGlvbiB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVSZXBvcnQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZVJlcG9ydFNldHRpbmdzKHsgW2tleV06IHZhbHVlIH0pO1xuICB9XG5cbiAgdXBkYXRlTGF5b3V0UHJvcChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gdGhpcy5kZWZpbml0aW9uKCkubGF5b3V0O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVSZXBvcnRTZXR0aW5ncyh7XG4gICAgICBsYXlvdXQ6IHsgLi4uY3VycmVudExheW91dCwgW2tleV06IHZhbHVlIH0sXG4gICAgfSk7XG4gIH1cblxuICBhZGRSZXN1bHRHcmlkKCk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nRHMgPSB0aGlzLmRlZmluaXRpb24oKS5kYXRhU291cmNlc1swXTtcbiAgICBjb25zdCBkZWZhdWx0R3JpZDogUmVwb3J0R3JpZERlZmluaXRpb24gPSB7XG4gICAgICBkYXRhU291cmNlSWQ6IGV4aXN0aW5nRHM/LmlkID8/ICdkZWZhdWx0JyxcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBmaWVsZDogJ2lkJywgbGFiZWw6ICdJRCcsIGRhdGFUeXBlOiAnbnVtYmVyJywgdmlzaWJsZTogdHJ1ZSwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBmaWVsZDogJ25hbWUnLCBsYWJlbDogJ05hbWUnLCBkYXRhVHlwZTogJ3N0cmluZycsIHZpc2libGU6IHRydWUsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICBdLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBwYWdpbmF0aW9uOiB0cnVlLFxuICAgICAgICBwYWdlU2l6ZTogMjUsXG4gICAgICAgIHNob3dSb3dOdW1iZXJzOiB0cnVlLFxuICAgICAgICBzaG93Rm9vdGVyOiB0cnVlLFxuICAgICAgICBzaWRlQmFyOiB0cnVlLFxuICAgICAgICBnbG9iYWxTZWFyY2g6IHRydWUsXG4gICAgICAgIHN0YXR1c0JhcjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKGRlZmF1bHRHcmlkKTtcbiAgfVxuXG4gIHJlbW92ZVJlc3VsdEdyaWQoKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh1bmRlZmluZWQpO1xuICB9XG5cbiAgYWRkQ29sdW1uKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkID8/IHtcbiAgICAgIGRhdGFTb3VyY2VJZDogJ2RlZmF1bHQnLFxuICAgICAgY29sdW1uczogW10sXG4gICAgfTtcbiAgICBjb25zdCBjb2xDb3VudCA9IGN1cnJlbnQuY29sdW1ucy5sZW5ndGggKyAxO1xuICAgIGNvbnN0IG5ld0NvbDogR3JpZENvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICBmaWVsZDogYGZpZWxkXyR7Y29sQ291bnR9YCxcbiAgICAgIGxhYmVsOiBgQ29sdW1uICR7Y29sQ291bnR9YCxcbiAgICAgIGRhdGFUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICB9O1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIGNvbHVtbnM6IFsuLi5jdXJyZW50LmNvbHVtbnMsIG5ld0NvbF0sXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVDb2x1bW4oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHRDb2xzID0gWy4uLmN1cnJlbnQuY29sdW1uc107XG4gICAgbmV4dENvbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBjb2x1bW5zOiBuZXh0Q29scyxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtbihpbmRleDogbnVtYmVyLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHRDb2xzID0gY3VycmVudC5jb2x1bW5zLm1hcCgoYywgaWR4KSA9PiB7XG4gICAgICBpZiAoaWR4ID09PSBpbmRleCkge1xuICAgICAgICByZXR1cm4geyAuLi5jLCBbZmllbGRdOiB2YWx1ZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfSk7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVwZGF0ZUdyaWRTZXR0aW5ncyh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgY29sdW1uczogbmV4dENvbHMsXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVHcmlkT3B0aW9uKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZGVmaW5pdGlvbigpLmdyaWQgPz8ge1xuICAgICAgZGF0YVNvdXJjZUlkOiAnZGVmYXVsdCcsXG4gICAgICBjb2x1bW5zOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IG5leHRPcHRpb25zID0geyAuLi4oY3VycmVudC5vcHRpb25zID8/IHt9KSwgW2ZpZWxkXTogdmFsdWUgfTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBvcHRpb25zOiBuZXh0T3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRSb3dDbGlja0FjdGlvbihhY3Rpb246IEdyaWRSb3dDbGlja0FjdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRlZmluaXRpb24oKS5ncmlkO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51cGRhdGVHcmlkU2V0dGluZ3Moe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHJvd0NsaWNrQWN0aW9uOiBhY3Rpb24sXG4gICAgfSk7XG4gIH1cblxuICBhdXRvRGV0ZWN0R3JpZENvbHVtbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2NvdmVyeUFkYXB0ZXIpIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnRHcmlkID0gdGhpcy5kZWZpbml0aW9uKCkuZ3JpZDtcbiAgICBsZXQgdGFyZ2V0RW50aXR5ID0gJyc7XG4gICAgbGV0IHRhcmdldFR5cGU6ICd0YWJsZScgfCAnc3RvcmVkX3Byb2NlZHVyZScgPSAnc3RvcmVkX3Byb2NlZHVyZSc7XG5cbiAgICBjb25zdCBncmlkRHMgPSB0aGlzLmRlZmluaXRpb24oKS5kYXRhU291cmNlcz8uZmluZCgoZCkgPT4gZC5pZCA9PT0gY3VycmVudEdyaWQ/LmRhdGFTb3VyY2VJZCk7XG4gICAgaWYgKGdyaWREcyAmJiBncmlkRHMuZW5kcG9pbnQpIHtcbiAgICAgIHRhcmdldEVudGl0eSA9IGdyaWREcy5lbmRwb2ludDtcbiAgICAgIGlmIChncmlkRHMubWV0aG9kID09PSAnR0VUJykge1xuICAgICAgICB0YXJnZXRUeXBlID0gJ3RhYmxlJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcFdpdGhFbnRpdHkgPSB0aGlzLmRlZmluaXRpb24oKS5jb21wb25lbnRzLmZpbmQoKGMpID0+IGMuZGF0YVNvdXJjZT8uZW50aXR5TmFtZSk7XG4gICAgICBpZiAoY29tcFdpdGhFbnRpdHk/LmRhdGFTb3VyY2U/LmVudGl0eU5hbWUpIHtcbiAgICAgICAgdGFyZ2V0RW50aXR5ID0gY29tcFdpdGhFbnRpdHkuZGF0YVNvdXJjZS5lbnRpdHlOYW1lO1xuICAgICAgICBpZiAoY29tcFdpdGhFbnRpdHkuZGF0YVNvdXJjZS5zb3VyY2VUeXBlID09PSAndGFibGUnKSB7XG4gICAgICAgICAgdGFyZ2V0VHlwZSA9ICd0YWJsZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldEVudGl0eSkge1xuICAgICAgY29uc29sZS53YXJuKCdbUHJvcGVydHlFZGl0b3JdIE5vIHByb2NlZHVyZSBvciB0YWJsZSBlbnRpdHkgZm91bmQgdG8gYXV0by1kZXRlY3QgY29sdW1ucyBmcm9tLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY292ZXJ5QWRhcHRlci5nZXRDb2x1bW5zKHRhcmdldEVudGl0eSwgJ2RibycsIHRhcmdldFR5cGUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoY29scykgPT4ge1xuICAgICAgICBpZiAoIWNvbHMgfHwgY29scy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgY29uc3QgbWFwcGVkQ29sczogR3JpZENvbHVtbkRlZmluaXRpb25bXSA9IGNvbHMubWFwKChjKSA9PiAoe1xuICAgICAgICAgIGZpZWxkOiBjLmZpZWxkLFxuICAgICAgICAgIGxhYmVsOiBodW1hbml6ZUlkZW50aWZpZXIoYy5sYWJlbCB8fCBjLmZpZWxkKSxcbiAgICAgICAgICBkYXRhVHlwZTogKGMuZGF0YVR5cGUgYXMgYW55KSB8fCAnc3RyaW5nJyxcbiAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgICAgIGFsaWduOiBjLmRhdGFUeXBlID09PSAnbnVtYmVyJyA/ICdyaWdodCcgOiAnbGVmdCcsXG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKHtcbiAgICAgICAgICAuLi4oY3VycmVudEdyaWQgPz8ge1xuICAgICAgICAgICAgZGF0YVNvdXJjZUlkOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICBvcHRpb25zOiB7IHBhZ2luYXRpb246IHRydWUsIHBhZ2VTaXplOiAyNSwgc2hvd1Jvd051bWJlcnM6IHRydWUsIHNob3dGb290ZXI6IHRydWUgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjb2x1bW5zOiBtYXBwZWRDb2xzLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcignW1Byb3BlcnR5RWRpdG9yXSBBdXRvLWRldGVjdCBjb2x1bW5zIGZhaWxlZDonLCBlcnIpLFxuICAgIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgZXhwYW5kZWRTZWN0aW9ucyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe1xuICAgIGRhdGFzb3VyY2U6IHRydWUsXG4gICAgYWN0aW9uOiB0cnVlLFxuICAgIGdlbmVyYWw6IHRydWUsXG4gICAgbGF5b3V0OiBmYWxzZSxcbiAgICB2YWxpZGF0aW9uOiBmYWxzZSxcbiAgfSk7XG5cbiAgdG9nZ2xlU2VjdGlvbihzZWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkU2VjdGlvbnMudXBkYXRlKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtzZWN0aW9uXTogIXByZXZbc2VjdGlvbl0sXG4gICAgfSkpO1xuICB9XG5cbiAgaXNTZWN0aW9uRXhwYW5kZWQoc2VjdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZFNlY3Rpb25zKClbc2VjdGlvbl07XG4gIH1cblxuICBnZXRBY3Rpb25CYWRnZShjb21wOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBhY3QgPSAoY29tcC5wcm9wZXJ0aWVzPy5bJ2FjdGlvbiddIGFzIHN0cmluZykgfHwgJ2V4ZWN1dGUtcmVwb3J0JztcbiAgICBzd2l0Y2ggKGFjdCkge1xuICAgICAgY2FzZSAnZXhlY3V0ZS1yZXBvcnQnOlxuICAgICAgICByZXR1cm4gJ1J1biBSZXBvcnQnO1xuICAgICAgY2FzZSAncmVzZXQnOlxuICAgICAgICByZXR1cm4gJ1Jlc2V0IEZvcm0nO1xuICAgICAgY2FzZSAnZXhwb3J0Jzoge1xuICAgICAgICBjb25zdCBmbXQgPSAoKGNvbXAucHJvcGVydGllcz8uWydhY3Rpb25QYXJhbXMnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LlsnZm9ybWF0J10gYXMgc3RyaW5nKSB8fCAnZXhjZWwnO1xuICAgICAgICByZXR1cm4gYEV4cG9ydCAoJHtmbXQudG9VcHBlckNhc2UoKX0pYDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ByaW50LXJlcG9ydCc6XG4gICAgICAgIHJldHVybiAnUHJpbnQgKC5ScHQpJztcbiAgICAgIGNhc2UgJ25hdmlnYXRlJzpcbiAgICAgICAgcmV0dXJuICdOYXZpZ2F0ZSc7XG4gICAgICBjYXNlICdjdXN0b20tZXZlbnQnOlxuICAgICAgICByZXR1cm4gJ0N1c3RvbSBFdmVudCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYWN0O1xuICAgIH1cbiAgfVxuXG4gIGdldERhdGFzb3VyY2VCYWRnZShjb21wOiBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBkcyA9IGNvbXAuZGF0YVNvdXJjZTtcbiAgICBpZiAoIWRzIHx8IGRzLnNvdXJjZVR5cGUgPT09ICdzdGF0aWMnKSByZXR1cm4gJ1N0YXRpYyBMaXN0JztcbiAgICBpZiAoZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyB8fCBkcy5lbnRpdHlOYW1lKSB7XG4gICAgICByZXR1cm4gZHMuZW50aXR5TmFtZSA/IGBUYWJsZTogJHtkcy5lbnRpdHlOYW1lfWAgOiAnVGFibGUgLyBWaWV3JztcbiAgICB9XG4gICAgaWYgKGRzLnNvdXJjZVR5cGUgPT09ICdwcm9jZWR1cmUnKSB7XG4gICAgICByZXR1cm4gZHMuZW50aXR5TmFtZSA/IGBTUDogJHtkcy5lbnRpdHlOYW1lfWAgOiAnU3RvcmVkIFByb2MnO1xuICAgIH1cbiAgICByZXR1cm4gJ1N0YXRpYyBMaXN0JztcbiAgfVxuXG4gIGdldExheW91dEJhZGdlKGNvbXA6IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYW4gPSBjb21wLmxheW91dD8uY29sdW1uU3BhbiB8fCAoY29tcC50eXBlID09PSAnYnV0dG9uJyA/IDIgOiA0KTtcbiAgICByZXR1cm4gYCR7c3Bhbn0vJHt0aGlzLm1heENvbHVtbnMoKX0gY29sc2A7XG4gIH1cblxuICBnZXRWYWxpZGF0aW9uQmFkZ2UoY29tcDogUmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbXAudmFsaWRhdGlvbj8ucmVxdWlyZWQgPyAnUmVxdWlyZWQnIDogJ09wdGlvbmFsJztcbiAgfVxufVxuIl19