bways-report 0.1.1 → 0.1.3

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 (100) hide show
  1. package/README.md +153 -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/design-canvas/design-canvas.component.mjs +665 -90
  21. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
  22. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +164 -23
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +458 -14
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +173 -2
  25. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +182 -6
  26. package/esm2022/lib/features/designer/designer.component.mjs +101 -12
  27. package/esm2022/lib/features/designer/index.mjs +4 -1
  28. package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
  29. package/esm2022/lib/features/designer/services/designer-state.service.mjs +10 -9
  30. package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
  31. package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
  32. package/esm2022/lib/features/export/index.mjs +2 -2
  33. package/esm2022/lib/features/export/models/export.models.mjs +1 -1
  34. package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
  35. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
  36. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +231 -33
  37. package/esm2022/lib/features/runtime/index.mjs +2 -1
  38. package/esm2022/lib/features/runtime/report-execution.service.mjs +64 -0
  39. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +224 -26
  40. package/esm2022/lib/features/runtime/report-runtime.component.mjs +341 -7
  41. package/esm2022/lib/features/runtime/rpt-report.component.mjs +537 -0
  42. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +26 -9
  43. package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
  44. package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
  45. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +727 -73
  46. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
  47. package/esm2022/lib/primitives/components/index.mjs +2 -1
  48. package/esm2022/lib/primitives/register-builtins.mjs +51 -2
  49. package/esm2022/lib/provide-reporting.mjs +145 -24
  50. package/fesm2022/bways-report.mjs +8051 -1672
  51. package/fesm2022/bways-report.mjs.map +1 -1
  52. package/lib/core/index.d.ts +2 -0
  53. package/lib/core/models/report-datasource.model.d.ts +9 -0
  54. package/lib/core/models/report-definition.model.d.ts +2 -0
  55. package/lib/core/models/report-grid.model.d.ts +44 -0
  56. package/lib/core/services/report-session-context.service.d.ts +6 -1
  57. package/lib/core/utils/data-normalization.util.d.ts +15 -0
  58. package/lib/core/utils/report-parameter.util.d.ts +35 -0
  59. package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
  60. package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
  61. package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
  62. package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
  63. package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
  64. package/lib/data-access/adapters/index.d.ts +7 -2
  65. package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
  66. package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
  67. package/lib/data-access/contracts/api-dtos.d.ts +67 -0
  68. package/lib/data-access/contracts/index.d.ts +1 -0
  69. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +24 -0
  70. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
  71. package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
  72. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +4 -0
  73. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +18 -2
  74. package/lib/features/designer/components/property-editor/property-editor.component.d.ts +7 -0
  75. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +9 -0
  76. package/lib/features/designer/designer.component.d.ts +5 -0
  77. package/lib/features/designer/index.d.ts +4 -0
  78. package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
  79. package/lib/features/designer/services/designer-state.service.d.ts +1 -1
  80. package/lib/features/designer/services/report-template.service.d.ts +32 -0
  81. package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
  82. package/lib/features/export/index.d.ts +2 -2
  83. package/lib/features/export/models/export.models.d.ts +23 -0
  84. package/lib/features/export/services/report-export.service.d.ts +31 -2
  85. package/lib/features/runtime/dynamic-renderer.component.d.ts +39 -2
  86. package/lib/features/runtime/index.d.ts +2 -0
  87. package/lib/features/runtime/report-execution.service.d.ts +16 -0
  88. package/lib/features/runtime/report-grid-bridge.component.d.ts +129 -6
  89. package/lib/features/runtime/report-runtime.component.d.ts +83 -1
  90. package/lib/features/runtime/rpt-report.component.d.ts +66 -0
  91. package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
  92. package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
  93. package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
  94. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
  95. package/lib/primitives/components/index.d.ts +2 -0
  96. package/lib/provide-reporting.d.ts +79 -26
  97. package/package.json +2 -1
  98. package/schematics/collection.json +10 -0
  99. package/schematics/ng-add/index.js +45 -0
  100. package/schematics/ng-add/schema.json +17 -0
