@firestitch/report 18.5.0 → 18.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +2 -1
- package/app/reports/components/component-list/component-list.component.d.ts +3 -7
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +5 -4
- package/app/reports/components/report-component/report-component.component.d.ts +7 -6
- package/app/reports/components/timezone-select/timezone-select.component.d.ts +4 -6
- package/app/reports/consts/report-week.const.d.ts +2 -0
- package/app/reports/data/report-ai-chat.data.d.ts +12 -0
- package/app/reports/data/report.data.d.ts +3 -3
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +6 -6
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +5 -0
- package/app/reports/export/report-export-collector.service.d.ts +14 -2
- package/app/reports/export/report-pdf.service.d.ts +14 -1
- package/app/reports/export/report-pptx.service.d.ts +2 -1
- package/app/reports/format.d.ts +8 -1
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +18 -2
- package/app/reports/option-builder.d.ts +2 -1
- package/app/reports/pipes/report-date.pipe.d.ts +7 -0
- package/app/reports/report-filter-items.d.ts +5 -0
- package/app/reports/report-url-state.d.ts +15 -0
- package/app/reports/services/report-filter-state.service.d.ts +27 -2
- package/app/reports/theme/typography.d.ts +2 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +16 -8
- package/app/reports/views/report/report.component.d.ts +6 -6
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +7 -4
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +34 -131
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +57 -44
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +57 -35
- package/esm2022/app/reports/components/timezone-select/timezone-select.component.mjs +23 -23
- package/esm2022/app/reports/consts/report-week.const.mjs +7 -0
- package/esm2022/app/reports/data/report-ai-chat.data.mjs +25 -0
- package/esm2022/app/reports/data/report.data.mjs +22 -9
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +25 -26
- package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +2 -2
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +38 -13
- package/esm2022/app/reports/export/report-export-collector.service.mjs +95 -29
- package/esm2022/app/reports/export/report-export.service.mjs +11 -8
- package/esm2022/app/reports/export/report-pdf.service.mjs +245 -84
- package/esm2022/app/reports/export/report-pptx.service.mjs +64 -48
- package/esm2022/app/reports/format.mjs +126 -9
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/option-builder.mjs +146 -15
- package/esm2022/app/reports/pipes/report-date.pipe.mjs +21 -0
- package/esm2022/app/reports/report-filter-items.mjs +42 -10
- package/esm2022/app/reports/report-url-state.mjs +148 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +339 -64
- package/esm2022/app/reports/theme/echarts.mjs +6 -5
- package/esm2022/app/reports/theme/typography.mjs +6 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +198 -90
- package/esm2022/app/reports/views/report/report.component.mjs +68 -62
- package/fesm2022/{firestitch-report-echarts-CtKYuRcT.mjs → firestitch-report-echarts-Djtmaxj1.mjs} +6 -6
- package/fesm2022/firestitch-report-echarts-Djtmaxj1.mjs.map +1 -0
- package/fesm2022/{firestitch-report-firestitch-report-Df1IXrEs.mjs → firestitch-report-firestitch-report-D3zseBZc.mjs} +1781 -738
- package/fesm2022/firestitch-report-firestitch-report-D3zseBZc.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/app/reports/dialogs/report-settings/report-settings-default.d.ts +0 -2
- package/esm2022/app/reports/dialogs/report-settings/report-settings-default.mjs +0 -22
- package/fesm2022/firestitch-report-echarts-CtKYuRcT.mjs.map +0 -1
- package/fesm2022/firestitch-report-firestitch-report-Df1IXrEs.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, computed, signal, } from '@angular/core';
|
|
2
2
|
import { ControlContainer, FormsModule, NgForm } from '@angular/forms';
|
|
3
3
|
import { MatFormField, MatLabel } from '@angular/material/form-field';
|
|
4
4
|
import { MatOption } from '@angular/material/core';
|
|
@@ -10,41 +10,41 @@ import * as i1 from "@angular/forms";
|
|
|
10
10
|
import * as i2 from "@firestitch/form";
|
|
11
11
|
// Self-contained timezone picker for the report settings dialog. The IANA zone
|
|
12
12
|
// list comes from the browser (Intl.supportedValuesOf), so the package carries no
|
|
13
|
-
// dependency on any app timezone API.
|
|
13
|
+
// dependency on any app timezone API. It shows the zone it is given and never
|
|
14
|
+
// picks one itself: the dialog always seeds the zone the report uses, and that
|
|
15
|
+
// zone is listed even when the browser's list lacks it (some browsers leave
|
|
16
|
+
// 'UTC' out).
|
|
14
17
|
export class TimezoneSelectComponent {
|
|
15
18
|
placeholder = 'Timezone';
|
|
16
19
|
required = false;
|
|
17
20
|
disabled = false;
|
|
18
21
|
timezoneChange = new EventEmitter();
|
|
19
22
|
set timezone(value) {
|
|
20
|
-
if (value && value !== this._timezone) {
|
|
21
|
-
this._timezone
|
|
22
|
-
this.timezoneChange.emit(
|
|
23
|
+
if (value && value !== this._timezone()) {
|
|
24
|
+
this._timezone.set(value);
|
|
25
|
+
this.timezoneChange.emit(value);
|
|
23
26
|
}
|
|
24
27
|
}
|
|
25
28
|
get timezone() {
|
|
26
|
-
return this._timezone;
|
|
29
|
+
return this._timezone();
|
|
27
30
|
}
|
|
28
31
|
guid = guid();
|
|
29
|
-
timezones =
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
this.timezone = this._browserTimezone;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
// The browser's IANA zone list where available; fall back to at least the
|
|
39
|
-
// viewer's own zone so the control is never empty.
|
|
40
|
-
_supportedTimezones() {
|
|
32
|
+
timezones = computed(() => this._supportedTimezones(this._timezone()));
|
|
33
|
+
_timezone = signal('');
|
|
34
|
+
// The browser's IANA zone list where available, with the current value
|
|
35
|
+
// prepended when the list lacks it, so the select always shows the zone the
|
|
36
|
+
// report uses.
|
|
37
|
+
_supportedTimezones(current) {
|
|
41
38
|
const intl = Intl;
|
|
42
|
-
|
|
39
|
+
const zones = typeof intl.supportedValuesOf === 'function'
|
|
43
40
|
? intl.supportedValuesOf('timeZone')
|
|
44
|
-
: [
|
|
41
|
+
: [];
|
|
42
|
+
return current && !zones.includes(current)
|
|
43
|
+
? [current, ...zones]
|
|
44
|
+
: zones;
|
|
45
45
|
}
|
|
46
46
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimezoneSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
47
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TimezoneSelectComponent, isStandalone: true, selector: "fs-ai-report-timezone-select", inputs: { placeholder: "placeholder", required: "required", disabled: "disabled", timezone: "timezone" }, outputs: { timezoneChange: "timezoneChange" }, ngImport: i0, template: "<mat-form-field class=\"full-width\">\n <mat-label>{{placeholder}}</mat-label>\n <mat-select\n [(ngModel)]=\"timezone\"\n [fsFormRequired]=\"required\"\n [disabled]=\"disabled\"\n name=\"timezone_select_{{ guid }}\">\n @for (item of timezones; track item) {\n <mat-option [value]=\"item\">{{ item }}</mat-option>\n }\n </mat-select>\n</mat-form-field>\n", styles: [".full-width{width:100%}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { 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: "ngmodule", type: FsFormModule }, { kind: "directive", type: i2.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
47
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TimezoneSelectComponent, isStandalone: true, selector: "fs-ai-report-timezone-select", inputs: { placeholder: "placeholder", required: "required", disabled: "disabled", timezone: "timezone" }, outputs: { timezoneChange: "timezoneChange" }, ngImport: i0, template: "<mat-form-field class=\"full-width\">\n <mat-label>{{placeholder}}</mat-label>\n <mat-select\n [(ngModel)]=\"timezone\"\n [fsFormRequired]=\"required\"\n [disabled]=\"disabled\"\n name=\"timezone_select_{{ guid }}\">\n @for (item of timezones(); track item) {\n <mat-option [value]=\"item\">{{ item }}</mat-option>\n }\n </mat-select>\n</mat-form-field>\n", styles: [".full-width{width:100%}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { 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: "ngmodule", type: FsFormModule }, { kind: "directive", type: i2.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
48
48
|
}
|
|
49
49
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TimezoneSelectComponent, decorators: [{
|
|
50
50
|
type: Component,
|
|
@@ -55,7 +55,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
55
55
|
MatOption,
|
|
56
56
|
FormsModule,
|
|
57
57
|
FsFormModule,
|
|
58
|
-
], template: "<mat-form-field class=\"full-width\">\n <mat-label>{{placeholder}}</mat-label>\n <mat-select\n [(ngModel)]=\"timezone\"\n [fsFormRequired]=\"required\"\n [disabled]=\"disabled\"\n name=\"timezone_select_{{ guid }}\">\n @for (item of timezones; track item) {\n <mat-option [value]=\"item\">{{ item }}</mat-option>\n }\n </mat-select>\n</mat-form-field>\n", styles: [".full-width{width:100%}\n"] }]
|
|
58
|
+
], template: "<mat-form-field class=\"full-width\">\n <mat-label>{{placeholder}}</mat-label>\n <mat-select\n [(ngModel)]=\"timezone\"\n [fsFormRequired]=\"required\"\n [disabled]=\"disabled\"\n name=\"timezone_select_{{ guid }}\">\n @for (item of timezones(); track item) {\n <mat-option [value]=\"item\">{{ item }}</mat-option>\n }\n </mat-select>\n</mat-form-field>\n", styles: [".full-width{width:100%}\n"] }]
|
|
59
59
|
}], propDecorators: { placeholder: [{
|
|
60
60
|
type: Input
|
|
61
61
|
}], required: [{
|
|
@@ -67,4 +67,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
67
67
|
}], timezone: [{
|
|
68
68
|
type: Input
|
|
69
69
|
}] } });
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXpvbmUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jb21wb25lbnRzL3RpbWV6b25lLXNlbGVjdC90aW1lem9uZS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvdGltZXpvbmUtc2VsZWN0L3RpbWV6b25lLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEdBQ2xGLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXJELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFHaEQsK0VBQStFO0FBQy9FLGtGQUFrRjtBQUNsRiw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSxjQUFjO0FBaUJkLE1BQU0sT0FBTyx1QkFBdUI7SUFFbEIsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUN6QixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDaEIsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFFN0QsSUFBb0IsUUFBUSxDQUFDLEtBQWE7UUFDeEMsSUFBSSxLQUFLLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxJQUFJLEdBQVcsSUFBSSxFQUFFLENBQUM7SUFDYixTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXRFLFNBQVMsR0FBRyxNQUFNLENBQVMsRUFBRSxDQUFDLENBQUM7SUFFaEQsdUVBQXVFO0lBQ3ZFLDRFQUE0RTtJQUM1RSxlQUFlO0lBQ1AsbUJBQW1CLENBQUMsT0FBZTtRQUN6QyxNQUFNLElBQUksR0FBRyxJQUFvRSxDQUFDO1FBQ2xGLE1BQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixLQUFLLFVBQVU7WUFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUM7WUFDcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVQLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDWixDQUFDO3dHQW5DVSx1QkFBdUI7NEZBQXZCLHVCQUF1QixpUENsQ3BDLCtYQVlBLG1GRGNJLFlBQVksNExBQ1osUUFBUSxzREFDUixTQUFTLHdlQUNULFNBQVMsb0pBQ1QsV0FBVyw4VkFDWCxZQUFZLGdNQVRDLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOzs0RkFZeEQsdUJBQXVCO2tCQWhCbkMsU0FBUzsrQkFDRSw4QkFBOEIsaUJBR3pCLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLG1CQUNsRCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFFBQVE7d0JBQ1IsU0FBUzt3QkFDVCxTQUFTO3dCQUNULFdBQVc7d0JBQ1gsWUFBWTtxQkFDYjs4QkFJZSxXQUFXO3NCQUExQixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVyxjQUFjO3NCQUE5QixNQUFNO2dCQUVhLFFBQVE7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIGNvbXB1dGVkLCBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgRm9ybXNNb2R1bGUsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCwgTWF0TGFiZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdE9wdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgTWF0U2VsZWN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcblxuaW1wb3J0IHsgZ3VpZCB9IGZyb20gJ0BmaXJlc3RpdGNoL2NvbW1vbic7XG5pbXBvcnQgeyBGc0Zvcm1Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9mb3JtJztcblxuXG4vLyBTZWxmLWNvbnRhaW5lZCB0aW1lem9uZSBwaWNrZXIgZm9yIHRoZSByZXBvcnQgc2V0dGluZ3MgZGlhbG9nLiBUaGUgSUFOQSB6b25lXG4vLyBsaXN0IGNvbWVzIGZyb20gdGhlIGJyb3dzZXIgKEludGwuc3VwcG9ydGVkVmFsdWVzT2YpLCBzbyB0aGUgcGFja2FnZSBjYXJyaWVzIG5vXG4vLyBkZXBlbmRlbmN5IG9uIGFueSBhcHAgdGltZXpvbmUgQVBJLiBJdCBzaG93cyB0aGUgem9uZSBpdCBpcyBnaXZlbiBhbmQgbmV2ZXJcbi8vIHBpY2tzIG9uZSBpdHNlbGY6IHRoZSBkaWFsb2cgYWx3YXlzIHNlZWRzIHRoZSB6b25lIHRoZSByZXBvcnQgdXNlcywgYW5kIHRoYXRcbi8vIHpvbmUgaXMgbGlzdGVkIGV2ZW4gd2hlbiB0aGUgYnJvd3NlcidzIGxpc3QgbGFja3MgaXQgKHNvbWUgYnJvd3NlcnMgbGVhdmVcbi8vICdVVEMnIG91dCkuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1haS1yZXBvcnQtdGltZXpvbmUtc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RpbWV6b25lLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RpbWV6b25lLXNlbGVjdC5jb21wb25lbnQuc2NzcyddLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEZvcm1GaWVsZCxcbiAgICBNYXRMYWJlbCxcbiAgICBNYXRTZWxlY3QsXG4gICAgTWF0T3B0aW9uLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEZzRm9ybU1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGltZXpvbmVTZWxlY3RDb21wb25lbnQge1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlciA9ICdUaW1lem9uZSc7XG4gIEBJbnB1dCgpIHB1YmxpYyByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQE91dHB1dCgpIHB1YmxpYyB0aW1lem9uZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdGltZXpvbmUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gdGhpcy5fdGltZXpvbmUoKSkge1xuICAgICAgdGhpcy5fdGltZXpvbmUuc2V0KHZhbHVlKTtcbiAgICAgIHRoaXMudGltZXpvbmVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB0aW1lem9uZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90aW1lem9uZSgpO1xuICB9XG5cbiAgcHVibGljIGd1aWQ6IHN0cmluZyA9IGd1aWQoKTtcbiAgcHVibGljIHJlYWRvbmx5IHRpbWV6b25lcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3N1cHBvcnRlZFRpbWV6b25lcyh0aGlzLl90aW1lem9uZSgpKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdGltZXpvbmUgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgLy8gVGhlIGJyb3dzZXIncyBJQU5BIHpvbmUgbGlzdCB3aGVyZSBhdmFpbGFibGUsIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVcbiAgLy8gcHJlcGVuZGVkIHdoZW4gdGhlIGxpc3QgbGFja3MgaXQsIHNvIHRoZSBzZWxlY3QgYWx3YXlzIHNob3dzIHRoZSB6b25lIHRoZVxuICAvLyByZXBvcnQgdXNlcy5cbiAgcHJpdmF0ZSBfc3VwcG9ydGVkVGltZXpvbmVzKGN1cnJlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBpbnRsID0gSW50bCBhcyB1bmtub3duIGFzIHsgc3VwcG9ydGVkVmFsdWVzT2Y/OiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZ1tdIH07XG4gICAgY29uc3Qgem9uZXMgPSB0eXBlb2YgaW50bC5zdXBwb3J0ZWRWYWx1ZXNPZiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBpbnRsLnN1cHBvcnRlZFZhbHVlc09mKCd0aW1lWm9uZScpXG4gICAgICA6IFtdO1xuXG4gICAgcmV0dXJuIGN1cnJlbnQgJiYgIXpvbmVzLmluY2x1ZGVzKGN1cnJlbnQpXG4gICAgICA/IFtjdXJyZW50LCAuLi56b25lc11cbiAgICAgIDogem9uZXM7XG4gIH1cbn1cbiIsIjxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZ1bGwtd2lkdGhcIj5cbiAgPG1hdC1sYWJlbD57e3BsYWNlaG9sZGVyfX08L21hdC1sYWJlbD5cbiAgPG1hdC1zZWxlY3RcbiAgICBbKG5nTW9kZWwpXT1cInRpbWV6b25lXCJcbiAgICBbZnNGb3JtUmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgbmFtZT1cInRpbWV6b25lX3NlbGVjdF97eyBndWlkIH19XCI+XG4gICAgQGZvciAoaXRlbSBvZiB0aW1lem9uZXMoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW1cIj57eyBpdGVtIH19PC9tYXQtb3B0aW9uPlxuICAgIH1cbiAgPC9tYXQtc2VsZWN0PlxuPC9tYXQtZm9ybS1maWVsZD5cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Report weeks start on Monday. This is a rule, not a setting: the server's
|
|
2
|
+
// weekly time buckets (ReportTimeBucket::getPeriodStart() at the Week grain)
|
|
3
|
+
// and its relative date presets (ReportRelativeRangeEnum) both start the week
|
|
4
|
+
// on Monday, so the viewer's thisWeek/lastWeek presets must too, or a weekly
|
|
5
|
+
// chart's buckets would straddle the range its own filter names.
|
|
6
|
+
export const REPORT_WEEK_STARTS_ON = 1;
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXdlZWsuY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29uc3RzL3JlcG9ydC13ZWVrLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQVEsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5cbi8vIFJlcG9ydCB3ZWVrcyBzdGFydCBvbiBNb25kYXkuIFRoaXMgaXMgYSBydWxlLCBub3QgYSBzZXR0aW5nOiB0aGUgc2VydmVyJ3Ncbi8vIHdlZWtseSB0aW1lIGJ1Y2tldHMgKFJlcG9ydFRpbWVCdWNrZXQ6OmdldFBlcmlvZFN0YXJ0KCkgYXQgdGhlIFdlZWsgZ3JhaW4pXG4vLyBhbmQgaXRzIHJlbGF0aXZlIGRhdGUgcHJlc2V0cyAoUmVwb3J0UmVsYXRpdmVSYW5nZUVudW0pIGJvdGggc3RhcnQgdGhlIHdlZWtcbi8vIG9uIE1vbmRheSwgc28gdGhlIHZpZXdlcidzIHRoaXNXZWVrL2xhc3RXZWVrIHByZXNldHMgbXVzdCB0b28sIG9yIGEgd2Vla2x5XG4vLyBjaGFydCdzIGJ1Y2tldHMgd291bGQgc3RyYWRkbGUgdGhlIHJhbmdlIGl0cyBvd24gZmlsdGVyIG5hbWVzLlxuZXhwb3J0IGNvbnN0IFJFUE9SVF9XRUVLX1NUQVJUU19PTjogRGF5ID0gMTtcbiJdfQ==
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { FsAiChatData } from '@firestitch/ai';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
// The report view's chat gateway: the stock one, plus fields read at the
|
|
5
|
+
// moment each turn is sent and merged into that turn's body only. The chat's
|
|
6
|
+
// requestData can't carry them, because it is also the key of the conversation
|
|
7
|
+
// list, and a change there reloads the list and drops the open conversation.
|
|
8
|
+
//
|
|
9
|
+
// It relies on FsAiChatData.chatStream(basePath, body, config) being the one
|
|
10
|
+
// path a turn takes. Nothing else is overridden, so the conversation list and
|
|
11
|
+
// the create never see these fields. It stands in for a per-turn input on
|
|
12
|
+
// fs-ai-chat itself, and can be removed when @firestitch/ai ships one.
|
|
13
|
+
export class ReportAiChatData extends FsAiChatData {
|
|
14
|
+
// Set by the host view. A function, so it is read at send time.
|
|
15
|
+
turnData = () => ({});
|
|
16
|
+
chatStream(basePath, body, config = {}) {
|
|
17
|
+
return super.chatStream(basePath, { ...body, ...this.turnData() }, config);
|
|
18
|
+
}
|
|
19
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportAiChatData, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
20
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportAiChatData });
|
|
21
|
+
}
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportAiChatData, decorators: [{
|
|
23
|
+
type: Injectable
|
|
24
|
+
}] });
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWFpLWNoYXQuZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kYXRhL3JlcG9ydC1haS1jaGF0LmRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBVzlDLHlFQUF5RTtBQUN6RSw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsdUVBQXVFO0FBRXZFLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxZQUFZO0lBRWhELGdFQUFnRTtJQUN6RCxRQUFRLEdBQWtDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFNUMsVUFBVSxDQUFDLFFBQWdCLEVBQUUsSUFBb0IsRUFBRSxTQUEyQixFQUFFO1FBQzlGLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdFLENBQUM7d0dBUFUsZ0JBQWdCOzRHQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZzQWlDaGF0RGF0YSB9IGZyb20gJ0BmaXJlc3RpdGNoL2FpJztcblxuXG4vLyBUaGUgcGFyZW50J3Mgb3duIHBhcmFtZXRlciB0eXBlcywgc28gdGhlIG92ZXJyaWRlIGFsd2F5cyBtYXRjaGVzIHRoZVxuLy8gQGZpcmVzdGl0Y2gvYWkgYnVpbGQgaXQgZXh0ZW5kcyAoYSBsaW5rZWQgYnVpbGQgY2FycmllcyBpdHMgb3duXG4vLyBAZmlyZXN0aXRjaC9hcGksIHdob3NlIFJlcXVlc3RDb25maWcgaXMgYSBkaWZmZXJlbnQgdHlwZSkuXG50eXBlIENoYXRTdHJlYW1Cb2R5ID0gUGFyYW1ldGVyczxGc0FpQ2hhdERhdGFbJ2NoYXRTdHJlYW0nXT5bMV07XG50eXBlIENoYXRTdHJlYW1Db25maWcgPSBQYXJhbWV0ZXJzPEZzQWlDaGF0RGF0YVsnY2hhdFN0cmVhbSddPlsyXTtcbnR5cGUgQ2hhdFN0cmVhbSA9IFJldHVyblR5cGU8RnNBaUNoYXREYXRhWydjaGF0U3RyZWFtJ10+O1xuXG5cbi8vIFRoZSByZXBvcnQgdmlldydzIGNoYXQgZ2F0ZXdheTogdGhlIHN0b2NrIG9uZSwgcGx1cyBmaWVsZHMgcmVhZCBhdCB0aGVcbi8vIG1vbWVudCBlYWNoIHR1cm4gaXMgc2VudCBhbmQgbWVyZ2VkIGludG8gdGhhdCB0dXJuJ3MgYm9keSBvbmx5LiBUaGUgY2hhdCdzXG4vLyByZXF1ZXN0RGF0YSBjYW4ndCBjYXJyeSB0aGVtLCBiZWNhdXNlIGl0IGlzIGFsc28gdGhlIGtleSBvZiB0aGUgY29udmVyc2F0aW9uXG4vLyBsaXN0LCBhbmQgYSBjaGFuZ2UgdGhlcmUgcmVsb2FkcyB0aGUgbGlzdCBhbmQgZHJvcHMgdGhlIG9wZW4gY29udmVyc2F0aW9uLlxuLy9cbi8vIEl0IHJlbGllcyBvbiBGc0FpQ2hhdERhdGEuY2hhdFN0cmVhbShiYXNlUGF0aCwgYm9keSwgY29uZmlnKSBiZWluZyB0aGUgb25lXG4vLyBwYXRoIGEgdHVybiB0YWtlcy4gTm90aGluZyBlbHNlIGlzIG92ZXJyaWRkZW4sIHNvIHRoZSBjb252ZXJzYXRpb24gbGlzdCBhbmRcbi8vIHRoZSBjcmVhdGUgbmV2ZXIgc2VlIHRoZXNlIGZpZWxkcy4gSXQgc3RhbmRzIGluIGZvciBhIHBlci10dXJuIGlucHV0IG9uXG4vLyBmcy1haS1jaGF0IGl0c2VsZiwgYW5kIGNhbiBiZSByZW1vdmVkIHdoZW4gQGZpcmVzdGl0Y2gvYWkgc2hpcHMgb25lLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEFpQ2hhdERhdGEgZXh0ZW5kcyBGc0FpQ2hhdERhdGEge1xuXG4gIC8vIFNldCBieSB0aGUgaG9zdCB2aWV3LiBBIGZ1bmN0aW9uLCBzbyBpdCBpcyByZWFkIGF0IHNlbmQgdGltZS5cbiAgcHVibGljIHR1cm5EYXRhOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9ICgpID0+ICh7fSk7XG5cbiAgcHVibGljIG92ZXJyaWRlIGNoYXRTdHJlYW0oYmFzZVBhdGg6IHN0cmluZywgYm9keTogQ2hhdFN0cmVhbUJvZHksIGNvbmZpZzogQ2hhdFN0cmVhbUNvbmZpZyA9IHt9KTogQ2hhdFN0cmVhbSB7XG4gICAgcmV0dXJuIHN1cGVyLmNoYXRTdHJlYW0oYmFzZVBhdGgsIHsgLi4uYm9keSwgLi4udGhpcy50dXJuRGF0YSgpIH0sIGNvbmZpZyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -194,22 +194,35 @@ export class ReportData {
|
|
|
194
194
|
...config,
|
|
195
195
|
});
|
|
196
196
|
}
|
|
197
|
-
// Exports
|
|
198
|
-
//
|
|
199
|
-
// progress while
|
|
197
|
+
// Exports one component to CSV server-side: the file is what the screen
|
|
198
|
+
// shows (a chart or KPI as rendered, a list in full in the screen's order).
|
|
199
|
+
// The backend streams percentage progress while it writes.
|
|
200
|
+
//
|
|
201
|
+
// key: null on purpose, unlike the key: 'url' presigned-export pattern: the
|
|
202
|
+
// response also carries `notes`, the sentences saying how the file falls
|
|
203
|
+
// short of the full result, and the caller has to show them before it hands
|
|
204
|
+
// the url to FsProcess.download.
|
|
200
205
|
exportComponent(reportId, componentId, filters = [], state = {}, config = {}) {
|
|
201
206
|
return this._api.post(this._path(`${reportId}/components/${componentId}/export`), { filters, state }, {
|
|
202
|
-
key:
|
|
207
|
+
key: null,
|
|
203
208
|
...config,
|
|
204
209
|
});
|
|
205
210
|
}
|
|
206
211
|
// Exports EVERY component on the report — or on one page — server-side and
|
|
207
212
|
// resolves to a presigned URL for a zip of one CSV per component, foldered by
|
|
208
|
-
// page. `filters` carries the resolved values for
|
|
209
|
-
// each one picks out its own.
|
|
213
|
+
// page, plus an 'Export Notes.txt'. `filters` carries the resolved values for
|
|
214
|
+
// every component together; each one picks out its own. `frequency` is the
|
|
215
|
+
// report's group-by grain (the server re-buckets only time-series charts to
|
|
216
|
+
// it), and `filterSummary` is the filter bar as the viewer reads it, written
|
|
217
|
+
// verbatim into the notes file. Same keep-alive contract as exportComponent,
|
|
210
218
|
// over a longer run; consume through FsProcess.download.
|
|
211
|
-
exportReport(reportId, filters = [], pageId = null, config = {}) {
|
|
212
|
-
return this._api.post(this._path(`${reportId}/export`), {
|
|
219
|
+
exportReport(reportId, filters = [], pageId = null, frequency = null, filterSummary = [], config = {}) {
|
|
220
|
+
return this._api.post(this._path(`${reportId}/export`), {
|
|
221
|
+
filters,
|
|
222
|
+
...(pageId ? { pageId } : {}),
|
|
223
|
+
...(frequency ? { frequency } : {}),
|
|
224
|
+
filterSummary,
|
|
225
|
+
}, {
|
|
213
226
|
key: 'url',
|
|
214
227
|
...config,
|
|
215
228
|
});
|
|
@@ -353,4 +366,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
353
366
|
providedIn: 'root',
|
|
354
367
|
}]
|
|
355
368
|
}] });
|
|
356
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLGlCQUFpQixDQUFDOztBQWN2RCwyRUFBMkU7QUFDM0UsOEVBQThFO0FBQzlFLHFGQUFxRjtBQUlyRixNQUFNLE9BQU8sVUFBVTtJQUNiLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFN0IsNkVBQTZFO0lBQzdFLDhFQUE4RTtJQUN2RSxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBRTVCLGtGQUFrRjtJQUNsRixrREFBa0Q7SUFDMUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQ3ZCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDL0QsQ0FBQztJQUVNLE9BQU8sQ0FBQyxRQUFhLEVBQUUsRUFBRSxTQUF3QixFQUFFO1FBQ3hELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixLQUFLLEVBQ0w7WUFDRSxHQUFHLEVBQUUsU0FBUztZQUNkLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUN2RSxJQUFJLENBQUMsUUFBYSxFQUFFLEVBQUUsU0FBd0IsRUFBRTtRQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFLEVBQ1osS0FBSyxFQUNMLE1BQU0sQ0FD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RSxHQUFHLEVBQUUsVUFBVTtZQUNmLEdBQUcsTUFBTTtTQUNWLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RSxlQUFlO0lBQ1IsaUJBQWlCLENBQ3RCLFFBQWdCLEVBQ2hCLE9BQWUsRUFDZixPQUEyRSxFQUMzRSxTQUF3QixFQUFFO1FBRTFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLGlCQUFpQixPQUFPLEVBQUUsQ0FBQyxFQUNqRCxPQUFPLEVBQ1A7WUFDRSxHQUFHLEVBQUUsYUFBYTtZQUNsQixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO3dHQXJtQlUsVUFBVTs0R0FBVixVQUFVLGNBRlQsTUFBTTs7NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRnNBcGksIFJlcXVlc3RDb25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9hcGknO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnRDb21wb25lbnRTcWwsXG4gIFJlcG9ydEZpbHRlckxldmVsLFxuICBSZXBvcnRUcmVlLFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIEFQSSBnYXRld2F5IGZvciB0aGUgUmVwb3J0cyBtb2R1bGUuIEV2ZXJ5IGVuZHBvaW50IGhhbmdzIG9mZiBbYmFzZVBhdGhdLFxuLy8gd2hpY2ggZGVmYXVsdHMgdG8gXCJyZXBvcnRzXCIgKHRoZSBmcmFtZXdvcmsgcmVwb3J0cyBiYWNrZW5kIGF0IC9hcGkvcmVwb3J0cylcbi8vIGFuZCBjYW4gYmUgcmVwb2ludGVkIGJ5IHRoZSBob3N0IHNvIHRoZSBwYWNrYWdlIHN0YXlzIHNlbGYtY29udGFpbmVkIGFuZCBwb3J0YWJsZS5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnREYXRhPFQgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfYXBpID0gaW5qZWN0KEZzQXBpKTtcblxuICAvLyBUaGUgQVBJIHJvb3QgZm9yIGV2ZXJ5IHJlcG9ydHMgZW5kcG9pbnQuIERlZmF1bHRzIHRvIHRoZSBmcmFtZXdvcmsgcmVwb3J0c1xuICAvLyBjb250ZXh0OyBzZXQgaXQgb25jZSAoZS5nLiBmcm9tIHRoZSBob3N0J3MgcmVwb3J0IHBhZ2UpIHRvIG1vdW50IGVsc2V3aGVyZS5cbiAgcHVibGljIGJhc2VQYXRoID0gJ3JlcG9ydHMnO1xuXG4gIC8vIEJ1aWxkIGFuIGVuZHBvaW50IHBhdGggdW5kZXIgdGhlIGNvbmZpZ3VyZWQgYmFzZSwgZS5nLiBfcGF0aCgpID0+IFwiYWkvcmVwb3J0c1wiLFxuICAvLyBfcGF0aChgJHtpZH0vcGFnZXNgKSA9PiBcImFpL3JlcG9ydHMvMTIzL3BhZ2VzXCIuXG4gIHByaXZhdGUgX3BhdGgoc3VmZml4ID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdWZmaXggPyBgJHt0aGlzLmJhc2VQYXRofS8ke3N1ZmZpeH1gIDogdGhpcy5iYXNlUGF0aDtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRzKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnRzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQm90aCBoYWx2ZXMgb2YgdGhlIGxpc3Rpbmcg4oCUIHJlcG9ydHMgQU5EIHRoZSBmb2xkZXJzIHRoZXkgYXJlIGZpbGVkIGludG8g4oCUXG4gIC8vIGZyb20gdGhlIG9uZSBHRVQuIE5vIGBrZXlgLCBiZWNhdXNlIHRoZSB3aG9sZSBwYXlsb2FkIGlzIHRoZSBhbnN3ZXIgaGVyZTtcbiAgLy8gcmVwb3J0cygpIGtlZXBzIGl0cyAncmVwb3J0cycga2V5IGZvciBjYWxsZXJzIHRoYXQgb25seSB3YW50IHRoZSBmbGF0IGxpc3QuXG4gIHB1YmxpYyB0cmVlKHF1ZXJ5OiBhbnkgPSB7fSwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFJlcG9ydFRyZWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgY29uZmlnLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlKG5hbWU6IHN0cmluZywgcmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgeyBuYW1lLCByZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBGaWxlIGEgcmVwb3J0IHVuZGVyIGEgZm9sZGVyLCBvciBwYXNzIG51bGwgdG8gbW92ZSBpdCB0byB0aGUgcm9vdC4gU2VudFxuICAvLyBleHBsaWNpdGx5IChuZXZlciBvbWl0dGVkKSBzbyB0aGUgYmFja2VuZCBjYW4gdGVsbCBcIm1vdmUgdG8gcm9vdFwiIGZyb21cbiAgLy8gXCJsZWF2ZSB0aGUgZm9sZGVyIGFsb25lXCIuXG4gIHB1YmxpYyBtb3ZlUmVwb3J0KHJlcG9ydElkOiBudW1iZXIsIHJlcG9ydEZvbGRlcklkOiBudW1iZXIgfCBudWxsLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHsgcmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZvbGRlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50UmVwb3J0Rm9sZGVySWQ6IG51bWJlciA9IG51bGwsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoJ2ZvbGRlcnMnKSxcbiAgICAgIHsgbmFtZSwgcGFyZW50UmVwb3J0Rm9sZGVySWQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZm9sZGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVuYW1lIGFuZC9vciBtb3ZlIGEgZm9sZGVyLiBPbmx5IHRoZSBrZXlzIHBhc3NlZCBhcmUgYWN0ZWQgb24gc2VydmVyLXNpZGUsXG4gIC8vIHNvIGEgcmVuYW1lIG5ldmVyIGRpc3R1cmJzIHRoZSBwYXJlbnQgYW5kIGEgZHJhZyBuZXZlciBkaXN0dXJicyB0aGUgbmFtZS5cbiAgcHVibGljIHVwZGF0ZUZvbGRlcihcbiAgICByZXBvcnRGb2xkZXJJZDogbnVtYmVyLFxuICAgIGZvbGRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfWApLFxuICAgICAgZm9sZGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTb2Z0LWRlbGV0ZSwgd2hhdGV2ZXIgdGhlIGZvbGRlciBob2xkczogaXRzIGNvbnRlbnRzIGxlYXZlIHRoZSBsaXN0aW5nIHdpdGhcbiAgLy8gaXQsIGFuZCB1bmRlbGV0ZUZvbGRlcigpIGJyaW5ncyB0aGUgbG90IGJhY2suXG4gIHB1YmxpYyBkZWxldGVGb2xkZXIocmVwb3J0Rm9sZGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGEgc29mdC1kZWxldGVkIGZvbGRlciB0aHJvdWdoIGl0cyBvd24gYWN0aW9uIGVuZHBvaW50IOKAlCB0aGUgZm9sZGVyXG4gIC8vIFBVVCBkb2VzIG5vdCBhY2NlcHQgYHN0YXRlYC4gQW55IGRlbGV0ZWQgZm9sZGVyIGFib3ZlIGl0IGlzIHJlc3RvcmVkIHRvbywgc29cbiAgLy8gaXQgbGFuZHMgYmFjayB3aGVyZSBpdCB3YXMuXG4gIHB1YmxpYyB1bmRlbGV0ZUZvbGRlcihyZXBvcnRGb2xkZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYGZvbGRlcnMvJHtyZXBvcnRGb2xkZXJJZH0vdW5kZWxldGVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lKHJlcG9ydElkOiBudW1iZXIsIG5hbWU6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7IG5hbWUgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVwb3J0IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgbmFtZSwgcGFnZVdpZHRoLCBwYWdlSGVpZ2h0LCBsYXlvdXQsXG4gIC8vIHN0eWxlcywgaGVhZGVyRm9vdGVyIH0g4oCUIHN0eWxlcyBjYXJyeSB0aGUgcmVwb3J0J3MgdHlwb2dyYXBoaWMgY29uZmlnIChlLmcuXG4gIC8vIGhlYWRpbmcgc2l6ZSksIGhlYWRlckZvb3RlciB0aGUgaGVhZGVyL2Zvb3RlciBiYW5kIGRlcHRocyBpbiBpbmNoZXMuIFRoZVxuICAvLyBwYWdlIHNpemUgaXMgaW4gaW5jaGVzIGFuZCB3aWR0aC9oZWlnaHQgZ28gdG9nZXRoZXIuXG4gIHB1YmxpYyB1cGRhdGUocmVwb3J0SWQ6IG51bWJlciwgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHNldHRpbmdzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBBcHBlbmQgYSBibGFuayBwYWdlIHRvIHRoZSByZXBvcnQ7IHJlc29sdmVzIHRvIHRoZSBuZXcgcGFnZS5cbiAgcHVibGljIGFkZFBhZ2UocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhZ2UnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBBbnkgc3Vic2V0IG9mIHsgbmFtZSwgbWFzdGVySGlkZGVuIH0uIEFuIGVtcHR5IG5hbWUgaXMgc3RvcmVkIGFzIG51bGxcbiAgLy8gc2VydmVyLXNpZGUsIHdoaWNoIHB1dHMgdGhlIHRhYiBiYWNrIG9uIGl0cyBwb3NpdGlvbmFsIFwiUGFnZSBOXCIgbGFiZWw7XG4gIC8vIG1hc3RlckhpZGRlbiBoaWRlcyB0aGUgcmVwb3J0J3MgaGVhZGVyIGFuZCBmb290ZXIgb24gdGhpcyBwYWdlLlxuICBwdWJsaWMgdXBkYXRlUGFnZShcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHBhZ2VJZDogbnVtYmVyLFxuICAgIHBhZ2U6IHsgbmFtZT86IHN0cmluZzsgbWFzdGVySGlkZGVuPzogYm9vbGVhbiB9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzLyR7cGFnZUlkfWApLFxuICAgICAgcGFnZSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGFnZScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIERlbGV0ZSBhIHBhZ2UgYW5kIGV2ZXJ5dGhpbmcgb24gaXQuIFJlZnVzZWQgc2VydmVyLXNpZGUgZm9yIHRoZSBsYXN0XG4gIC8vIHJlbWFpbmluZyBwYWdlIOKAlCBhIHJlcG9ydCB3aXRoIG5vIGNhbnZhcyBpcyBhIGRlbGV0ZWQgcmVwb3J0LCBub3QgYSBwYWdlXG4gIC8vIG9wZXJhdGlvbi5cbiAgcHVibGljIGRlbGV0ZVBhZ2UocmVwb3J0SWQ6IG51bWJlciwgcGFnZUlkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlcy8ke3BhZ2VJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdwYWdlJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGVyc2lzdCB0aGUgdGFiIG9yZGVyIGFmdGVyIGEgZHJhZyDigJQgdGhlIHdob2xlIGxpc3QsIGluIGl0cyBuZXcgb3JkZXIsIHNvXG4gIC8vIHRoZSBzZXF1ZW5jZSBzdGF5cyBnYXBsZXNzIHdpdGhvdXQgdGhlIHNlcnZlciBpbmZlcnJpbmcgdGhlIG1vdmUuXG4gIHB1YmxpYyBzYXZlUGFnZVBvc2l0aW9ucyhcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHBvc2l0aW9uczogeyBwYWdlSWQ6IG51bWJlcjsgb3JkZXI6IG51bWJlciB9W10sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvcG9zaXRpb25zYCksXG4gICAgICB7IHBvc2l0aW9ucyB9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIENvbXBvbmVudCBzZXR0aW5nczogYW55IHN1YnNldCBvZiB7IHRpdGxlLCBwYWRkaW5nIH0g4oCUIHRoZSBodW1hbi1mYWNpbmdcbiAgLy8gZGlhbG9nIGVkaXRzIOKAlCBvciBhIHRleHQgYmxvY2sncyB7IGh0bWwgfSBmcm9tIGl0cyBpbmxpbmUgZWRpdG9yOyBnZW9tZXRyeVxuICAvLyAoeC95L3cvaC9mbG93V2lkdGgpIGlzIHBlcnNpc3RlZCB2aWEgc2F2ZVBvc2l0aW9ucyBmcm9tIHRoZSBjYW52YXMgaW5zdGVhZC5cbiAgcHVibGljIHVwZGF0ZUNvbXBvbmVudChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vc2V0dGluZ3NgKSxcbiAgICAgIHNldHRpbmdzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdjb21wb25lbnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQbGFjZSBhIHRleHQgYmxvY2sg4oCUIG9uIGEgcGFnZSwgb3IgaW4gdGhlIGhlYWRlci9mb290ZXIgd2hlbiBwYWdlSWQgaXNcbiAgLy8gb21pdHRlZC4gVGhlIG9ubHkgY29tcG9uZW50IHRoZSBVSSBjcmVhdGVzIGl0c2VsZjogY2hhcnRzLCBsaXN0cyBhbmQgS1BJc1xuICAvLyBuZWVkIGEgcXVlcnkgYW5kIGNvbWUgZnJvbSB0aGUgY2hhdC4gUmVzb2x2ZXMgdG8geyBpZCB9LlxuICBwdWJsaWMgYWRkVGV4dChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHRleHQ6IHsgcGFnZUlkPzogbnVtYmVyOyBodG1sPzogc3RyaW5nOyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50c2ApLFxuICAgICAgdGV4dCxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGVsZXRlIG9uZSBjb21wb25lbnQgZnJvbSB0aGUgY2FudmFzLCB0b2dldGhlciB3aXRoIGl0cyBmaWx0ZXJzIGFuZCBhbnlcbiAgLy8gZmlsdGVyIGdyb3VwIHRoZXkgbGVhdmUgZW1wdHkuIFNvZnQgc2VydmVyLXNpZGUsIGJ1dCB0aGVyZSBpcyBubyByZXN0b3JlXG4gIC8vIGFueXdoZXJlIGluIHRoZSBVSSwgc28gdGhlIGRpYWxvZydzIGNvbmZpcm0gcHJlc2VudHMgaXQgYXMgcGVybWFuZW50LlxuICBwdWJsaWMgZGVsZXRlQ29tcG9uZW50KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU29mdC1kZWxldGU6IHRoZSByZXBvcnQgbGVhdmVzIHRoZSBsaXN0aW5nIGJ1dCBrZWVwcyBpdHMgcGFnZXMgYW5kXG4gIC8vIGNvbXBvbmVudHMsIHNvIHVuZGVsZXRlKCkgYnJpbmdzIGJhY2sgdGhlIHNhbWUgZG9jdW1lbnQuXG4gIHB1YmxpYyBkZWxldGUocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVzdG9yZSBhIHNvZnQtZGVsZXRlZCByZXBvcnQgdGhyb3VnaCBpdHMgb3duIGFjdGlvbiBlbmRwb2ludCDigJQgdGhlIHJlcG9ydFxuICAvLyBQVVQgZG9lcyBub3QgYWNjZXB0IGBzdGF0ZWAuIEl0cyBmb2xkZXIgaXMgcmVzdG9yZWQgdG9vIHdoZW4gaXQgaXMgZGVsZXRlZCxcbiAgLy8gb3IgaW5zaWRlIG9uZSB0aGF0IGlzLCBzbyB0aGUgcmVwb3J0IGxhbmRzIGJhY2sgd2hlcmUgaXQgd2FzLlxuICBwdWJsaWMgdW5kZWxldGUocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS91bmRlbGV0ZWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBhc3NlbWJsZWQgc3RydWN0dXJlOiBwYWdlcyDihpIgY29tcG9uZW50cyAoKyB0aGVpciBmaWx0ZXJzKSBhbmQgdGhlXG4gIC8vIHJlcG9ydCdzIGZpbHRlciBncm91cHMuXG4gIHB1YmxpYyBnZXQocmVwb3J0SWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUGVyc2lzdCBnZW9tZXRyeSBmb3IgdGhlIG1vdmVkIGNvbXBvbmVudHMgb25seSDigJQgYW55IHN1YnNldCBvZlxuICAvLyB7IHgsIHksIHcsIGggfSAoaW5jaGVzKSwgZmxvd1dpZHRoIChwZXJjZW50KSBhbmQgb3JkZXIgKGZsb3cgcG9zaXRpb24pLlxuICBwdWJsaWMgc2F2ZVBvc2l0aW9ucyhcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHBvc2l0aW9uczogKHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUGFydGlhbDx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlcjsgZmxvd1dpZHRoOiBudW1iZXI7IG9yZGVyOiBudW1iZXIgfT4pW10sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy9wb3NpdGlvbnNgKSxcbiAgICAgIHsgcG9zaXRpb25zIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gT25lIGNvbXBvbmVudCdzIGRhdGEuIFRoZSBib2R5IGNhcnJpZXMgZXZlcnl0aGluZyBzZXNzaW9uLXNjb3BlZDogdGhlXG4gIC8vIHJlc29sdmVkIGZpbHRlciB2YWx1ZXMgYW5kIHRoZSBjb21wb25lbnQncyBvd24gaW50ZXJhY3Rpb24gc3RhdGUuXG4gIC8vXG4gIC8vIGBpc0V4cG9ydGAgbWFya3MgdGhlIHJlYWQgYXMgcGFydCBvZiBhIFBERi9Qb3dlclBvaW50IHJlbmRlci4gVGhlIHNlcnZlclxuICAvLyBnaXZlcyB0aG9zZSBhIGxvbmdlciBwZXItc3RhdGVtZW50IGNlaWxpbmcgdGhhbiBhbiBvbi1zY3JlZW4gdGlsZSwgYmVjYXVzZVxuICAvLyBhIHJlYWRlciB3YXRjaGluZyBhbiBleHBvcnQgcHJvZ3Jlc3MgYmFyIGNhbiB3YWl0IGZvciBhIHF1ZXJ5IG5vYm9keSB3b3VsZFxuICAvLyB0b2xlcmF0ZSB3YWl0aW5nIGZvciBvbiBhIGRhc2hib2FyZC5cbiAgcHVibGljIGNvbXBvbmVudERhdGEoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdLFxuICAgIHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7fSxcbiAgICBpc0V4cG9ydCA9IGZhbHNlLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2RhdGFgKSxcbiAgICAgIHsgZmlsdGVycywgc3RhdGUsIGV4cG9ydDogaXNFeHBvcnQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZGF0YScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEV4cG9ydHMgdGhlIGNvbXBvbmVudCdzIEZVTEwgZmlsdGVyZWQgZGF0YXNldCB0byBDU1Ygc2VydmVyLXNpZGUgYW5kXG4gIC8vIHJlc29sdmVzIHRvIGEgcHJlc2lnbmVkIGRvd25sb2FkIFVSTC4gVGhlIGJhY2tlbmQgc3RyZWFtcyBwZXJjZW50YWdlXG4gIC8vIHByb2dyZXNzIHdoaWxlIGNodW5raW5nOyBjb25zdW1lIHRocm91Z2ggRnNQcm9jZXNzLmRvd25sb2FkLlxuICBwdWJsaWMgZXhwb3J0Q29tcG9uZW50KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXJzOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXSxcbiAgICBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge30sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZXhwb3J0YCksXG4gICAgICB7IGZpbHRlcnMsIHN0YXRlIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3VybCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEV4cG9ydHMgRVZFUlkgY29tcG9uZW50IG9uIHRoZSByZXBvcnQg4oCUIG9yIG9uIG9uZSBwYWdlIOKAlCBzZXJ2ZXItc2lkZSBhbmRcbiAgLy8gcmVzb2x2ZXMgdG8gYSBwcmVzaWduZWQgVVJMIGZvciBhIHppcCBvZiBvbmUgQ1NWIHBlciBjb21wb25lbnQsIGZvbGRlcmVkIGJ5XG4gIC8vIHBhZ2UuIGBmaWx0ZXJzYCBjYXJyaWVzIHRoZSByZXNvbHZlZCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvbXBvbmVudCB0b2dldGhlcjtcbiAgLy8gZWFjaCBvbmUgcGlja3Mgb3V0IGl0cyBvd24uIFNhbWUga2VlcC1hbGl2ZSBjb250cmFjdCBhcyBleHBvcnRDb21wb25lbnQsXG4gIC8vIG92ZXIgYSBsb25nZXIgcnVuOyBjb25zdW1lIHRocm91Z2ggRnNQcm9jZXNzLmRvd25sb2FkLlxuICBwdWJsaWMgZXhwb3J0UmVwb3J0KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgcGFnZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbCxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZXhwb3J0YCksXG4gICAgICB7IGZpbHRlcnMsIC4uLihwYWdlSWQgPyB7IHBhZ2VJZCB9IDoge30pIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3VybCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIERpc3RpbmN0IG9wdGlvbnMgZm9yIGEgc2VsZWN0IGZpbHRlciAoZHJpdmVzIG11bHRpc2VsZWN0IGNvbnRyb2xzKS5cbiAgcHVibGljIGZpbHRlck9wdGlvbnMocmVwb3J0SWQ6IG51bWJlciwgZmlsdGVySWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH0vb3B0aW9uc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ29wdGlvbnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgc3RhdGVtZW50IGEgY29tcG9uZW50IHJ1bnMsIGZvciB0aGUgU1FMIHRhYi5cbiAgLy9cbiAgLy8gRmV0Y2hlZCByYXRoZXIgdGhhbiByZWFkIG9mZiB0aGUgY29tcG9uZW50LCBiZWNhdXNlIGEgREVSSVZFRCBjb21wb25lbnQgaGFzXG4gIC8vIG5vIHN0b3JlZCBTUUwg4oCUIGl0IHN0b3JlcyBhIGRvY3VtZW50LCBhbmQgaXRzIHN0YXRlbWVudCBvbmx5IGV4aXN0cyBvbmNlXG4gIC8vIHRoZSBiYWNrZW5kIGNvbXBpbGVzIHRoYXQgZG9jdW1lbnQuIENvbXBpbGVkIHBlciByZXF1ZXN0LCBmb3IgdGhlIG9uZVxuICAvLyBjb21wb25lbnQgYmVpbmcgbG9va2VkIGF0LCBzbyBvcGVuaW5nIGEgcmVwb3J0IG5ldmVyIHBheXMgZm9yIGl0LlxuICAvL1xuICAvLyBga2V5OiBudWxsYCBiZWNhdXNlIHRoZSB3aG9sZSBlbnZlbG9wZSBpcyB0aGUgYW5zd2VyIGhlcmU6IGEgc3RhbGUgZG9jdW1lbnRcbiAgLy8gY29tZXMgYmFjayBhcyB7IHNxbDogbnVsbCwgZXJyb3IsIGVycm9yVHlwZSB9IGFuZCB1bndyYXBwaW5nIG9uZSBmaWVsZFxuICAvLyB3b3VsZCB0aHJvdyB0aGUgZGlhZ25vc2lzIGF3YXkuXG4gIHB1YmxpYyBjb21wb25lbnRTcWwoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFJlcG9ydENvbXBvbmVudFNxbD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9zcWxgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBjb21wb25lbnQgU1FMJ3MgZmlsdGVyYWJsZSBvdXRwdXQgY29sdW1ucyDigJQgZHJpdmVzIHRoZSBjb2x1bW4gcGlja2VyXG4gIC8vIGluIHRoZSBmaWx0ZXIgVUkgc28gYSBjb2x1bW4gbmFtZSBpcyBuZXZlciB0eXBlZCBieSBoYW5kLlxuICBwdWJsaWMgY29tcG9uZW50Q29sdW1ucyhyZXBvcnRJZDogbnVtYmVyLCBjb21wb25lbnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9jb2x1bW5zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnY29sdW1ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1ha2Ugb25lIGNvbHVtbiBmaWx0ZXJhYmxlLiBgbGV2ZWxgIChjb21wb25lbnQgfCByZXBvcnQpIHBsYWNlcyBhIG5ld1xuICAvLyBncm91cDsgYGdyb3VwSWRgIGluc3RlYWQgbGlua3MgaW50byBhbiBleGlzdGluZyBncm91cC4gQSBzZWxlY3QgZmlsdGVyJ3NcbiAgLy8gb3B0aW9ucyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBjb21wb25lbnQgU1FMIHdoZW4gb3B0aW9uc1NxbCBpcyBvbWl0dGVkLlxuICBwdWJsaWMgYWRkRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBmaWx0ZXI6IHsgZmlsdGVyQ29sdW1uOiBzdHJpbmc7IHR5cGU/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyBsZXZlbD86IHN0cmluZzsgb3B0aW9uc1NxbD86IHN0cmluZzsgZ3JvdXBJZD86IG51bWJlciB9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2ZpbHRlcnNgKSxcbiAgICAgIGZpbHRlcixcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlIGEgZmlsdGVyIOKAlCBhbnkgc3Vic2V0IG9mIHsgbGFiZWwsIG9wdGlvbnNTcWwsIGVuYWJsZWQgfS5cbiAgcHVibGljIHVwZGF0ZUZpbHRlcihcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcklkOiBudW1iZXIsXG4gICAgY2hhbmdlczogeyBsYWJlbD86IHN0cmluZzsgb3B0aW9uc1NxbD86IHN0cmluZzsgZW5hYmxlZD86IGJvb2xlYW4gfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9YCksXG4gICAgICBjaGFuZ2VzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZW1vdmUgYSBmaWx0ZXIgKGl0cyBncm91cCBnb2VzIHRvbyB3aGVuIG5vdGhpbmcgZWxzZSB1c2VzIGl0KS5cbiAgcHVibGljIGRlbGV0ZUZpbHRlcihyZXBvcnRJZDogbnVtYmVyLCBmaWx0ZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBnbG9iYWwgQUkga25vd2xlZGdlIGRvY3VtZW50IChvcGVyYXRvci1hdXRob3JlZCBhZ2VudCBpbnN0cnVjdGlvbnMpXG4gIC8vIGFuZCBpdHMgZnVsbCB2ZXJzaW9uIGhpc3Rvcnk6IHsgaW5zdHJ1Y3Rpb25zLCB2ZXJzaW9ucyB9LlxuICBwdWJsaWMgaW5zdHJ1Y3Rpb25zKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdpbnN0cnVjdGlvbnMnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNhdmUgYSBuZXcgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQgKGFwcGVuZC1vbmx5OyBhbiB1bmNoYW5nZWQgc2F2ZSBpcyBhXG4gIC8vIG5vLW9wIHNlcnZlci1zaWRlKS4gUmVzb2x2ZXMgdG8gdGhlIHNhbWUgeyBpbnN0cnVjdGlvbnMsIHZlcnNpb25zIH0gc2hhcGUuXG4gIHB1YmxpYyBzYXZlSW5zdHJ1Y3Rpb25zKGNvbnRlbnQ6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoJ2luc3RydWN0aW9ucycpLFxuICAgICAgeyBjb250ZW50IH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gTWFrZSBhbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IGN1cnJlbnQgKG5vIG5ldyByb3cgaXMgY3JlYXRlZCkuXG4gIHB1YmxpYyByZXN0b3JlSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25JZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYGluc3RydWN0aW9ucy8ke2luc3RydWN0aW9uSWR9L3Jlc3RvcmVgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6IG51bGwsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJ1biBhIHNlbWFudGljLWRhdGFiYXNlIGJ1aWxkLCBzdHJlYW1lZDogZW1pdHMgYW4gZXZlbnQgcGVyIE5ESlNPTiBmcmFtZVxuICAvLyAoeyBraW5kOiAnbG9nJywgbGluZSwgcGVyY2VudCB9IGZlZWQgbGluZXMgYW5kIHsga2luZDogJ3NlY3Rpb24nIH0gcGhhc2VcbiAgLy8gbWFya2VycykgYW5kIGNvbXBsZXRlcyB3aGVuIHRoZSBidWlsZCBlbmRzLiBGZWVkIHRoZSBsaW5lcyBpbnRvIEZzUHJvY2Vzcy5cbiAgcHVibGljIHNlbWFudGljQnVpbGQoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuc3RyZWFtKFxuICAgICAgJ1BPU1QnLFxuICAgICAgdGhpcy5fcGF0aCgnc2VtYW50aWMvYnVpbGQnKSxcbiAgICAgIHsgc3RyZWFtOiB0cnVlIH0sXG4gICAgICBjb25maWcsXG4gICAgKTtcbiAgfVxuXG4gIC8vIExhdGVzdCBidWlsZCBzdGF0dXMgKyBlbnRpdHkgc2NvcmVib2FyZDogeyBidWlsZCwgZGV0YWlsIH0uXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkU3RhdHVzKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZW1hbnRpYy9idWlsZCcpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU3RvcCB0aGUgcnVubmluZyBidWlsZCAodGhlIGN1cnJlbnQgc2VtYW50aWMgZGF0YWJhc2Ugc3RheXMgaW4gcGxhY2UpLlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZFN0b3AoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKCdzZW1hbnRpYy9idWlsZC9zdG9wJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnYnVpbGQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBPbmUgZW50aXR5J3MgY2FjaGVkIEFJLWNsYXNzaWZpZWQgY29kZSBmdW5jdGlvbnMg4oCUIGxvYWRlZCBvbiBleHBhbmQsIG9uZVxuICAvLyBlbnRpdHkgYXQgYSB0aW1lLCBiZWNhdXNlIHRoZSBmdWxsIHNldCBhY3Jvc3MgYWxsIGVudGl0aWVzIGlzIGZhciB0b28gYmlnXG4gIC8vIHRvIHNoaXAgaW5zaWRlIHRoZSBzY29yZWJvYXJkIGNhbGwuXG4gIHB1YmxpYyBzZW1hbnRpY0VudGl0eUZ1bmN0aW9ucyhlbnRpdHk6IHN0cmluZywgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoYHNlbWFudGljL2VudGl0aWVzLyR7ZW50aXR5fS9mdW5jdGlvbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdlbnRpdHlGdW5jdGlvbnMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0IG1vZHVsZSdzIEdlbmVyYWwgc2V0dGluZ3MgKHNlbWFudGljLWJ1aWxkIGNvbmN1cnJlbmN5ICsgaXRzIGJvdW5kcykuXG4gIHB1YmxpYyBzZXR0aW5ncyhjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgnc2V0dGluZ3MnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdzZXR0aW5ncycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNhdmUgdGhlIEdlbmVyYWwgc2V0dGluZ3M7IHJlc29sdmVzIHRvIHRoZSBzYW1lIHsgc2V0dGluZ3MgfSBzaGFwZS5cbiAgcHVibGljIHNhdmVTZXR0aW5ncyhzZXR0aW5nczogeyBzZW1hbnRpY0J1aWxkQ29uY3VycmVuY3k6IG51bWJlciB9LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aCgnc2V0dGluZ3MnKSxcbiAgICAgIHNldHRpbmdzLFxuICAgICAge1xuICAgICAgICBrZXk6ICdzZXR0aW5ncycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBhIGZpbHRlciBncm91cCDigJQgaXRzIGV4cG9zdXJlIGxldmVsICgnY29tcG9uZW50JyB8ICdyZXBvcnQnIHwgJ2JvdGgnKVxuICAvLyBhbmQvb3IgaXRzIGRlZmF1bHQgdmFsdWUgKHRoZSB2YWx1ZSBzZWVkaW5nIHRoZSByZXBvcnQgYmFyIG9uIG9wZW4pLiBTZW5kXG4gIC8vIGBkZWZhdWx0OiBudWxsYCAob3IgYW4gZW1wdHkgZGVmYXVsdCkgdG8gY2xlYXIgaXQuIE9ubHkgdGhlIGtleXMgcHJvdmlkZWRcbiAgLy8gYXJlIGNoYW5nZWQuXG4gIHB1YmxpYyB1cGRhdGVGaWx0ZXJHcm91cChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGdyb3VwSWQ6IG51bWJlcixcbiAgICBjaGFuZ2VzOiB7IGxldmVsPzogUmVwb3J0RmlsdGVyTGV2ZWw7IGRlZmF1bHQ/OiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVyZ3JvdXBzLyR7Z3JvdXBJZH1gKSxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlckdyb3VwJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
369
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGF0YS9yZXBvcnQuZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLGlCQUFpQixDQUFDOztBQWdCdkQsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSxxRkFBcUY7QUFJckYsTUFBTSxPQUFPLFVBQVU7SUFDYixJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdCLDZFQUE2RTtJQUM3RSw4RUFBOEU7SUFDdkUsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUU1QixrRkFBa0Y7SUFDbEYsa0RBQWtEO0lBQzFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRTtRQUN2QixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQy9ELENBQUM7SUFFTSxPQUFPLENBQUMsUUFBYSxFQUFFLEVBQUUsU0FBd0IsRUFBRTtRQUN4RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFLEVBQ1osS0FBSyxFQUNMO1lBQ0UsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSw4RUFBOEU7SUFDdkUsSUFBSSxDQUFDLFFBQWEsRUFBRSxFQUFFLFNBQXdCLEVBQUU7UUFDckQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLEtBQUssRUFDTCxNQUFNLENB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LENBQUMsRUFDdEIsRUFBRSxFQUNGO1lBQ0UsR0FBRyxFQUFFLFVBQVU7WUFDZixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsc0VBQXNFO0lBQy9ELFlBQVksQ0FBQyxRQUE4QyxFQUFFLFNBQXdCLEVBQUU7UUFDNUYsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFDdEIsUUFBUSxFQUNSO1lBQ0UsR0FBRyxFQUFFLFVBQVU7WUFDZixHQUFHLE1BQU07U0FDVixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLDRFQUE0RTtJQUM1RSw0RUFBNEU7SUFDNUUsZUFBZTtJQUNSLGlCQUFpQixDQUN0QixRQUFnQixFQUNoQixPQUFlLEVBQ2YsT0FBMkUsRUFDM0UsU0FBd0IsRUFBRTtRQUUxQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsT0FBTyxFQUFFLENBQUMsRUFDakQsT0FBTyxFQUNQO1lBQ0UsR0FBRyxFQUFFLGFBQWE7WUFDbEIsR0FBRyxNQUFNO1NBQ1YsQ0FDRixDQUFDO0lBQ0osQ0FBQzt3R0FwbkJVLFVBQVU7NEdBQVYsVUFBVSxjQUZULE1BQU07OzRGQUVQLFVBQVU7a0JBSHRCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZzQXBpLCBSZXF1ZXN0Q29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXBpJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBDb21wb25lbnREYXRhU3RhdGUsXG4gIENvbXBvbmVudEV4cG9ydFJlc3BvbnNlLFxuICBGaWx0ZXJHcm91cERlZmF1bHQsXG4gIFJlcG9ydENvbXBvbmVudFNxbCxcbiAgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydFRyZWUsXG4gIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gQVBJIGdhdGV3YXkgZm9yIHRoZSBSZXBvcnRzIG1vZHVsZS4gRXZlcnkgZW5kcG9pbnQgaGFuZ3Mgb2ZmIFtiYXNlUGF0aF0sXG4vLyB3aGljaCBkZWZhdWx0cyB0byBcInJlcG9ydHNcIiAodGhlIGZyYW1ld29yayByZXBvcnRzIGJhY2tlbmQgYXQgL2FwaS9yZXBvcnRzKVxuLy8gYW5kIGNhbiBiZSByZXBvaW50ZWQgYnkgdGhlIGhvc3Qgc28gdGhlIHBhY2thZ2Ugc3RheXMgc2VsZi1jb250YWluZWQgYW5kIHBvcnRhYmxlLlxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydERhdGE8VCA9IGFueT4ge1xuICBwcml2YXRlIF9hcGkgPSBpbmplY3QoRnNBcGkpO1xuXG4gIC8vIFRoZSBBUEkgcm9vdCBmb3IgZXZlcnkgcmVwb3J0cyBlbmRwb2ludC4gRGVmYXVsdHMgdG8gdGhlIGZyYW1ld29yayByZXBvcnRzXG4gIC8vIGNvbnRleHQ7IHNldCBpdCBvbmNlIChlLmcuIGZyb20gdGhlIGhvc3QncyByZXBvcnQgcGFnZSkgdG8gbW91bnQgZWxzZXdoZXJlLlxuICBwdWJsaWMgYmFzZVBhdGggPSAncmVwb3J0cyc7XG5cbiAgLy8gQnVpbGQgYW4gZW5kcG9pbnQgcGF0aCB1bmRlciB0aGUgY29uZmlndXJlZCBiYXNlLCBlLmcuIF9wYXRoKCkgPT4gXCJhaS9yZXBvcnRzXCIsXG4gIC8vIF9wYXRoKGAke2lkfS9wYWdlc2ApID0+IFwiYWkvcmVwb3J0cy8xMjMvcGFnZXNcIi5cbiAgcHJpdmF0ZSBfcGF0aChzdWZmaXggPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1ZmZpeCA/IGAke3RoaXMuYmFzZVBhdGh9LyR7c3VmZml4fWAgOiB0aGlzLmJhc2VQYXRoO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydHMocXVlcnk6IGFueSA9IHt9LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgcXVlcnksXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydHMnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBCb3RoIGhhbHZlcyBvZiB0aGUgbGlzdGluZyDigJQgcmVwb3J0cyBBTkQgdGhlIGZvbGRlcnMgdGhleSBhcmUgZmlsZWQgaW50byDigJRcbiAgLy8gZnJvbSB0aGUgb25lIEdFVC4gTm8gYGtleWAsIGJlY2F1c2UgdGhlIHdob2xlIHBheWxvYWQgaXMgdGhlIGFuc3dlciBoZXJlO1xuICAvLyByZXBvcnRzKCkga2VlcHMgaXRzICdyZXBvcnRzJyBrZXkgZm9yIGNhbGxlcnMgdGhhdCBvbmx5IHdhbnQgdGhlIGZsYXQgbGlzdC5cbiAgcHVibGljIHRyZWUocXVlcnk6IGFueSA9IHt9LCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8UmVwb3J0VHJlZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aCgpLFxuICAgICAgcXVlcnksXG4gICAgICBjb25maWcsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGUobmFtZTogc3RyaW5nLCByZXBvcnRGb2xkZXJJZDogbnVtYmVyID0gbnVsbCwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKCksXG4gICAgICB7IG5hbWUsIHJlcG9ydEZvbGRlcklkIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEZpbGUgYSByZXBvcnQgdW5kZXIgYSBmb2xkZXIsIG9yIHBhc3MgbnVsbCB0byBtb3ZlIGl0IHRvIHRoZSByb290LiBTZW50XG4gIC8vIGV4cGxpY2l0bHkgKG5ldmVyIG9taXR0ZWQpIHNvIHRoZSBiYWNrZW5kIGNhbiB0ZWxsIFwibW92ZSB0byByb290XCIgZnJvbVxuICAvLyBcImxlYXZlIHRoZSBmb2xkZXIgYWxvbmVcIi5cbiAgcHVibGljIG1vdmVSZXBvcnQocmVwb3J0SWQ6IG51bWJlciwgcmVwb3J0Rm9sZGVySWQ6IG51bWJlciB8IG51bGwsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgeyByZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRm9sZGVyKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJlbnRSZXBvcnRGb2xkZXJJZDogbnVtYmVyID0gbnVsbCxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aCgnZm9sZGVycycpLFxuICAgICAgeyBuYW1lLCBwYXJlbnRSZXBvcnRGb2xkZXJJZCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmb2xkZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZW5hbWUgYW5kL29yIG1vdmUgYSBmb2xkZXIuIE9ubHkgdGhlIGtleXMgcGFzc2VkIGFyZSBhY3RlZCBvbiBzZXJ2ZXItc2lkZSxcbiAgLy8gc28gYSByZW5hbWUgbmV2ZXIgZGlzdHVyYnMgdGhlIHBhcmVudCBhbmQgYSBkcmFnIG5ldmVyIGRpc3R1cmJzIHRoZSBuYW1lLlxuICBwdWJsaWMgdXBkYXRlRm9sZGVyKFxuICAgIHJlcG9ydEZvbGRlcklkOiBudW1iZXIsXG4gICAgZm9sZGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGBmb2xkZXJzLyR7cmVwb3J0Rm9sZGVySWR9YCksXG4gICAgICBmb2xkZXIsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZvbGRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNvZnQtZGVsZXRlLCB3aGF0ZXZlciB0aGUgZm9sZGVyIGhvbGRzOiBpdHMgY29udGVudHMgbGVhdmUgdGhlIGxpc3Rpbmcgd2l0aFxuICAvLyBpdCwgYW5kIHVuZGVsZXRlRm9sZGVyKCkgYnJpbmdzIHRoZSBsb3QgYmFjay5cbiAgcHVibGljIGRlbGV0ZUZvbGRlcihyZXBvcnRGb2xkZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZvbGRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlc3RvcmUgYSBzb2Z0LWRlbGV0ZWQgZm9sZGVyIHRocm91Z2ggaXRzIG93biBhY3Rpb24gZW5kcG9pbnQg4oCUIHRoZSBmb2xkZXJcbiAgLy8gUFVUIGRvZXMgbm90IGFjY2VwdCBgc3RhdGVgLiBBbnkgZGVsZXRlZCBmb2xkZXIgYWJvdmUgaXQgaXMgcmVzdG9yZWQgdG9vLCBzb1xuICAvLyBpdCBsYW5kcyBiYWNrIHdoZXJlIGl0IHdhcy5cbiAgcHVibGljIHVuZGVsZXRlRm9sZGVyKHJlcG9ydEZvbGRlcklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgZm9sZGVycy8ke3JlcG9ydEZvbGRlcklkfS91bmRlbGV0ZWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZvbGRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWUocmVwb3J0SWQ6IG51bWJlciwgbmFtZTogc3RyaW5nLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHsgbmFtZSB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXBvcnQgc2V0dGluZ3M6IGFueSBzdWJzZXQgb2YgeyBuYW1lLCBwYWdlV2lkdGgsIHBhZ2VIZWlnaHQsIGxheW91dCxcbiAgLy8gc3R5bGVzLCBoZWFkZXJGb290ZXIgfSDigJQgc3R5bGVzIGNhcnJ5IHRoZSByZXBvcnQncyB0eXBvZ3JhcGhpYyBjb25maWcgKGUuZy5cbiAgLy8gaGVhZGluZyBzaXplKSwgaGVhZGVyRm9vdGVyIHRoZSBoZWFkZXIvZm9vdGVyIGJhbmQgZGVwdGhzIGluIGluY2hlcy4gVGhlXG4gIC8vIHBhZ2Ugc2l6ZSBpcyBpbiBpbmNoZXMgYW5kIHdpZHRoL2hlaWdodCBnbyB0b2dldGhlci5cbiAgcHVibGljIHVwZGF0ZShyZXBvcnRJZDogbnVtYmVyLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfWApLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3JlcG9ydCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFwcGVuZCBhIGJsYW5rIHBhZ2UgdG8gdGhlIHJlcG9ydDsgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYWdlLlxuICBwdWJsaWMgYWRkUGFnZShyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncGFnZScsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFueSBzdWJzZXQgb2YgeyBuYW1lLCBtYXN0ZXJIaWRkZW4gfS4gQW4gZW1wdHkgbmFtZSBpcyBzdG9yZWQgYXMgbnVsbFxuICAvLyBzZXJ2ZXItc2lkZSwgd2hpY2ggcHV0cyB0aGUgdGFiIGJhY2sgb24gaXRzIHBvc2l0aW9uYWwgXCJQYWdlIE5cIiBsYWJlbDtcbiAgLy8gbWFzdGVySGlkZGVuIGhpZGVzIHRoZSByZXBvcnQncyBoZWFkZXIgYW5kIGZvb3RlciBvbiB0aGlzIHBhZ2UuXG4gIHB1YmxpYyB1cGRhdGVQYWdlKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcGFnZUlkOiBudW1iZXIsXG4gICAgcGFnZTogeyBuYW1lPzogc3RyaW5nOyBtYXN0ZXJIaWRkZW4/OiBib29sZWFuIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vcGFnZXMvJHtwYWdlSWR9YCksXG4gICAgICBwYWdlLFxuICAgICAge1xuICAgICAgICBrZXk6ICdwYWdlJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGVsZXRlIGEgcGFnZSBhbmQgZXZlcnl0aGluZyBvbiBpdC4gUmVmdXNlZCBzZXJ2ZXItc2lkZSBmb3IgdGhlIGxhc3RcbiAgLy8gcmVtYWluaW5nIHBhZ2Ug4oCUIGEgcmVwb3J0IHdpdGggbm8gY2FudmFzIGlzIGEgZGVsZXRlZCByZXBvcnQsIG5vdCBhIHBhZ2VcbiAgLy8gb3BlcmF0aW9uLlxuICBwdWJsaWMgZGVsZXRlUGFnZShyZXBvcnRJZDogbnVtYmVyLCBwYWdlSWQ6IG51bWJlciwgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3BhZ2VzLyR7cGFnZUlkfWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhZ2UnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IHRoZSB0YWIgb3JkZXIgYWZ0ZXIgYSBkcmFnIOKAlCB0aGUgd2hvbGUgbGlzdCwgaW4gaXRzIG5ldyBvcmRlciwgc29cbiAgLy8gdGhlIHNlcXVlbmNlIHN0YXlzIGdhcGxlc3Mgd2l0aG91dCB0aGUgc2VydmVyIGluZmVycmluZyB0aGUgbW92ZS5cbiAgcHVibGljIHNhdmVQYWdlUG9zaXRpb25zKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcG9zaXRpb25zOiB7IHBhZ2VJZDogbnVtYmVyOyBvcmRlcjogbnVtYmVyIH1bXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9wYWdlcy9wb3NpdGlvbnNgKSxcbiAgICAgIHsgcG9zaXRpb25zIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzOiBhbnkgc3Vic2V0IG9mIHsgdGl0bGUsIHBhZGRpbmcgfSDigJQgdGhlIGh1bWFuLWZhY2luZ1xuICAvLyBkaWFsb2cgZWRpdHMg4oCUIG9yIGEgdGV4dCBibG9jaydzIHsgaHRtbCB9IGZyb20gaXRzIGlubGluZSBlZGl0b3I7IGdlb21ldHJ5XG4gIC8vICh4L3kvdy9oL2Zsb3dXaWR0aCkgaXMgcGVyc2lzdGVkIHZpYSBzYXZlUG9zaXRpb25zIGZyb20gdGhlIGNhbnZhcyBpbnN0ZWFkLlxuICBwdWJsaWMgdXBkYXRlQ29tcG9uZW50KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgY29tcG9uZW50SWQ6IG51bWJlcixcbiAgICBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS9zZXR0aW5nc2ApLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFBsYWNlIGEgdGV4dCBibG9jayDigJQgb24gYSBwYWdlLCBvciBpbiB0aGUgaGVhZGVyL2Zvb3RlciB3aGVuIHBhZ2VJZCBpc1xuICAvLyBvbWl0dGVkLiBUaGUgb25seSBjb21wb25lbnQgdGhlIFVJIGNyZWF0ZXMgaXRzZWxmOiBjaGFydHMsIGxpc3RzIGFuZCBLUElzXG4gIC8vIG5lZWQgYSBxdWVyeSBhbmQgY29tZSBmcm9tIHRoZSBjaGF0LiBSZXNvbHZlcyB0byB7IGlkIH0uXG4gIHB1YmxpYyBhZGRUZXh0KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgdGV4dDogeyBwYWdlSWQ/OiBudW1iZXI7IGh0bWw/OiBzdHJpbmc7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3OiBudW1iZXI7IGg6IG51bWJlciB9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzYCksXG4gICAgICB0ZXh0LFxuICAgICAge1xuICAgICAgICBrZXk6ICdjb21wb25lbnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBEZWxldGUgb25lIGNvbXBvbmVudCBmcm9tIHRoZSBjYW52YXMsIHRvZ2V0aGVyIHdpdGggaXRzIGZpbHRlcnMgYW5kIGFueVxuICAvLyBmaWx0ZXIgZ3JvdXAgdGhleSBsZWF2ZSBlbXB0eS4gU29mdCBzZXJ2ZXItc2lkZSwgYnV0IHRoZXJlIGlzIG5vIHJlc3RvcmVcbiAgLy8gYW55d2hlcmUgaW4gdGhlIFVJLCBzbyB0aGUgZGlhbG9nJ3MgY29uZmlybSBwcmVzZW50cyBpdCBhcyBwZXJtYW5lbnQuXG4gIHB1YmxpYyBkZWxldGVDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmRlbGV0ZShcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdjb21wb25lbnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTb2Z0LWRlbGV0ZTogdGhlIHJlcG9ydCBsZWF2ZXMgdGhlIGxpc3RpbmcgYnV0IGtlZXBzIGl0cyBwYWdlcyBhbmRcbiAgLy8gY29tcG9uZW50cywgc28gdW5kZWxldGUoKSBicmluZ3MgYmFjayB0aGUgc2FtZSBkb2N1bWVudC5cbiAgcHVibGljIGRlbGV0ZShyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZGVsZXRlKFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBSZXN0b3JlIGEgc29mdC1kZWxldGVkIHJlcG9ydCB0aHJvdWdoIGl0cyBvd24gYWN0aW9uIGVuZHBvaW50IOKAlCB0aGUgcmVwb3J0XG4gIC8vIFBVVCBkb2VzIG5vdCBhY2NlcHQgYHN0YXRlYC4gSXRzIGZvbGRlciBpcyByZXN0b3JlZCB0b28gd2hlbiBpdCBpcyBkZWxldGVkLFxuICAvLyBvciBpbnNpZGUgb25lIHRoYXQgaXMsIHNvIHRoZSByZXBvcnQgbGFuZHMgYmFjayB3aGVyZSBpdCB3YXMuXG4gIHB1YmxpYyB1bmRlbGV0ZShyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L3VuZGVsZXRlYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncmVwb3J0JyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGFzc2VtYmxlZCBzdHJ1Y3R1cmU6IHBhZ2VzIOKGkiBjb21wb25lbnRzICgrIHRoZWlyIGZpbHRlcnMpIGFuZCB0aGVcbiAgLy8gcmVwb3J0J3MgZmlsdGVyIGdyb3Vwcy5cbiAgcHVibGljIGdldChyZXBvcnRJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH1gKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdyZXBvcnQnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBQZXJzaXN0IGdlb21ldHJ5IGZvciB0aGUgbW92ZWQgY29tcG9uZW50cyBvbmx5IOKAlCBhbnkgc3Vic2V0IG9mXG4gIC8vIHsgeCwgeSwgdywgaCB9IChpbmNoZXMpLCBmbG93V2lkdGggKHBlcmNlbnQpIGFuZCBvcmRlciAoZmxvdyBwb3NpdGlvbikuXG4gIHB1YmxpYyBzYXZlUG9zaXRpb25zKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgcG9zaXRpb25zOiAoeyBjb21wb25lbnRJZDogbnVtYmVyIH0gJiBQYXJ0aWFsPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHc6IG51bWJlcjsgaDogbnVtYmVyOyBmbG93V2lkdGg6IG51bWJlcjsgb3JkZXI6IG51bWJlciB9PilbXSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzL3Bvc2l0aW9uc2ApLFxuICAgICAgeyBwb3NpdGlvbnMgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBPbmUgY29tcG9uZW50J3MgZGF0YS4gVGhlIGJvZHkgY2FycmllcyBldmVyeXRoaW5nIHNlc3Npb24tc2NvcGVkOiB0aGVcbiAgLy8gcmVzb2x2ZWQgZmlsdGVyIHZhbHVlcyBhbmQgdGhlIGNvbXBvbmVudCdzIG93biBpbnRlcmFjdGlvbiBzdGF0ZS5cbiAgLy9cbiAgLy8gYGlzRXhwb3J0YCBtYXJrcyB0aGUgcmVhZCBhcyBwYXJ0IG9mIGEgUERGL1Bvd2VyUG9pbnQgcmVuZGVyLiBUaGUgc2VydmVyXG4gIC8vIGdpdmVzIHRob3NlIGEgbG9uZ2VyIHBlci1zdGF0ZW1lbnQgY2VpbGluZyB0aGFuIGFuIG9uLXNjcmVlbiB0aWxlLCBiZWNhdXNlXG4gIC8vIGEgcmVhZGVyIHdhdGNoaW5nIGFuIGV4cG9ydCBwcm9ncmVzcyBiYXIgY2FuIHdhaXQgZm9yIGEgcXVlcnkgbm9ib2R5IHdvdWxkXG4gIC8vIHRvbGVyYXRlIHdhaXRpbmcgZm9yIG9uIGEgZGFzaGJvYXJkLlxuICBwdWJsaWMgY29tcG9uZW50RGF0YShcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHt9LFxuICAgIGlzRXhwb3J0ID0gZmFsc2UsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZGF0YWApLFxuICAgICAgeyBmaWx0ZXJzLCBzdGF0ZSwgZXhwb3J0OiBpc0V4cG9ydCB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdkYXRhJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwb3J0cyBvbmUgY29tcG9uZW50IHRvIENTViBzZXJ2ZXItc2lkZTogdGhlIGZpbGUgaXMgd2hhdCB0aGUgc2NyZWVuXG4gIC8vIHNob3dzIChhIGNoYXJ0IG9yIEtQSSBhcyByZW5kZXJlZCwgYSBsaXN0IGluIGZ1bGwgaW4gdGhlIHNjcmVlbidzIG9yZGVyKS5cbiAgLy8gVGhlIGJhY2tlbmQgc3RyZWFtcyBwZXJjZW50YWdlIHByb2dyZXNzIHdoaWxlIGl0IHdyaXRlcy5cbiAgLy9cbiAgLy8ga2V5OiBudWxsIG9uIHB1cnBvc2UsIHVubGlrZSB0aGUga2V5OiAndXJsJyBwcmVzaWduZWQtZXhwb3J0IHBhdHRlcm46IHRoZVxuICAvLyByZXNwb25zZSBhbHNvIGNhcnJpZXMgYG5vdGVzYCwgdGhlIHNlbnRlbmNlcyBzYXlpbmcgaG93IHRoZSBmaWxlIGZhbGxzXG4gIC8vIHNob3J0IG9mIHRoZSBmdWxsIHJlc3VsdCwgYW5kIHRoZSBjYWxsZXIgaGFzIHRvIHNob3cgdGhlbSBiZWZvcmUgaXQgaGFuZHNcbiAgLy8gdGhlIHVybCB0byBGc1Byb2Nlc3MuZG93bmxvYWQuXG4gIHB1YmxpYyBleHBvcnRDb21wb25lbnQoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcnM6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdLFxuICAgIHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7fSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxDb21wb25lbnRFeHBvcnRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZXhwb3J0YCksXG4gICAgICB7IGZpbHRlcnMsIHN0YXRlIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwb3J0cyBFVkVSWSBjb21wb25lbnQgb24gdGhlIHJlcG9ydCDigJQgb3Igb24gb25lIHBhZ2Ug4oCUIHNlcnZlci1zaWRlIGFuZFxuICAvLyByZXNvbHZlcyB0byBhIHByZXNpZ25lZCBVUkwgZm9yIGEgemlwIG9mIG9uZSBDU1YgcGVyIGNvbXBvbmVudCwgZm9sZGVyZWQgYnlcbiAgLy8gcGFnZSwgcGx1cyBhbiAnRXhwb3J0IE5vdGVzLnR4dCcuIGBmaWx0ZXJzYCBjYXJyaWVzIHRoZSByZXNvbHZlZCB2YWx1ZXMgZm9yXG4gIC8vIGV2ZXJ5IGNvbXBvbmVudCB0b2dldGhlcjsgZWFjaCBvbmUgcGlja3Mgb3V0IGl0cyBvd24uIGBmcmVxdWVuY3lgIGlzIHRoZVxuICAvLyByZXBvcnQncyBncm91cC1ieSBncmFpbiAodGhlIHNlcnZlciByZS1idWNrZXRzIG9ubHkgdGltZS1zZXJpZXMgY2hhcnRzIHRvXG4gIC8vIGl0KSwgYW5kIGBmaWx0ZXJTdW1tYXJ5YCBpcyB0aGUgZmlsdGVyIGJhciBhcyB0aGUgdmlld2VyIHJlYWRzIGl0LCB3cml0dGVuXG4gIC8vIHZlcmJhdGltIGludG8gdGhlIG5vdGVzIGZpbGUuIFNhbWUga2VlcC1hbGl2ZSBjb250cmFjdCBhcyBleHBvcnRDb21wb25lbnQsXG4gIC8vIG92ZXIgYSBsb25nZXIgcnVuOyBjb25zdW1lIHRocm91Z2ggRnNQcm9jZXNzLmRvd25sb2FkLlxuICBwdWJsaWMgZXhwb3J0UmVwb3J0KFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZmlsdGVyczogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW10sXG4gICAgcGFnZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbCxcbiAgICBmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbCxcbiAgICBmaWx0ZXJTdW1tYXJ5OiBzdHJpbmdbXSA9IFtdLFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnBvc3QoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9leHBvcnRgKSxcbiAgICAgIHtcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgLi4uKHBhZ2VJZCA/IHsgcGFnZUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihmcmVxdWVuY3kgPyB7IGZyZXF1ZW5jeSB9IDoge30pLFxuICAgICAgICBmaWx0ZXJTdW1tYXJ5LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAndXJsJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gRGlzdGluY3Qgb3B0aW9ucyBmb3IgYSBzZWxlY3QgZmlsdGVyIChkcml2ZXMgbXVsdGlzZWxlY3QgY29udHJvbHMpLlxuICBwdWJsaWMgZmlsdGVyT3B0aW9ucyhyZXBvcnRJZDogbnVtYmVyLCBmaWx0ZXJJZDogbnVtYmVyLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgJHtyZXBvcnRJZH0vZmlsdGVycy8ke2ZpbHRlcklkfS9vcHRpb25zYCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnb3B0aW9ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBzdGF0ZW1lbnQgYSBjb21wb25lbnQgcnVucywgZm9yIHRoZSBTUUwgdGFiLlxuICAvL1xuICAvLyBGZXRjaGVkIHJhdGhlciB0aGFuIHJlYWQgb2ZmIHRoZSBjb21wb25lbnQsIGJlY2F1c2UgYSBERVJJVkVEIGNvbXBvbmVudCBoYXNcbiAgLy8gbm8gc3RvcmVkIFNRTCDigJQgaXQgc3RvcmVzIGEgZG9jdW1lbnQsIGFuZCBpdHMgc3RhdGVtZW50IG9ubHkgZXhpc3RzIG9uY2VcbiAgLy8gdGhlIGJhY2tlbmQgY29tcGlsZXMgdGhhdCBkb2N1bWVudC4gQ29tcGlsZWQgcGVyIHJlcXVlc3QsIGZvciB0aGUgb25lXG4gIC8vIGNvbXBvbmVudCBiZWluZyBsb29rZWQgYXQsIHNvIG9wZW5pbmcgYSByZXBvcnQgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gIC8vXG4gIC8vIGBrZXk6IG51bGxgIGJlY2F1c2UgdGhlIHdob2xlIGVudmVsb3BlIGlzIHRoZSBhbnN3ZXIgaGVyZTogYSBzdGFsZSBkb2N1bWVudFxuICAvLyBjb21lcyBiYWNrIGFzIHsgc3FsOiBudWxsLCBlcnJvciwgZXJyb3JUeXBlIH0gYW5kIHVud3JhcHBpbmcgb25lIGZpZWxkXG4gIC8vIHdvdWxkIHRocm93IHRoZSBkaWFnbm9zaXMgYXdheS5cbiAgcHVibGljIGNvbXBvbmVudFNxbChcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIGNvbXBvbmVudElkOiBudW1iZXIsXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8UmVwb3J0Q29tcG9uZW50U3FsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L3NxbGApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudCBTUUwncyBmaWx0ZXJhYmxlIG91dHB1dCBjb2x1bW5zIOKAlCBkcml2ZXMgdGhlIGNvbHVtbiBwaWNrZXJcbiAgLy8gaW4gdGhlIGZpbHRlciBVSSBzbyBhIGNvbHVtbiBuYW1lIGlzIG5ldmVyIHR5cGVkIGJ5IGhhbmQuXG4gIHB1YmxpYyBjb21wb25lbnRDb2x1bW5zKHJlcG9ydElkOiBudW1iZXIsIGNvbXBvbmVudElkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9L2NvbHVtbnNgKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdjb2x1bW5zJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gTWFrZSBvbmUgY29sdW1uIGZpbHRlcmFibGUuIGBsZXZlbGAgKGNvbXBvbmVudCB8IHJlcG9ydCkgcGxhY2VzIGEgbmV3XG4gIC8vIGdyb3VwOyBgZ3JvdXBJZGAgaW5zdGVhZCBsaW5rcyBpbnRvIGFuIGV4aXN0aW5nIGdyb3VwLiBBIHNlbGVjdCBmaWx0ZXInc1xuICAvLyBvcHRpb25zIGFyZSBkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudCBTUUwgd2hlbiBvcHRpb25zU3FsIGlzIG9taXR0ZWQuXG4gIHB1YmxpYyBhZGRGaWx0ZXIoXG4gICAgcmVwb3J0SWQ6IG51bWJlcixcbiAgICBjb21wb25lbnRJZDogbnVtYmVyLFxuICAgIGZpbHRlcjogeyBmaWx0ZXJDb2x1bW46IHN0cmluZzsgdHlwZT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGxldmVsPzogc3RyaW5nOyBvcHRpb25zU3FsPzogc3RyaW5nOyBncm91cElkPzogbnVtYmVyIH0sXG4gICAgY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vZmlsdGVyc2ApLFxuICAgICAgZmlsdGVyLFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWx0ZXInLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBVcGRhdGUgYSBmaWx0ZXIg4oCUIGFueSBzdWJzZXQgb2YgeyBsYWJlbCwgb3B0aW9uc1NxbCwgZW5hYmxlZCB9LlxuICBwdWJsaWMgdXBkYXRlRmlsdGVyKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZmlsdGVySWQ6IG51bWJlcixcbiAgICBjaGFuZ2VzOiB7IGxhYmVsPzogc3RyaW5nOyBvcHRpb25zU3FsPzogc3RyaW5nOyBlbmFibGVkPzogYm9vbGVhbiB9LFxuICAgIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLnB1dChcbiAgICAgIHRoaXMuX3BhdGgoYCR7cmVwb3J0SWR9L2ZpbHRlcnMvJHtmaWx0ZXJJZH1gKSxcbiAgICAgIGNoYW5nZXMsXG4gICAgICB7XG4gICAgICAgIGtleTogJ2ZpbHRlcicsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhIGZpbHRlciAoaXRzIGdyb3VwIGdvZXMgdG9vIHdoZW4gbm90aGluZyBlbHNlIHVzZXMgaXQpLlxuICBwdWJsaWMgZGVsZXRlRmlsdGVyKHJlcG9ydElkOiBudW1iZXIsIGZpbHRlcklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5kZWxldGUoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJzLyR7ZmlsdGVySWR9YCksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIGdsb2JhbCBBSSBrbm93bGVkZ2UgZG9jdW1lbnQgKG9wZXJhdG9yLWF1dGhvcmVkIGFnZW50IGluc3RydWN0aW9ucylcbiAgLy8gYW5kIGl0cyBmdWxsIHZlcnNpb24gaGlzdG9yeTogeyBpbnN0cnVjdGlvbnMsIHZlcnNpb25zIH0uXG4gIHB1YmxpYyBpbnN0cnVjdGlvbnMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ2luc3RydWN0aW9ucycpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU2F2ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCAoYXBwZW5kLW9ubHk7IGFuIHVuY2hhbmdlZCBzYXZlIGlzIGFcbiAgLy8gbm8tb3Agc2VydmVyLXNpZGUpLiBSZXNvbHZlcyB0byB0aGUgc2FtZSB7IGluc3RydWN0aW9ucywgdmVyc2lvbnMgfSBzaGFwZS5cbiAgcHVibGljIHNhdmVJbnN0cnVjdGlvbnMoY29udGVudDogc3RyaW5nLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucHV0KFxuICAgICAgdGhpcy5fcGF0aCgnaW5zdHJ1Y3Rpb25zJyksXG4gICAgICB7IGNvbnRlbnQgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBNYWtlIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQgY3VycmVudCAobm8gbmV3IHJvdyBpcyBjcmVhdGVkKS5cbiAgcHVibGljIHJlc3RvcmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbklkOiBudW1iZXIsIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wb3N0KFxuICAgICAgdGhpcy5fcGF0aChgaW5zdHJ1Y3Rpb25zLyR7aW5zdHJ1Y3Rpb25JZH0vcmVzdG9yZWApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogbnVsbCxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gUnVuIGEgc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQsIHN0cmVhbWVkOiBlbWl0cyBhbiBldmVudCBwZXIgTkRKU09OIGZyYW1lXG4gIC8vICh7IGtpbmQ6ICdsb2cnLCBsaW5lLCBwZXJjZW50IH0gZmVlZCBsaW5lcyBhbmQgeyBraW5kOiAnc2VjdGlvbicgfSBwaGFzZVxuICAvLyBtYXJrZXJzKSBhbmQgY29tcGxldGVzIHdoZW4gdGhlIGJ1aWxkIGVuZHMuIEZlZWQgdGhlIGxpbmVzIGludG8gRnNQcm9jZXNzLlxuICBwdWJsaWMgc2VtYW50aWNCdWlsZChjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5zdHJlYW0oXG4gICAgICAnUE9TVCcsXG4gICAgICB0aGlzLl9wYXRoKCdzZW1hbnRpYy9idWlsZCcpLFxuICAgICAgeyBzdHJlYW06IHRydWUgfSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuICB9XG5cbiAgLy8gTGF0ZXN0IGJ1aWxkIHN0YXR1cyArIGVudGl0eSBzY29yZWJvYXJkOiB7IGJ1aWxkLCBkZXRhaWwgfS5cbiAgcHVibGljIHNlbWFudGljQnVpbGRTdGF0dXMoY29uZmlnOiBSZXF1ZXN0Q29uZmlnID0ge30pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBpLmdldChcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkJyksXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAga2V5OiBudWxsLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvLyBTdG9wIHRoZSBydW5uaW5nIGJ1aWxkICh0aGUgY3VycmVudCBzZW1hbnRpYyBkYXRhYmFzZSBzdGF5cyBpbiBwbGFjZSkuXG4gIHB1YmxpYyBzZW1hbnRpY0J1aWxkU3RvcChjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkucG9zdChcbiAgICAgIHRoaXMuX3BhdGgoJ3NlbWFudGljL2J1aWxkL3N0b3AnKSxcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdidWlsZCcsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIE9uZSBlbnRpdHkncyBjYWNoZWQgQUktY2xhc3NpZmllZCBjb2RlIGZ1bmN0aW9ucyDigJQgbG9hZGVkIG9uIGV4cGFuZCwgb25lXG4gIC8vIGVudGl0eSBhdCBhIHRpbWUsIGJlY2F1c2UgdGhlIGZ1bGwgc2V0IGFjcm9zcyBhbGwgZW50aXRpZXMgaXMgZmFyIHRvbyBiaWdcbiAgLy8gdG8gc2hpcCBpbnNpZGUgdGhlIHNjb3JlYm9hcmQgY2FsbC5cbiAgcHVibGljIHNlbWFudGljRW50aXR5RnVuY3Rpb25zKGVudGl0eTogc3RyaW5nLCBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGkuZ2V0KFxuICAgICAgdGhpcy5fcGF0aChgc2VtYW50aWMvZW50aXRpZXMvJHtlbnRpdHl9L2Z1bmN0aW9uc2ApLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2VudGl0eUZ1bmN0aW9ucycsXG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQgbW9kdWxlJ3MgR2VuZXJhbCBzZXR0aW5ncyAoc2VtYW50aWMtYnVpbGQgY29uY3VycmVuY3kgKyBpdHMgYm91bmRzKS5cbiAgcHVibGljIHNldHRpbmdzKGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5nZXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZXR0aW5ncycpLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gU2F2ZSB0aGUgR2VuZXJhbCBzZXR0aW5nczsgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgeyBzZXR0aW5ncyB9IHNoYXBlLlxuICBwdWJsaWMgc2F2ZVNldHRpbmdzKHNldHRpbmdzOiB7IHNlbWFudGljQnVpbGRDb25jdXJyZW5jeTogbnVtYmVyIH0sIGNvbmZpZzogUmVxdWVzdENvbmZpZyA9IHt9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKCdzZXR0aW5ncycpLFxuICAgICAgc2V0dGluZ3MsXG4gICAgICB7XG4gICAgICAgIGtleTogJ3NldHRpbmdzJyxcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gVXBkYXRlIGEgZmlsdGVyIGdyb3VwIOKAlCBpdHMgZXhwb3N1cmUgbGV2ZWwgKCdjb21wb25lbnQnIHwgJ3JlcG9ydCcgfCAnYm90aCcpXG4gIC8vIGFuZC9vciBpdHMgZGVmYXVsdCB2YWx1ZSAodGhlIHZhbHVlIHNlZWRpbmcgdGhlIHJlcG9ydCBiYXIgb24gb3BlbikuIFNlbmRcbiAgLy8gYGRlZmF1bHQ6IG51bGxgIChvciBhbiBlbXB0eSBkZWZhdWx0KSB0byBjbGVhciBpdC4gT25seSB0aGUga2V5cyBwcm92aWRlZFxuICAvLyBhcmUgY2hhbmdlZC5cbiAgcHVibGljIHVwZGF0ZUZpbHRlckdyb3VwKFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgZ3JvdXBJZDogbnVtYmVyLFxuICAgIGNoYW5nZXM6IHsgbGV2ZWw/OiBSZXBvcnRGaWx0ZXJMZXZlbDsgZGVmYXVsdD86IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwgfSxcbiAgICBjb25maWc6IFJlcXVlc3RDb25maWcgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaS5wdXQoXG4gICAgICB0aGlzLl9wYXRoKGAke3JlcG9ydElkfS9maWx0ZXJncm91cHMvJHtncm91cElkfWApLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmlsdGVyR3JvdXAnLFxuICAgICAgICAuLi5jb25maWcsXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|