bways-report 0.1.2 → 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.
- package/README.md +150 -51
- package/esm2022/lib/core/errors/reporting-errors.mjs +2 -2
- package/esm2022/lib/core/index.mjs +3 -1
- package/esm2022/lib/core/models/report-datasource.model.mjs +1 -1
- package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
- package/esm2022/lib/core/models/report-grid.model.mjs +1 -1
- package/esm2022/lib/core/services/report-session-context.service.mjs +50 -5
- package/esm2022/lib/core/utils/data-normalization.util.mjs +56 -0
- package/esm2022/lib/core/utils/report-parameter.util.mjs +180 -0
- package/esm2022/lib/data-access/adapters/http-datasource.adapter.mjs +82 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +34 -9
- package/esm2022/lib/data-access/adapters/http-masterdata.adapter.mjs +38 -0
- package/esm2022/lib/data-access/adapters/http-persistence.adapter.mjs +217 -0
- package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +3 -1
- package/esm2022/lib/data-access/adapters/index.mjs +8 -3
- package/esm2022/lib/data-access/adapters/local-storage-persistence.adapter.mjs +167 -0
- package/esm2022/lib/data-access/adapters/mock-datasource.adapter.mjs +60 -0
- package/esm2022/lib/data-access/contracts/api-dtos.mjs +6 -0
- package/esm2022/lib/data-access/contracts/index.mjs +2 -1
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +555 -92
- package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +593 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +164 -23
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +410 -12
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +149 -2
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +109 -6
- package/esm2022/lib/features/designer/designer.component.mjs +101 -12
- package/esm2022/lib/features/designer/index.mjs +4 -1
- package/esm2022/lib/features/designer/rpt-report-designer.component.mjs +102 -0
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +10 -9
- package/esm2022/lib/features/designer/services/report-template.service.mjs +318 -0
- package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +41 -9
- package/esm2022/lib/features/export/index.mjs +2 -2
- package/esm2022/lib/features/export/models/export.models.mjs +1 -1
- package/esm2022/lib/features/export/services/report-export.service.mjs +420 -5
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +2 -2
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +231 -33
- package/esm2022/lib/features/runtime/index.mjs +2 -1
- package/esm2022/lib/features/runtime/report-execution.service.mjs +64 -0
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +224 -26
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +341 -7
- package/esm2022/lib/features/runtime/rpt-report.component.mjs +537 -0
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +19 -8
- package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +18 -7
- package/esm2022/lib/primitives/components/date-range/rpt-date-range.component.mjs +346 -0
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +727 -73
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
- package/esm2022/lib/primitives/components/index.mjs +2 -1
- package/esm2022/lib/primitives/register-builtins.mjs +51 -2
- package/esm2022/lib/provide-reporting.mjs +145 -24
- package/fesm2022/bways-report.mjs +6871 -753
- package/fesm2022/bways-report.mjs.map +1 -1
- package/lib/core/index.d.ts +2 -0
- package/lib/core/models/report-datasource.model.d.ts +9 -0
- package/lib/core/models/report-definition.model.d.ts +2 -0
- package/lib/core/models/report-grid.model.d.ts +44 -0
- package/lib/core/services/report-session-context.service.d.ts +6 -1
- package/lib/core/utils/data-normalization.util.d.ts +15 -0
- package/lib/core/utils/report-parameter.util.d.ts +35 -0
- package/lib/data-access/adapters/http-datasource.adapter.d.ts +20 -0
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +3 -0
- package/lib/data-access/adapters/http-masterdata.adapter.d.ts +13 -0
- package/lib/data-access/adapters/http-persistence.adapter.d.ts +27 -0
- package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +2 -0
- package/lib/data-access/adapters/index.d.ts +7 -2
- package/lib/data-access/adapters/local-storage-persistence.adapter.d.ts +19 -0
- package/lib/data-access/adapters/mock-datasource.adapter.d.ts +9 -0
- package/lib/data-access/contracts/api-dtos.d.ts +67 -0
- package/lib/data-access/contracts/index.d.ts +1 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +22 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -1
- package/lib/features/designer/components/property-editor/property-editor-action.component.d.ts +33 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +4 -0
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +16 -2
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +5 -0
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +7 -0
- package/lib/features/designer/designer.component.d.ts +5 -0
- package/lib/features/designer/index.d.ts +4 -0
- package/lib/features/designer/rpt-report-designer.component.d.ts +38 -0
- package/lib/features/designer/services/designer-state.service.d.ts +1 -1
- package/lib/features/designer/services/report-template.service.d.ts +32 -0
- package/lib/features/designer/utilities/canvas-layout.util.d.ts +4 -0
- package/lib/features/export/index.d.ts +2 -2
- package/lib/features/export/models/export.models.d.ts +23 -0
- package/lib/features/export/services/report-export.service.d.ts +31 -2
- package/lib/features/runtime/dynamic-renderer.component.d.ts +39 -2
- package/lib/features/runtime/index.d.ts +2 -0
- package/lib/features/runtime/report-execution.service.d.ts +16 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +129 -6
- package/lib/features/runtime/report-runtime.component.d.ts +83 -1
- package/lib/features/runtime/rpt-report.component.d.ts +66 -0
- package/lib/primitives/components/button/rpt-button.component.d.ts +5 -2
- package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +1 -0
- package/lib/primitives/components/date-range/rpt-date-range.component.d.ts +43 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +55 -7
- package/lib/primitives/components/index.d.ts +2 -0
- package/lib/provide-reporting.d.ts +79 -26
- package/package.json +2 -1
- package/schematics/collection.json +10 -0
- package/schematics/ng-add/index.js +45 -0
- package/schematics/ng-add/schema.json +17 -0
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, inject, input, output, signal, viewChild, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { ReportExportService } from '../export/services/report-export.service';
|
|
5
|
+
import { ReportRuntimeComponent } from './report-runtime.component';
|
|
6
|
+
import { RptIconComponent } from '../../primitives/components/icon/rpt-icon.component';
|
|
7
|
+
import { ReportPersistenceAdapter } from '../../data-access/contracts/report-persistence.contract';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/forms";
|
|
10
|
+
export class RptReportComponent {
|
|
11
|
+
exportService = inject(ReportExportService);
|
|
12
|
+
persistence = inject(ReportPersistenceAdapter, { optional: true });
|
|
13
|
+
id = input(undefined);
|
|
14
|
+
report = input(null);
|
|
15
|
+
parameters = input({});
|
|
16
|
+
showExport = input(true);
|
|
17
|
+
enablePresets = input(true);
|
|
18
|
+
autoExecute = input(true);
|
|
19
|
+
rowClick = output();
|
|
20
|
+
dataLoaded = output();
|
|
21
|
+
gridStateChange = output();
|
|
22
|
+
presetSaved = output();
|
|
23
|
+
presetChange = output();
|
|
24
|
+
exportRequested = output();
|
|
25
|
+
printRequested = output();
|
|
26
|
+
runtimeComponent = viewChild(ReportRuntimeComponent);
|
|
27
|
+
// Preset states
|
|
28
|
+
activePresetId = signal('default');
|
|
29
|
+
isSavePresetModalOpen = signal(false);
|
|
30
|
+
newPresetName = signal('');
|
|
31
|
+
latestGridState = signal(null);
|
|
32
|
+
customPresets = signal([]);
|
|
33
|
+
currentDefinition = computed(() => {
|
|
34
|
+
return this.report();
|
|
35
|
+
});
|
|
36
|
+
activeDefinition = computed(() => {
|
|
37
|
+
return this.report() ?? this.runtimeComponent()?.currentDefinition() ?? null;
|
|
38
|
+
});
|
|
39
|
+
recordCount = computed(() => {
|
|
40
|
+
return this.runtimeComponent()?.resultData()?.length ?? 0;
|
|
41
|
+
});
|
|
42
|
+
showToolbar = computed(() => {
|
|
43
|
+
return this.showExport() || this.enablePresets();
|
|
44
|
+
});
|
|
45
|
+
savedPresets = computed(() => {
|
|
46
|
+
const def = this.activeDefinition();
|
|
47
|
+
const initialPresets = def?.grid?.options?.presets ?? [];
|
|
48
|
+
const map = new Map();
|
|
49
|
+
for (const p of initialPresets) {
|
|
50
|
+
if (p && p.id)
|
|
51
|
+
map.set(p.id, p);
|
|
52
|
+
}
|
|
53
|
+
for (const p of this.customPresets()) {
|
|
54
|
+
if (p && p.id)
|
|
55
|
+
map.set(p.id, p);
|
|
56
|
+
}
|
|
57
|
+
return Array.from(map.values());
|
|
58
|
+
});
|
|
59
|
+
onRowActionTriggered(event) {
|
|
60
|
+
this.rowClick.emit({
|
|
61
|
+
row: event.row,
|
|
62
|
+
parameters: event.parameters,
|
|
63
|
+
action: event.action,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
onGridStateChanged(state) {
|
|
67
|
+
this.latestGridState.set(state);
|
|
68
|
+
this.gridStateChange.emit(state);
|
|
69
|
+
}
|
|
70
|
+
onSelectPreset(presetId) {
|
|
71
|
+
this.activePresetId.set(presetId);
|
|
72
|
+
if (presetId === 'default') {
|
|
73
|
+
this.presetChange.emit(null);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const preset = this.savedPresets().find((p) => p.id === presetId);
|
|
77
|
+
if (preset) {
|
|
78
|
+
if (preset.gridState) {
|
|
79
|
+
this.latestGridState.set(preset.gridState);
|
|
80
|
+
this.gridStateChange.emit(preset.gridState);
|
|
81
|
+
}
|
|
82
|
+
this.presetChange.emit(preset);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
confirmSavePreset() {
|
|
86
|
+
this.saveCurrentPreset();
|
|
87
|
+
}
|
|
88
|
+
exportExcel() {
|
|
89
|
+
this.onExportExcel();
|
|
90
|
+
}
|
|
91
|
+
exportCsv() {
|
|
92
|
+
this.onExportCsv();
|
|
93
|
+
}
|
|
94
|
+
print() {
|
|
95
|
+
this.onPrintReport();
|
|
96
|
+
}
|
|
97
|
+
openSavePresetModal() {
|
|
98
|
+
this.newPresetName.set('');
|
|
99
|
+
this.isSavePresetModalOpen.set(true);
|
|
100
|
+
}
|
|
101
|
+
closeSavePresetModal() {
|
|
102
|
+
this.isSavePresetModalOpen.set(false);
|
|
103
|
+
}
|
|
104
|
+
saveCurrentPreset() {
|
|
105
|
+
const name = this.newPresetName().trim();
|
|
106
|
+
if (!name)
|
|
107
|
+
return;
|
|
108
|
+
const presetId = `preset_${Date.now()}`;
|
|
109
|
+
const newPreset = {
|
|
110
|
+
id: presetId,
|
|
111
|
+
name,
|
|
112
|
+
gridState: this.latestGridState() ?? {},
|
|
113
|
+
createdAt: new Date().toISOString(),
|
|
114
|
+
};
|
|
115
|
+
const def = this.activeDefinition();
|
|
116
|
+
if (def && def.grid) {
|
|
117
|
+
if (!def.grid.options)
|
|
118
|
+
def.grid.options = {};
|
|
119
|
+
const currentPresets = def.grid.options.presets ?? [];
|
|
120
|
+
def.grid.options.presets = [...currentPresets, newPreset];
|
|
121
|
+
if (this.persistence && def.id) {
|
|
122
|
+
this.persistence.save(def).subscribe({
|
|
123
|
+
next: () => { },
|
|
124
|
+
error: () => { },
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
this.customPresets.update((prev) => [...prev, newPreset]);
|
|
129
|
+
this.activePresetId.set(presetId);
|
|
130
|
+
this.presetSaved.emit({ name, preset: newPreset });
|
|
131
|
+
this.closeSavePresetModal();
|
|
132
|
+
}
|
|
133
|
+
deletePreset(presetId) {
|
|
134
|
+
if (presetId === 'default')
|
|
135
|
+
return;
|
|
136
|
+
this.customPresets.update((prev) => prev.filter((p) => p.id !== presetId));
|
|
137
|
+
const def = this.activeDefinition();
|
|
138
|
+
if (def && def.grid && def.grid.options) {
|
|
139
|
+
const current = def.grid.options.presets ?? [];
|
|
140
|
+
def.grid.options.presets = current.filter((p) => p.id !== presetId);
|
|
141
|
+
if (this.persistence && def.id) {
|
|
142
|
+
this.persistence.save(def).subscribe({
|
|
143
|
+
next: () => { },
|
|
144
|
+
error: () => { },
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (this.activePresetId() === presetId) {
|
|
149
|
+
this.onSelectPreset('default');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
onExportExcel() {
|
|
153
|
+
const data = this.runtimeComponent()?.resultData();
|
|
154
|
+
if (!data || !Array.isArray(data) || data.length === 0)
|
|
155
|
+
return;
|
|
156
|
+
const def = this.activeDefinition();
|
|
157
|
+
const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
|
|
158
|
+
this.exportService.exportExcel(data, {
|
|
159
|
+
fileName: def?.name ? `${def.name}.xls` : 'report.xls',
|
|
160
|
+
columns: cols,
|
|
161
|
+
brandedHeader: { reportTitle: def?.name },
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
onExportCsv() {
|
|
165
|
+
const data = this.runtimeComponent()?.resultData();
|
|
166
|
+
if (!data || !Array.isArray(data) || data.length === 0)
|
|
167
|
+
return;
|
|
168
|
+
const def = this.activeDefinition();
|
|
169
|
+
const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
|
|
170
|
+
this.exportService.exportCsv(data, {
|
|
171
|
+
fileName: def?.name ? `${def.name}.csv` : 'report.csv',
|
|
172
|
+
columns: cols,
|
|
173
|
+
brandedHeader: { reportTitle: def?.name },
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
onPrintReport() {
|
|
177
|
+
const data = this.runtimeComponent()?.resultData();
|
|
178
|
+
if (!data || !Array.isArray(data) || data.length === 0)
|
|
179
|
+
return;
|
|
180
|
+
const def = this.activeDefinition();
|
|
181
|
+
const cols = def?.grid?.columns.map((c) => ({ field: c.field, header: c.label }));
|
|
182
|
+
this.exportService.printReport(data, {
|
|
183
|
+
title: def?.name || 'Report Print Preview',
|
|
184
|
+
columns: cols,
|
|
185
|
+
brandedHeader: { reportTitle: def?.name },
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
189
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptReportComponent, isStandalone: true, selector: "rpt-report, rpt-view", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, report: { classPropertyName: "report", publicName: "report", isSignal: true, isRequired: false, transformFunction: null }, parameters: { classPropertyName: "parameters", publicName: "parameters", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, enablePresets: { classPropertyName: "enablePresets", publicName: "enablePresets", isSignal: true, isRequired: false, transformFunction: null }, autoExecute: { classPropertyName: "autoExecute", publicName: "autoExecute", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", dataLoaded: "dataLoaded", gridStateChange: "gridStateChange", presetSaved: "presetSaved", presetChange: "presetChange", exportRequested: "exportRequested", printRequested: "printRequested" }, viewQueries: [{ propertyName: "runtimeComponent", first: true, predicate: ReportRuntimeComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
190
|
+
<div class="rpt-facade-container">
|
|
191
|
+
<!-- Top Action & Preset Bar -->
|
|
192
|
+
@if (showToolbar()) {
|
|
193
|
+
<div class="rpt-facade-toolbar">
|
|
194
|
+
<div class="rpt-toolbar-left">
|
|
195
|
+
@if (activeDefinition()?.name) {
|
|
196
|
+
<div class="rpt-report-title-badge">
|
|
197
|
+
<span class="rpt-title-dot"></span>
|
|
198
|
+
<span class="rpt-title-text">{{ activeDefinition()?.name }}</span>
|
|
199
|
+
</div>
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
@if (recordCount() > 0) {
|
|
203
|
+
<span class="rpt-record-count-chip" title="Current dataset size">
|
|
204
|
+
<span class="rpt-chip-dot"></span>
|
|
205
|
+
<span class="rpt-tabular-nums">{{ recordCount() }} rows</span>
|
|
206
|
+
</span>
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
<!-- Saved Views / Preset Switcher -->
|
|
210
|
+
@if (enablePresets()) {
|
|
211
|
+
<div class="rpt-preset-control">
|
|
212
|
+
<label class="rpt-preset-label">
|
|
213
|
+
<rpt-icon name="bookmark" [size]="12" />
|
|
214
|
+
<span>View:</span>
|
|
215
|
+
</label>
|
|
216
|
+
<select
|
|
217
|
+
class="rpt-preset-select"
|
|
218
|
+
[ngModel]="activePresetId()"
|
|
219
|
+
(ngModelChange)="onSelectPreset($event)"
|
|
220
|
+
aria-label="Select report view preset"
|
|
221
|
+
>
|
|
222
|
+
<option value="default">Default View</option>
|
|
223
|
+
@for (preset of savedPresets(); track preset.id) {
|
|
224
|
+
<option [value]="preset.id">{{ preset.name }}</option>
|
|
225
|
+
}
|
|
226
|
+
</select>
|
|
227
|
+
<button
|
|
228
|
+
type="button"
|
|
229
|
+
class="rpt-btn-save-view"
|
|
230
|
+
(click)="openSavePresetModal()"
|
|
231
|
+
title="Save current grid view or manage presets"
|
|
232
|
+
>
|
|
233
|
+
<rpt-icon name="plus" [size]="11" />
|
|
234
|
+
<span>Save View</span>
|
|
235
|
+
</button>
|
|
236
|
+
</div>
|
|
237
|
+
}
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<!-- Export Actions -->
|
|
241
|
+
@if (showExport()) {
|
|
242
|
+
<div class="rpt-toolbar-right">
|
|
243
|
+
<button
|
|
244
|
+
type="button"
|
|
245
|
+
class="rpt-export-btn rpt-export-excel"
|
|
246
|
+
(click)="onExportExcel()"
|
|
247
|
+
[disabled]="!recordCount()"
|
|
248
|
+
title="Export result table to Excel spreadsheet (.xls)"
|
|
249
|
+
>
|
|
250
|
+
<rpt-icon name="file-text" [size]="13" />
|
|
251
|
+
<span>Excel</span>
|
|
252
|
+
</button>
|
|
253
|
+
<button
|
|
254
|
+
type="button"
|
|
255
|
+
class="rpt-export-btn rpt-export-csv"
|
|
256
|
+
(click)="onExportCsv()"
|
|
257
|
+
[disabled]="!recordCount()"
|
|
258
|
+
title="Export result table to CSV file"
|
|
259
|
+
>
|
|
260
|
+
<rpt-icon name="download" [size]="13" />
|
|
261
|
+
<span>CSV</span>
|
|
262
|
+
</button>
|
|
263
|
+
<button
|
|
264
|
+
type="button"
|
|
265
|
+
class="rpt-export-btn rpt-export-print"
|
|
266
|
+
(click)="onPrintReport()"
|
|
267
|
+
[disabled]="!recordCount()"
|
|
268
|
+
title="Print report with branded layout"
|
|
269
|
+
>
|
|
270
|
+
<rpt-icon name="printer" [size]="13" />
|
|
271
|
+
<span>Print</span>
|
|
272
|
+
</button>
|
|
273
|
+
</div>
|
|
274
|
+
}
|
|
275
|
+
</div>
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
<!-- Core Runtime Engine -->
|
|
279
|
+
<rpt-report-runtime
|
|
280
|
+
#runtimeRef
|
|
281
|
+
[reportId]="id()"
|
|
282
|
+
[report]="currentDefinition()"
|
|
283
|
+
(rowActionTriggered)="onRowActionTriggered($event)"
|
|
284
|
+
(gridStateChange)="onGridStateChanged($event)"
|
|
285
|
+
(exportRequested)="exportRequested.emit($event)"
|
|
286
|
+
(printRequested)="printRequested.emit($event)"
|
|
287
|
+
/>
|
|
288
|
+
|
|
289
|
+
<!-- Save View Preset Modal -->
|
|
290
|
+
@if (isSavePresetModalOpen()) {
|
|
291
|
+
<div class="rpt-modal-backdrop" (click)="closeSavePresetModal()" aria-hidden="true"></div>
|
|
292
|
+
<div class="rpt-modal-dialog" role="dialog" aria-modal="true" aria-label="Save View Preset">
|
|
293
|
+
<div class="rpt-modal-header">
|
|
294
|
+
<div class="rpt-modal-header-title">
|
|
295
|
+
<rpt-icon name="bookmark" [size]="16" />
|
|
296
|
+
<h4 class="rpt-modal-title">Custom View Presets</h4>
|
|
297
|
+
</div>
|
|
298
|
+
<button type="button" class="rpt-modal-close" (click)="closeSavePresetModal()" aria-label="Close modal">✕</button>
|
|
299
|
+
</div>
|
|
300
|
+
<div class="rpt-modal-body">
|
|
301
|
+
<p class="rpt-modal-hint">
|
|
302
|
+
Save your active column ordering, widths, sortings, and filters into a reusable view preset.
|
|
303
|
+
</p>
|
|
304
|
+
|
|
305
|
+
<div class="rpt-input-group">
|
|
306
|
+
<label class="rpt-field-label">New View Name</label>
|
|
307
|
+
<input
|
|
308
|
+
type="text"
|
|
309
|
+
class="rpt-modal-input"
|
|
310
|
+
placeholder="e.g. High Value Transactions - Q3"
|
|
311
|
+
[ngModel]="newPresetName()"
|
|
312
|
+
(ngModelChange)="newPresetName.set($event)"
|
|
313
|
+
(keydown.enter)="saveCurrentPreset()"
|
|
314
|
+
autofocus
|
|
315
|
+
/>
|
|
316
|
+
</div>
|
|
317
|
+
|
|
318
|
+
<!-- Existing Presets Management List -->
|
|
319
|
+
@if (savedPresets().length > 0) {
|
|
320
|
+
<div class="rpt-existing-presets">
|
|
321
|
+
<span class="rpt-existing-label">Saved Views in this report:</span>
|
|
322
|
+
<div class="rpt-presets-list">
|
|
323
|
+
@for (preset of savedPresets(); track preset.id) {
|
|
324
|
+
<div class="rpt-preset-row">
|
|
325
|
+
<div class="rpt-preset-info">
|
|
326
|
+
<span class="rpt-preset-row-name">{{ preset.name }}</span>
|
|
327
|
+
@if (preset.id === activePresetId()) {
|
|
328
|
+
<span class="rpt-preset-active-tag">Active</span>
|
|
329
|
+
}
|
|
330
|
+
</div>
|
|
331
|
+
<button
|
|
332
|
+
type="button"
|
|
333
|
+
class="rpt-btn-del-preset"
|
|
334
|
+
(click)="deletePreset(preset.id)"
|
|
335
|
+
title="Delete view preset"
|
|
336
|
+
aria-label="Delete view preset"
|
|
337
|
+
>
|
|
338
|
+
<rpt-icon name="trash" [size]="12" />
|
|
339
|
+
</button>
|
|
340
|
+
</div>
|
|
341
|
+
}
|
|
342
|
+
</div>
|
|
343
|
+
</div>
|
|
344
|
+
}
|
|
345
|
+
</div>
|
|
346
|
+
<div class="rpt-modal-footer">
|
|
347
|
+
<button type="button" class="rpt-btn-cancel" (click)="closeSavePresetModal()">Cancel</button>
|
|
348
|
+
<button
|
|
349
|
+
type="button"
|
|
350
|
+
class="rpt-btn-confirm"
|
|
351
|
+
[disabled]="!newPresetName().trim()"
|
|
352
|
+
(click)="saveCurrentPreset()"
|
|
353
|
+
>
|
|
354
|
+
Save View
|
|
355
|
+
</button>
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
}
|
|
359
|
+
</div>
|
|
360
|
+
`, isInline: true, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ReportRuntimeComponent, selector: "rpt-report-runtime, rpt-runtime", inputs: ["reportId", "report"], outputs: ["resetRequested", "exportRequested", "printRequested", "customActionTriggered", "gridStateChange", "columnDefsChange", "rowActionTriggered", "drilldownRequested"] }, { kind: "component", type: RptIconComponent, selector: "rpt-icon", inputs: ["name", "size", "color", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
361
|
+
}
|
|
362
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptReportComponent, decorators: [{
|
|
363
|
+
type: Component,
|
|
364
|
+
args: [{ selector: 'rpt-report, rpt-view', standalone: true, imports: [CommonModule, FormsModule, ReportRuntimeComponent, RptIconComponent], template: `
|
|
365
|
+
<div class="rpt-facade-container">
|
|
366
|
+
<!-- Top Action & Preset Bar -->
|
|
367
|
+
@if (showToolbar()) {
|
|
368
|
+
<div class="rpt-facade-toolbar">
|
|
369
|
+
<div class="rpt-toolbar-left">
|
|
370
|
+
@if (activeDefinition()?.name) {
|
|
371
|
+
<div class="rpt-report-title-badge">
|
|
372
|
+
<span class="rpt-title-dot"></span>
|
|
373
|
+
<span class="rpt-title-text">{{ activeDefinition()?.name }}</span>
|
|
374
|
+
</div>
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
@if (recordCount() > 0) {
|
|
378
|
+
<span class="rpt-record-count-chip" title="Current dataset size">
|
|
379
|
+
<span class="rpt-chip-dot"></span>
|
|
380
|
+
<span class="rpt-tabular-nums">{{ recordCount() }} rows</span>
|
|
381
|
+
</span>
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
<!-- Saved Views / Preset Switcher -->
|
|
385
|
+
@if (enablePresets()) {
|
|
386
|
+
<div class="rpt-preset-control">
|
|
387
|
+
<label class="rpt-preset-label">
|
|
388
|
+
<rpt-icon name="bookmark" [size]="12" />
|
|
389
|
+
<span>View:</span>
|
|
390
|
+
</label>
|
|
391
|
+
<select
|
|
392
|
+
class="rpt-preset-select"
|
|
393
|
+
[ngModel]="activePresetId()"
|
|
394
|
+
(ngModelChange)="onSelectPreset($event)"
|
|
395
|
+
aria-label="Select report view preset"
|
|
396
|
+
>
|
|
397
|
+
<option value="default">Default View</option>
|
|
398
|
+
@for (preset of savedPresets(); track preset.id) {
|
|
399
|
+
<option [value]="preset.id">{{ preset.name }}</option>
|
|
400
|
+
}
|
|
401
|
+
</select>
|
|
402
|
+
<button
|
|
403
|
+
type="button"
|
|
404
|
+
class="rpt-btn-save-view"
|
|
405
|
+
(click)="openSavePresetModal()"
|
|
406
|
+
title="Save current grid view or manage presets"
|
|
407
|
+
>
|
|
408
|
+
<rpt-icon name="plus" [size]="11" />
|
|
409
|
+
<span>Save View</span>
|
|
410
|
+
</button>
|
|
411
|
+
</div>
|
|
412
|
+
}
|
|
413
|
+
</div>
|
|
414
|
+
|
|
415
|
+
<!-- Export Actions -->
|
|
416
|
+
@if (showExport()) {
|
|
417
|
+
<div class="rpt-toolbar-right">
|
|
418
|
+
<button
|
|
419
|
+
type="button"
|
|
420
|
+
class="rpt-export-btn rpt-export-excel"
|
|
421
|
+
(click)="onExportExcel()"
|
|
422
|
+
[disabled]="!recordCount()"
|
|
423
|
+
title="Export result table to Excel spreadsheet (.xls)"
|
|
424
|
+
>
|
|
425
|
+
<rpt-icon name="file-text" [size]="13" />
|
|
426
|
+
<span>Excel</span>
|
|
427
|
+
</button>
|
|
428
|
+
<button
|
|
429
|
+
type="button"
|
|
430
|
+
class="rpt-export-btn rpt-export-csv"
|
|
431
|
+
(click)="onExportCsv()"
|
|
432
|
+
[disabled]="!recordCount()"
|
|
433
|
+
title="Export result table to CSV file"
|
|
434
|
+
>
|
|
435
|
+
<rpt-icon name="download" [size]="13" />
|
|
436
|
+
<span>CSV</span>
|
|
437
|
+
</button>
|
|
438
|
+
<button
|
|
439
|
+
type="button"
|
|
440
|
+
class="rpt-export-btn rpt-export-print"
|
|
441
|
+
(click)="onPrintReport()"
|
|
442
|
+
[disabled]="!recordCount()"
|
|
443
|
+
title="Print report with branded layout"
|
|
444
|
+
>
|
|
445
|
+
<rpt-icon name="printer" [size]="13" />
|
|
446
|
+
<span>Print</span>
|
|
447
|
+
</button>
|
|
448
|
+
</div>
|
|
449
|
+
}
|
|
450
|
+
</div>
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
<!-- Core Runtime Engine -->
|
|
454
|
+
<rpt-report-runtime
|
|
455
|
+
#runtimeRef
|
|
456
|
+
[reportId]="id()"
|
|
457
|
+
[report]="currentDefinition()"
|
|
458
|
+
(rowActionTriggered)="onRowActionTriggered($event)"
|
|
459
|
+
(gridStateChange)="onGridStateChanged($event)"
|
|
460
|
+
(exportRequested)="exportRequested.emit($event)"
|
|
461
|
+
(printRequested)="printRequested.emit($event)"
|
|
462
|
+
/>
|
|
463
|
+
|
|
464
|
+
<!-- Save View Preset Modal -->
|
|
465
|
+
@if (isSavePresetModalOpen()) {
|
|
466
|
+
<div class="rpt-modal-backdrop" (click)="closeSavePresetModal()" aria-hidden="true"></div>
|
|
467
|
+
<div class="rpt-modal-dialog" role="dialog" aria-modal="true" aria-label="Save View Preset">
|
|
468
|
+
<div class="rpt-modal-header">
|
|
469
|
+
<div class="rpt-modal-header-title">
|
|
470
|
+
<rpt-icon name="bookmark" [size]="16" />
|
|
471
|
+
<h4 class="rpt-modal-title">Custom View Presets</h4>
|
|
472
|
+
</div>
|
|
473
|
+
<button type="button" class="rpt-modal-close" (click)="closeSavePresetModal()" aria-label="Close modal">✕</button>
|
|
474
|
+
</div>
|
|
475
|
+
<div class="rpt-modal-body">
|
|
476
|
+
<p class="rpt-modal-hint">
|
|
477
|
+
Save your active column ordering, widths, sortings, and filters into a reusable view preset.
|
|
478
|
+
</p>
|
|
479
|
+
|
|
480
|
+
<div class="rpt-input-group">
|
|
481
|
+
<label class="rpt-field-label">New View Name</label>
|
|
482
|
+
<input
|
|
483
|
+
type="text"
|
|
484
|
+
class="rpt-modal-input"
|
|
485
|
+
placeholder="e.g. High Value Transactions - Q3"
|
|
486
|
+
[ngModel]="newPresetName()"
|
|
487
|
+
(ngModelChange)="newPresetName.set($event)"
|
|
488
|
+
(keydown.enter)="saveCurrentPreset()"
|
|
489
|
+
autofocus
|
|
490
|
+
/>
|
|
491
|
+
</div>
|
|
492
|
+
|
|
493
|
+
<!-- Existing Presets Management List -->
|
|
494
|
+
@if (savedPresets().length > 0) {
|
|
495
|
+
<div class="rpt-existing-presets">
|
|
496
|
+
<span class="rpt-existing-label">Saved Views in this report:</span>
|
|
497
|
+
<div class="rpt-presets-list">
|
|
498
|
+
@for (preset of savedPresets(); track preset.id) {
|
|
499
|
+
<div class="rpt-preset-row">
|
|
500
|
+
<div class="rpt-preset-info">
|
|
501
|
+
<span class="rpt-preset-row-name">{{ preset.name }}</span>
|
|
502
|
+
@if (preset.id === activePresetId()) {
|
|
503
|
+
<span class="rpt-preset-active-tag">Active</span>
|
|
504
|
+
}
|
|
505
|
+
</div>
|
|
506
|
+
<button
|
|
507
|
+
type="button"
|
|
508
|
+
class="rpt-btn-del-preset"
|
|
509
|
+
(click)="deletePreset(preset.id)"
|
|
510
|
+
title="Delete view preset"
|
|
511
|
+
aria-label="Delete view preset"
|
|
512
|
+
>
|
|
513
|
+
<rpt-icon name="trash" [size]="12" />
|
|
514
|
+
</button>
|
|
515
|
+
</div>
|
|
516
|
+
}
|
|
517
|
+
</div>
|
|
518
|
+
</div>
|
|
519
|
+
}
|
|
520
|
+
</div>
|
|
521
|
+
<div class="rpt-modal-footer">
|
|
522
|
+
<button type="button" class="rpt-btn-cancel" (click)="closeSavePresetModal()">Cancel</button>
|
|
523
|
+
<button
|
|
524
|
+
type="button"
|
|
525
|
+
class="rpt-btn-confirm"
|
|
526
|
+
[disabled]="!newPresetName().trim()"
|
|
527
|
+
(click)="saveCurrentPreset()"
|
|
528
|
+
>
|
|
529
|
+
Save View
|
|
530
|
+
</button>
|
|
531
|
+
</div>
|
|
532
|
+
</div>
|
|
533
|
+
}
|
|
534
|
+
</div>
|
|
535
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-facade-container{width:100%;position:relative}.rpt-facade-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 16px;background:#fff;border:1px solid var(--rpt-color-border-subtle, #e2e8f0);border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:var(--rpt-box-shadow-xs, 0 1px 2px rgba(0, 0, 0, .04));margin-bottom:14px;flex-wrap:wrap}.rpt-toolbar-left,.rpt-toolbar-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rpt-report-title-badge{display:inline-flex;align-items:center;gap:6px;font-size:.875rem;font-weight:700;color:#0f172a;padding-right:4px}.rpt-title-dot{width:8px;height:8px;border-radius:50%;background:var(--rpt-color-primary, #2563eb)}.rpt-record-count-chip{display:inline-flex;align-items:center;gap:5px;background:#f1f5f9;color:#475569;font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-full, 9999px);border:1px solid #e2e8f0}.rpt-chip-dot{width:6px;height:6px;border-radius:50%;background:#10b981}.rpt-preset-control{display:flex;align-items:center;gap:6px;background:#f8fafc;padding:3px 6px;border-radius:var(--rpt-border-radius, 6px);border:1px solid #e2e8f0}.rpt-preset-label{display:inline-flex;align-items:center;gap:4px;font-size:.725rem;font-weight:600;color:#64748b}.rpt-preset-select{border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-sm, 4px);padding:3px 8px;font-size:.75rem;font-weight:500;color:#0f172a;background:#fff;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease}.rpt-preset-select:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 2px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-btn-save-view{display:inline-flex;align-items:center;gap:4px;background:var(--rpt-color-primary-light, #eff6ff);border:1px solid #bfdbfe;color:var(--rpt-color-primary, #2563eb);font-size:.725rem;font-weight:600;padding:3px 8px;border-radius:var(--rpt-border-radius-sm, 4px);cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-btn-save-view:hover{background:#dbeafe;border-color:#93c5fd}.rpt-export-btn{display:inline-flex;align-items:center;gap:5px;border-radius:var(--rpt-border-radius, 6px);padding:5px 12px;font-size:.75rem;font-weight:600;cursor:pointer;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-export-btn:disabled{opacity:.45;cursor:not-allowed}.rpt-export-excel{background:#f0fdf4;border:1px solid #bbf7d0;color:#15803d}.rpt-export-excel:hover:not(:disabled){background:#dcfce7;border-color:#86efac}.rpt-export-csv{background:#f8fafc;border:1px solid #cbd5e1;color:#334155}.rpt-export-csv:hover:not(:disabled){background:#f1f5f9;border-color:#94a3b8;color:#0f172a}.rpt-export-print{background:#eef2ff;border:1px solid #c7d2fe;color:#4338ca}.rpt-export-print:hover:not(:disabled){background:#e0e7ff;border-color:#a5b4fc}.rpt-modal-backdrop{position:fixed;inset:0;background:#0f172a73;backdrop-filter:blur(6px);z-index:1100}.rpt-modal-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(460px,92vw);background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius-lg, 8px);box-shadow:0 20px 25px -5px #00000026,0 8px 10px -6px #0000001a;z-index:1101;display:flex;flex-direction:column;overflow:hidden;animation:rpt-modal-pop .16s cubic-bezier(.16,1,.3,1)}@keyframes rpt-modal-pop{0%{opacity:0;transform:translate(-50%,-46%) scale(.97)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}.rpt-modal-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.rpt-modal-header-title{display:inline-flex;align-items:center;gap:8px;color:var(--rpt-color-primary, #2563eb)}.rpt-modal-title{font-size:.95rem;font-weight:700;color:#0f172a;margin:0}.rpt-modal-close{background:transparent;border:none;color:#64748b;font-size:1.1rem;cursor:pointer;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .12s ease}.rpt-modal-close:hover{background:#e2e8f0;color:#0f172a}.rpt-modal-body{padding:18px}.rpt-modal-hint{font-size:.8rem;color:#64748b;margin:0 0 16px;line-height:1.45}.rpt-input-group{margin-bottom:16px}.rpt-field-label{display:block;font-size:.75rem;font-weight:600;color:#334155;margin-bottom:6px}.rpt-modal-input{width:100%;box-sizing:border-box;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:8px 12px;font-size:.85rem;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.rpt-modal-input:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:0 0 0 3px var(--rpt-color-primary-focus, rgba(37, 99, 235, .25))}.rpt-existing-presets{border-top:1px solid #e2e8f0;padding-top:12px;margin-top:8px}.rpt-existing-label{display:block;font-size:.725rem;font-weight:600;color:#64748b;margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.rpt-presets-list{max-height:140px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.rpt-preset-row{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:4px}.rpt-preset-info{display:inline-flex;align-items:center;gap:8px}.rpt-preset-row-name{font-size:.775rem;font-weight:600;color:#1e293b}.rpt-preset-active-tag{font-size:.65rem;font-weight:600;background:#dbeafe;color:#1d4ed8;padding:1px 6px;border-radius:9999px}.rpt-btn-del-preset{background:transparent;border:none;color:#94a3b8;cursor:pointer;padding:4px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .12s ease}.rpt-btn-del-preset:hover{background:#fee2e2;color:#dc2626}.rpt-modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;padding:12px 18px;border-top:1px solid #e2e8f0;background:#f8fafc}.rpt-btn-cancel{background:#fff;border:1px solid #cbd5e1;border-radius:var(--rpt-border-radius, 6px);padding:6px 14px;font-size:.775rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s ease}.rpt-btn-cancel:hover{background:#f1f5f9;color:#0f172a}.rpt-btn-confirm{background:var(--rpt-color-primary, #2563eb);color:#fff;border:none;border-radius:var(--rpt-border-radius, 6px);padding:6px 16px;font-size:.775rem;font-weight:600;cursor:pointer;transition:all .12s ease}.rpt-btn-confirm:hover:not(:disabled){background:var(--rpt-color-primary-hover, #1d4ed8)}.rpt-btn-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
536
|
+
}] });
|
|
537
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9ydW50aW1lL3JwdC1yZXBvcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDdkYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seURBQXlELENBQUM7OztBQXVpQm5HLE1BQU0sT0FBTyxrQkFBa0I7SUFDWixhQUFhLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDNUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTNFLEVBQUUsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sR0FBRyxLQUFLLENBQTBCLElBQUksQ0FBQyxDQUFDO0lBQzlDLFVBQVUsR0FBRyxLQUFLLENBQTBCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELFVBQVUsR0FBRyxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUM7SUFDbEMsYUFBYSxHQUFHLEtBQUssQ0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJLVCxtQkE0V2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSZXBvcnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWRlZmluaXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgR3JpZFJvd0NsaWNrQWN0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWdyaWQubW9kZWwnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0U2VydmljZSB9IGZyb20gJy4uL2V4cG9ydC9zZXJ2aWNlcy9yZXBvcnQtZXhwb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0UnVudGltZUNvbXBvbmVudCB9IGZyb20gJy4vcmVwb3J0LXJ1bnRpbWUuY29tcG9uZW50JztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0UGVyc2lzdGVuY2VBZGFwdGVyIH0gZnJvbSAnLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL3JlcG9ydC1wZXJzaXN0ZW5jZS5jb250cmFjdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0Vmlld1ByZXNldCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZ3JpZFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZm9ybVZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1yZXBvcnQsIHJwdC12aWV3JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlcG9ydFJ1bnRpbWVDb21wb25lbnQsIFJwdEljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJycHQtZmFjYWRlLWNvbnRhaW5lclwiPlxuICAgICAgPCEtLSBUb3AgQWN0aW9uICYgUHJlc2V0IEJhciAtLT5cbiAgICAgIEBpZiAoc2hvd1Rvb2xiYXIoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWZhY2FkZS10b29sYmFyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC10b29sYmFyLWxlZnRcIj5cbiAgICAgICAgICAgIEBpZiAoYWN0aXZlRGVmaW5pdGlvbigpPy5uYW1lKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcmVwb3J0LXRpdGxlLWJhZGdlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtdGl0bGUtZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXRpdGxlLXRleHRcIj57eyBhY3RpdmVEZWZpbml0aW9uKCk/Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHJlY29yZENvdW50KCkgPiAwKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXJlY29yZC1jb3VudC1jaGlwXCIgdGl0bGU9XCJDdXJyZW50IGRhdGFzZXQgc2l6ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWNoaXAtZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXRhYnVsYXItbnVtc1wiPnt7IHJlY29yZENvdW50KCkgfX0gcm93czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIFNhdmVkIFZpZXdzIC8gUHJlc2V0IFN3aXRjaGVyIC0tPlxuICAgICAgICAgICAgQGlmIChlbmFibGVQcmVzZXRzKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1wcmVzZXQtY29udHJvbFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwdC1wcmVzZXQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiYm9va21hcmtcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5WaWV3Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LXByZXNldC1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYWN0aXZlUHJlc2V0SWQoKVwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlbGVjdFByZXNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3QgcmVwb3J0IHZpZXcgcHJlc2V0XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZGVmYXVsdFwiPkRlZmF1bHQgVmlldzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgQGZvciAocHJlc2V0IG9mIHNhdmVkUHJlc2V0cygpOyB0cmFjayBwcmVzZXQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwicHJlc2V0LmlkXCI+e3sgcHJlc2V0Lm5hbWUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWJ0bi1zYXZlLXZpZXdcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TYXZlUHJlc2V0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIlNhdmUgY3VycmVudCBncmlkIHZpZXcgb3IgbWFuYWdlIHByZXNldHNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwicGx1c1wiIFtzaXplXT1cIjExXCIgLz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlNhdmUgVmlldzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEV4cG9ydCBBY3Rpb25zIC0tPlxuICAgICAgICAgIEBpZiAoc2hvd0V4cG9ydCgpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXRvb2xiYXItcmlnaHRcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWV4cG9ydC1idG4gcnB0LWV4cG9ydC1leGNlbFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRXhwb3J0RXhjZWwoKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFyZWNvcmRDb3VudCgpXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkV4cG9ydCByZXN1bHQgdGFibGUgdG8gRXhjZWwgc3ByZWFkc2hlZXQgKC54bHMpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZmlsZS10ZXh0XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPkV4Y2VsPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LWV4cG9ydC1idG4gcnB0LWV4cG9ydC1jc3ZcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkV4cG9ydENzdigpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXJlY29yZENvdW50KClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwb3J0IHJlc3VsdCB0YWJsZSB0byBDU1YgZmlsZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImRvd25sb2FkXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPkNTVjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJwdC1leHBvcnQtYnRuIHJwdC1leHBvcnQtcHJpbnRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblByaW50UmVwb3J0KClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhcmVjb3JkQ291bnQoKVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJQcmludCByZXBvcnQgd2l0aCBicmFuZGVkIGxheW91dFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInByaW50ZXJcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+UHJpbnQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBDb3JlIFJ1bnRpbWUgRW5naW5lIC0tPlxuICAgICAgPHJwdC1yZXBvcnQtcnVudGltZVxuICAgICAgICAjcnVudGltZVJlZlxuICAgICAgICBbcmVwb3J0SWRdPVwiaWQoKVwiXG4gICAgICAgIFtyZXBvcnRdPVwiY3VycmVudERlZmluaXRpb24oKVwiXG4gICAgICAgIChyb3dBY3Rpb25UcmlnZ2VyZWQpPVwib25Sb3dBY3Rpb25UcmlnZ2VyZWQoJGV2ZW50KVwiXG4gICAgICAgIChncmlkU3RhdGVDaGFuZ2UpPVwib25HcmlkU3RhdGVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAoZXhwb3J0UmVxdWVzdGVkKT1cImV4cG9ydFJlcXVlc3RlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAocHJpbnRSZXF1ZXN0ZWQpPVwicHJpbnRSZXF1ZXN0ZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgIC8+XG5cbiAgICAgIDwhLS0gU2F2ZSBWaWV3IFByZXNldCBNb2RhbCAtLT5cbiAgICAgIEBpZiAoaXNTYXZlUHJlc2V0TW9kYWxPcGVuKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1tb2RhbC1iYWNrZHJvcFwiIChjbGljayk9XCJjbG9zZVNhdmVQcmVzZXRNb2RhbCgpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbW9kYWwtZGlhbG9nXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbD1cIlNhdmUgVmlldyBQcmVzZXRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1tb2RhbC1oZWFkZXItdGl0bGVcIj5cbiAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJib29rbWFya1wiIFtzaXplXT1cIjE2XCIgLz5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzPVwicnB0LW1vZGFsLXRpdGxlXCI+Q3VzdG9tIFZpZXcgUHJlc2V0czwvaDQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnB0LW1vZGFsLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlU2F2ZVByZXNldE1vZGFsKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2UgbW9kYWxcIj7inJU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwicnB0LW1vZGFsLWhpbnRcIj5cbiAgICAgICAgICAgICAgU2F2ZSB5b3VyIGFjdGl2ZSBjb2x1bW4gb3JkZXJpbmcsIHdpZHRocywgc29ydGluZ3MsIGFuZCBmaWx0ZXJzIGludG8gYSByZXVzYWJsZSB2aWV3IHByZXNldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycHQtZmllbGQtbGFiZWxcIj5OZXcgVmlldyBOYW1lPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicnB0LW1vZGFsLWlucHV0XCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gSGlnaCBWYWx1ZSBUcmFuc2FjdGlvbnMgLSBRM1wiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwibmV3UHJlc2V0TmFtZSgpXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJuZXdQcmVzZXROYW1lLnNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzYXZlQ3VycmVudFByZXNldCgpXCJcbiAgICAgICAgICAgICAgICBhdXRvZm9jdXNcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEV4aXN0aW5nIFByZXNldHMgTWFuYWdlbWVudCBMaXN0IC0tPlxuICAgICAgICAgICAgQGlmIChzYXZlZFByZXNldHMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZXhpc3RpbmctcHJlc2V0c1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWV4aXN0aW5nLWxhYmVsXCI+U2F2ZWQgVmlld3MgaW4gdGhpcyByZXBvcnQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtcHJlc2V0cy1saXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChwcmVzZXQgb2Ygc2F2ZWRQcmVzZXRzKCk7IHRyYWNrIHByZXNldC5pZCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXNldC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LXByZXNldC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1wcmVzZXQtcm93LW5hbWVcIj57eyBwcmVzZXQubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJlc2V0LmlkID09PSBhY3RpdmVQcmVzZXRJZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LXByZXNldC1hY3RpdmUtdGFnXCI+QWN0aXZlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtYnRuLWRlbC1wcmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVByZXNldChwcmVzZXQuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRGVsZXRlIHZpZXcgcHJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJEZWxldGUgdmlldyBwcmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwidHJhc2hcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LW1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycHQtYnRuLWNhbmNlbFwiIChjbGljayk9XCJjbG9zZVNhdmVQcmVzZXRNb2RhbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInJwdC1idG4tY29uZmlybVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbmV3UHJlc2V0TmFtZSgpLnRyaW0oKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzYXZlQ3VycmVudFByZXNldCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgU2F2ZSBWaWV3XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ycHQtZm9udC1mYW1pbHksIGluaGVyaXQpO1xuICAgIH1cbiAgICAucnB0LWZhY2FkZS1jb250YWluZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIC5ycHQtZmFjYWRlLXRvb2xiYXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBwYWRkaW5nOiAxMHB4IDE2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlci1zdWJ0bGUsICNlMmU4ZjApO1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtbGcsIDhweCk7XG4gICAgICBib3gtc2hhZG93OiB2YXIoLS1ycHQtYm94LXNoYWRvdy14cywgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4wNCkpO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTRweDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICB9XG4gICAgLnJwdC10b29sYmFyLWxlZnQsIC5ycHQtdG9vbGJhci1yaWdodCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogMTBweDtcbiAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICB9XG4gICAgLnJwdC1yZXBvcnQtdGl0bGUtYmFkZ2Uge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgICAgcGFkZGluZy1yaWdodDogNHB4O1xuICAgIH1cbiAgICAucnB0LXRpdGxlLWRvdCB7XG4gICAgICB3aWR0aDogOHB4O1xuICAgICAgaGVpZ2h0OiA4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgfVxuICAgIC5ycHQtcmVjb3JkLWNvdW50LWNoaXAge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA1cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICM0NzU1Njk7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIHBhZGRpbmc6IDNweCA4cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1mdWxsLCA5OTk5cHgpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICB9XG4gICAgLnJwdC1jaGlwLWRvdCB7XG4gICAgICB3aWR0aDogNnB4O1xuICAgICAgaGVpZ2h0OiA2cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiAjMTBiOTgxO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1jb250cm9sIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA2cHg7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgcGFkZGluZzogM3B4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2UyZThmMDtcbiAgICB9XG4gICAgLnJwdC1wcmVzZXQtbGFiZWwge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA0cHg7XG4gICAgICBmb250LXNpemU6IDAuNzI1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1zZWxlY3Qge1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLXNtLCA0cHgpO1xuICAgICAgcGFkZGluZzogM3B4IDhweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1wcmVzZXQtc2VsZWN0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWZvY3VzLCByZ2JhKDM3LCA5OSwgMjM1LCAwLjI1KSk7XG4gICAgfVxuICAgIC5ycHQtYnRuLXNhdmUtdmlldyB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LWxpZ2h0LCAjZWZmNmZmKTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNiZmRiZmU7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgZm9udC1zaXplOiAwLjcyNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBwYWRkaW5nOiAzcHggOHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMtc20sIDRweCk7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAucnB0LWJ0bi1zYXZlLXZpZXc6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2RiZWFmZTtcbiAgICAgIGJvcmRlci1jb2xvcjogIzkzYzVmZDtcbiAgICB9XG4gICAgLnJwdC1leHBvcnQtYnRuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcnB0LWJvcmRlci1yYWRpdXMsIDZweCk7XG4gICAgICBwYWRkaW5nOiA1cHggMTJweDtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlO1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1idG46ZGlzYWJsZWQge1xuICAgICAgb3BhY2l0eTogMC40NTtcbiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWV4Y2VsIHtcbiAgICAgIGJhY2tncm91bmQ6ICNmMGZkZjQ7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjYmJmN2QwO1xuICAgICAgY29sb3I6ICMxNTgwM2Q7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWV4Y2VsOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJhY2tncm91bmQ6ICNkY2ZjZTc7XG4gICAgICBib3JkZXItY29sb3I6ICM4NmVmYWM7XG4gICAgfVxuICAgIC5ycHQtZXhwb3J0LWNzdiB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGNvbG9yOiAjMzM0MTU1O1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1jc3Y6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogI2YxZjVmOTtcbiAgICAgIGJvcmRlci1jb2xvcjogIzk0YTNiODtcbiAgICAgIGNvbG9yOiAjMGYxNzJhO1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1wcmludCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZWVmMmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2M3ZDJmZTtcbiAgICAgIGNvbG9yOiAjNDMzOGNhO1xuICAgIH1cbiAgICAucnB0LWV4cG9ydC1wcmludDpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTBlN2ZmO1xuICAgICAgYm9yZGVyLWNvbG9yOiAjYTViNGZjO1xuICAgIH1cbiAgICAvKiBNb2RhbCAqL1xuICAgIC5ycHQtbW9kYWwtYmFja2Ryb3Age1xuICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgaW5zZXQ6IDA7XG4gICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE1LCAyMywgNDIsIDAuNDUpO1xuICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDZweCk7XG4gICAgICB6LWluZGV4OiAxMTAwO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWRpYWxvZyB7XG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICB0b3A6IDUwJTtcbiAgICAgIGxlZnQ6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgd2lkdGg6IG1pbig0NjBweCwgOTJ2dyk7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLWxnLCA4cHgpO1xuICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDI1cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMTUpLCAwIDhweCAxMHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAgICAgei1pbmRleDogMTEwMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGFuaW1hdGlvbjogcnB0LW1vZGFsLXBvcCAxNjBtcyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcbiAgICB9XG4gICAgQGtleWZyYW1lcyBycHQtbW9kYWwtcG9wIHtcbiAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNDYlKSBzY2FsZSgwLjk3KTsgfVxuICAgICAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgxKTsgfVxuICAgIH1cbiAgICAucnB0LW1vZGFsLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDE0cHggMThweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1oZWFkZXItdGl0bGUge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgIH1cbiAgICAucnB0LW1vZGFsLXRpdGxlIHtcbiAgICAgIGZvbnQtc2l6ZTogMC45NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBjb2xvcjogIzBmMTcyYTtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1jbG9zZSB7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGNvbG9yOiAjNjQ3NDhiO1xuICAgICAgZm9udC1zaXplOiAxLjFyZW07XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB3aWR0aDogMjhweDtcbiAgICAgIGhlaWdodDogMjhweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1jbG9zZTpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZTJlOGYwO1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtYm9keSB7XG4gICAgICBwYWRkaW5nOiAxOHB4O1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWhpbnQge1xuICAgICAgZm9udC1zaXplOiAwLjhyZW07XG4gICAgICBjb2xvcjogIzY0NzQ4YjtcbiAgICAgIG1hcmdpbjogMCAwIDE2cHggMDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ1O1xuICAgIH1cbiAgICAucnB0LWlucHV0LWdyb3VwIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgfVxuICAgIC5ycHQtZmllbGQtbGFiZWwge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICMzMzQxNTU7XG4gICAgICBtYXJnaW4tYm90dG9tOiA2cHg7XG4gICAgfVxuICAgIC5ycHQtbW9kYWwtaW5wdXQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgcGFkZGluZzogOHB4IDEycHg7XG4gICAgICBmb250LXNpemU6IDAuODVyZW07XG4gICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1tb2RhbC1pbnB1dDpmb2N1cyB7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1wcmltYXJ5LCAjMjU2M2ViKTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeS1mb2N1cywgcmdiYSgzNywgOTksIDIzNSwgMC4yNSkpO1xuICAgIH1cbiAgICAucnB0LWV4aXN0aW5nLXByZXNldHMge1xuICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlMmU4ZjA7XG4gICAgICBwYWRkaW5nLXRvcDogMTJweDtcbiAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICB9XG4gICAgLnJwdC1leGlzdGluZy1sYWJlbCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIGZvbnQtc2l6ZTogMC43MjVyZW07XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6ICM2NDc0OGI7XG4gICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xuICAgIH1cbiAgICAucnB0LXByZXNldHMtbGlzdCB7XG4gICAgICBtYXgtaGVpZ2h0OiAxNDBweDtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogNnB4O1xuICAgIH1cbiAgICAucnB0LXByZXNldC1yb3cge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBwYWRkaW5nOiA2cHggMTBweDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIH1cbiAgICAucnB0LXByZXNldC1pbmZvIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGdhcDogOHB4O1xuICAgIH1cbiAgICAucnB0LXByZXNldC1yb3ctbmFtZSB7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiAjMWUyOTNiO1xuICAgIH1cbiAgICAucnB0LXByZXNldC1hY3RpdmUtdGFnIHtcbiAgICAgIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBiYWNrZ3JvdW5kOiAjZGJlYWZlO1xuICAgICAgY29sb3I6ICMxZDRlZDg7XG4gICAgICBwYWRkaW5nOiAxcHggNnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgIH1cbiAgICAucnB0LWJ0bi1kZWwtcHJlc2V0IHtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgY29sb3I6ICM5NGEzYjg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICBwYWRkaW5nOiA0cHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtYnRuLWRlbC1wcmVzZXQ6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogI2ZlZTJlMjtcbiAgICAgIGNvbG9yOiAjZGMyNjI2O1xuICAgIH1cbiAgICAucnB0LW1vZGFsLWZvb3RlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgICBnYXA6IDEwcHg7XG4gICAgICBwYWRkaW5nOiAxMnB4IDE4cHg7XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2UyZThmMDtcbiAgICAgIGJhY2tncm91bmQ6ICNmOGZhZmM7XG4gICAgfVxuICAgIC5ycHQtYnRuLWNhbmNlbCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgcGFkZGluZzogNnB4IDE0cHg7XG4gICAgICBmb250LXNpemU6IDAuNzc1cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGNvbG9yOiAjNDc1NTY5O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtYnRuLWNhbmNlbDpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjFmNWY5O1xuICAgICAgY29sb3I6ICMwZjE3MmE7XG4gICAgfVxuICAgIC5ycHQtYnRuLWNvbmZpcm0ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgY29sb3I6ICNmZmZmZmY7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIHBhZGRpbmc6IDZweCAxNnB4O1xuICAgICAgZm9udC1zaXplOiAwLjc3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMTIwbXMgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1idG4tY29uZmlybTpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeS1ob3ZlciwgIzFkNGVkOCk7XG4gICAgfVxuICAgIC5ycHQtYnRuLWNvbmZpcm06ZGlzYWJsZWQge1xuICAgICAgb3BhY2l0eTogMC41O1xuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUnB0UmVwb3J0Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBleHBvcnRTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydEV4cG9ydFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlcnNpc3RlbmNlID0gaW5qZWN0KFJlcG9ydFBlcnNpc3RlbmNlQWRhcHRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBpZCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgcmVwb3J0ID0gaW5wdXQ8UmVwb3J0RGVmaW5pdGlvbiB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBwYXJhbWV0ZXJzID0gaW5wdXQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHt9KTtcbiAgcmVhZG9ubHkgc2hvd0V4cG9ydCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBlbmFibGVQcmVzZXRzID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGF1dG9FeGVjdXRlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgcmVhZG9ubHkgcm93Q2xpY2sgPSBvdXRwdXQ8e1xuICAgIHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgYWN0aW9uPzogR3JpZFJvd0NsaWNrQWN0aW9uO1xuICB9PigpO1xuICByZWFkb25seSBkYXRhTG9hZGVkID0gb3V0cHV0PHVua25vd25bXT4oKTtcbiAgcmVhZG9ubHkgZ3JpZFN0YXRlQ2hhbmdlID0gb3V0cHV0PGFueT4oKTtcbiAgcmVhZG9ubHkgcHJlc2V0U2F2ZWQgPSBvdXRwdXQ8eyBuYW1lOiBzdHJpbmc7IHByZXNldDogUmVwb3J0Vmlld1ByZXNldCB9PigpO1xuICByZWFkb25seSBwcmVzZXRDaGFuZ2UgPSBvdXRwdXQ8UmVwb3J0Vmlld1ByZXNldCB8IG51bGw+KCk7XG4gIHJlYWRvbmx5IGV4cG9ydFJlcXVlc3RlZCA9IG91dHB1dDxhbnk+KCk7XG4gIHJlYWRvbmx5IHByaW50UmVxdWVzdGVkID0gb3V0cHV0PGFueT4oKTtcblxuICByZWFkb25seSBydW50aW1lQ29tcG9uZW50ID0gdmlld0NoaWxkKFJlcG9ydFJ1bnRpbWVDb21wb25lbnQpO1xuXG4gIC8vIFByZXNldCBzdGF0ZXNcbiAgcmVhZG9ubHkgYWN0aXZlUHJlc2V0SWQgPSBzaWduYWw8c3RyaW5nPignZGVmYXVsdCcpO1xuICByZWFkb25seSBpc1NhdmVQcmVzZXRNb2RhbE9wZW4gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBuZXdQcmVzZXROYW1lID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICByZWFkb25seSBsYXRlc3RHcmlkU3RhdGUgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgY3VzdG9tUHJlc2V0cyA9IHNpZ25hbDxSZXBvcnRWaWV3UHJlc2V0W10+KFtdKTtcblxuICByZWFkb25seSBjdXJyZW50RGVmaW5pdGlvbiA9IGNvbXB1dGVkPFJlcG9ydERlZmluaXRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucmVwb3J0KCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFjdGl2ZURlZmluaXRpb24gPSBjb21wdXRlZDxSZXBvcnREZWZpbml0aW9uIHwgbnVsbD4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9ydCgpID8/IHRoaXMucnVudGltZUNvbXBvbmVudCgpPy5jdXJyZW50RGVmaW5pdGlvbigpID8/IG51bGw7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHJlY29yZENvdW50ID0gY29tcHV0ZWQ8bnVtYmVyPigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucnVudGltZUNvbXBvbmVudCgpPy5yZXN1bHREYXRhKCk/Lmxlbmd0aCA/PyAwO1xuICB9KTtcblxuICByZWFkb25seSBzaG93VG9vbGJhciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5zaG93RXhwb3J0KCkgfHwgdGhpcy5lbmFibGVQcmVzZXRzKCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHNhdmVkUHJlc2V0cyA9IGNvbXB1dGVkPFJlcG9ydFZpZXdQcmVzZXRbXT4oKCkgPT4ge1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGNvbnN0IGluaXRpYWxQcmVzZXRzID0gKChkZWY/LmdyaWQ/Lm9wdGlvbnMgYXMgYW55KT8ucHJlc2V0cyBhcyBSZXBvcnRWaWV3UHJlc2V0W10pID8/IFtdO1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZXBvcnRWaWV3UHJlc2V0PigpO1xuICAgIGZvciAoY29uc3QgcCBvZiBpbml0aWFsUHJlc2V0cykge1xuICAgICAgaWYgKHAgJiYgcC5pZCkgbWFwLnNldChwLmlkLCBwKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwIG9mIHRoaXMuY3VzdG9tUHJlc2V0cygpKSB7XG4gICAgICBpZiAocCAmJiBwLmlkKSBtYXAuc2V0KHAuaWQsIHApO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShtYXAudmFsdWVzKCkpO1xuICB9KTtcblxuICBvblJvd0FjdGlvblRyaWdnZXJlZChldmVudDoge1xuICAgIGFjdGlvbjogR3JpZFJvd0NsaWNrQWN0aW9uO1xuICAgIHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiB2b2lkIHtcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQoe1xuICAgICAgcm93OiBldmVudC5yb3csXG4gICAgICBwYXJhbWV0ZXJzOiBldmVudC5wYXJhbWV0ZXJzLFxuICAgICAgYWN0aW9uOiBldmVudC5hY3Rpb24sXG4gICAgfSk7XG4gIH1cblxuICBvbkdyaWRTdGF0ZUNoYW5nZWQoc3RhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubGF0ZXN0R3JpZFN0YXRlLnNldChzdGF0ZSk7XG4gICAgdGhpcy5ncmlkU3RhdGVDaGFuZ2UuZW1pdChzdGF0ZSk7XG4gIH1cblxuICBvblNlbGVjdFByZXNldChwcmVzZXRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQcmVzZXRJZC5zZXQocHJlc2V0SWQpO1xuICAgIGlmIChwcmVzZXRJZCA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICB0aGlzLnByZXNldENoYW5nZS5lbWl0KG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXNldCA9IHRoaXMuc2F2ZWRQcmVzZXRzKCkuZmluZCgocCkgPT4gcC5pZCA9PT0gcHJlc2V0SWQpO1xuICAgIGlmIChwcmVzZXQpIHtcbiAgICAgIGlmIChwcmVzZXQuZ3JpZFN0YXRlKSB7XG4gICAgICAgIHRoaXMubGF0ZXN0R3JpZFN0YXRlLnNldChwcmVzZXQuZ3JpZFN0YXRlKTtcbiAgICAgICAgdGhpcy5ncmlkU3RhdGVDaGFuZ2UuZW1pdChwcmVzZXQuZ3JpZFN0YXRlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJlc2V0Q2hhbmdlLmVtaXQocHJlc2V0KTtcbiAgICB9XG4gIH1cblxuICBjb25maXJtU2F2ZVByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnNhdmVDdXJyZW50UHJlc2V0KCk7XG4gIH1cblxuICBleHBvcnRFeGNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uRXhwb3J0RXhjZWwoKTtcbiAgfVxuXG4gIGV4cG9ydENzdigpOiB2b2lkIHtcbiAgICB0aGlzLm9uRXhwb3J0Q3N2KCk7XG4gIH1cblxuICBwcmludCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uUHJpbnRSZXBvcnQoKTtcbiAgfVxuXG4gIG9wZW5TYXZlUHJlc2V0TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5uZXdQcmVzZXROYW1lLnNldCgnJyk7XG4gICAgdGhpcy5pc1NhdmVQcmVzZXRNb2RhbE9wZW4uc2V0KHRydWUpO1xuICB9XG5cbiAgY2xvc2VTYXZlUHJlc2V0TW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5pc1NhdmVQcmVzZXRNb2RhbE9wZW4uc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHNhdmVDdXJyZW50UHJlc2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5ld1ByZXNldE5hbWUoKS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG5cbiAgICBjb25zdCBwcmVzZXRJZCA9IGBwcmVzZXRfJHtEYXRlLm5vdygpfWA7XG4gICAgY29uc3QgbmV3UHJlc2V0OiBSZXBvcnRWaWV3UHJlc2V0ID0ge1xuICAgICAgaWQ6IHByZXNldElkLFxuICAgICAgbmFtZSxcbiAgICAgIGdyaWRTdGF0ZTogdGhpcy5sYXRlc3RHcmlkU3RhdGUoKSA/PyB7fSxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG5cbiAgICBjb25zdCBkZWYgPSB0aGlzLmFjdGl2ZURlZmluaXRpb24oKTtcbiAgICBpZiAoZGVmICYmIGRlZi5ncmlkKSB7XG4gICAgICBpZiAoIWRlZi5ncmlkLm9wdGlvbnMpIGRlZi5ncmlkLm9wdGlvbnMgPSB7fTtcbiAgICAgIGNvbnN0IGN1cnJlbnRQcmVzZXRzOiBSZXBvcnRWaWV3UHJlc2V0W10gPSAoZGVmLmdyaWQub3B0aW9ucyBhcyBhbnkpLnByZXNldHMgPz8gW107XG4gICAgICAoZGVmLmdyaWQub3B0aW9ucyBhcyBhbnkpLnByZXNldHMgPSBbLi4uY3VycmVudFByZXNldHMsIG5ld1ByZXNldF07XG5cbiAgICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlICYmIGRlZi5pZCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlLnNhdmUoZGVmKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHt9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7fSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jdXN0b21QcmVzZXRzLnVwZGF0ZSgocHJldikgPT4gWy4uLnByZXYsIG5ld1ByZXNldF0pO1xuICAgIHRoaXMuYWN0aXZlUHJlc2V0SWQuc2V0KHByZXNldElkKTtcbiAgICB0aGlzLnByZXNldFNhdmVkLmVtaXQoeyBuYW1lLCBwcmVzZXQ6IG5ld1ByZXNldCB9KTtcbiAgICB0aGlzLmNsb3NlU2F2ZVByZXNldE1vZGFsKCk7XG4gIH1cblxuICBkZWxldGVQcmVzZXQocHJlc2V0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChwcmVzZXRJZCA9PT0gJ2RlZmF1bHQnKSByZXR1cm47XG5cbiAgICB0aGlzLmN1c3RvbVByZXNldHMudXBkYXRlKChwcmV2KSA9PiBwcmV2LmZpbHRlcigocCkgPT4gcC5pZCAhPT0gcHJlc2V0SWQpKTtcblxuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGlmIChkZWYgJiYgZGVmLmdyaWQgJiYgZGVmLmdyaWQub3B0aW9ucykge1xuICAgICAgY29uc3QgY3VycmVudCA9ICgoZGVmLmdyaWQub3B0aW9ucyBhcyBhbnkpLnByZXNldHMgYXMgUmVwb3J0Vmlld1ByZXNldFtdKSA/PyBbXTtcbiAgICAgIChkZWYuZ3JpZC5vcHRpb25zIGFzIGFueSkucHJlc2V0cyA9IGN1cnJlbnQuZmlsdGVyKChwKSA9PiBwLmlkICE9PSBwcmVzZXRJZCk7XG5cbiAgICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlICYmIGRlZi5pZCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlLnNhdmUoZGVmKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICgpID0+IHt9LFxuICAgICAgICAgIGVycm9yOiAoKSA9PiB7fSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlUHJlc2V0SWQoKSA9PT0gcHJlc2V0SWQpIHtcbiAgICAgIHRoaXMub25TZWxlY3RQcmVzZXQoJ2RlZmF1bHQnKTtcbiAgICB9XG4gIH1cblxuICBvbkV4cG9ydEV4Y2VsKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8ucmVzdWx0RGF0YSgpO1xuICAgIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGNvbnN0IGNvbHMgPSBkZWY/LmdyaWQ/LmNvbHVtbnMubWFwKChjKSA9PiAoeyBmaWVsZDogYy5maWVsZCwgaGVhZGVyOiBjLmxhYmVsIH0pKTtcbiAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0RXhjZWwoZGF0YSBhcyBhbnksIHtcbiAgICAgIGZpbGVOYW1lOiBkZWY/Lm5hbWUgPyBgJHtkZWYubmFtZX0ueGxzYCA6ICdyZXBvcnQueGxzJyxcbiAgICAgIGNvbHVtbnM6IGNvbHMsXG4gICAgICBicmFuZGVkSGVhZGVyOiB7IHJlcG9ydFRpdGxlOiBkZWY/Lm5hbWUgfSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uRXhwb3J0Q3N2KCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8ucmVzdWx0RGF0YSgpO1xuICAgIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGNvbnN0IGNvbHMgPSBkZWY/LmdyaWQ/LmNvbHVtbnMubWFwKChjKSA9PiAoeyBmaWVsZDogYy5maWVsZCwgaGVhZGVyOiBjLmxhYmVsIH0pKTtcbiAgICB0aGlzLmV4cG9ydFNlcnZpY2UuZXhwb3J0Q3N2KGRhdGEgYXMgYW55LCB7XG4gICAgICBmaWxlTmFtZTogZGVmPy5uYW1lID8gYCR7ZGVmLm5hbWV9LmNzdmAgOiAncmVwb3J0LmNzdicsXG4gICAgICBjb2x1bW5zOiBjb2xzLFxuICAgICAgYnJhbmRlZEhlYWRlcjogeyByZXBvcnRUaXRsZTogZGVmPy5uYW1lIH0sXG4gICAgfSk7XG4gIH1cblxuICBvblByaW50UmVwb3J0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJ1bnRpbWVDb21wb25lbnQoKT8ucmVzdWx0RGF0YSgpO1xuICAgIGlmICghZGF0YSB8fCAhQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGRlZiA9IHRoaXMuYWN0aXZlRGVmaW5pdGlvbigpO1xuICAgIGNvbnN0IGNvbHMgPSBkZWY/LmdyaWQ/LmNvbHVtbnMubWFwKChjKSA9PiAoeyBmaWVsZDogYy5maWVsZCwgaGVhZGVyOiBjLmxhYmVsIH0pKTtcbiAgICB0aGlzLmV4cG9ydFNlcnZpY2UucHJpbnRSZXBvcnQoZGF0YSBhcyBhbnksIHtcbiAgICAgIHRpdGxlOiBkZWY/Lm5hbWUgfHwgJ1JlcG9ydCBQcmludCBQcmV2aWV3JyxcbiAgICAgIGNvbHVtbnM6IGNvbHMsXG4gICAgICBicmFuZGVkSGVhZGVyOiB7IHJlcG9ydFRpdGxlOiBkZWY/Lm5hbWUgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|