@@ -1,15 +1,19 @@
1
- import { ChangeDetectionStrategy, Component, inject, output, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, 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 { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';
5
+ import { ReportTemplateService } from '../../services/report-template.service';
5
6
  import * as i0 from "@angular/core";
6
7
  export class DesignerToolbarComponent {
7
8
  designerState = inject(DesignerStateService);
9
+ templateService = inject(ReportTemplateService);
8
10
  definition = this.designerState.definition;
9
11
  viewMode = this.designerState.viewMode;
10
12
  isDirty = this.designerState.isDirty;
11
13
  canUndo = this.designerState.canUndo;
12
14
  canRedo = this.designerState.canRedo;
15
+ isTemplatesModalOpen = signal(false);
16
+ availableBlueprints = this.templateService.getTemplates();
13
17
  saveRequested = output();
14
18
  setMode(mode) {
15
19
  this.designerState.setViewMode(mode);
@@ -23,6 +27,40 @@ export class DesignerToolbarComponent {
23
27
  saveReport() {
24
28
  this.saveRequested.emit();
25
29
  }
30
+ openTemplatesModal() {
31
+ this.isTemplatesModalOpen.set(true);
32
+ }
33
+ closeTemplatesModal() {
34
+ this.isTemplatesModalOpen.set(false);
35
+ }
36
+ applyBlueprint(blueprintId) {
37
+ const newDef = this.templateService.instantiateTemplate(blueprintId);
38
+ this.designerState.loadDefinition(newDef);
39
+ this.closeTemplatesModal();
40
+ }
41
+ addResultGrid() {
42
+ const existingDs = this.definition().dataSources[0];
43
+ const defaultGrid = {
44
+ dataSourceId: existingDs?.id ?? 'default',
45
+ columns: [
46
+ { field: 'id', label: 'ID', dataType: 'number', visible: true, sortable: true },
47
+ { field: 'name', label: 'Name', dataType: 'string', visible: true, sortable: true },
48
+ ],
49
+ options: {
50
+ pagination: true,
51
+ pageSize: 25,
52
+ showRowNumbers: true,
53
+ showFooter: true,
54
+ },
55
+ };
56
+ this.designerState.updateGridSettings(defaultGrid);
57
+ this.designerState.selectComponent(null);
58
+ this.designerState.setActiveTab('grid');
59
+ }
60
+ selectGridSettings() {
61
+ this.designerState.selectComponent(null);
62
+ this.designerState.setActiveTab('grid');
63
+ }
26
64
  exportJson() {
27
65
  const dataStr = 'data:text/json;charset=utf-8,' +
28
66
  encodeURIComponent(JSON.stringify(this.definition(), null, 2));
@@ -79,7 +117,7 @@ export class DesignerToolbarComponent {
79
117
  </div>
80
118
  </div>
81
119
 
82
- <!-- Right: Undo, Redo, Save, Export -->
120
+ <!-- Right: Undo, Redo, Blueprints, Grid, Export, Save -->
83
121
  <div class="toolbar-right">
84
122
  <div class="history-group">
85
123
  <button
@@ -104,6 +142,42 @@ export class DesignerToolbarComponent {
104
142
 
105
143
  <div class="actions-divider"></div>
106
144
 
145
+ <!-- 1-Click Blueprints Gallery Button -->
146
+ <button
147
+ type="button"
148
+ class="tool-btn btn-blueprints"
149
+ (click)="openTemplatesModal()"
150
+ title="Start from pre-configured enterprise blueprints"
151
+ >
152
+ <rpt-icon name="layers" [size]="14" />
153
+ <span>Blueprints</span>
154
+ </button>
155
+
156
+ <!-- Add / Configure Grid Quick Button -->
157
+ @if (!definition().grid) {
158
+ <button
159
+ type="button"
160
+ class="tool-btn btn-grid-action"
161
+ (click)="addResultGrid()"
162
+ title="Attach a Result Data Grid (UltraGrid / Table) to this report"
163
+ >
164
+ <rpt-icon name="table" [size]="14" />
165
+ <span>+ Add Grid</span>
166
+ </button>
167
+ } @else {
168
+ <button
169
+ type="button"
170
+ class="tool-btn btn-grid-configured"
171
+ (click)="selectGridSettings()"
172
+ title="Configure Result Data Grid columns and pagination"
173
+ >
174
+ <rpt-icon name="table" [size]="14" />
175
+ <span>Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
176
+ </button>
177
+ }
178
+
179
+ <div class="actions-divider"></div>
180
+
107
181
  <button
108
182
  type="button"
109
183
  class="tool-btn btn-export"
@@ -124,8 +198,41 @@ export class DesignerToolbarComponent {
124
198
  <span>Save Changes</span>
125
199
  </button>
126
200
  </div>
201
+
202
+ <!-- Blueprints Gallery Modal -->
203
+ @if (isTemplatesModalOpen()) {
204
+ <div class="blueprint-backdrop" (click)="closeTemplatesModal()" aria-hidden="true"></div>
205
+ <div class="blueprint-modal" role="dialog" aria-modal="true" aria-label="Starter Report Blueprints">
206
+ <div class="blueprint-modal-header">
207
+ <div>
208
+ <h3 class="blueprint-modal-title">Starter Report Blueprints</h3>
209
+ <p class="blueprint-modal-sub">Choose a pre-configured architecture pattern to jumpstart report creation.</p>
210
+ </div>
211
+ <button type="button" class="btn-close-modal" (click)="closeTemplatesModal()" aria-label="Close">✕</button>
212
+ </div>
213
+ <div class="blueprint-grid">
214
+ @for (bp of availableBlueprints; track bp.id) {
215
+ <div class="blueprint-card" (click)="applyBlueprint(bp.id)">
216
+ <div class="blueprint-card-top">
217
+ <span class="blueprint-cat-badge">{{ bp.category }}</span>
218
+ <div class="blueprint-card-icon">
219
+ <rpt-icon [name]="bp.icon || 'table'" [size]="20" />
220
+ </div>
221
+ </div>
222
+ <h4 class="blueprint-card-title">{{ bp.name }}</h4>
223
+ <p class="blueprint-card-desc">{{ bp.description }}</p>
224
+ <div class="blueprint-card-footer">
225
+ <button type="button" class="btn-apply-blueprint">
226
+ Use Blueprint →
227
+ </button>
228
+ </div>
229
+ </div>
230
+ }
231
+ </div>
232
+ </div>
233
+ }
127
234
  </div>
128
- `, isInline: true, styles: [":host{display:block;background:#0f172a;color:#fff;height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid #1e293b;box-sizing:border-box}.toolbar-root{display:flex;align-items:center;justify-content:space-between;height:100%;padding:0 20px}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:12px;min-width:240px}.toolbar-right{justify-content:flex-end}.toolbar-center{display:flex;justify-content:center;flex:1}.report-identity{display:flex;align-items:center;gap:8px}.report-name{font-size:.95rem;font-weight:700;color:#fff;letter-spacing:-.01em}.dirty-badge{font-size:.65rem;font-weight:600;color:#f59e0b;background:#f59e0b26;padding:2px 6px;border-radius:4px}.mode-pill-group{display:flex;background:#1e293b;padding:3px;border-radius:8px;gap:2px}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border:none;background:transparent;color:#94a3b8;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .15s ease}.mode-btn:hover{color:#fff}.mode-btn.active{background:#2563eb;color:#fff;box-shadow:0 1px 3px #0003}.history-group{display:flex;gap:4px}.tool-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 12px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;border:1px solid rgba(255,255,255,.15);background:#ffffff0d;color:#e2e8f0;transition:all .15s ease}.tool-btn:hover:not(:disabled){background:#ffffff26;color:#fff}.tool-btn:disabled{opacity:.3;cursor:not-allowed}.actions-divider{width:1px;height:20px;background:#ffffff26}.btn-save{background:#2563eb;border-color:#2563eb;color:#fff}.btn-save:hover:not(:disabled){background:#1d4ed8;border-color:#1d4ed8}.btn-export{background:transparent}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
235
+ `, isInline: true, styles: [":host{display:block;background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;position:relative;box-shadow:0 1px 3px #0000000a;z-index:30}.toolbar-root{display:flex;align-items:center;justify-content:space-between;height:100%;padding:0 20px}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:12px;min-width:240px}.toolbar-right{justify-content:flex-end}.toolbar-center{display:flex;justify-content:center;flex:1}.report-identity{display:flex;align-items:center;gap:8px}.report-name{font-weight:600;font-size:.9rem;letter-spacing:-.01em;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:280px}.dirty-badge{font-size:.65rem;font-weight:600;color:#b45309;background:#fef3c7;border:1px solid #fde68a;padding:1px 6px;border-radius:9999px;white-space:nowrap}.mode-pill-group{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:3px;gap:2px}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.mode-btn:hover{color:var(--rpt-color-text, #0f172a);background:#0000000a}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 3px #00000014}.history-group{display:flex;gap:2px}.tool-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tool-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-hover, #94a3b8)}.tool-btn:disabled{opacity:.45;cursor:not-allowed}.actions-divider{width:1px;height:20px;background:var(--rpt-color-border, #cbd5e1)}.btn-blueprints{background:#faf5ff;border-color:#e9d5ff;color:#7c3aed}.btn-blueprints:hover:not(:disabled){background:#f3e8ff;color:#6d28d9;border-color:#c084fc}.btn-save{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff}.btn-save:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.btn-export{background:#fff;color:var(--rpt-color-text-secondary, #334155)}.btn-grid-action{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-action:hover:not(:disabled){background:#dcfce7;color:#15803d;border-color:#86efac}.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.btn-grid-configured:hover:not(:disabled){background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.blueprint-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(4px);z-index:2000;animation:rpt-fade-in .15s ease-out}.blueprint-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(840px,92vw);max-height:85vh;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);box-shadow:var(--rpt-box-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, .15));z-index:2001;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-in .18s cubic-bezier(.16,1,.3,1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-modal-in{0%{transform:translate(-50%,-46%) scale(.96);opacity:0}to{transform:translate(-50%,-50%) scale(1);opacity:1}}.blueprint-modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.blueprint-modal-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 4px}.blueprint-modal-sub{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.btn-close-modal{background:transparent;border:none;color:var(--rpt-color-text-muted, #64748b);font-size:1.25rem;cursor:pointer;padding:4px;line-height:1;border-radius:4px;transition:all .12s ease}.btn-close-modal:hover{color:var(--rpt-color-text, #0f172a);background:#e2e8f0}.blueprint-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;padding:20px 24px;overflow-y:auto}.blueprint-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:16px;cursor:pointer;display:flex;flex-direction:column;transition:all .15s ease}.blueprint-card:hover{border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-2px);box-shadow:0 8px 24px #2563eb1f}.blueprint-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.blueprint-cat-badge{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:2px 6px;border-radius:4px}.blueprint-card-icon{color:var(--rpt-color-primary, #2563eb)}.blueprint-card-title{font-size:var(--rpt-font-size-base, .875rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.blueprint-card-desc{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);line-height:1.4;margin:0 0 16px;flex:1}.blueprint-card-footer{margin-top:auto}.btn-apply-blueprint{width:100%;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background .12s ease}.blueprint-card:hover .btn-apply-blueprint{background:var(--rpt-color-primary-hover, #1d4ed8)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
129
236
  }
130
237
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignerToolbarComponent, decorators: [{
131
238
  type: Component,
@@ -174,7 +281,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
174
281
  </div>
175
282
  </div>
176
283
 
177
- <!-- Right: Undo, Redo, Save, Export -->
284
+ <!-- Right: Undo, Redo, Blueprints, Grid, Export, Save -->
178
285
  <div class="toolbar-right">
179
286
  <div class="history-group">
180
287
  <button
@@ -199,6 +306,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
199
306
 
200
307
  <div class="actions-divider"></div>
201
308
 
309
+ <!-- 1-Click Blueprints Gallery Button -->
310
+ <button
311
+ type="button"
312
+ class="tool-btn btn-blueprints"
313
+ (click)="openTemplatesModal()"
314
+ title="Start from pre-configured enterprise blueprints"
315
+ >
316
+ <rpt-icon name="layers" [size]="14" />
317
+ <span>Blueprints</span>
318
+ </button>
319
+
320
+ <!-- Add / Configure Grid Quick Button -->
321
+ @if (!definition().grid) {
322
+ <button
323
+ type="button"
324
+ class="tool-btn btn-grid-action"
325
+ (click)="addResultGrid()"
326
+ title="Attach a Result Data Grid (UltraGrid / Table) to this report"
327
+ >
328
+ <rpt-icon name="table" [size]="14" />
329
+ <span>+ Add Grid</span>
330
+ </button>
331
+ } @else {
332
+ <button
333
+ type="button"
334
+ class="tool-btn btn-grid-configured"
335
+ (click)="selectGridSettings()"
336
+ title="Configure Result Data Grid columns and pagination"
337
+ >
338
+ <rpt-icon name="table" [size]="14" />
339
+ <span>Grid ({{ definition().grid?.columns?.length ?? 0 }})</span>
340
+ </button>
341
+ }
342
+
343
+ <div class="actions-divider"></div>
344
+
202
345
  <button
203
346
  type="button"
204
347
  class="tool-btn btn-export"
@@ -219,7 +362,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
219
362
  <span>Save Changes</span>
220
363
  </button>
221
364
  </div>
365
+
366
+ <!-- Blueprints Gallery Modal -->
367
+ @if (isTemplatesModalOpen()) {
368
+ <div class="blueprint-backdrop" (click)="closeTemplatesModal()" aria-hidden="true"></div>
369
+ <div class="blueprint-modal" role="dialog" aria-modal="true" aria-label="Starter Report Blueprints">
370
+ <div class="blueprint-modal-header">
371
+ <div>
372
+ <h3 class="blueprint-modal-title">Starter Report Blueprints</h3>
373
+ <p class="blueprint-modal-sub">Choose a pre-configured architecture pattern to jumpstart report creation.</p>
374
+ </div>
375
+ <button type="button" class="btn-close-modal" (click)="closeTemplatesModal()" aria-label="Close">✕</button>
376
+ </div>
377
+ <div class="blueprint-grid">
378
+ @for (bp of availableBlueprints; track bp.id) {
379
+ <div class="blueprint-card" (click)="applyBlueprint(bp.id)">
380
+ <div class="blueprint-card-top">
381
+ <span class="blueprint-cat-badge">{{ bp.category }}</span>
382
+ <div class="blueprint-card-icon">
383
+ <rpt-icon [name]="bp.icon || 'table'" [size]="20" />
384
+ </div>
385
+ </div>
386
+ <h4 class="blueprint-card-title">{{ bp.name }}</h4>
387
+ <p class="blueprint-card-desc">{{ bp.description }}</p>
388
+ <div class="blueprint-card-footer">
389
+ <button type="button" class="btn-apply-blueprint">
390
+ Use Blueprint →
391
+ </button>
392
+ </div>
393
+ </div>
394
+ }
395
+ </div>
396
+ </div>
397
+ }
222
398
  </div>
223
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;background:#0f172a;color:#fff;height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid #1e293b;box-sizing:border-box}.toolbar-root{display:flex;align-items:center;justify-content:space-between;height:100%;padding:0 20px}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:12px;min-width:240px}.toolbar-right{justify-content:flex-end}.toolbar-center{display:flex;justify-content:center;flex:1}.report-identity{display:flex;align-items:center;gap:8px}.report-name{font-size:.95rem;font-weight:700;color:#fff;letter-spacing:-.01em}.dirty-badge{font-size:.65rem;font-weight:600;color:#f59e0b;background:#f59e0b26;padding:2px 6px;border-radius:4px}.mode-pill-group{display:flex;background:#1e293b;padding:3px;border-radius:8px;gap:2px}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border:none;background:transparent;color:#94a3b8;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;transition:all .15s ease}.mode-btn:hover{color:#fff}.mode-btn.active{background:#2563eb;color:#fff;box-shadow:0 1px 3px #0003}.history-group{display:flex;gap:4px}.tool-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 12px;font-size:.75rem;font-weight:600;border-radius:6px;cursor:pointer;border:1px solid rgba(255,255,255,.15);background:#ffffff0d;color:#e2e8f0;transition:all .15s ease}.tool-btn:hover:not(:disabled){background:#ffffff26;color:#fff}.tool-btn:disabled{opacity:.3;cursor:not-allowed}.actions-divider{width:1px;height:20px;background:#ffffff26}.btn-save{background:#2563eb;border-color:#2563eb;color:#fff}.btn-save:hover:not(:disabled){background:#1d4ed8;border-color:#1d4ed8}.btn-export{background:transparent}\n"] }]
399
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;background:var(--rpt-color-surface, #ffffff);color:var(--rpt-color-text, #0f172a);height:56px;font-family:var(--rpt-font-family, inherit);border-bottom:1px solid var(--rpt-color-border, #cbd5e1);box-sizing:border-box;position:relative;box-shadow:0 1px 3px #0000000a;z-index:30}.toolbar-root{display:flex;align-items:center;justify-content:space-between;height:100%;padding:0 20px}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:12px;min-width:240px}.toolbar-right{justify-content:flex-end}.toolbar-center{display:flex;justify-content:center;flex:1}.report-identity{display:flex;align-items:center;gap:8px}.report-name{font-weight:600;font-size:.9rem;letter-spacing:-.01em;color:var(--rpt-color-text, #0f172a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:280px}.dirty-badge{font-size:.65rem;font-weight:600;color:#b45309;background:#fef3c7;border:1px solid #fde68a;padding:1px 6px;border-radius:9999px;white-space:nowrap}.mode-pill-group{display:flex;background:#f1f5f9;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:3px;gap:2px}.mode-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-muted, #64748b);background:transparent;border:none;border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.mode-btn:hover{color:var(--rpt-color-text, #0f172a);background:#0000000a}.mode-btn.active{background:#fff;color:var(--rpt-color-primary, #2563eb);font-weight:600;box-shadow:0 1px 3px #00000014}.history-group{display:flex;gap:2px}.tool-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text-secondary, #334155);background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.tool-btn:hover:not(:disabled){background:var(--rpt-color-surface-hover, #f8fafc);color:var(--rpt-color-text, #0f172a);border-color:var(--rpt-color-border-hover, #94a3b8)}.tool-btn:disabled{opacity:.45;cursor:not-allowed}.actions-divider{width:1px;height:20px;background:var(--rpt-color-border, #cbd5e1)}.btn-blueprints{background:#faf5ff;border-color:#e9d5ff;color:#7c3aed}.btn-blueprints:hover:not(:disabled){background:#f3e8ff;color:#6d28d9;border-color:#c084fc}.btn-save{background:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb);color:#fff}.btn-save:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8);border-color:var(--rpt-color-primary-hover, #1d4ed8)}.btn-export{background:#fff;color:var(--rpt-color-text-secondary, #334155)}.btn-grid-action{background:#f0fdf4;border-color:#bbf7d0;color:#16a34a}.btn-grid-action:hover:not(:disabled){background:#dcfce7;color:#15803d;border-color:#86efac}.btn-grid-configured{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.btn-grid-configured:hover:not(:disabled){background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}.blueprint-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(4px);z-index:2000;animation:rpt-fade-in .15s ease-out}.blueprint-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(840px,92vw);max-height:85vh;background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-xl, 12px);box-shadow:var(--rpt-box-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, .15));z-index:2001;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-in .18s cubic-bezier(.16,1,.3,1)}@keyframes rpt-fade-in{0%{opacity:0}to{opacity:1}}@keyframes rpt-modal-in{0%{transform:translate(-50%,-46%) scale(.96);opacity:0}to{transform:translate(-50%,-50%) scale(1);opacity:1}}.blueprint-modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--rpt-color-border, #cbd5e1);background:var(--rpt-color-surface, #f8fafc)}.blueprint-modal-title{font-size:var(--rpt-font-size-lg, 1.125rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 4px}.blueprint-modal-sub{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);margin:0}.btn-close-modal{background:transparent;border:none;color:var(--rpt-color-text-muted, #64748b);font-size:1.25rem;cursor:pointer;padding:4px;line-height:1;border-radius:4px;transition:all .12s ease}.btn-close-modal:hover{color:var(--rpt-color-text, #0f172a);background:#e2e8f0}.blueprint-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;padding:20px 24px;overflow-y:auto}.blueprint-card{background:#fff;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-lg, 8px);padding:16px;cursor:pointer;display:flex;flex-direction:column;transition:all .15s ease}.blueprint-card:hover{border-color:var(--rpt-color-primary, #2563eb);transform:translateY(-2px);box-shadow:0 8px 24px #2563eb1f}.blueprint-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.blueprint-cat-badge{font-size:.65rem;font-weight:600;color:#7c3aed;background:#f5f3ff;border:1px solid #ddd6fe;padding:2px 6px;border-radius:4px}.blueprint-card-icon{color:var(--rpt-color-primary, #2563eb)}.blueprint-card-title{font-size:var(--rpt-font-size-base, .875rem);font-weight:700;color:var(--rpt-color-text, #0f172a);margin:0 0 6px}.blueprint-card-desc{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text-muted, #64748b);line-height:1.4;margin:0 0 16px;flex:1}.blueprint-card-footer{margin-top:auto}.btn-apply-blueprint{width:100%;background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:background .12s ease}.blueprint-card:hover .btn-apply-blueprint{background:var(--rpt-color-primary-hover, #1d4ed8)}\n"] }]
224
400
  }] });
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItdG9vbGJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL3Rvb2xiYXIvZGVzaWduZXItdG9vbGJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG9CQUFvQixFQUFvQixNQUFNLHVDQUF1QyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOztBQWtPN0YsTUFBTSxPQUFPLHdCQUF3QjtJQUNsQixhQUFhLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFckQsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO0lBQzNDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDckMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQ3JDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUVyQyxhQUFhLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFFeEMsT0FBTyxDQUFDLElBQXNCO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxPQUFPLEdBQ1gsK0JBQStCO1lBQy9CLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsY0FBYyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsY0FBYyxDQUFDLFlBQVksQ0FDekIsVUFBVSxFQUNWLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxtQkFBbUIsT0FBTyxDQUN0RCxDQUFDO1FBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDMUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMxQixDQUFDO3dHQXhDVSx3QkFBd0I7NEZBQXhCLHdCQUF3Qiw2SEE1TnpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkZULCt4REE1RlMsWUFBWSwrQkFBRSxnQkFBZ0I7OzRGQTZON0Isd0JBQXdCO2tCQWhPcEMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLFlBQy9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkZULG1CQStIZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGluamVjdCxcbiAgb3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEZXNpZ25lclN0YXRlU2VydmljZSwgRGVzaWduZXJWaWV3TW9kZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1kZXNpZ25lci10b29sYmFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInRvb2xiYXItcm9vdFwiPlxuICAgICAgPCEtLSBMZWZ0OiBUaXRsZSAmIERpcnR5IGluZGljYXRvciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWxlZnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1pZGVudGl0eVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVwb3J0LW5hbWVcIj57eyBkZWZpbml0aW9uKCkubmFtZSB8fCAnVW50aXRsZWQgUmVwb3J0JyB9fTwvc3Bhbj5cbiAgICAgICAgICBAaWYgKGlzRGlydHkoKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXJ0eS1iYWRnZVwiIHRpdGxlPVwiVW5zYXZlZCBjaGFuZ2VzXCI+4pePIFVuc2F2ZWQ8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENlbnRlcjogTW9kZSBTd2l0Y2hlciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kZS1waWxsLWdyb3VwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwidmlld01vZGUoKSA9PT0gJ2Rlc2lnbidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ2Rlc2lnbicpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImVkaXRcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5EZXNpZ248L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm1vZGUtYnRuXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwidmlld01vZGUoKSA9PT0gJ3ByZXZpZXcnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdwcmV2aWV3JylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZXllXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgPHNwYW4+TGl2ZSBQcmV2aWV3PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtb2RlLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInZpZXdNb2RlKCkgPT09ICdqc29uJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgnanNvbicpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNvZGVcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj5KU09OIFNjaGVtYTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBSaWdodDogVW5kbywgUmVkbywgU2F2ZSwgRXhwb3J0IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRvb2xiYXItcmlnaHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhpc3RvcnktZ3JvdXBcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidG9vbC1idG5cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5VbmRvKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVuZG8oKVwiXG4gICAgICAgICAgICB0aXRsZT1cIlVuZG8gKEN0cmwrWilcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidW5kb1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidG9vbC1idG5cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5SZWRvKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlZG8oKVwiXG4gICAgICAgICAgICB0aXRsZT1cIlJlZG8gKEN0cmwrWSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicmVkb1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMtZGl2aWRlclwiPjwvZGl2PlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInRvb2wtYnRuIGJ0bi1leHBvcnRcIlxuICAgICAgICAgIChjbGljayk9XCJleHBvcnRKc29uKClcIlxuICAgICAgICAgIHRpdGxlPVwiRG93bmxvYWQgSlNPTiBEZWZpbml0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZG93bmxvYWRcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPHNwYW4+RXhwb3J0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0b29sLWJ0biBidG4tc2F2ZVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNhdmVSZXBvcnQoKVwiXG4gICAgICAgICAgdGl0bGU9XCJTYXZlIFJlcG9ydCBEZWZpbml0aW9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwic2F2ZVwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8c3Bhbj5TYXZlIENoYW5nZXM8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG5cbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgYmFja2dyb3VuZDogIzBmMTcyYTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgaGVpZ2h0OiA1NnB4O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzFlMjkzYjtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC50b29sYmFyLXJvb3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBwYWRkaW5nOiAwIDIwcHg7XG4gICAgfVxuICAgIC50b29sYmFyLWxlZnQsIC50b29sYmFyLXJpZ2h0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgICAgbWluLXdpZHRoOiAyNDBweDtcbiAgICB9XG4gICAgLnRvb2xiYXItcmlnaHQge1xuICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICB9XG4gICAgLnRvb2xiYXItY2VudGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGZsZXg6IDE7XG4gICAgfVxuICAgIC5yZXBvcnQtaWRlbnRpdHkge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICB9XG4gICAgLnJlcG9ydC1uYW1lIHtcbiAgICAgIGZvbnQtc2l6ZTogMC45NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtO1xuICAgIH1cbiAgICAuZGlydHktYmFkZ2Uge1xuICAgICAgZm9udC1zaXplOiAwLjY1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjZjU5ZTBiO1xuICAgICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE1OCwgMTEsIDAuMTUpO1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICB9XG4gICAgLm1vZGUtcGlsbC1ncm91cCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYmFja2dyb3VuZDogIzFlMjkzYjtcbiAgICAgIHBhZGRpbmc6IDNweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIGdhcDogMnB4O1xuICAgIH1cbiAgICAubW9kZS1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwYWRkaW5nOiA2cHggMTRweDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5tb2RlLWJ0bjpob3ZlciB7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICB9XG4gICAgLm1vZGUtYnRuLmFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMjU2M2ViO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAgIH1cbiAgICAuaGlzdG9yeS1ncm91cCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZ2FwOiA0cHg7XG4gICAgfVxuICAgIC50b29sLWJ0biB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgcGFkZGluZzogMCAxMnB4O1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpO1xuICAgICAgY29sb3I6ICNlMmU4ZjA7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgZWFzZTtcbiAgICB9XG4gICAgLnRvb2wtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICB9XG4gICAgLnRvb2wtYnRuOmRpc2FibGVkIHtcbiAgICAgIG9wYWNpdHk6IDAuMztcbiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgfVxuICAgIC5hY3Rpb25zLWRpdmlkZXIge1xuICAgICAgd2lkdGg6IDFweDtcbiAgICAgIGhlaWdodDogMjBweDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7XG4gICAgfVxuICAgIC5idG4tc2F2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMjU2M2ViO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMjU2M2ViO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgfVxuICAgIC5idG4tc2F2ZTpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMWQ0ZWQ4O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjMWQ0ZWQ4O1xuICAgIH1cbiAgICAuYnRuLWV4cG9ydCB7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduZXJUb29sYmFyQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lclN0YXRlID0gaW5qZWN0KERlc2lnbmVyU3RhdGVTZXJ2aWNlKTtcblxuICByZWFkb25seSBkZWZpbml0aW9uID0gdGhpcy5kZXNpZ25lclN0YXRlLmRlZmluaXRpb247XG4gIHJlYWRvbmx5IHZpZXdNb2RlID0gdGhpcy5kZXNpZ25lclN0YXRlLnZpZXdNb2RlO1xuICByZWFkb25seSBpc0RpcnR5ID0gdGhpcy5kZXNpZ25lclN0YXRlLmlzRGlydHk7XG4gIHJlYWRvbmx5IGNhblVuZG8gPSB0aGlzLmRlc2lnbmVyU3RhdGUuY2FuVW5kbztcbiAgcmVhZG9ubHkgY2FuUmVkbyA9IHRoaXMuZGVzaWduZXJTdGF0ZS5jYW5SZWRvO1xuXG4gIHJlYWRvbmx5IHNhdmVSZXF1ZXN0ZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBzZXRNb2RlKG1vZGU6IERlc2lnbmVyVmlld01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2V0Vmlld01vZGUobW9kZSk7XG4gIH1cblxuICB1bmRvKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS51bmRvKCk7XG4gIH1cblxuICByZWRvKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5yZWRvKCk7XG4gIH1cblxuICBzYXZlUmVwb3J0KCk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZVJlcXVlc3RlZC5lbWl0KCk7XG4gIH1cblxuICBleHBvcnRKc29uKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGFTdHIgPVxuICAgICAgJ2RhdGE6dGV4dC9qc29uO2NoYXJzZXQ9dXRmLTgsJyArXG4gICAgICBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkodGhpcy5kZWZpbml0aW9uKCksIG51bGwsIDIpKTtcbiAgICBjb25zdCBkb3dubG9hZEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBkb3dubG9hZEFuY2hvci5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBkYXRhU3RyKTtcbiAgICBkb3dubG9hZEFuY2hvci5zZXRBdHRyaWJ1dGUoXG4gICAgICAnZG93bmxvYWQnLFxuICAgICAgYCR7dGhpcy5kZWZpbml0aW9uKCkuaWQgfHwgJ3JlcG9ydC1kZWZpbml0aW9uJ30uanNvbmBcbiAgICApO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG93bmxvYWRBbmNob3IpO1xuICAgIGRvd25sb2FkQW5jaG9yLmNsaWNrKCk7XG4gICAgZG93bmxvYWRBbmNob3IucmVtb3ZlKCk7XG4gIH1cbn1cbiJdfQ==
401
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXItdG9vbGJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL3Rvb2xiYXIvZGVzaWduZXItdG9vbGJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBb0IsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUU3RixPQUFPLEVBQUUscUJBQXFCLEVBQW1CLE1BQU0sd0NBQXdDLENBQUM7O0FBNmRoRyxNQUFNLE9BQU8sd0JBQXdCO0lBQ2xCLGFBQWEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM3QyxlQUFlLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFeEQsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO0lBQzNDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDckMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQ3JDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUVyQyxvQkFBb0IsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDOUMsbUJBQW1CLEdBQXNCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFN0UsYUFBYSxHQUFHLE1BQU0sRUFBUSxDQUFDO0lBRXhDLE9BQU8sQ0FBQyxJQUFzQjtRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxjQUFjLENBQUMsV0FBbUI7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsYUFBYTtRQUNYLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsTUFBTSxXQUFXLEdBQXlCO1lBQ3hDLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLFNBQVM7WUFDekMsT0FBTyxFQUFFO2dCQUNQLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUMvRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTthQUNwRjtZQUNELE9BQU8sRUFBRTtnQkFDUCxVQUFVLEVBQUUsSUFBSTtnQkFDaEIsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLFVBQVUsRUFBRSxJQUFJO2FBQ2pCO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsVUFBVTtRQUNSLE1BQU0sT0FBTyxHQUNYLCtCQUErQjtZQUMvQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLGNBQWMsQ0FBQyxZQUFZLENBQ3pCLFVBQVUsRUFDVixHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLElBQUksbUJBQW1CLE9BQU8sQ0FDdEQsQ0FBQztRQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QixjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDMUIsQ0FBQzt3R0FuRlUsd0JBQXdCOzRGQUF4Qix3QkFBd0IsNkhBdmR6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdLVCwwaE1BaktTLFlBQVksK0JBQUUsZ0JBQWdCOzs0RkF3ZDdCLHdCQUF3QjtrQkEzZHBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxZQUMvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdLVCxtQkFxVGdCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBpbmplY3QsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEZXNpZ25lclN0YXRlU2VydmljZSwgRGVzaWduZXJWaWV3TW9kZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1ncmlkLm1vZGVsJztcbmltcG9ydCB7IFJlcG9ydFRlbXBsYXRlU2VydmljZSwgUmVwb3J0Qmx1ZXByaW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LXRlbXBsYXRlLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtZGVzaWduZXItdG9vbGJhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJwdEljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJvb3RcIj5cbiAgICAgIDwhLS0gTGVmdDogVGl0bGUgJiBEaXJ0eSBpbmRpY2F0b3IgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1sZWZ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtaWRlbnRpdHlcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcG9ydC1uYW1lXCI+e3sgZGVmaW5pdGlvbigpLm5hbWUgfHwgJ1VudGl0bGVkIFJlcG9ydCcgfX08L3NwYW4+XG4gICAgICAgICAgQGlmIChpc0RpcnR5KCkpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlydHktYmFkZ2VcIiB0aXRsZT1cIlVuc2F2ZWQgY2hhbmdlc1wiPuKXjyBVbnNhdmVkPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDZW50ZXI6IE1vZGUgU3dpdGNoZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGUtcGlsbC1ncm91cFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtb2RlLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInZpZXdNb2RlKCkgPT09ICdkZXNpZ24nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRNb2RlKCdkZXNpZ24nKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJlZGl0XCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgPHNwYW4+RGVzaWduPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtb2RlLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInZpZXdNb2RlKCkgPT09ICdwcmV2aWV3J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0TW9kZSgncHJldmlldycpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImV5ZVwiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICAgIDxzcGFuPkxpdmUgUHJldmlldzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9kZS1idG5cIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJ2aWV3TW9kZSgpID09PSAnanNvbidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldE1vZGUoJ2pzb24nKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjb2RlXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgPHNwYW4+SlNPTiBTY2hlbWE8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUmlnaHQ6IFVuZG8sIFJlZG8sIEJsdWVwcmludHMsIEdyaWQsIEV4cG9ydCwgU2F2ZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJpZ2h0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaXN0b3J5LWdyb3VwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRvb2wtYnRuXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuVW5kbygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ1bmRvKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJVbmRvIChDdHJsK1opXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInVuZG9cIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInRvb2wtYnRuXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUmVkbygpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJyZWRvKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJSZWRvIChDdHJsK1kpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInJlZG9cIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICA8IS0tIDEtQ2xpY2sgQmx1ZXByaW50cyBHYWxsZXJ5IEJ1dHRvbiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidG9vbC1idG4gYnRuLWJsdWVwcmludHNcIlxuICAgICAgICAgIChjbGljayk9XCJvcGVuVGVtcGxhdGVzTW9kYWwoKVwiXG4gICAgICAgICAgdGl0bGU9XCJTdGFydCBmcm9tIHByZS1jb25maWd1cmVkIGVudGVycHJpc2UgYmx1ZXByaW50c1wiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImxheWVyc1wiIFtzaXplXT1cIjE0XCIgLz5cbiAgICAgICAgICA8c3Bhbj5CbHVlcHJpbnRzPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8IS0tIEFkZCAvIENvbmZpZ3VyZSBHcmlkIFF1aWNrIEJ1dHRvbiAtLT5cbiAgICAgICAgQGlmICghZGVmaW5pdGlvbigpLmdyaWQpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidG9vbC1idG4gYnRuLWdyaWQtYWN0aW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRSZXN1bHRHcmlkKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJBdHRhY2ggYSBSZXN1bHQgRGF0YSBHcmlkIChVbHRyYUdyaWQgLyBUYWJsZSkgdG8gdGhpcyByZXBvcnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidGFibGVcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj4rIEFkZCBHcmlkPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidG9vbC1idG4gYnRuLWdyaWQtY29uZmlndXJlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0R3JpZFNldHRpbmdzKClcIlxuICAgICAgICAgICAgdGl0bGU9XCJDb25maWd1cmUgUmVzdWx0IERhdGEgR3JpZCBjb2x1bW5zIGFuZCBwYWdpbmF0aW9uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInRhYmxlXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgICAgPHNwYW4+R3JpZCAoe3sgZGVmaW5pdGlvbigpLmdyaWQ/LmNvbHVtbnM/Lmxlbmd0aCA/PyAwIH19KTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ0b29sLWJ0biBidG4tZXhwb3J0XCJcbiAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0SnNvbigpXCJcbiAgICAgICAgICB0aXRsZT1cIkRvd25sb2FkIEpTT04gRGVmaW5pdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRvd25sb2FkXCIgW3NpemVdPVwiMTRcIiAvPlxuICAgICAgICAgIDxzcGFuPkV4cG9ydDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidG9vbC1idG4gYnRuLXNhdmVcIlxuICAgICAgICAgIChjbGljayk9XCJzYXZlUmVwb3J0KClcIlxuICAgICAgICAgIHRpdGxlPVwiU2F2ZSBSZXBvcnQgRGVmaW5pdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInNhdmVcIiBbc2l6ZV09XCIxNFwiIC8+XG4gICAgICAgICAgPHNwYW4+U2F2ZSBDaGFuZ2VzPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEJsdWVwcmludHMgR2FsbGVyeSBNb2RhbCAtLT5cbiAgICAgIEBpZiAoaXNUZW1wbGF0ZXNNb2RhbE9wZW4oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYmx1ZXByaW50LWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlVGVtcGxhdGVzTW9kYWwoKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmx1ZXByaW50LW1vZGFsXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbD1cIlN0YXJ0ZXIgUmVwb3J0IEJsdWVwcmludHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmx1ZXByaW50LW1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiYmx1ZXByaW50LW1vZGFsLXRpdGxlXCI+U3RhcnRlciBSZXBvcnQgQmx1ZXByaW50czwvaDM+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiYmx1ZXByaW50LW1vZGFsLXN1YlwiPkNob29zZSBhIHByZS1jb25maWd1cmVkIGFyY2hpdGVjdHVyZSBwYXR0ZXJuIHRvIGp1bXBzdGFydCByZXBvcnQgY3JlYXRpb24uPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZS1tb2RhbFwiIChjbGljayk9XCJjbG9zZVRlbXBsYXRlc01vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj7inJU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmx1ZXByaW50LWdyaWRcIj5cbiAgICAgICAgICAgIEBmb3IgKGJwIG9mIGF2YWlsYWJsZUJsdWVwcmludHM7IHRyYWNrIGJwLmlkKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibHVlcHJpbnQtY2FyZFwiIChjbGljayk9XCJhcHBseUJsdWVwcmludChicC5pZClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmx1ZXByaW50LWNhcmQtdG9wXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJsdWVwcmludC1jYXQtYmFkZ2VcIj57eyBicC5jYXRlZ29yeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibHVlcHJpbnQtY2FyZC1pY29uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJicC5pY29uIHx8ICd0YWJsZSdcIiBbc2l6ZV09XCIyMFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJibHVlcHJpbnQtY2FyZC10aXRsZVwiPnt7IGJwLm5hbWUgfX08L2g0PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYmx1ZXByaW50LWNhcmQtZGVzY1wiPnt7IGJwLmRlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibHVlcHJpbnQtY2FyZC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWFwcGx5LWJsdWVwcmludFwiPlxuICAgICAgICAgICAgICAgICAgICBVc2UgQmx1ZXByaW50IOKGklxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcblxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2ZmZmZmZik7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgICAgaGVpZ2h0OiA1NnB4O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wNCk7XG4gICAgICB6LWluZGV4OiAzMDtcbiAgICB9XG4gICAgLnRvb2xiYXItcm9vdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIHBhZGRpbmc6IDAgMjBweDtcbiAgICB9XG4gICAgLnRvb2xiYXItbGVmdCwgLnRvb2xiYXItcmlnaHQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBtaW4td2lkdGg6IDI0MHB4O1xuICAgIH1cbiAgICAudG9vbGJhci1yaWdodCB7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIH1cbiAgICAudG9vbGJhci1jZW50ZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgZmxleDogMTtcbiAgICB9XG4gICAgLnJlcG9ydC1pZGVudGl0eSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgIH1cbiAgICAucmVwb3J0LW5hbWUge1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGZvbnQtc2l6ZTogMC45cmVtO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIG1heC13aWR0aDogMjgwcHg7XG4gICAgfVxuICAgIC5kaXJ0eS1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICNiNDUzMDk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmVmM2M3O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZkZTY4YTtcbiAgICAgIHBhZGRpbmc6IDFweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbiAgICAubW9kZS1waWxsLWdyb3VwIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1sZywgOHB4KTtcbiAgICAgIHBhZGRpbmc6IDNweDtcbiAgICAgIGdhcDogMnB4O1xuICAgIH1cbiAgICAubW9kZS1idG4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBwYWRkaW5nOiA1cHggMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1zbSwgMC43NXJlbSk7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAubW9kZS1idG46aG92ZXIge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNCk7XG4gICAgfVxuICAgIC5tb2RlLWJ0bi5hY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wOCk7XG4gICAgfVxuICAgIC5oaXN0b3J5LWdyb3VwIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBnYXA6IDJweDtcbiAgICB9XG4gICAgLnRvb2wtYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNnB4O1xuICAgICAgcGFkZGluZzogNnB4IDEycHg7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtc20sIDAuNzVyZW0pO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1zZWNvbmRhcnksICMzMzQxNTUpO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXJwdC1jb2xvci1ib3JkZXIsICNjYmQ1ZTEpO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAudG9vbC1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UtaG92ZXIsICNmOGZhZmMpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLWJvcmRlci1ob3ZlciwgIzk0YTNiOCk7XG4gICAgfVxuICAgIC50b29sLWJ0bjpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjQ1O1xuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICB9XG4gICAgLmFjdGlvbnMtZGl2aWRlciB7XG4gICAgICB3aWR0aDogMXB4O1xuICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgfVxuICAgIC5idG4tYmx1ZXByaW50cyB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmFmNWZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjZTlkNWZmO1xuICAgICAgY29sb3I6ICM3YzNhZWQ7XG4gICAgfVxuICAgIC5idG4tYmx1ZXByaW50czpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjNlOGZmO1xuICAgICAgY29sb3I6ICM2ZDI4ZDk7XG4gICAgICBib3JkZXItY29sb3I6ICNjMDg0ZmM7XG4gICAgfVxuICAgIC5idG4tc2F2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgIH1cbiAgICAuYnRuLXNhdmU6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnktaG92ZXIsICMxZDRlZDgpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeS1ob3ZlciwgIzFkNGVkOCk7XG4gICAgfVxuICAgIC5idG4tZXhwb3J0IHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQtc2Vjb25kYXJ5LCAjMzM0MTU1KTtcbiAgICB9XG4gICAgLmJ0bi1ncmlkLWFjdGlvbiB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjBmZGY0O1xuICAgICAgYm9yZGVyLWNvbG9yOiAjYmJmN2QwO1xuICAgICAgY29sb3I6ICMxNmEzNGE7XG4gICAgfVxuICAgIC5idG4tZ3JpZC1hY3Rpb246aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogI2RjZmNlNztcbiAgICAgIGNvbG9yOiAjMTU4MDNkO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjODZlZmFjO1xuICAgIH1cbiAgICAuYnRuLWdyaWQtY29uZmlndXJlZCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWZmNmZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjYmZkYmZlO1xuICAgICAgY29sb3I6ICMyNTYzZWI7XG4gICAgfVxuICAgIC5idG4tZ3JpZC1jb25maWd1cmVkOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6ICNkYmVhZmU7XG4gICAgICBjb2xvcjogIzFkNGVkODtcbiAgICAgIGJvcmRlci1jb2xvcjogIzkzYzVmZDtcbiAgICB9XG5cbiAgICAvKiBCbHVlcHJpbnRzIE1vZGFsICovXG4gICAgLmJsdWVwcmludC1iYWNrZHJvcCB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICBpbnNldDogMDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTUsIDIzLCA0MiwgMC40NSk7XG4gICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgICAgIHotaW5kZXg6IDIwMDA7XG4gICAgICBhbmltYXRpb246IHJwdC1mYWRlLWluIDE1MG1zIGVhc2Utb3V0O1xuICAgIH1cbiAgICAuYmx1ZXByaW50LW1vZGFsIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICB3aWR0aDogbWluKDg0MHB4LCA5MnZ3KTtcbiAgICAgIG1heC1oZWlnaHQ6IDg1dmg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy14bCwgMTJweCk7XG4gICAgICBib3gtc2hhZG93OiB2YXIoLS1ycHQtYm94LXNoYWRvdy14bCwgMCAyMHB4IDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMTUpKTtcbiAgICAgIHotaW5kZXg6IDIwMDE7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBhbmltYXRpb246IHJwdC1tb2RhbC1pbiAxODBtcyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcbiAgICB9XG4gICAgQGtleWZyYW1lcyBycHQtZmFkZS1pbiB7XG4gICAgICBmcm9tIHsgb3BhY2l0eTogMDsgfVxuICAgICAgdG8geyBvcGFjaXR5OiAxOyB9XG4gICAgfVxuICAgIEBrZXlmcmFtZXMgcnB0LW1vZGFsLWluIHtcbiAgICAgIGZyb20geyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNDYlKSBzY2FsZSgwLjk2KTsgb3BhY2l0eTogMDsgfVxuICAgICAgdG8geyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgxKTsgb3BhY2l0eTogMTsgfVxuICAgIH1cbiAgICAuYmx1ZXByaW50LW1vZGFsLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiAyMHB4IDI0cHg7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3Itc3VyZmFjZSwgI2Y4ZmFmYyk7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtbW9kYWwtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLWxnLCAxLjEyNXJlbSk7XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIG1hcmdpbjogMCAwIDRweCAwO1xuICAgIH1cbiAgICAuYmx1ZXByaW50LW1vZGFsLXN1YiB7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtc20sIDAuNzVyZW0pO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gICAgLmJ0bi1jbG9zZS1tb2RhbCB7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiA0cHg7XG4gICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHRyYW5zaXRpb246IGFsbCAxMjBtcyBlYXNlO1xuICAgIH1cbiAgICAuYnRuLWNsb3NlLW1vZGFsOmhvdmVyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgIH1cbiAgICAuYmx1ZXByaW50LWdyaWQge1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjQwcHgsIDFmcikpO1xuICAgICAgZ2FwOiAxNnB4O1xuICAgICAgcGFkZGluZzogMjBweCAyNHB4O1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICB9XG4gICAgLmJsdWVwcmludC1jYXJkIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLWxnLCA4cHgpO1xuICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGVhc2U7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtY2FyZDpob3ZlciB7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcbiAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgzNywgOTksIDIzNSwgMC4xMik7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtY2FyZC10b3Age1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICAgIH1cbiAgICAuYmx1ZXByaW50LWNhdC1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICM3YzNhZWQ7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjVmM2ZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDZmZTtcbiAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtY2FyZC1pY29uIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtY2FyZC10aXRsZSB7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtYmFzZSwgMC44NzVyZW0pO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICBtYXJnaW46IDAgMCA2cHggMDtcbiAgICB9XG4gICAgLmJsdWVwcmludC1jYXJkLWRlc2Mge1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLXNtLCAwLjc1cmVtKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgbWFyZ2luOiAwIDAgMTZweCAwO1xuICAgICAgZmxleDogMTtcbiAgICB9XG4gICAgLmJsdWVwcmludC1jYXJkLWZvb3RlciB7XG4gICAgICBtYXJnaW4tdG9wOiBhdXRvO1xuICAgIH1cbiAgICAuYnRuLWFwcGx5LWJsdWVwcmludCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGNvbG9yOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBwYWRkaW5nOiA2cHggMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5ibHVlcHJpbnQtY2FyZDpob3ZlciAuYnRuLWFwcGx5LWJsdWVwcmludCB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeS1ob3ZlciwgIzFkNGVkOCk7XG4gICAgfVxuICBgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERlc2lnbmVyVG9vbGJhckNvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJTdGF0ZSA9IGluamVjdChEZXNpZ25lclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydFRlbXBsYXRlU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgZGVmaW5pdGlvbiA9IHRoaXMuZGVzaWduZXJTdGF0ZS5kZWZpbml0aW9uO1xuICByZWFkb25seSB2aWV3TW9kZSA9IHRoaXMuZGVzaWduZXJTdGF0ZS52aWV3TW9kZTtcbiAgcmVhZG9ubHkgaXNEaXJ0eSA9IHRoaXMuZGVzaWduZXJTdGF0ZS5pc0RpcnR5O1xuICByZWFkb25seSBjYW5VbmRvID0gdGhpcy5kZXNpZ25lclN0YXRlLmNhblVuZG87XG4gIHJlYWRvbmx5IGNhblJlZG8gPSB0aGlzLmRlc2lnbmVyU3RhdGUuY2FuUmVkbztcblxuICByZWFkb25seSBpc1RlbXBsYXRlc01vZGFsT3BlbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGF2YWlsYWJsZUJsdWVwcmludHM6IFJlcG9ydEJsdWVwcmludFtdID0gdGhpcy50ZW1wbGF0ZVNlcnZpY2UuZ2V0VGVtcGxhdGVzKCk7XG5cbiAgcmVhZG9ubHkgc2F2ZVJlcXVlc3RlZCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHNldE1vZGUobW9kZTogRGVzaWduZXJWaWV3TW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZXRWaWV3TW9kZShtb2RlKTtcbiAgfVxuXG4gIHVuZG8oKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnVuZG8oKTtcbiAgfVxuXG4gIHJlZG8oKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLnJlZG8oKTtcbiAgfVxuXG4gIHNhdmVSZXBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5zYXZlUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIG9wZW5UZW1wbGF0ZXNNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzVGVtcGxhdGVzTW9kYWxPcGVuLnNldCh0cnVlKTtcbiAgfVxuXG4gIGNsb3NlVGVtcGxhdGVzTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc1RlbXBsYXRlc01vZGFsT3Blbi5zZXQoZmFsc2UpO1xuICB9XG5cbiAgYXBwbHlCbHVlcHJpbnQoYmx1ZXByaW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0RlZiA9IHRoaXMudGVtcGxhdGVTZXJ2aWNlLmluc3RhbnRpYXRlVGVtcGxhdGUoYmx1ZXByaW50SWQpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5sb2FkRGVmaW5pdGlvbihuZXdEZWYpO1xuICAgIHRoaXMuY2xvc2VUZW1wbGF0ZXNNb2RhbCgpO1xuICB9XG5cbiAgYWRkUmVzdWx0R3JpZCgpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZ0RzID0gdGhpcy5kZWZpbml0aW9uKCkuZGF0YVNvdXJjZXNbMF07XG4gICAgY29uc3QgZGVmYXVsdEdyaWQ6IFJlcG9ydEdyaWREZWZpbml0aW9uID0ge1xuICAgICAgZGF0YVNvdXJjZUlkOiBleGlzdGluZ0RzPy5pZCA/PyAnZGVmYXVsdCcsXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsgZmllbGQ6ICdpZCcsIGxhYmVsOiAnSUQnLCBkYXRhVHlwZTogJ251bWJlcicsIHZpc2libGU6IHRydWUsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICAgIHsgZmllbGQ6ICduYW1lJywgbGFiZWw6ICdOYW1lJywgZGF0YVR5cGU6ICdzdHJpbmcnLCB2aXNpYmxlOiB0cnVlLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgcGFnaW5hdGlvbjogdHJ1ZSxcbiAgICAgICAgcGFnZVNpemU6IDI1LFxuICAgICAgICBzaG93Um93TnVtYmVyczogdHJ1ZSxcbiAgICAgICAgc2hvd0Zvb3RlcjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUudXBkYXRlR3JpZFNldHRpbmdzKGRlZmF1bHRHcmlkKTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2VsZWN0Q29tcG9uZW50KG51bGwpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZXRBY3RpdmVUYWIoJ2dyaWQnKTtcbiAgfVxuXG4gIHNlbGVjdEdyaWRTZXR0aW5ncygpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuc2VsZWN0Q29tcG9uZW50KG51bGwpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5zZXRBY3RpdmVUYWIoJ2dyaWQnKTtcbiAgfVxuXG4gIGV4cG9ydEpzb24oKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YVN0ciA9XG4gICAgICAnZGF0YTp0ZXh0L2pzb247Y2hhcnNldD11dGYtOCwnICtcbiAgICAgIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh0aGlzLmRlZmluaXRpb24oKSwgbnVsbCwgMikpO1xuICAgIGNvbnN0IGRvd25sb2FkQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGRvd25sb2FkQW5jaG9yLnNldEF0dHJpYnV0ZSgnaHJlZicsIGRhdGFTdHIpO1xuICAgIGRvd25sb2FkQW5jaG9yLnNldEF0dHJpYnV0ZShcbiAgICAgICdkb3dubG9hZCcsXG4gICAgICBgJHt0aGlzLmRlZmluaXRpb24oKS5pZCB8fCAncmVwb3J0LWRlZmluaXRpb24nfS5qc29uYFxuICAgICk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb3dubG9hZEFuY2hvcik7XG4gICAgZG93bmxvYWRBbmNob3IuY2xpY2soKTtcbiAgICBkb3dubG9hZEFuY2hvci5yZW1vdmUoKTtcbiAgfVxufVxuIl19