@firestitch/report 18.0.11 → 18.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/app/reports/dialogs/entity-functions/entity-functions.component.d.ts +22 -0
  2. package/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.d.ts +6 -21
  3. package/app/reports/dialogs/global-settings/global-settings.component.d.ts +3 -3
  4. package/app/reports/dialogs/instruction-history/instruction-history.component.d.ts +16 -0
  5. package/app/reports/interfaces/report.interface.d.ts +10 -1
  6. package/app/reports/report-filter-items.d.ts +7 -0
  7. package/esm2022/app/reports/components/component-list/component-list.component.mjs +4 -2
  8. package/esm2022/app/reports/dialogs/entity-functions/entity-functions.component.mjs +81 -0
  9. package/esm2022/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.mjs +23 -71
  10. package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +31 -22
  11. package/esm2022/app/reports/dialogs/instruction-history/instruction-history.component.mjs +60 -0
  12. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +28 -7
  13. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  14. package/esm2022/app/reports/report-filter-items.mjs +28 -10
  15. package/fesm2022/{firestitch-report-echarts-DaBOoR9Z.mjs → firestitch-report-echarts-D9IzyGer.mjs} +2 -2
  16. package/fesm2022/{firestitch-report-echarts-DaBOoR9Z.mjs.map → firestitch-report-echarts-D9IzyGer.mjs.map} +1 -1
  17. package/fesm2022/{firestitch-report-firestitch-report-Cwsww3Jz.mjs → firestitch-report-firestitch-report-BwC8lvzk.mjs} +219 -130
  18. package/fesm2022/firestitch-report-firestitch-report-BwC8lvzk.mjs.map +1 -0
  19. package/fesm2022/firestitch-report.mjs +1 -1
  20. package/package.json +1 -1
  21. package/app/reports/dialogs/global-settings/components/history/history.component.d.ts +0 -8
  22. package/esm2022/app/reports/dialogs/global-settings/components/history/history.component.mjs +0 -32
  23. package/fesm2022/firestitch-report-firestitch-report-Cwsww3Jz.mjs.map +0 -1
@@ -2,19 +2,18 @@ import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, signa
2
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
3
  import { FormsModule } from '@angular/forms';
4
4
  import { MatButton } from '@angular/material/button';
5
- import { MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
5
+ import { MatDialog, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
6
6
  import { MatTabsModule } from '@angular/material/tabs';
7
7
  import { FsDialogModule } from '@firestitch/dialog';
8
8
  import { FsFormModule } from '@firestitch/form';
9
9
  import { FsMessage } from '@firestitch/message';
10
- import { FsPrompt } from '@firestitch/prompt';
11
10
  import { FsSkeletonModule } from '@firestitch/skeleton';
12
11
  import { FsTabsModule } from '@firestitch/tabs';
13
12
  import { switchMap, tap } from 'rxjs/operators';
14
13
  import { ReportData } from '../../data/report.data';
14
+ import { InstructionHistoryComponent } from '../instruction-history/instruction-history.component';
15
15
  import { AiKnowledgeComponent } from './components/ai-knowledge/ai-knowledge.component';
16
16
  import { GeneralComponent } from './components/general/general.component';
17
- import { HistoryComponent } from './components/history/history.component';
18
17
  import { SemanticDatabaseComponent } from './components/semantic-database/semantic-database.component';
19
18
  import * as i0 from "@angular/core";
20
19
  import * as i1 from "@angular/forms";
@@ -46,14 +45,14 @@ const SCAFFOLD = [
46
45
  // the dialog frame, the tab group, and a per-tab footer. Each tab is its own
47
46
  // component —
48
47
  // AI Knowledge — the operator-authored markdown document appended to the
49
- // report agent's system instructions on every chat turn.
50
- // History — every saved version (append-only), any of which can be restored.
48
+ // report agent's system instructions on every chat turn. Its footer carries a
49
+ // View History button opening the version-history dialog (restores happen
50
+ // there; the shell refreshes on close).
51
51
  // Semantic Database — the build scoreboard the AI is built from, with a
52
52
  // self-contained Build action.
53
53
  // General — report-module settings (the semantic-build concurrency).
54
- // The shell owns the shared data (the instructions document for the first two
55
- // tabs, the settings for General) plus the tab-aware save; everything else lives
56
- // in the children.
54
+ // The shell owns the shared data (the instructions document, the settings for
55
+ // General) plus the tab-aware save; everything else lives in the children.
57
56
  export class GlobalSettingsComponent {
58
57
  selectedTab = 'knowledge';
59
58
  // The Semantic Database tab component, so the shared footer can drive its
@@ -74,9 +73,9 @@ export class GlobalSettingsComponent {
74
73
  // Gate the whole form on both loads, so every tab's fields are ready to render.
75
74
  loaded = computed(() => !!this.instructions() && !!this.settings());
76
75
  _dialogRef = inject(MatDialogRef);
76
+ _dialog = inject(MatDialog);
77
77
  _reportData = inject(ReportData);
78
78
  _message = inject(FsMessage);
79
- _prompt = inject(FsPrompt);
80
79
  _destroyRef = inject(DestroyRef);
81
80
  constructor() {
82
81
  this._init();
@@ -98,17 +97,28 @@ export class GlobalSettingsComponent {
98
97
  this._dialogRef.close(instructions);
99
98
  }));
100
99
  };
101
- // Make an earlier version current — flips the flag, creates no new version.
102
- restore(version) {
103
- this._prompt.confirm({
104
- title: 'Restore version',
105
- template: 'Make this version the current AI knowledge? The newer versions stay in the history.',
106
- commitLabel: 'Restore',
100
+ // Open the version-history dialog. Restores happen inside it, so when it
101
+ // closes (however it closes) re-fetch the document: a restore changed the
102
+ // current version and must reseed the editor; otherwise just refresh the
103
+ // version list without touching an unsaved draft.
104
+ openHistory() {
105
+ const currentId = this.instructions()?.instructions?.id;
106
+ this._dialog.open(InstructionHistoryComponent, {
107
+ width: '800px',
108
+ maxWidth: '95vw',
109
+ maxHeight: '85vh',
110
+ autoFocus: false,
111
+ data: { versions: this.instructions()?.versions ?? [] },
107
112
  })
108
- .pipe(switchMap(() => this._reportData.restoreInstruction(version.id)), takeUntilDestroyed(this._destroyRef))
113
+ .afterClosed()
114
+ .pipe(switchMap(() => this._reportData.instructions()), takeUntilDestroyed(this._destroyRef))
109
115
  .subscribe((instructions) => {
110
- this._applyInstructions(instructions);
111
- this._message.success('Version restored');
116
+ if (instructions.instructions?.id !== currentId) {
117
+ this._applyInstructions(instructions);
118
+ }
119
+ else {
120
+ this.instructions.set(instructions);
121
+ }
112
122
  });
113
123
  }
114
124
  _init() {
@@ -128,7 +138,7 @@ export class GlobalSettingsComponent {
128
138
  this.concurrency.set(settings.semanticBuildConcurrency);
129
139
  }
130
140
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GlobalSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
131
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GlobalSettingsComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "semanticDatabase", first: true, predicate: SemanticDatabaseComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<form\n *fsSkeletonForm=\"loaded()\"\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <fs-dialog-title>\n Report Settings\n </fs-dialog-title>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"AI Knowledge\"\n name=\"knowledge\">\n <fs-ai-report-global-settings-ai-knowledge\n [content]=\"content()\"\n (contentChange)=\"content.set($event)\"\n [config]=\"editorConfig\">\n </fs-ai-report-global-settings-ai-knowledge>\n </mat-tab>\n <mat-tab\n label=\"History\"\n name=\"history\">\n <fs-ai-report-global-settings-history\n [versions]=\"instructions()?.versions ?? []\"\n (restore)=\"restore($event)\">\n </fs-ai-report-global-settings-history>\n </mat-tab>\n <mat-tab\n label=\"Semantic Database\"\n name=\"build\">\n <fs-ai-report-global-settings-semantic-database>\n </fs-ai-report-global-settings-semantic-database>\n </mat-tab>\n <mat-tab\n label=\"General\"\n name=\"general\">\n <fs-ai-report-global-settings-general\n [concurrency]=\"concurrency()\"\n (concurrencyChange)=\"concurrency.set($event)\"\n [min]=\"settings()!.semanticBuildConcurrencyMin\"\n [max]=\"settings()!.semanticBuildConcurrencyMax\">\n </fs-ai-report-global-settings-general>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <!-- The footer follows the selected tab. AI Knowledge and General are the\n editable tabs, so they get Save/Cancel; History and Semantic Database\n are read/run surfaces, so they get a primary Close. The Semantic\n Database tab also carries its Build/Rebuild/Stop action beside Close. -->\n <fs-form-dialog-actions [save]=\"selectedTab === 'knowledge' || selectedTab === 'general'\">\n @if (selectedTab !== 'knowledge' && selectedTab !== 'general') {\n <button\n type=\"button\"\n mat-button\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Close\n </button>\n }\n @if (selectedTab === 'build' && semanticDatabase(); as db) {\n @if (db.buildActive()) {\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"db.stopBuild()\">\n Stop Build\n </button>\n } @else {\n @if (db.status(); as buildStatus) {\n <button\n type=\"button\"\n mat-button\n (click)=\"db.build()\">\n {{ buildStatus.detail.generatedAt ? 'Rebuild' : 'Build' }}\n </button>\n }\n }\n }\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i2.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "component", type: i2.FsDialogTitleComponent, selector: "fs-dialog-title", inputs: ["close", "dockToggle", "back"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "component", type: i3.FsFormDialogActionsComponent, selector: "fs-form-dialog-actions", inputs: ["save", "create", "close", "done", "closeData", "name"] }, { kind: "directive", type: i3.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i4.FsSkeletonFormDirective, selector: "[fsSkeletonForm]", inputs: ["fsSkeletonForm", "fsSkeletonFormLines"] }, { kind: "ngmodule", type: FsTabsModule }, { kind: "directive", type: i5.FsTabsHeaderTabGroupDirective, selector: "mat-tab-group, matTabGroup, [matTabGroup]", inputs: ["orientation", "selected", "selectedData"], outputs: ["selectedChange", "selectedDataChange"], exportAs: ["fsTabsHeaderTabGroup"] }, { kind: "directive", type: i5.FsTabsTabDirective, selector: "mat-tab,matTab", inputs: ["name", "data"], exportAs: ["fsTabsTab"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i6.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: AiKnowledgeComponent, selector: "fs-ai-report-global-settings-ai-knowledge", inputs: ["content", "config"], outputs: ["contentChange"] }, { kind: "component", type: GeneralComponent, selector: "fs-ai-report-global-settings-general", inputs: ["concurrency", "min", "max"], outputs: ["concurrencyChange"] }, { kind: "component", type: HistoryComponent, selector: "fs-ai-report-global-settings-history", inputs: ["versions"], outputs: ["restore"] }, { kind: "component", type: SemanticDatabaseComponent, selector: "fs-ai-report-global-settings-semantic-database" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
141
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GlobalSettingsComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "semanticDatabase", first: true, predicate: SemanticDatabaseComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<form\n *fsSkeletonForm=\"loaded()\"\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <fs-dialog-title>\n Report Settings\n </fs-dialog-title>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"AI Knowledge\"\n name=\"knowledge\">\n <fs-ai-report-global-settings-ai-knowledge\n [content]=\"content()\"\n (contentChange)=\"content.set($event)\"\n [config]=\"editorConfig\">\n </fs-ai-report-global-settings-ai-knowledge>\n </mat-tab>\n <mat-tab\n label=\"Semantic Database\"\n name=\"build\">\n <fs-ai-report-global-settings-semantic-database>\n </fs-ai-report-global-settings-semantic-database>\n </mat-tab>\n <mat-tab\n label=\"General\"\n name=\"general\">\n <fs-ai-report-global-settings-general\n [concurrency]=\"concurrency()\"\n (concurrencyChange)=\"concurrency.set($event)\"\n [min]=\"settings()!.semanticBuildConcurrencyMin\"\n [max]=\"settings()!.semanticBuildConcurrencyMax\">\n </fs-ai-report-global-settings-general>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <!-- The footer follows the selected tab. AI Knowledge projects its own\n Save | View History | Cancel row (fs-form-dialog-actions renders\n projected content after Save/Cancel, so the default pair can't keep\n View History beside Save); General uses the default Save/Cancel; the\n Semantic Database tab is a read/run surface, so it gets a primary\n Close plus its Build/Rebuild/Stop action. -->\n <fs-form-dialog-actions [save]=\"selectedTab === 'general'\">\n @if (selectedTab === 'knowledge') {\n <button\n type=\"submit\"\n mat-button\n color=\"primary\">\n Save\n </button>\n <button\n type=\"button\"\n mat-button\n (click)=\"openHistory()\">\n View History\n </button>\n <button\n type=\"button\"\n mat-button\n [mat-dialog-close]=\"null\">\n Cancel\n </button>\n }\n @if (selectedTab === 'build') {\n <button\n type=\"button\"\n mat-button\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Close\n </button>\n }\n @if (selectedTab === 'build' && semanticDatabase(); as db) {\n @if (db.buildActive()) {\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"db.stopBuild()\">\n Stop Build\n </button>\n } @else {\n @if (db.status(); as buildStatus) {\n <button\n type=\"button\"\n mat-button\n (click)=\"db.build()\">\n {{ buildStatus.detail.generatedAt ? 'Rebuild' : 'Build' }}\n </button>\n }\n }\n }\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i2.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "component", type: i2.FsDialogTitleComponent, selector: "fs-dialog-title", inputs: ["close", "dockToggle", "back"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "component", type: i3.FsFormDialogActionsComponent, selector: "fs-form-dialog-actions", inputs: ["save", "create", "close", "done", "closeData", "name"] }, { kind: "directive", type: i3.FsButtonDirective, selector: "[mat-raised-button],[mat-button],[mat-flat-button],[mat-stroked-button]", inputs: ["name", "dirtySubmit"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i4.FsSkeletonFormDirective, selector: "[fsSkeletonForm]", inputs: ["fsSkeletonForm", "fsSkeletonFormLines"] }, { kind: "ngmodule", type: FsTabsModule }, { kind: "directive", type: i5.FsTabsHeaderTabGroupDirective, selector: "mat-tab-group, matTabGroup, [matTabGroup]", inputs: ["orientation", "selected", "selectedData"], outputs: ["selectedChange", "selectedDataChange"], exportAs: ["fsTabsHeaderTabGroup"] }, { kind: "directive", type: i5.FsTabsTabDirective, selector: "mat-tab,matTab", inputs: ["name", "data"], exportAs: ["fsTabsTab"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i6.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: AiKnowledgeComponent, selector: "fs-ai-report-global-settings-ai-knowledge", inputs: ["content", "config"], outputs: ["contentChange"] }, { kind: "component", type: GeneralComponent, selector: "fs-ai-report-global-settings-general", inputs: ["concurrency", "min", "max"], outputs: ["concurrencyChange"] }, { kind: "component", type: SemanticDatabaseComponent, selector: "fs-ai-report-global-settings-semantic-database" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
132
142
  }
133
143
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GlobalSettingsComponent, decorators: [{
134
144
  type: Component,
@@ -145,8 +155,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
145
155
  MatTabsModule,
146
156
  AiKnowledgeComponent,
147
157
  GeneralComponent,
148
- HistoryComponent,
149
158
  SemanticDatabaseComponent,
150
- ], template: "<form\n *fsSkeletonForm=\"loaded()\"\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <fs-dialog-title>\n Report Settings\n </fs-dialog-title>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"AI Knowledge\"\n name=\"knowledge\">\n <fs-ai-report-global-settings-ai-knowledge\n [content]=\"content()\"\n (contentChange)=\"content.set($event)\"\n [config]=\"editorConfig\">\n </fs-ai-report-global-settings-ai-knowledge>\n </mat-tab>\n <mat-tab\n label=\"History\"\n name=\"history\">\n <fs-ai-report-global-settings-history\n [versions]=\"instructions()?.versions ?? []\"\n (restore)=\"restore($event)\">\n </fs-ai-report-global-settings-history>\n </mat-tab>\n <mat-tab\n label=\"Semantic Database\"\n name=\"build\">\n <fs-ai-report-global-settings-semantic-database>\n </fs-ai-report-global-settings-semantic-database>\n </mat-tab>\n <mat-tab\n label=\"General\"\n name=\"general\">\n <fs-ai-report-global-settings-general\n [concurrency]=\"concurrency()\"\n (concurrencyChange)=\"concurrency.set($event)\"\n [min]=\"settings()!.semanticBuildConcurrencyMin\"\n [max]=\"settings()!.semanticBuildConcurrencyMax\">\n </fs-ai-report-global-settings-general>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <!-- The footer follows the selected tab. AI Knowledge and General are the\n editable tabs, so they get Save/Cancel; History and Semantic Database\n are read/run surfaces, so they get a primary Close. The Semantic\n Database tab also carries its Build/Rebuild/Stop action beside Close. -->\n <fs-form-dialog-actions [save]=\"selectedTab === 'knowledge' || selectedTab === 'general'\">\n @if (selectedTab !== 'knowledge' && selectedTab !== 'general') {\n <button\n type=\"button\"\n mat-button\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Close\n </button>\n }\n @if (selectedTab === 'build' && semanticDatabase(); as db) {\n @if (db.buildActive()) {\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"db.stopBuild()\">\n Stop Build\n </button>\n } @else {\n @if (db.status(); as buildStatus) {\n <button\n type=\"button\"\n mat-button\n (click)=\"db.build()\">\n {{ buildStatus.detail.generatedAt ? 'Rebuild' : 'Build' }}\n </button>\n }\n }\n }\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>\n", styles: [":host{display:block}\n"] }]
159
+ ], template: "<form\n *fsSkeletonForm=\"loaded()\"\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <fs-dialog-title>\n Report Settings\n </fs-dialog-title>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"AI Knowledge\"\n name=\"knowledge\">\n <fs-ai-report-global-settings-ai-knowledge\n [content]=\"content()\"\n (contentChange)=\"content.set($event)\"\n [config]=\"editorConfig\">\n </fs-ai-report-global-settings-ai-knowledge>\n </mat-tab>\n <mat-tab\n label=\"Semantic Database\"\n name=\"build\">\n <fs-ai-report-global-settings-semantic-database>\n </fs-ai-report-global-settings-semantic-database>\n </mat-tab>\n <mat-tab\n label=\"General\"\n name=\"general\">\n <fs-ai-report-global-settings-general\n [concurrency]=\"concurrency()\"\n (concurrencyChange)=\"concurrency.set($event)\"\n [min]=\"settings()!.semanticBuildConcurrencyMin\"\n [max]=\"settings()!.semanticBuildConcurrencyMax\">\n </fs-ai-report-global-settings-general>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <!-- The footer follows the selected tab. AI Knowledge projects its own\n Save | View History | Cancel row (fs-form-dialog-actions renders\n projected content after Save/Cancel, so the default pair can't keep\n View History beside Save); General uses the default Save/Cancel; the\n Semantic Database tab is a read/run surface, so it gets a primary\n Close plus its Build/Rebuild/Stop action. -->\n <fs-form-dialog-actions [save]=\"selectedTab === 'general'\">\n @if (selectedTab === 'knowledge') {\n <button\n type=\"submit\"\n mat-button\n color=\"primary\">\n Save\n </button>\n <button\n type=\"button\"\n mat-button\n (click)=\"openHistory()\">\n View History\n </button>\n <button\n type=\"button\"\n mat-button\n [mat-dialog-close]=\"null\">\n Cancel\n </button>\n }\n @if (selectedTab === 'build') {\n <button\n type=\"button\"\n mat-button\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Close\n </button>\n }\n @if (selectedTab === 'build' && semanticDatabase(); as db) {\n @if (db.buildActive()) {\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"db.stopBuild()\">\n Stop Build\n </button>\n } @else {\n @if (db.status(); as buildStatus) {\n <button\n type=\"button\"\n mat-button\n (click)=\"db.build()\">\n {{ buildStatus.detail.generatedAt ? 'Rebuild' : 'Build' }}\n </button>\n }\n }\n }\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>\n", styles: [":host{display:block}\n"] }]
151
160
  }], ctorParameters: () => [] });
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL2dsb2JhbC1zZXR0aW5ncy9nbG9iYWwtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZ2xvYmFsLXNldHRpbmdzL2dsb2JhbC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhE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Z0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixvQkFBb0I7d0JBQ3BCLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQix5QkFBeUI7cUJBQzFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ2xvc2UsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5cbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcbmltcG9ydCB7IEZzRm9ybU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2Zvcm0nO1xuaW1wb3J0IHsgRnNNYXJrZG93bkVkaXRvckNvbmZpZyB9IGZyb20gJ0BmaXJlc3RpdGNoL21hcmtkb3duLWVkaXRvcic7XG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IEZzUHJvbXB0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvbXB0JztcbmltcG9ydCB7IEZzU2tlbGV0b25Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9za2VsZXRvbic7XG5pbXBvcnQgeyBGc1RhYnNNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC90YWJzJztcblxuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydEluc3RydWN0aW9uLCBSZXBvcnRJbnN0cnVjdGlvbnMsIFJlcG9ydFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEFpS25vd2xlZGdlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2FpLWtub3dsZWRnZS9haS1rbm93bGVkZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IEdlbmVyYWxDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZ2VuZXJhbC9nZW5lcmFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBIaXN0b3J5Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2hpc3RvcnkvaGlzdG9yeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VtYW50aWNEYXRhYmFzZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zZW1hbnRpYy1kYXRhYmFzZS9zZW1hbnRpYy1kYXRhYmFzZS5jb21wb25lbnQnO1xuXG5cbi8vIE1hdGNoZXMgdGhlIGJhY2tlbmQgY2FwIChSZXBvcnRzVmlldzo6SU5TVFJVQ1RJT05TX01BWF9MRU5HVEgpIOKAlCB0aGUgZG9jdW1lbnRcbi8vIHJpZGVzIGFsb25nIG9uIGV2ZXJ5IGFnZW50IHR1cm4sIHNvIGl0IGlzIGEgcHJvbXB0LWJ1ZGdldCBndWFyZC5cbmNvbnN0IE1BWF9MRU5HVEggPSA1MDAwMDtcblxuLy8gU2VlZGVkIGludG8gdGhlIGVkaXRvciAoY2xpZW50LXNpZGUsIHVuc2F2ZWQpIHdoZW4gbm8gdmVyc2lvbiBleGlzdHMgeWV0LCBzb1xuLy8gdGhlIG9wZXJhdG9yIHNlZXMgdGhlIGludGVuZGVkIHNoYXBlIG9mIHRoZSBkb2N1bWVudC5cbmNvbnN0IFNDQUZGT0xEID0gW1xuICAnIyBHbG9zc2FyeScsXG4gICcnLFxuICAnKlRlcm1zIHlvdXIgdGVhbSB1c2VzIGFuZCB3aGF0IHRoZXkgbWVhbiBpbiB0aGUgZGF0YSDigJQgZS5nLiBcImNsaWVudHNcIiBhcmUgY2xpZW50IGFjY291bnRzLionLFxuICAnJyxcbiAgJyMgQnVzaW5lc3MgcnVsZXMnLFxuICAnJyxcbiAgJypSdWxlcyB0aGUgQUkgc2hvdWxkIGFwcGx5IHdoZW4gYnVpbGRpbmcgb3IgZXhwbGFpbmluZyByZXBvcnRzLionLFxuICAnJyxcbiAgJyMgU3BlY2lhbCBjYXNlcycsXG4gICcnLFxuICAnKktub3duIGV4Y2VwdGlvbnMgYW5kIGRhdGEgcXVpcmtzIHRoZSBBSSBjYW5ub3QgaW5mZXIgb24gaXRzIG93bi4qJyxcbiAgJycsXG5dLmpvaW4oJ1xcbicpO1xuXG5cbi8vIEdsb2JhbCByZXBvcnQgc2V0dGluZ3MsIG9wZW5lZCBmcm9tIHRoZSByZXBvcnRzIGxpc3RpbmcncyBnZWFyLiBBIHRoaW4gc2hlbGw6XG4vLyB0aGUgZGlhbG9nIGZyYW1lLCB0aGUgdGFiIGdyb3VwLCBhbmQgYSBwZXItdGFiIGZvb3Rlci4gRWFjaCB0YWIgaXMgaXRzIG93blxuLy8gY29tcG9uZW50IOKAlFxuLy8gICBBSSBLbm93bGVkZ2Ug4oCUIHRoZSBvcGVyYXRvci1hdXRob3JlZCBtYXJrZG93biBkb2N1bWVudCBhcHBlbmRlZCB0byB0aGVcbi8vICAgcmVwb3J0IGFnZW50J3Mgc3lzdGVtIGluc3RydWN0aW9ucyBvbiBldmVyeSBjaGF0IHR1cm4uXG4vLyAgIEhpc3Rvcnkg4oCUIGV2ZXJ5IHNhdmVkIHZlcnNpb24gKGFwcGVuZC1vbmx5KSwgYW55IG9mIHdoaWNoIGNhbiBiZSByZXN0b3JlZC5cbi8vICAgU2VtYW50aWMgRGF0YWJhc2Ug4oCUIHRoZSBidWlsZCBzY29yZWJvYXJkIHRoZSBBSSBpcyBidWlsdCBmcm9tLCB3aXRoIGFcbi8vICAgc2VsZi1jb250YWluZWQgQnVpbGQgYWN0aW9uLlxuLy8gICBHZW5lcmFsIOKAlCByZXBvcnQtbW9kdWxlIHNldHRpbmdzICh0aGUgc2VtYW50aWMtYnVpbGQgY29uY3VycmVuY3kpLlxuLy8gVGhlIHNoZWxsIG93bnMgdGhlIHNoYXJlZCBkYXRhICh0aGUgaW5zdHJ1Y3Rpb25zIGRvY3VtZW50IGZvciB0aGUgZmlyc3QgdHdvXG4vLyB0YWJzLCB0aGUgc2V0dGluZ3MgZm9yIEdlbmVyYWwpIHBsdXMgdGhlIHRhYi1hd2FyZSBzYXZlOyBldmVyeXRoaW5nIGVsc2UgbGl2ZXNcbi8vIGluIHRoZSBjaGlsZHJlbi5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZ2xvYmFsLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2xvYmFsLXNldHRpbmdzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNGb3JtTW9kdWxlLFxuICAgIEZzU2tlbGV0b25Nb2R1bGUsXG4gICAgRnNUYWJzTW9kdWxlLFxuICAgIE1hdEJ1dHRvbixcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdERpYWxvZ0Nsb3NlLFxuICAgIE1hdERpYWxvZ0NvbnRlbnQsXG4gICAgTWF0VGFic01vZHVsZSxcbiAgICBBaUtub3dsZWRnZUNvbXBvbmVudCxcbiAgICBHZW5lcmFsQ29tcG9uZW50LFxuICAgIEhpc3RvcnlDb21wb25lbnQsXG4gICAgU2VtYW50aWNEYXRhYmFzZUNvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgR2xvYmFsU2V0dGluZ3NDb21wb25lbnQge1xuXG4gIHB1YmxpYyBzZWxlY3RlZFRhYiA9ICdrbm93bGVkZ2UnO1xuXG4gIC8vIFRoZSBTZW1hbnRpYyBEYXRhYmFzZSB0YWIgY29tcG9uZW50LCBzbyB0aGUgc2hhcmVkIGZvb3RlciBjYW4gZHJpdmUgaXRzXG4gIC8vIEJ1aWxkL1JlYnVpbGQvU3RvcCBhY3Rpb24gaW5saW5lIG5leHQgdG8gQ2xvc2UgKHRoZSBidWlsZCBzdGF0ZSBsaXZlcyB0aGVyZSkuXG4gIHB1YmxpYyByZWFkb25seSBzZW1hbnRpY0RhdGFiYXNlID0gdmlld0NoaWxkKFNlbWFudGljRGF0YWJhc2VDb21wb25lbnQpO1xuXG4gIC8vIFRoZSBlZGl0b3IncyBkcmFmdCwgaGVsZCBvbiB0aGUgc2hlbGwgc28gc3dpdGNoaW5nIHRhYnMgbmV2ZXIgbG9zZXMgYW4gZWRpdFxuICAvLyDigJQgc2VlZGVkIGZyb20gdGhlIGN1cnJlbnQgdmVyc2lvbiAob3IgdGhlIHNjYWZmb2xkKS5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRlbnQgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGVkaXRvckNvbmZpZzogRnNNYXJrZG93bkVkaXRvckNvbmZpZyA9IHtcbiAgICBtYXhMZW5ndGg6IE1BWF9MRU5HVEgsXG4gICAgcGxhY2Vob2xkZXI6ICdUZXJtaW5vbG9neSwgYnVzaW5lc3MgcnVsZXMgYW5kIHNwZWNpYWwgY2FzZXMgdGhlIHJlcG9ydCBBSSBzaG91bGQga25vd+KApicsXG4gIH07XG5cbiAgLy8gQm90aCBudWxsIHVudGlsIGxvYWRlZCDigJQgdGhlIGZvcm0gd2FpdHMgYmVoaW5kIHRoZSBza2VsZXRvbiB1bnRpbCBlYWNoIGlzIGluLlxuICBwdWJsaWMgcmVhZG9ubHkgaW5zdHJ1Y3Rpb25zID0gc2lnbmFsPFJlcG9ydEluc3RydWN0aW9ucyB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgc2V0dGluZ3MgPSBzaWduYWw8UmVwb3J0U2V0dGluZ3MgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgR2VuZXJhbCB0YWIncyBjb25jdXJyZW5jeSBkcmFmdCAoYm91bmQgdG8gaXRzIGZpZWxkKSwgc2VlZGVkIGZyb20gc2V0dGluZ3MuXG4gIHB1YmxpYyByZWFkb25seSBjb25jdXJyZW5jeSA9IHNpZ25hbDxudW1iZXI+KDApO1xuXG4gIC8vIEdhdGUgdGhlIHdob2xlIGZvcm0gb24gYm90aCBsb2Fkcywgc28gZXZlcnkgdGFiJ3MgZmllbGRzIGFyZSByZWFkeSB0byByZW5kZXIuXG4gIHB1YmxpYyByZWFkb25seSBsb2FkZWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAhIXRoaXMuaW5zdHJ1Y3Rpb25zKCkgJiYgISF0aGlzLnNldHRpbmdzKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpYWxvZ1JlZiA9IGluamVjdDxNYXREaWFsb2dSZWY8R2xvYmFsU2V0dGluZ3NDb21wb25lbnQ+PihNYXREaWFsb2dSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb21wdCA9IGluamVjdChGc1Byb21wdCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgLy8gVGhlIGZvb3RlciBTYXZlIGlzIHNoYXJlZCwgc28gaXQgc2F2ZXMgd2hhdGV2ZXIgdGhlIGN1cnJlbnQgdGFiIG93bnM6IHRoZVxuICAvLyBHZW5lcmFsIHRhYiBwZXJzaXN0cyBpdHMgc2V0dGluZ3MgKGFuZCBzdGF5cyBvcGVuKTsgQUkgS25vd2xlZGdlIHNhdmVzIGEgbmV3XG4gIC8vIGRvY3VtZW50IHZlcnNpb24gYW5kIGNsb3Nlcy5cbiAgcHVibGljIHNhdmUgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdnZW5lcmFsJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuc2F2ZVNldHRpbmdzKHsgc2VtYW50aWNCdWlsZENvbmN1cnJlbmN5OiB0aGlzLmNvbmN1cnJlbmN5KCkgfSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChzZXR0aW5nczogUmVwb3J0U2V0dGluZ3MpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2FwcGx5U2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTZXR0aW5ncyBzYXZlZCcpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLnNhdmVJbnN0cnVjdGlvbnModGhpcy5jb250ZW50KCkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChpbnN0cnVjdGlvbnM6IFJlcG9ydEluc3RydWN0aW9ucykgPT4ge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQUkga25vd2xlZGdlIHNhdmVkJyk7XG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKGluc3RydWN0aW9ucyk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfTtcblxuICAvLyBNYWtlIGFuIGVhcmxpZXIgdmVyc2lvbiBjdXJyZW50IOKAlCBmbGlwcyB0aGUgZmxhZywgY3JlYXRlcyBubyBuZXcgdmVyc2lvbi5cbiAgcHVibGljIHJlc3RvcmUodmVyc2lvbjogUmVwb3J0SW5zdHJ1Y3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICB0aXRsZTogJ1Jlc3RvcmUgdmVyc2lvbicsXG4gICAgICB0ZW1wbGF0ZTogJ01ha2UgdGhpcyB2ZXJzaW9uIHRoZSBjdXJyZW50IEFJIGtub3dsZWRnZT8gVGhlIG5ld2VyIHZlcnNpb25zIHN0YXkgaW4gdGhlIGhpc3RvcnkuJyxcbiAgICAgIGNvbW1pdExhYmVsOiAnUmVzdG9yZScsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5yZXN0b3JlSW5zdHJ1Y3Rpb24odmVyc2lvbi5pZCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChpbnN0cnVjdGlvbnM6IFJlcG9ydEluc3RydWN0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLl9hcHBseUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1ZlcnNpb24gcmVzdG9yZWQnKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZXBvcnREYXRhLmluc3RydWN0aW9ucygpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChpbnN0cnVjdGlvbnM6IFJlcG9ydEluc3RydWN0aW9ucykgPT4gdGhpcy5fYXBwbHlJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICB0aGlzLl9yZXBvcnREYXRhLnNldHRpbmdzKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHNldHRpbmdzOiBSZXBvcnRTZXR0aW5ncykgPT4gdGhpcy5fYXBwbHlTZXR0aW5ncyhzZXR0aW5ncykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBSZXBvcnRJbnN0cnVjdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmluc3RydWN0aW9ucy5zZXQoaW5zdHJ1Y3Rpb25zKTtcbiAgICB0aGlzLmNvbnRlbnQuc2V0KGluc3RydWN0aW9ucy5pbnN0cnVjdGlvbnM/LmNvbnRlbnQgPz8gU0NBRkZPTEQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlTZXR0aW5ncyhzZXR0aW5nczogUmVwb3J0U2V0dGluZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnNldHRpbmdzLnNldChzZXR0aW5ncyk7XG4gICAgdGhpcy5jb25jdXJyZW5jeS5zZXQoc2V0dGluZ3Muc2VtYW50aWNCdWlsZENvbmN1cnJlbmN5KTtcbiAgfVxufVxuIiwiPGZvcm1cbiAgICAqZnNTa2VsZXRvbkZvcm09XCJsb2FkZWQoKVwiXG4gICAgZnNGb3JtXG4gICAgW3N1Ym1pdF09XCJzYXZlXCI+XG4gIDxmcy1kaWFsb2c+XG4gICAgPGZzLWRpYWxvZy10aXRsZT5cbiAgICAgIFJlcG9ydCBTZXR0aW5nc1xuICAgIDwvZnMtZGlhbG9nLXRpdGxlPlxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgICA8bWF0LXRhYi1ncm91cCBbKHNlbGVjdGVkKV09XCJzZWxlY3RlZFRhYlwiPlxuICAgICAgICA8bWF0LXRhYlxuICAgICAgICAgICAgbGFiZWw9XCJBSSBLbm93bGVkZ2VcIlxuICAgICAgICAgICAgbmFtZT1cImtub3dsZWRnZVwiPlxuICAgICAgICAgIDxmcy1haS1yZXBvcnQtZ2xvYmFsLXNldHRpbmdzLWFpLWtub3dsZWRnZVxuICAgICAgICAgICAgICBbY29udGVudF09XCJjb250ZW50KClcIlxuICAgICAgICAgICAgICAoY29udGVudENoYW5nZSk9XCJjb250ZW50LnNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJlZGl0b3JDb25maWdcIj5cbiAgICAgICAgICA8L2ZzLWFpLXJlcG9ydC1nbG9iYWwtc2V0dGluZ3MtYWkta25vd2xlZGdlPlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkhpc3RvcnlcIlxuICAgICAgICAgICAgbmFtZT1cImhpc3RvcnlcIj5cbiAgICAgICAgICA8ZnMtYWktcmVwb3J0LWdsb2JhbC1zZXR0aW5ncy1oaXN0b3J5XG4gICAgICAgICAgICAgIFt2ZXJzaW9uc109XCJpbnN0cnVjdGlvbnMoKT8udmVyc2lvbnMgPz8gW11cIlxuICAgICAgICAgICAgICAocmVzdG9yZSk9XCJyZXN0b3JlKCRldmVudClcIj5cbiAgICAgICAgICA8L2ZzLWFpLXJlcG9ydC1nbG9iYWwtc2V0dGluZ3MtaGlzdG9yeT5cbiAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8bWF0LXRhYlxuICAgICAgICAgICAgbGFiZWw9XCJTZW1hbnRpYyBEYXRhYmFzZVwiXG4gICAgICAgICAgICBuYW1lPVwiYnVpbGRcIj5cbiAgICAgICAgICA8ZnMtYWktcmVwb3J0LWdsb2JhbC1zZXR0aW5ncy1zZW1hbnRpYy1kYXRhYmFzZT5cbiAgICAgICAgICA8L2ZzLWFpLXJlcG9ydC1nbG9iYWwtc2V0dGluZ3Mtc2VtYW50aWMtZGF0YWJhc2U+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgIGxhYmVsPVwiR2VuZXJhbFwiXG4gICAgICAgICAgICBuYW1lPVwiZ2VuZXJhbFwiPlxuICAgICAgICAgIDxmcy1haS1yZXBvcnQtZ2xvYmFsLXNldHRpbmdzLWdlbmVyYWxcbiAgICAgICAgICAgICAgW2NvbmN1cnJlbmN5XT1cImNvbmN1cnJlbmN5KClcIlxuICAgICAgICAgICAgICAoY29uY3VycmVuY3lDaGFuZ2UpPVwiY29uY3VycmVuY3kuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICBbbWluXT1cInNldHRpbmdzKCkhLnNlbWFudGljQnVpbGRDb25jdXJyZW5jeU1pblwiXG4gICAgICAgICAgICAgIFttYXhdPVwic2V0dGluZ3MoKSEuc2VtYW50aWNCdWlsZENvbmN1cnJlbmN5TWF4XCI+XG4gICAgICAgICAgPC9mcy1haS1yZXBvcnQtZ2xvYmFsLXNldHRpbmdzLWdlbmVyYWw+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgPCEtLSBUaGUgZm9vdGVyIGZvbGxvd3MgdGhlIHNlbGVjdGVkIHRhYi4gQUkgS25vd2xlZGdlIGFuZCBHZW5lcmFsIGFyZSB0aGVcbiAgICAgICAgICAgZWRpdGFibGUgdGFicywgc28gdGhleSBnZXQgU2F2ZS9DYW5jZWw7IEhpc3RvcnkgYW5kIFNlbWFudGljIERhdGFiYXNlXG4gICAgICAgICAgIGFyZSByZWFkL3J1biBzdXJmYWNlcywgc28gdGhleSBnZXQgYSBwcmltYXJ5IENsb3NlLiBUaGUgU2VtYW50aWNcbiAgICAgICAgICAgRGF0YWJhc2UgdGFiIGFsc28gY2FycmllcyBpdHMgQnVpbGQvUmVidWlsZC9TdG9wIGFjdGlvbiBiZXNpZGUgQ2xvc2UuIC0tPlxuICAgICAgPGZzLWZvcm0tZGlhbG9nLWFjdGlvbnMgW3NhdmVdPVwic2VsZWN0ZWRUYWIgPT09ICdrbm93bGVkZ2UnIHx8IHNlbGVjdGVkVGFiID09PSAnZ2VuZXJhbCdcIj5cbiAgICAgICAgQGlmIChzZWxlY3RlZFRhYiAhPT0gJ2tub3dsZWRnZScgJiYgc2VsZWN0ZWRUYWIgIT09ICdnZW5lcmFsJykge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwidW5kZWZpbmVkXCI+XG4gICAgICAgICAgICBDbG9zZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoc2VsZWN0ZWRUYWIgPT09ICdidWlsZCcgJiYgc2VtYW50aWNEYXRhYmFzZSgpOyBhcyBkYikge1xuICAgICAgICAgIEBpZiAoZGIuYnVpbGRBY3RpdmUoKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYi5zdG9wQnVpbGQoKVwiPlxuICAgICAgICAgICAgICBTdG9wIEJ1aWxkXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBpZiAoZGIuc3RhdHVzKCk7IGFzIGJ1aWxkU3RhdHVzKSB7XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRiLmJ1aWxkKClcIj5cbiAgICAgICAgICAgICAgICB7eyBidWlsZFN0YXR1cy5kZXRhaWwuZ2VuZXJhdGVkQXQgPyAnUmVidWlsZCcgOiAnQnVpbGQnIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9mcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT5cbiJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL2dsb2JhbC1zZXR0aW5ncy9nbG9iYWwtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvZ2xvYmFsLXNldHRpbmdzL2dsb2JhbC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2SCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1B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Q1osZ0JBQWdCLHdLQUNoQixZQUFZLG9hQUNaLFNBQVMsaUxBQ1QsZ0JBQWdCLDRIQUNoQixjQUFjLHFMQUNkLGdCQUFnQix3R0FDaEIsYUFBYSw2b0JBQ2Isb0JBQW9CLGlKQUNwQixnQkFBZ0Isd0pBQ2hCLHlCQUF5Qjs7NEZBR2hCLHVCQUF1QjtrQkFyQm5DLFNBQVM7c0NBR1MsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxjQUFjO3dCQUNkLFlBQVk7d0JBQ1osZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixvQkFBb0I7d0JBQ3BCLGdCQUFnQjt3QkFDaEIseUJBQXlCO3FCQUMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ2xvc2UsIE1hdERpYWxvZ0NvbnRlbnQsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5cbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcbmltcG9ydCB7IEZzRm9ybU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2Zvcm0nO1xuaW1wb3J0IHsgRnNNYXJrZG93bkVkaXRvckNvbmZpZyB9IGZyb20gJ0BmaXJlc3RpdGNoL21hcmtkb3duLWVkaXRvcic7XG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IEZzU2tlbGV0b25Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9za2VsZXRvbic7XG5pbXBvcnQgeyBGc1RhYnNNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC90YWJzJztcblxuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydEluc3RydWN0aW9ucywgUmVwb3J0U2V0dGluZ3MgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25IaXN0b3J5Q29tcG9uZW50IH0gZnJvbSAnLi4vaW5zdHJ1Y3Rpb24taGlzdG9yeS9pbnN0cnVjdGlvbi1oaXN0b3J5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBaUtub3dsZWRnZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9haS1rbm93bGVkZ2UvYWkta25vd2xlZGdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW5lcmFsQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2dlbmVyYWwvZ2VuZXJhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VtYW50aWNEYXRhYmFzZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zZW1hbnRpYy1kYXRhYmFzZS9zZW1hbnRpYy1kYXRhYmFzZS5jb21wb25lbnQnO1xuXG5cbi8vIE1hdGNoZXMgdGhlIGJhY2tlbmQgY2FwIChSZXBvcnRzVmlldzo6SU5TVFJVQ1RJT05TX01BWF9MRU5HVEgpIOKAlCB0aGUgZG9jdW1lbnRcbi8vIHJpZGVzIGFsb25nIG9uIGV2ZXJ5IGFnZW50IHR1cm4sIHNvIGl0IGlzIGEgcHJvbXB0LWJ1ZGdldCBndWFyZC5cbmNvbnN0IE1BWF9MRU5HVEggPSA1MDAwMDtcblxuLy8gU2VlZGVkIGludG8gdGhlIGVkaXRvciAoY2xpZW50LXNpZGUsIHVuc2F2ZWQpIHdoZW4gbm8gdmVyc2lvbiBleGlzdHMgeWV0LCBzb1xuLy8gdGhlIG9wZXJhdG9yIHNlZXMgdGhlIGludGVuZGVkIHNoYXBlIG9mIHRoZSBkb2N1bWVudC5cbmNvbnN0IFNDQUZGT0xEID0gW1xuICAnIyBHbG9zc2FyeScsXG4gICcnLFxuICAnKlRlcm1zIHlvdXIgdGVhbSB1c2VzIGFuZCB3aGF0IHRoZXkgbWVhbiBpbiB0aGUgZGF0YSDigJQgZS5nLiBcImNsaWVudHNcIiBhcmUgY2xpZW50IGFjY291bnRzLionLFxuICAnJyxcbiAgJyMgQnVzaW5lc3MgcnVsZXMnLFxuICAnJyxcbiAgJypSdWxlcyB0aGUgQUkgc2hvdWxkIGFwcGx5IHdoZW4gYnVpbGRpbmcgb3IgZXhwbGFpbmluZyByZXBvcnRzLionLFxuICAnJyxcbiAgJyMgU3BlY2lhbCBjYXNlcycsXG4gICcnLFxuICAnKktub3duIGV4Y2VwdGlvbnMgYW5kIGRhdGEgcXVpcmtzIHRoZSBBSSBjYW5ub3QgaW5mZXIgb24gaXRzIG93bi4qJyxcbiAgJycsXG5dLmpvaW4oJ1xcbicpO1xuXG5cbi8vIEdsb2JhbCByZXBvcnQgc2V0dGluZ3MsIG9wZW5lZCBmcm9tIHRoZSByZXBvcnRzIGxpc3RpbmcncyBnZWFyLiBBIHRoaW4gc2hlbGw6XG4vLyB0aGUgZGlhbG9nIGZyYW1lLCB0aGUgdGFiIGdyb3VwLCBhbmQgYSBwZXItdGFiIGZvb3Rlci4gRWFjaCB0YWIgaXMgaXRzIG93blxuLy8gY29tcG9uZW50IOKAlFxuLy8gICBBSSBLbm93bGVkZ2Ug4oCUIHRoZSBvcGVyYXRvci1hdXRob3JlZCBtYXJrZG93biBkb2N1bWVudCBhcHBlbmRlZCB0byB0aGVcbi8vICAgcmVwb3J0IGFnZW50J3Mgc3lzdGVtIGluc3RydWN0aW9ucyBvbiBldmVyeSBjaGF0IHR1cm4uIEl0cyBmb290ZXIgY2FycmllcyBhXG4vLyAgIFZpZXcgSGlzdG9yeSBidXR0b24gb3BlbmluZyB0aGUgdmVyc2lvbi1oaXN0b3J5IGRpYWxvZyAocmVzdG9yZXMgaGFwcGVuXG4vLyAgIHRoZXJlOyB0aGUgc2hlbGwgcmVmcmVzaGVzIG9uIGNsb3NlKS5cbi8vICAgU2VtYW50aWMgRGF0YWJhc2Ug4oCUIHRoZSBidWlsZCBzY29yZWJvYXJkIHRoZSBBSSBpcyBidWlsdCBmcm9tLCB3aXRoIGFcbi8vICAgc2VsZi1jb250YWluZWQgQnVpbGQgYWN0aW9uLlxuLy8gICBHZW5lcmFsIOKAlCByZXBvcnQtbW9kdWxlIHNldHRpbmdzICh0aGUgc2VtYW50aWMtYnVpbGQgY29uY3VycmVuY3kpLlxuLy8gVGhlIHNoZWxsIG93bnMgdGhlIHNoYXJlZCBkYXRhICh0aGUgaW5zdHJ1Y3Rpb25zIGRvY3VtZW50LCB0aGUgc2V0dGluZ3MgZm9yXG4vLyBHZW5lcmFsKSBwbHVzIHRoZSB0YWItYXdhcmUgc2F2ZTsgZXZlcnl0aGluZyBlbHNlIGxpdmVzIGluIHRoZSBjaGlsZHJlbi5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZ2xvYmFsLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2xvYmFsLXNldHRpbmdzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgRnNEaWFsb2dNb2R1bGUsXG4gICAgRnNGb3JtTW9kdWxlLFxuICAgIEZzU2tlbGV0b25Nb2R1bGUsXG4gICAgRnNUYWJzTW9kdWxlLFxuICAgIE1hdEJ1dHRvbixcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdERpYWxvZ0Nsb3NlLFxuICAgIE1hdERpYWxvZ0NvbnRlbnQsXG4gICAgTWF0VGFic01vZHVsZSxcbiAgICBBaUtub3dsZWRnZUNvbXBvbmVudCxcbiAgICBHZW5lcmFsQ29tcG9uZW50LFxuICAgIFNlbWFudGljRGF0YWJhc2VDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEdsb2JhbFNldHRpbmdzQ29tcG9uZW50IHtcblxuICBwdWJsaWMgc2VsZWN0ZWRUYWIgPSAna25vd2xlZGdlJztcblxuICAvLyBUaGUgU2VtYW50aWMgRGF0YWJhc2UgdGFiIGNvbXBvbmVudCwgc28gdGhlIHNoYXJlZCBmb290ZXIgY2FuIGRyaXZlIGl0c1xuICAvLyBCdWlsZC9SZWJ1aWxkL1N0b3AgYWN0aW9uIGlubGluZSBuZXh0IHRvIENsb3NlICh0aGUgYnVpbGQgc3RhdGUgbGl2ZXMgdGhlcmUpLlxuICBwdWJsaWMgcmVhZG9ubHkgc2VtYW50aWNEYXRhYmFzZSA9IHZpZXdDaGlsZChTZW1hbnRpY0RhdGFiYXNlQ29tcG9uZW50KTtcblxuICAvLyBUaGUgZWRpdG9yJ3MgZHJhZnQsIGhlbGQgb24gdGhlIHNoZWxsIHNvIHN3aXRjaGluZyB0YWJzIG5ldmVyIGxvc2VzIGFuIGVkaXRcbiAgLy8g4oCUIHNlZWRlZCBmcm9tIHRoZSBjdXJyZW50IHZlcnNpb24gKG9yIHRoZSBzY2FmZm9sZCkuXG4gIHB1YmxpYyByZWFkb25seSBjb250ZW50ID0gc2lnbmFsPHN0cmluZz4oJycpO1xuXG4gIHB1YmxpYyByZWFkb25seSBlZGl0b3JDb25maWc6IEZzTWFya2Rvd25FZGl0b3JDb25maWcgPSB7XG4gICAgbWF4TGVuZ3RoOiBNQVhfTEVOR1RILFxuICAgIHBsYWNlaG9sZGVyOiAnVGVybWlub2xvZ3ksIGJ1c2luZXNzIHJ1bGVzIGFuZCBzcGVjaWFsIGNhc2VzIHRoZSByZXBvcnQgQUkgc2hvdWxkIGtub3figKYnLFxuICB9O1xuXG4gIC8vIEJvdGggbnVsbCB1bnRpbCBsb2FkZWQg4oCUIHRoZSBmb3JtIHdhaXRzIGJlaGluZCB0aGUgc2tlbGV0b24gdW50aWwgZWFjaCBpcyBpbi5cbiAgcHVibGljIHJlYWRvbmx5IGluc3RydWN0aW9ucyA9IHNpZ25hbDxSZXBvcnRJbnN0cnVjdGlvbnMgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHNldHRpbmdzID0gc2lnbmFsPFJlcG9ydFNldHRpbmdzIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIEdlbmVyYWwgdGFiJ3MgY29uY3VycmVuY3kgZHJhZnQgKGJvdW5kIHRvIGl0cyBmaWVsZCksIHNlZWRlZCBmcm9tIHNldHRpbmdzLlxuICBwdWJsaWMgcmVhZG9ubHkgY29uY3VycmVuY3kgPSBzaWduYWw8bnVtYmVyPigwKTtcblxuICAvLyBHYXRlIHRoZSB3aG9sZSBmb3JtIG9uIGJvdGggbG9hZHMsIHNvIGV2ZXJ5IHRhYidzIGZpZWxkcyBhcmUgcmVhZHkgdG8gcmVuZGVyLlxuICBwdWJsaWMgcmVhZG9ubHkgbG9hZGVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gISF0aGlzLmluc3RydWN0aW9ucygpICYmICEhdGhpcy5zZXR0aW5ncygpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kaWFsb2dSZWYgPSBpbmplY3Q8TWF0RGlhbG9nUmVmPEdsb2JhbFNldHRpbmdzQ29tcG9uZW50Pj4oTWF0RGlhbG9nUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2UgPSBpbmplY3QoRnNNZXNzYWdlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICAvLyBUaGUgZm9vdGVyIFNhdmUgaXMgc2hhcmVkLCBzbyBpdCBzYXZlcyB3aGF0ZXZlciB0aGUgY3VycmVudCB0YWIgb3duczogdGhlXG4gIC8vIEdlbmVyYWwgdGFiIHBlcnNpc3RzIGl0cyBzZXR0aW5ncyAoYW5kIHN0YXlzIG9wZW4pOyBBSSBLbm93bGVkZ2Ugc2F2ZXMgYSBuZXdcbiAgLy8gZG9jdW1lbnQgdmVyc2lvbiBhbmQgY2xvc2VzLlxuICBwdWJsaWMgc2F2ZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2dlbmVyYWwnKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5zYXZlU2V0dGluZ3MoeyBzZW1hbnRpY0J1aWxkQ29uY3VycmVuY3k6IHRoaXMuY29uY3VycmVuY3koKSB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKHNldHRpbmdzOiBSZXBvcnRTZXR0aW5ncykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYXBwbHlTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1NldHRpbmdzIHNhdmVkJyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuc2F2ZUluc3RydWN0aW9ucyh0aGlzLmNvbnRlbnQoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGluc3RydWN0aW9uczogUmVwb3J0SW5zdHJ1Y3Rpb25zKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdBSSBrbm93bGVkZ2Ugc2F2ZWQnKTtcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoaW5zdHJ1Y3Rpb25zKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9O1xuXG4gIC8vIE9wZW4gdGhlIHZlcnNpb24taGlzdG9yeSBkaWFsb2cuIFJlc3RvcmVzIGhhcHBlbiBpbnNpZGUgaXQsIHNvIHdoZW4gaXRcbiAgLy8gY2xvc2VzIChob3dldmVyIGl0IGNsb3NlcykgcmUtZmV0Y2ggdGhlIGRvY3VtZW50OiBhIHJlc3RvcmUgY2hhbmdlZCB0aGVcbiAgLy8gY3VycmVudCB2ZXJzaW9uIGFuZCBtdXN0IHJlc2VlZCB0aGUgZWRpdG9yOyBvdGhlcndpc2UganVzdCByZWZyZXNoIHRoZVxuICAvLyB2ZXJzaW9uIGxpc3Qgd2l0aG91dCB0b3VjaGluZyBhbiB1bnNhdmVkIGRyYWZ0LlxuICBwdWJsaWMgb3Blbkhpc3RvcnkoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudElkID0gdGhpcy5pbnN0cnVjdGlvbnMoKT8uaW5zdHJ1Y3Rpb25zPy5pZDtcblxuICAgIHRoaXMuX2RpYWxvZy5vcGVuKEluc3RydWN0aW9uSGlzdG9yeUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICBtYXhXaWR0aDogJzk1dncnLFxuICAgICAgbWF4SGVpZ2h0OiAnODV2aCcsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgZGF0YTogeyB2ZXJzaW9uczogdGhpcy5pbnN0cnVjdGlvbnMoKT8udmVyc2lvbnMgPz8gW10gfSxcbiAgICB9KVxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5pbnN0cnVjdGlvbnMoKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGluc3RydWN0aW9uczogUmVwb3J0SW5zdHJ1Y3Rpb25zKSA9PiB7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbnMuaW5zdHJ1Y3Rpb25zPy5pZCAhPT0gY3VycmVudElkKSB7XG4gICAgICAgICAgdGhpcy5fYXBwbHlJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmluc3RydWN0aW9ucy5zZXQoaW5zdHJ1Y3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3JlcG9ydERhdGEuaW5zdHJ1Y3Rpb25zKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGluc3RydWN0aW9uczogUmVwb3J0SW5zdHJ1Y3Rpb25zKSA9PiB0aGlzLl9hcHBseUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpKTtcblxuICAgIHRoaXMuX3JlcG9ydERhdGEuc2V0dGluZ3MoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoc2V0dGluZ3M6IFJlcG9ydFNldHRpbmdzKSA9PiB0aGlzLl9hcHBseVNldHRpbmdzKHNldHRpbmdzKSk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFJlcG9ydEluc3RydWN0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zLnNldChpbnN0cnVjdGlvbnMpO1xuICAgIHRoaXMuY29udGVudC5zZXQoaW5zdHJ1Y3Rpb25zLmluc3RydWN0aW9ucz8uY29udGVudCA/PyBTQ0FGRk9MRCk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVNldHRpbmdzKHNldHRpbmdzOiBSZXBvcnRTZXR0aW5ncyk6IHZvaWQge1xuICAgIHRoaXMuc2V0dGluZ3Muc2V0KHNldHRpbmdzKTtcbiAgICB0aGlzLmNvbmN1cnJlbmN5LnNldChzZXR0aW5ncy5zZW1hbnRpY0J1aWxkQ29uY3VycmVuY3kpO1xuICB9XG59XG4iLCI8Zm9ybVxuICAgICpmc1NrZWxldG9uRm9ybT1cImxvYWRlZCgpXCJcbiAgICBmc0Zvcm1cbiAgICBbc3VibWl0XT1cInNhdmVcIj5cbiAgPGZzLWRpYWxvZz5cbiAgICA8ZnMtZGlhbG9nLXRpdGxlPlxuICAgICAgUmVwb3J0IFNldHRpbmdzXG4gICAgPC9mcy1kaWFsb2ctdGl0bGU+XG4gICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgIDxtYXQtdGFiLWdyb3VwIFsoc2VsZWN0ZWQpXT1cInNlbGVjdGVkVGFiXCI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkFJIEtub3dsZWRnZVwiXG4gICAgICAgICAgICBuYW1lPVwia25vd2xlZGdlXCI+XG4gICAgICAgICAgPGZzLWFpLXJlcG9ydC1nbG9iYWwtc2V0dGluZ3MtYWkta25vd2xlZGdlXG4gICAgICAgICAgICAgIFtjb250ZW50XT1cImNvbnRlbnQoKVwiXG4gICAgICAgICAgICAgIChjb250ZW50Q2hhbmdlKT1cImNvbnRlbnQuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cImVkaXRvckNvbmZpZ1wiPlxuICAgICAgICAgIDwvZnMtYWktcmVwb3J0LWdsb2JhbC1zZXR0aW5ncy1haS1rbm93bGVkZ2U+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgIGxhYmVsPVwiU2VtYW50aWMgRGF0YWJhc2VcIlxuICAgICAgICAgICAgbmFtZT1cImJ1aWxkXCI+XG4gICAgICAgICAgPGZzLWFpLXJlcG9ydC1nbG9iYWwtc2V0dGluZ3Mtc2VtYW50aWMtZGF0YWJhc2U+XG4gICAgICAgICAgPC9mcy1haS1yZXBvcnQtZ2xvYmFsLXNldHRpbmdzLXNlbWFudGljLWRhdGFiYXNlPlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkdlbmVyYWxcIlxuICAgICAgICAgICAgbmFtZT1cImdlbmVyYWxcIj5cbiAgICAgICAgICA8ZnMtYWktcmVwb3J0LWdsb2JhbC1zZXR0aW5ncy1nZW5lcmFsXG4gICAgICAgICAgICAgIFtjb25jdXJyZW5jeV09XCJjb25jdXJyZW5jeSgpXCJcbiAgICAgICAgICAgICAgKGNvbmN1cnJlbmN5Q2hhbmdlKT1cImNvbmN1cnJlbmN5LnNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW21pbl09XCJzZXR0aW5ncygpIS5zZW1hbnRpY0J1aWxkQ29uY3VycmVuY3lNaW5cIlxuICAgICAgICAgICAgICBbbWF4XT1cInNldHRpbmdzKCkhLnNlbWFudGljQnVpbGRDb25jdXJyZW5jeU1heFwiPlxuICAgICAgICAgIDwvZnMtYWktcmVwb3J0LWdsb2JhbC1zZXR0aW5ncy1nZW5lcmFsPlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgIDwhLS0gVGhlIGZvb3RlciBmb2xsb3dzIHRoZSBzZWxlY3RlZCB0YWIuIEFJIEtub3dsZWRnZSBwcm9qZWN0cyBpdHMgb3duXG4gICAgICAgICAgIFNhdmUgfCBWaWV3IEhpc3RvcnkgfCBDYW5jZWwgcm93IChmcy1mb3JtLWRpYWxvZy1hY3Rpb25zIHJlbmRlcnNcbiAgICAgICAgICAgcHJvamVjdGVkIGNvbnRlbnQgYWZ0ZXIgU2F2ZS9DYW5jZWwsIHNvIHRoZSBkZWZhdWx0IHBhaXIgY2FuJ3Qga2VlcFxuICAgICAgICAgICBWaWV3IEhpc3RvcnkgYmVzaWRlIFNhdmUpOyBHZW5lcmFsIHVzZXMgdGhlIGRlZmF1bHQgU2F2ZS9DYW5jZWw7IHRoZVxuICAgICAgICAgICBTZW1hbnRpYyBEYXRhYmFzZSB0YWIgaXMgYSByZWFkL3J1biBzdXJmYWNlLCBzbyBpdCBnZXRzIGEgcHJpbWFyeVxuICAgICAgICAgICBDbG9zZSBwbHVzIGl0cyBCdWlsZC9SZWJ1aWxkL1N0b3AgYWN0aW9uLiAtLT5cbiAgICAgIDxmcy1mb3JtLWRpYWxvZy1hY3Rpb25zIFtzYXZlXT1cInNlbGVjdGVkVGFiID09PSAnZ2VuZXJhbCdcIj5cbiAgICAgICAgQGlmIChzZWxlY3RlZFRhYiA9PT0gJ2tub3dsZWRnZScpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiPlxuICAgICAgICAgICAgU2F2ZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5IaXN0b3J5KClcIj5cbiAgICAgICAgICAgIFZpZXcgSGlzdG9yeVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwibnVsbFwiPlxuICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChzZWxlY3RlZFRhYiA9PT0gJ2J1aWxkJykge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgW21hdC1kaWFsb2ctY2xvc2VdPVwidW5kZWZpbmVkXCI+XG4gICAgICAgICAgICBDbG9zZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoc2VsZWN0ZWRUYWIgPT09ICdidWlsZCcgJiYgc2VtYW50aWNEYXRhYmFzZSgpOyBhcyBkYikge1xuICAgICAgICAgIEBpZiAoZGIuYnVpbGRBY3RpdmUoKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkYi5zdG9wQnVpbGQoKVwiPlxuICAgICAgICAgICAgICBTdG9wIEJ1aWxkXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIEBpZiAoZGIuc3RhdHVzKCk7IGFzIGJ1aWxkU3RhdHVzKSB7XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRiLmJ1aWxkKClcIj5cbiAgICAgICAgICAgICAgICB7eyBidWlsZFN0YXR1cy5kZXRhaWwuZ2VuZXJhdGVkQXQgPyAnUmVidWlsZCcgOiAnQnVpbGQnIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9mcy1mb3JtLWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICA8L2ZzLWRpYWxvZz5cbjwvZm9ybT5cbiJdfQ==
@@ -0,0 +1,60 @@
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, inject, signal } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { MatButton } from '@angular/material/button';
4
+ import { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent } from '@angular/material/dialog';
5
+ import { FsChipModule } from '@firestitch/chip';
6
+ import { FsDateModule } from '@firestitch/date';
7
+ import { FsDialogModule } from '@firestitch/dialog';
8
+ import { FsMarkdownRendererComponent } from '@firestitch/markdown-editor';
9
+ import { FsMessage, FsMessageModule } from '@firestitch/message';
10
+ import { FsPrompt } from '@firestitch/prompt';
11
+ import { switchMap } from 'rxjs/operators';
12
+ import { ReportData } from '../../data/report.data';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@firestitch/chip";
15
+ import * as i2 from "@firestitch/date";
16
+ import * as i3 from "@firestitch/dialog";
17
+ import * as i4 from "@firestitch/message";
18
+ // The AI Knowledge document's version history (append-only), each version
19
+ // previewed and restorable — opened from the Report Settings footer's View
20
+ // History button. Restores happen here (confirm, then flip the current flag —
21
+ // no new version is created); the opener refreshes its instructions after this
22
+ // dialog closes, so a restore made here reseeds the editor there.
23
+ export class InstructionHistoryComponent {
24
+ _data = inject(MAT_DIALOG_DATA);
25
+ versions = signal(this._data.versions);
26
+ _reportData = inject(ReportData);
27
+ _prompt = inject(FsPrompt);
28
+ _message = inject(FsMessage);
29
+ _destroyRef = inject(DestroyRef);
30
+ // Make an earlier version current — flips the flag, creates no new version.
31
+ restore(version) {
32
+ this._prompt.confirm({
33
+ title: 'Restore version',
34
+ template: 'Make this version the current AI knowledge? The newer versions stay in the history.',
35
+ commitLabel: 'Restore',
36
+ })
37
+ .pipe(switchMap(() => this._reportData.restoreInstruction(version.id)), takeUntilDestroyed(this._destroyRef))
38
+ .subscribe((instructions) => {
39
+ this.versions.set(instructions.versions);
40
+ this._message.success('Version restored');
41
+ });
42
+ }
43
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InstructionHistoryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
44
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: InstructionHistoryComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<fs-dialog>\n <fs-dialog-title>\n AI Knowledge History\n </fs-dialog-title>\n <mat-dialog-content>\n @if (versions().length) {\n <div class=\"versions\">\n @for (version of versions(); track version.id) {\n <div class=\"version\">\n <div class=\"version-header\">\n <fs-date\n [date]=\"version.createDate\"\n format=\"date-time\">\n </fs-date>\n @if (version.accountName) {\n <span class=\"author\">{{ version.accountName }}</span>\n }\n <span class=\"spacer\"></span>\n @if (version.current) {\n <fs-chip\n size=\"tiny\"\n [backgroundColor]=\"'#2e7d32'\"\n color=\"#ffffff\">\n Current\n </fs-chip>\n } @else {\n <button\n type=\"button\"\n mat-stroked-button\n (click)=\"restore(version)\">\n Restore\n </button>\n }\n </div>\n <div class=\"version-preview\">\n <fs-markdown-renderer [markdown]=\"version.content\"></fs-markdown-renderer>\n </div>\n </div>\n }\n </div>\n } @else {\n <fs-message-info>\n No versions yet \u2014 every save of the AI Knowledge document lands here, and\n any version can be restored.\n </fs-message-info>\n }\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"primary\"\n [mat-dialog-close]=\"null\">\n Close\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [".version{border:1px solid rgba(0,0,0,.12);border-radius:6px;padding:12px}.version+.version{margin-top:12px}.version .version-header{display:flex;align-items:center;gap:8px}.version .version-header .author{color:#0009}.version .version-header .spacer{flex:1}.version .version-preview{margin-top:8px;max-height:200px;overflow-y:auto;border-top:1px solid rgba(0,0,0,.08);padding-top:8px}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "ngmodule", type: FsChipModule }, { kind: "component", type: i1.FsChipComponent, selector: "fs-chip", inputs: ["selectable", "removable", "value", "maxWidth", "width", "backgroundColor", "borderColor", "color", "shape", "outlined", "outlineDash", "icon", "image", "selected", "disabled", "padding", "contrastColor", "size"], outputs: ["selectedToggled", "removed", "click"] }, { kind: "ngmodule", type: FsDateModule }, { kind: "component", type: i2.FsDateComponent, selector: "fs-date", inputs: ["date", "format", "timezone"] }, { kind: "ngmodule", type: FsDialogModule }, { kind: "component", type: i3.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout"] }, { kind: "component", type: i3.FsDialogTitleComponent, selector: "fs-dialog-title", inputs: ["close", "dockToggle", "back"] }, { kind: "component", type: FsMarkdownRendererComponent, selector: "fs-markdown-renderer", inputs: ["config", "markdown"] }, { kind: "ngmodule", type: FsMessageModule }, { kind: "component", type: i4.FsMessageInfoComponent, selector: "fs-message-info" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
45
+ }
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InstructionHistoryComponent, decorators: [{
47
+ type: Component,
48
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
49
+ MatButton,
50
+ MatDialogContent,
51
+ MatDialogActions,
52
+ MatDialogClose,
53
+ FsChipModule,
54
+ FsDateModule,
55
+ FsDialogModule,
56
+ FsMarkdownRendererComponent,
57
+ FsMessageModule,
58
+ ], template: "<fs-dialog>\n <fs-dialog-title>\n AI Knowledge History\n </fs-dialog-title>\n <mat-dialog-content>\n @if (versions().length) {\n <div class=\"versions\">\n @for (version of versions(); track version.id) {\n <div class=\"version\">\n <div class=\"version-header\">\n <fs-date\n [date]=\"version.createDate\"\n format=\"date-time\">\n </fs-date>\n @if (version.accountName) {\n <span class=\"author\">{{ version.accountName }}</span>\n }\n <span class=\"spacer\"></span>\n @if (version.current) {\n <fs-chip\n size=\"tiny\"\n [backgroundColor]=\"'#2e7d32'\"\n color=\"#ffffff\">\n Current\n </fs-chip>\n } @else {\n <button\n type=\"button\"\n mat-stroked-button\n (click)=\"restore(version)\">\n Restore\n </button>\n }\n </div>\n <div class=\"version-preview\">\n <fs-markdown-renderer [markdown]=\"version.content\"></fs-markdown-renderer>\n </div>\n </div>\n }\n </div>\n } @else {\n <fs-message-info>\n No versions yet \u2014 every save of the AI Knowledge document lands here, and\n any version can be restored.\n </fs-message-info>\n }\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"primary\"\n [mat-dialog-close]=\"null\">\n Close\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [".version{border:1px solid rgba(0,0,0,.12);border-radius:6px;padding:12px}.version+.version{margin-top:12px}.version .version-header{display:flex;align-items:center;gap:8px}.version .version-header .author{color:#0009}.version .version-header .spacer{flex:1}.version .version-preview{margin-top:8px;max-height:200px;overflow-y:auto;border-top:1px solid rgba(0,0,0,.08);padding-top:8px}\n"] }]
59
+ }] });
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb24taGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZGlhbG9ncy9pbnN0cnVjdGlvbi1oaXN0b3J5L2luc3RydWN0aW9uLWhpc3RvcnkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvaW5zdHJ1Y3Rpb24taGlzdG9yeS9pbnN0cnVjdGlvbi1oaXN0b3J5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFL0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7O0FBU3BELDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0UsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSxrRUFBa0U7QUFrQmxFLE1BQU0sT0FBTywyQkFBMkI7SUFFckIsS0FBSyxHQUFHLE1BQU0sQ0FBK0IsZUFBZSxDQUFDLENBQUM7SUFFL0QsUUFBUSxHQUFHLE1BQU0sQ0FBc0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUzRCxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0IsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QixXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWxELDRFQUE0RTtJQUNyRSxPQUFPLENBQUMsT0FBMEI7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDbkIsS0FBSyxFQUFFLGlCQUFpQjtZQUN4QixRQUFRLEVBQUUscUZBQXFGO1lBQy9GLFdBQVcsRUFBRSxTQUFTO1NBQ3ZCLENBQUM7YUFDQyxJQUFJLENBQ0gsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ2hFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDckM7YUFDQSxTQUFTLENBQUMsQ0FBQyxZQUFnQyxFQUFFLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO3dHQTFCVSwyQkFBMkI7NEZBQTNCLDJCQUEyQix3RUM5Q3hDLHN2REF5REEsNGJEdEJJLFNBQVMsaUxBQ1QsZ0JBQWdCLHlHQUNoQixnQkFBZ0IsNEhBQ2hCLGNBQWMsb0xBQ2QsWUFBWSxxWEFDWixZQUFZLDRJQUNaLGNBQWMsK1RBQ2QsMkJBQTJCLGdHQUMzQixlQUFlOzs0RkFHTiwyQkFBMkI7a0JBakJ2QyxTQUFTO3NDQUdTLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsMkJBQTJCO3dCQUMzQixlQUFlO3FCQUNoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ0FjdGlvbnMsIE1hdERpYWxvZ0Nsb3NlLCBNYXREaWFsb2dDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgRnNDaGlwTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY2hpcCc7XG5pbXBvcnQgeyBGc0RhdGVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kYXRlJztcbmltcG9ydCB7IEZzRGlhbG9nTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZGlhbG9nJztcbmltcG9ydCB7IEZzTWFya2Rvd25SZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJ0BmaXJlc3RpdGNoL21hcmtkb3duLWVkaXRvcic7XG5pbXBvcnQgeyBGc01lc3NhZ2UsIEZzTWVzc2FnZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuXG5pbXBvcnQgeyBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydEluc3RydWN0aW9uLCBSZXBvcnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdHJ1Y3Rpb25IaXN0b3J5RGlhbG9nRGF0YSB7XG4gIHZlcnNpb25zOiBSZXBvcnRJbnN0cnVjdGlvbltdO1xufVxuXG5cbi8vIFRoZSBBSSBLbm93bGVkZ2UgZG9jdW1lbnQncyB2ZXJzaW9uIGhpc3RvcnkgKGFwcGVuZC1vbmx5KSwgZWFjaCB2ZXJzaW9uXG4vLyBwcmV2aWV3ZWQgYW5kIHJlc3RvcmFibGUg4oCUIG9wZW5lZCBmcm9tIHRoZSBSZXBvcnQgU2V0dGluZ3MgZm9vdGVyJ3MgVmlld1xuLy8gSGlzdG9yeSBidXR0b24uIFJlc3RvcmVzIGhhcHBlbiBoZXJlIChjb25maXJtLCB0aGVuIGZsaXAgdGhlIGN1cnJlbnQgZmxhZyDigJRcbi8vIG5vIG5ldyB2ZXJzaW9uIGlzIGNyZWF0ZWQpOyB0aGUgb3BlbmVyIHJlZnJlc2hlcyBpdHMgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoaXNcbi8vIGRpYWxvZyBjbG9zZXMsIHNvIGEgcmVzdG9yZSBtYWRlIGhlcmUgcmVzZWVkcyB0aGUgZWRpdG9yIHRoZXJlLlxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9pbnN0cnVjdGlvbi1oaXN0b3J5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW5zdHJ1Y3Rpb24taGlzdG9yeS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEJ1dHRvbixcbiAgICBNYXREaWFsb2dDb250ZW50LFxuICAgIE1hdERpYWxvZ0FjdGlvbnMsXG4gICAgTWF0RGlhbG9nQ2xvc2UsXG4gICAgRnNDaGlwTW9kdWxlLFxuICAgIEZzRGF0ZU1vZHVsZSxcbiAgICBGc0RpYWxvZ01vZHVsZSxcbiAgICBGc01hcmtkb3duUmVuZGVyZXJDb21wb25lbnQsXG4gICAgRnNNZXNzYWdlTW9kdWxlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBJbnN0cnVjdGlvbkhpc3RvcnlDb21wb25lbnQge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGEgPSBpbmplY3Q8SW5zdHJ1Y3Rpb25IaXN0b3J5RGlhbG9nRGF0YT4oTUFUX0RJQUxPR19EQVRBKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbnMgPSBzaWduYWw8UmVwb3J0SW5zdHJ1Y3Rpb25bXT4odGhpcy5fZGF0YS52ZXJzaW9ucyk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vIE1ha2UgYW4gZWFybGllciB2ZXJzaW9uIGN1cnJlbnQg4oCUIGZsaXBzIHRoZSBmbGFnLCBjcmVhdGVzIG5vIG5ldyB2ZXJzaW9uLlxuICBwdWJsaWMgcmVzdG9yZSh2ZXJzaW9uOiBSZXBvcnRJbnN0cnVjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX3Byb21wdC5jb25maXJtKHtcbiAgICAgIHRpdGxlOiAnUmVzdG9yZSB2ZXJzaW9uJyxcbiAgICAgIHRlbXBsYXRlOiAnTWFrZSB0aGlzIHZlcnNpb24gdGhlIGN1cnJlbnQgQUkga25vd2xlZGdlPyBUaGUgbmV3ZXIgdmVyc2lvbnMgc3RheSBpbiB0aGUgaGlzdG9yeS4nLFxuICAgICAgY29tbWl0TGFiZWw6ICdSZXN0b3JlJyxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9yZXBvcnREYXRhLnJlc3RvcmVJbnN0cnVjdGlvbih2ZXJzaW9uLmlkKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGluc3RydWN0aW9uczogUmVwb3J0SW5zdHJ1Y3Rpb25zKSA9PiB7XG4gICAgICAgIHRoaXMudmVyc2lvbnMuc2V0KGluc3RydWN0aW9ucy52ZXJzaW9ucyk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnVmVyc2lvbiByZXN0b3JlZCcpO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxmcy1kaWFsb2c+XG4gIDxmcy1kaWFsb2ctdGl0bGU+XG4gICAgQUkgS25vd2xlZGdlIEhpc3RvcnlcbiAgPC9mcy1kaWFsb2ctdGl0bGU+XG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgQGlmICh2ZXJzaW9ucygpLmxlbmd0aCkge1xuICAgICAgPGRpdiBjbGFzcz1cInZlcnNpb25zXCI+XG4gICAgICAgIEBmb3IgKHZlcnNpb24gb2YgdmVyc2lvbnMoKTsgdHJhY2sgdmVyc2lvbi5pZCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJzaW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmVyc2lvbi1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPGZzLWRhdGVcbiAgICAgICAgICAgICAgICAgIFtkYXRlXT1cInZlcnNpb24uY3JlYXRlRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBmb3JtYXQ9XCJkYXRlLXRpbWVcIj5cbiAgICAgICAgICAgICAgPC9mcy1kYXRlPlxuICAgICAgICAgICAgICBAaWYgKHZlcnNpb24uYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF1dGhvclwiPnt7IHZlcnNpb24uYWNjb3VudE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGFjZXJcIj48L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAodmVyc2lvbi5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgPGZzLWNoaXBcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInRpbnlcIlxuICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZENvbG9yXT1cIicjMmU3ZDMyJ1wiXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwiI2ZmZmZmZlwiPlxuICAgICAgICAgICAgICAgICAgQ3VycmVudFxuICAgICAgICAgICAgICAgIDwvZnMtY2hpcD5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXN0b3JlKHZlcnNpb24pXCI+XG4gICAgICAgICAgICAgICAgICBSZXN0b3JlXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnNpb24tcHJldmlld1wiPlxuICAgICAgICAgICAgICA8ZnMtbWFya2Rvd24tcmVuZGVyZXIgW21hcmtkb3duXT1cInZlcnNpb24uY29udGVudFwiPjwvZnMtbWFya2Rvd24tcmVuZGVyZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8ZnMtbWVzc2FnZS1pbmZvPlxuICAgICAgICBObyB2ZXJzaW9ucyB5ZXQg4oCUIGV2ZXJ5IHNhdmUgb2YgdGhlIEFJIEtub3dsZWRnZSBkb2N1bWVudCBsYW5kcyBoZXJlLCBhbmRcbiAgICAgICAgYW55IHZlcnNpb24gY2FuIGJlIHJlc3RvcmVkLlxuICAgICAgPC9mcy1tZXNzYWdlLWluZm8+XG4gICAgfVxuICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgIFttYXQtZGlhbG9nLWNsb3NlXT1cIm51bGxcIj5cbiAgICAgIENsb3NlXG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPC9mcy1kaWFsb2c+XG4iXX0=
@@ -19,7 +19,7 @@ import { forkJoin } from 'rxjs';
19
19
  import { switchMap, tap } from 'rxjs/operators';
20
20
  import { ReportData } from '../../data/report.data';
21
21
  import { DEFAULT_HEADING_SIZE } from '../../layout';
22
- import { loadGroupOptions, matchOptions } from '../../report-filter-items';
22
+ import { loadGroupOptions, matchOptions, resolveOptionValues } from '../../report-filter-items';
23
23
  import { dateFromBound, dateToBound } from './report-settings-default';
24
24
  import * as i0 from "@angular/core";
25
25
  import * as i1 from "@angular/forms";
@@ -109,24 +109,45 @@ export class ReportSettingsComponent {
109
109
  // in bar order, seeding each draft from the group's stored default.
110
110
  _buildFilterRows(report) {
111
111
  const reportId = report.id;
112
- const rows = (report.filterGroups ?? [])
112
+ const built = (report.filterGroups ?? [])
113
113
  .filter((group) => group.level === 'report' || group.level === 'both')
114
114
  .sort((a, b) => a.order - b.order)
115
115
  .map((group) => {
116
116
  const groupDefault = group.config?.default;
117
- return {
117
+ // One shared, replayed option stream per group: the chips fetch and the
118
+ // stored default's labels read the same list, so it is fetched once.
119
+ const options$ = loadGroupOptions(group, this._reportData, reportId);
120
+ const row = {
118
121
  group,
119
122
  label: group.label || group.filters?.[0]?.filterColumn || 'Filter',
120
123
  start: dateFromBound(groupDefault?.start),
121
124
  end: dateFromBound(groupDefault?.end),
122
- values: (groupDefault?.values ?? []).map((value) => ({ name: String(value), value })),
125
+ // Named below, once the option list carrying their labels is in.
126
+ values: [],
123
127
  value: groupDefault?.value ?? '',
124
128
  // fs-autocomplete-chips fetch: the group's distinct options, name-filtered.
125
129
  // Same loader the report bar uses, so the two never drift.
126
- fetch: (keyword) => matchOptions(loadGroupOptions(group, this._reportData, reportId), keyword),
130
+ fetch: (keyword) => matchOptions(options$, keyword),
127
131
  };
132
+ return { row, options$, values: groupDefault?.values ?? [] };
133
+ });
134
+ const rows = built.map((entry) => entry.row);
135
+ const seeded = built.filter((entry) => entry.values.length);
136
+ // Nothing to name — publish immediately rather than waiting on a request
137
+ // no row needs.
138
+ if (!seeded.length) {
139
+ this.filterRows.set(rows);
140
+ return;
141
+ }
142
+ // A stored select default holds ids, so its chips can only be named once the
143
+ // option list is in. Resolve every seeded row first and publish the rows in
144
+ // one go, so the tab never renders a chip showing a raw id.
145
+ forkJoin(seeded.map((entry) => resolveOptionValues(entry.options$, entry.values)))
146
+ .pipe(takeUntilDestroyed(this._destroyRef))
147
+ .subscribe((resolved) => {
148
+ resolved.forEach((values, index) => seeded[index].row.values = values);
149
+ this.filterRows.set(rows);
128
150
  });
129
- this.filterRows.set(rows);
130
151
  }
131
152
  // The draft default normalized to the wire shape for this row's type, or null
132
153
  // when empty (which clears the stored default).
@@ -205,4 +226,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
205
226
  TimezoneSelectComponent,
206
227
  ], template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <h1 mat-dialog-title>\n Report Settings\n </h1>\n <mat-dialog-content>\n <mat-tab-group [(selected)]=\"selectedTab\">\n <mat-tab\n label=\"Settings\"\n name=\"settings\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"name\"\n name=\"name\"\n [fsFormRequired]=\"true\">\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Page Size\n </mat-label>\n <mat-select\n [(ngModel)]=\"pageSize\"\n name=\"pageSize\">\n <mat-option value=\"widescreen\">\n Widescreen (13.33\" \u00D7 7.5\")\n </mat-option>\n <mat-option value=\"letter\">\n Letter (11\" \u00D7 8.5\")\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Orientation\n </mat-label>\n <mat-select\n [(ngModel)]=\"pageOrientation\"\n name=\"pageOrientation\">\n <mat-option value=\"landscape\">\n Landscape\n </mat-option>\n <mat-option value=\"portrait\">\n Portrait\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Layout\n </mat-label>\n <mat-select\n [(ngModel)]=\"layout\"\n name=\"layout\">\n <mat-option value=\"freeform\">\n Freeform \u2014 position components anywhere on the page\n </mat-option>\n <mat-option value=\"flow\">\n Flow \u2014 components flow into rows by width %\n </mat-option>\n </mat-select>\n <mat-hint>\n Freeform is like PowerPoint; Flow is like a responsive dashboard.\n </mat-hint>\n </mat-form-field>\n <fs-ai-report-timezone-select [(timezone)]=\"timezone\"></fs-ai-report-timezone-select>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Styles\"\n name=\"styles\">\n <div class=\"fs-column tab-body\">\n <mat-form-field>\n <mat-label>\n Heading Size\n </mat-label>\n <input\n matInput\n type=\"number\"\n step=\"1\"\n min=\"6\"\n max=\"96\"\n [(ngModel)]=\"headingSize\"\n name=\"headingSize\"\n [fsFormMin]=\"6\"\n [fsFormMax]=\"96\">\n <span matTextSuffix>\n pt\n </span>\n <mat-hint>\n Applies to component titles. Points map 1:1 to PDF and PowerPoint.\n </mat-hint>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab\n label=\"Filters\"\n name=\"filters\">\n <div class=\"fs-column tab-body\">\n @if (filterRows().length) {\n @for (row of filterRows(); track row.group.id) {\n @switch (row.group.type) {\n @case ('dateRange') {\n <div class=\"fs-row.gap-sm.align-center fs-flex\">\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Default From {{ row.label }}\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.start\"\n [name]=\"'start' + row.group.id\">\n </mat-form-field>\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Default To {{ row.label }}\n </mat-label>\n <input\n matInput\n fsDatePicker\n [(ngModel)]=\"row.end\"\n [name]=\"'end' + row.group.id\">\n </mat-form-field>\n </div>\n }\n @case ('select') {\n <fs-autocomplete-chips\n class=\"fs-flex\"\n [label]=\"'Default ' + row.label\"\n [fetch]=\"row.fetch\"\n [(ngModel)]=\"row.values\"\n [name]=\"'values' + row.group.id\"\n [multiple]=\"true\"\n [fetchOnFocus]=\"true\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n </fs-autocomplete-chips>\n }\n @default {\n <mat-form-field class=\"fs-flex\">\n <mat-label>\n Default {{ row.label }}\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"row.value\"\n [name]=\"'value' + row.group.id\">\n </mat-form-field>\n }\n }\n }\n } @else {\n <fs-message-info>\n This report has no report-level filters yet. Add a filter to a\n component (its settings \u2192 Filters) and show it in the report bar,\n then set its default here.\n </fs-message-info>\n }\n </div>\n </mat-tab>\n </mat-tab-group>\n </mat-dialog-content>\n <mat-dialog-actions>\n <fs-form-dialog-actions>\n <button\n type=\"button\"\n mat-button\n color=\"warn\"\n (click)=\"delete()\">\n Delete\n </button>\n </fs-form-dialog-actions>\n </mat-dialog-actions>\n </fs-dialog>\n</form>", styles: ["mat-form-field{width:100%}.tab-body{padding-top:16px}\n"] }]
207
228
  }] });
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL3JlcG9ydC1zZXR0aW5ncy9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0gsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUs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ZUFDVCxTQUFTLHFKQUNULHVCQUF1Qjs7NEZBR2QsdUJBQXVCO2tCQTVCbkMsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxXQUFXO3dCQUNYLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxlQUFlO3dCQUNmLFlBQVk7d0JBQ1osa0JBQWtCO3dCQUNsQix5QkFBeUI7d0JBQ3pCLGFBQWE7d0JBQ2IsU0FBUzt3QkFDVCxjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLFFBQVE7d0JBQ1IsT0FBTzt3QkFDUCxTQUFTO3dCQUNULFFBQVE7d0JBQ1IsU0FBUzt3QkFDVCxTQUFTO3dCQUNULHVCQUF1QjtxQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBPbkluaXQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmLCBNYXREaWFsb2dUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1hdExhYmVsLCBNYXRIaW50LCBNYXRTdWZmaXggfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0T3B0aW9uLCBNYXRTZWxlY3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0VGFic01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuXG5pbXBvcnQgeyBGc0F1dG9jb21wbGV0ZUNoaXBzTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXV0b2NvbXBsZXRlLWNoaXBzJztcbmltcG9ydCB7IEZzRGF0ZVBpY2tlck1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5pbXBvcnQgeyBGc01lc3NhZ2UsIEZzTWVzc2FnZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNUYWJzTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvdGFicyc7XG5cbmltcG9ydCB7IFRpbWV6b25lU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy90aW1lem9uZS1zZWxlY3QvdGltZXpvbmUtc2VsZWN0LmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgREVGQVVMVF9IRUFESU5HX1NJWkUgfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHsgbG9hZEdyb3VwT3B0aW9ucywgbWF0Y2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBkYXRlRnJvbUJvdW5kLCBkYXRlVG9Cb3VuZCB9IGZyb20gJy4vcmVwb3J0LXNldHRpbmdzLWRlZmF1bHQnO1xuXG5cbi8vIFdoYXQgdGhlIGRpYWxvZyBoYW5kcyBiYWNrIHdoZW4gaXQgY2xvc2VzLCBzbyB0aGUgcGFnZSBrbm93cyB3aGF0IGhhcHBlbmVkXG4vLyB3aXRob3V0IHNuaWZmaW5nIG1hZ2ljIHN0cmluZ3MuIEEgZGlzbWlzc2VkIGRpYWxvZyBjbG9zZXMgd2l0aCBgdW5kZWZpbmVkYC5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U2V0dGluZ3NSZXN1bHQge1xuICBhY3Rpb246ICdzYXZlZCcgfCAnZGVsZXRlZCc7XG59XG5cblxuLy8gT25lIHJlcG9ydC1sZXZlbCBmaWx0ZXIgaW4gdGhlIEZpbHRlcnMgdGFiOiBpdHMgZ3JvdXAsIHRoZSBpbmZlcnJlZCBpbnRlcmZhY2UsXG4vLyBhbmQgYW4gZWRpdGFibGUgZHJhZnQgZGVmYXVsdC4gVGhlIGRyYWZ0IGZpZWxkcyB1c2VkIGRlcGVuZCBvbiB0aGUgdHlwZVxuLy8gKGRhdGVSYW5nZSDihpIgc3RhcnQvZW5kIERhdGVzOyBzZWxlY3Qg4oaSIHZhbHVlczsga2V5d29yZCDihpIgdGV4dCkuIGBmZXRjaGAgbG9hZHNcbi8vIHRoZSBzZWxlY3Qgb3B0aW9ucyB0aGUgc2FtZSB3YXkgdGhlIHJlcG9ydCBiYXIgZG9lcy5cbmludGVyZmFjZSBGaWx0ZXJEZWZhdWx0Um93IHtcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwO1xuICBsYWJlbDogc3RyaW5nO1xuICBzdGFydDogRGF0ZSB8IG51bGw7XG4gIGVuZDogRGF0ZSB8IG51bGw7XG4gIHZhbHVlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcbiAgdmFsdWU6IHN0cmluZztcbiAgZmV0Y2g6IChrZXl3b3JkPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+O1xufVxuXG5cbi8vIFJlcG9ydCBzZXR0aW5ncywgaW4gdGhyZWUgdGFiczpcbi8vICAgU2V0dGluZ3Mg4oCUIG5hbWUgKyBwYWdlIHNldHVwIChzaXplLCBvcmllbnRhdGlvbiwgbGF5b3V0IG1vZGUpLlxuLy8gICBTdHlsZXMgICDigJQgdGhlIHJlcG9ydCdzIHR5cG9ncmFwaGljIHN0eWxlcyAoc2l6ZXMgaW4gUE9JTlRTLCAxOjEgd2l0aFxuLy8gICBQREYvUG93ZXJQb2ludCk7IHRoZSBIZWFkaW5nIHNpemUgdG8gc3RhcnQuXG4vLyAgIEZpbHRlcnMgIOKAlCB0aGUgcmVwb3J0LWxldmVsIGZpbHRlcnMgYW5kIHRoZWlyIERFRkFVTFQgdmFsdWVzLiBBIGRlZmF1bHRcbi8vICAgc2VlZHMgdGhlIHJlcG9ydCBiYXIgb24gZXZlcnkgb3BlbiAoZm9yIGV2ZXJ5IHZpZXdlcikgYnV0IHN0YXlzXG4vLyAgIHVzZXItY2hhbmdlYWJsZSDigJQgaXQgcHJlLWZpbGxzIHRoZSBjb250cm9sLCBpdCBkb2Vzbid0IGxvY2sgaXQuIFRoaXMgaXMgdGhlXG4vLyAgIGZpeCBmb3IgaGVhdnkgcmVwb3J0cyBvcGVuaW5nIGJsYW5rIGFuZCB0aW1pbmcgb3V0OiBhIGRlZmF1bHQgbW9udGggK1xuLy8gICBvcmdhbml6YXRpb24gc2NvcGVzIHRoZSBsYW5kaW5nIHBhZ2UgZnJvbSB0aGUgZmlyc3QgbG9hZC5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vcmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgRnNGb3JtTW9kdWxlLFxuICAgIEZzRGlhbG9nTW9kdWxlLFxuICAgIEZzTWVzc2FnZU1vZHVsZSxcbiAgICBGc1RhYnNNb2R1bGUsXG4gICAgRnNEYXRlUGlja2VyTW9kdWxlLFxuICAgIEZzQXV0b2NvbXBsZXRlQ2hpcHNNb2R1bGUsXG4gICAgTWF0VGFic01vZHVsZSxcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nVGl0bGUsXG4gICAgTWF0RGlhbG9nQ29udGVudCxcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdEZvcm1GaWVsZCxcbiAgICBNYXRMYWJlbCxcbiAgICBNYXRIaW50LFxuICAgIE1hdFN1ZmZpeCxcbiAgICBNYXRJbnB1dCxcbiAgICBNYXRTZWxlY3QsXG4gICAgTWF0T3B0aW9uLFxuICAgIFRpbWV6b25lU2VsZWN0Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIHNlbGVjdGVkVGFiID0gJ3NldHRpbmdzJztcblxuICBwdWJsaWMgbmFtZSA9ICcnO1xuICBwdWJsaWMgcGFnZVNpemU6ICd3aWRlc2NyZWVuJyB8ICdsZXR0ZXInID0gJ3dpZGVzY3JlZW4nO1xuICBwdWJsaWMgcGFnZU9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJyB8ICdwb3J0cmFpdCcgPSAnbGFuZHNjYXBlJztcbiAgcHVibGljIGxheW91dDogJ2ZyZWVmb3JtJyB8ICdmbG93JyA9ICdmcmVlZm9ybSc7XG4gIC8vIEVtcHR5IHVudGlsIHRoZSByZXBvcnQgaGFzIG9uZTsgYXBwLXRpbWV6b25lLXNlbGVjdCB0aGVuIGRlZmF1bHRzIGl0IHRvIHRoZVxuICAvLyB2aWV3ZXIncyBicm93c2VyIHpvbmUgKHdoaWNoIFNhdmUgcGVyc2lzdHMsIG1ha2luZyB0aGUgcmVwb3J0J3Mgem9uZSBleHBsaWNpdCkuXG4gIHB1YmxpYyB0aW1lem9uZSA9ICcnO1xuICBwdWJsaWMgaGVhZGluZ1NpemUgPSBERUZBVUxUX0hFQURJTkdfU0laRTtcblxuICAvLyBUaGUgcmVwb3J0LWxldmVsIGZpbHRlcnMgYW5kIHRoZWlyIGVkaXRhYmxlIGRlZmF1bHQgdmFsdWVzIChGaWx0ZXJzIHRhYikuXG4gIHB1YmxpYyByZWFkb25seSBmaWx0ZXJSb3dzID0gc2lnbmFsPEZpbHRlckRlZmF1bHRSb3dbXT4oW10pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGE6IHsgcmVwb3J0OiBSZXBvcnQgfSA9IGluamVjdChNQVRfRElBTE9HX0RBVEEpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kaWFsb2dSZWYgPSBpbmplY3Q8TWF0RGlhbG9nUmVmPFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCBSZXBvcnRTZXR0aW5nc1Jlc3VsdD4+KE1hdERpYWxvZ1JlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2UgPSBpbmplY3QoRnNNZXNzYWdlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fZGF0YS5yZXBvcnQ7XG4gICAgdGhpcy5uYW1lID0gcmVwb3J0Lm5hbWU7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHJlcG9ydC5wYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2VPcmllbnRhdGlvbiA9IHJlcG9ydC5wYWdlT3JpZW50YXRpb247XG4gICAgdGhpcy5sYXlvdXQgPSByZXBvcnQubGF5b3V0ID8/ICdmcmVlZm9ybSc7XG4gICAgdGhpcy50aW1lem9uZSA9IHJlcG9ydC50aW1lem9uZSA/PyAnJztcbiAgICB0aGlzLmhlYWRpbmdTaXplID0gcmVwb3J0LmNvbmZpZz8uc3R5bGVzPy5oZWFkaW5nPy5zaXplID8/IERFRkFVTFRfSEVBRElOR19TSVpFO1xuXG4gICAgdGhpcy5fYnVpbGRGaWx0ZXJSb3dzKHJlcG9ydCk7XG4gIH1cblxuICAvLyBDb25maXJtIGFuZCBkZWxldGUgaGVyZSwgd2hpbGUgdGhlIGRpYWxvZyBpcyBzdGlsbCBvcGVuLCB0aGVuIGNsb3NlIHdpdGhcbiAgLy8gYSBgZGVsZXRlZGAgcmVzdWx0LiBUaGUgcGFnZSByZWFjdHMgdG8gdGhlIHJlc3VsdDsgaXQgbm8gbG9uZ2VyIG93bnMgdGhlXG4gIC8vIHByb21wdCBvciB0aGUgQVBJIGNhbGwuXG4gIHB1YmxpYyBkZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdEZWxldGUgUmVwb3J0JyxcbiAgICAgIHRlbXBsYXRlOiBgRGVsZXRlIFwiJHt0aGlzLl9kYXRhLnJlcG9ydC5uYW1lfVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZSh0aGlzLl9kYXRhLnJlcG9ydC5pZCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdSZXBvcnQgZGVsZXRlZCcpO1xuICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoeyBhY3Rpb246ICdkZWxldGVkJyB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmUgPSAoKSA9PiB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLl9kYXRhLnJlcG9ydC5pZDtcblxuICAgIC8vIFBlcnNpc3QgdGhlIHJlcG9ydCBzZXR0aW5ncyBhbmQgZWFjaCBjaGFuZ2VkIGZpbHRlciBkZWZhdWx0IHRvZ2V0aGVyLCBzb1xuICAgIC8vIHRoZSBzaW5nbGUgU2F2ZSBjb3ZlcnMgYWxsIHRocmVlIHRhYnMuIFRoZSByZXBvcnQgcmVsb2FkcyBvbiB0aGUgYHNhdmVkYFxuICAgIC8vIHJlc3VsdCwgcmUtc2VlZGluZyB0aGUgYmFyIGZyb20gdGhlIG5ldyBkZWZhdWx0cy5cbiAgICBjb25zdCBzZXR0aW5ncyQgPSB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZShyZXBvcnRJZCwge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsXG4gICAgICBwYWdlT3JpZW50YXRpb246IHRoaXMucGFnZU9yaWVudGF0aW9uLFxuICAgICAgbGF5b3V0OiB0aGlzLmxheW91dCxcbiAgICAgIHRpbWV6b25lOiB0aGlzLnRpbWV6b25lLFxuICAgICAgc3R5bGVzOiB7IGhlYWRpbmc6IHsgc2l6ZTogdGhpcy5oZWFkaW5nU2l6ZSB9IH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZWZhdWx0cyQgPSB0aGlzLmZpbHRlclJvd3MoKVxuICAgICAgLmZpbHRlcigocm93KSA9PiB0aGlzLl9kZWZhdWx0Q2hhbmdlZChyb3cpKVxuICAgICAgLm1hcCgocm93KSA9PiB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZUZpbHRlckdyb3VwKHJlcG9ydElkLCByb3cuZ3JvdXAuaWQsIHtcbiAgICAgICAgZGVmYXVsdDogdGhpcy5fcm93RGVmYXVsdChyb3cpLFxuICAgICAgfSkpO1xuXG4gICAgcmV0dXJuIGZvcmtKb2luKFtzZXR0aW5ncyQsIC4uLmRlZmF1bHRzJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1JlcG9ydCBzZXR0aW5ncyBzYXZlZCcpO1xuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jbG9zZSh7IGFjdGlvbjogJ3NhdmVkJyB9KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9O1xuXG4gIC8vIEJ1aWxkIG9uZSBlZGl0YWJsZSByb3cgcGVyIHJlcG9ydC1sZXZlbCBmaWx0ZXIgZ3JvdXAgKGxldmVsIHJlcG9ydCBvciBib3RoKSxcbiAgLy8gaW4gYmFyIG9yZGVyLCBzZWVkaW5nIGVhY2ggZHJhZnQgZnJvbSB0aGUgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdC5cbiAgcHJpdmF0ZSBfYnVpbGRGaWx0ZXJSb3dzKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQuaWQ7XG5cbiAgICBjb25zdCByb3dzID0gKHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pXG4gICAgICAuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdyZXBvcnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpXG4gICAgICAubWFwKChncm91cCk6IEZpbHRlckRlZmF1bHRSb3cgPT4ge1xuICAgICAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBncm91cCxcbiAgICAgICAgICBsYWJlbDogZ3JvdXAubGFiZWwgfHwgZ3JvdXAuZmlsdGVycz8uWzBdPy5maWx0ZXJDb2x1bW4gfHwgJ0ZpbHRlcicsXG4gICAgICAgICAgc3RhcnQ6IGRhdGVGcm9tQm91bmQoZ3JvdXBEZWZhdWx0Py5zdGFydCksXG4gICAgICAgICAgZW5kOiBkYXRlRnJvbUJvdW5kKGdyb3VwRGVmYXVsdD8uZW5kKSxcbiAgICAgICAgICB2YWx1ZXM6IChncm91cERlZmF1bHQ/LnZhbHVlcyA/PyBbXSkubWFwKCh2YWx1ZSkgPT4gKHsgbmFtZTogU3RyaW5nKHZhbHVlKSwgdmFsdWUgfSkpLFxuICAgICAgICAgIHZhbHVlOiBncm91cERlZmF1bHQ/LnZhbHVlID8/ICcnLFxuICAgICAgICAgIC8vIGZzLWF1dG9jb21wbGV0ZS1jaGlwcyBmZXRjaDogdGhlIGdyb3VwJ3MgZGlzdGluY3Qgb3B0aW9ucywgbmFtZS1maWx0ZXJlZC5cbiAgICAgICAgICAvLyBTYW1lIGxvYWRlciB0aGUgcmVwb3J0IGJhciB1c2VzLCBzbyB0aGUgdHdvIG5ldmVyIGRyaWZ0LlxuICAgICAgICAgIGZldGNoOiAoa2V5d29yZD86IHN0cmluZykgPT5cbiAgICAgICAgICAgIG1hdGNoT3B0aW9ucyhsb2FkR3JvdXBPcHRpb25zKGdyb3VwLCB0aGlzLl9yZXBvcnREYXRhLCByZXBvcnRJZCksIGtleXdvcmQpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmZpbHRlclJvd3Muc2V0KHJvd3MpO1xuICB9XG5cbiAgLy8gVGhlIGRyYWZ0IGRlZmF1bHQgbm9ybWFsaXplZCB0byB0aGUgd2lyZSBzaGFwZSBmb3IgdGhpcyByb3cncyB0eXBlLCBvciBudWxsXG4gIC8vIHdoZW4gZW1wdHkgKHdoaWNoIGNsZWFycyB0aGUgc3RvcmVkIGRlZmF1bHQpLlxuICBwcml2YXRlIF9yb3dEZWZhdWx0KHJvdzogRmlsdGVyRGVmYXVsdFJvdyk6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwge1xuICAgIHN3aXRjaCAocm93Lmdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBkYXRlVG9Cb3VuZChyb3cuc3RhcnQpO1xuICAgICAgICBjb25zdCBlbmQgPSBkYXRlVG9Cb3VuZChyb3cuZW5kKTtcblxuICAgICAgICByZXR1cm4gKHN0YXJ0IHx8IGVuZCkgPyB7IHN0YXJ0OiBzdGFydCA/PyB1bmRlZmluZWQsIGVuZDogZW5kID8/IHVuZGVmaW5lZCB9IDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHJvdy52YWx1ZXMubGVuZ3RoID8geyB2YWx1ZXM6IHJvdy52YWx1ZXMubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSkgfSA6IG51bGw7XG5cbiAgICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvdy52YWx1ZS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlID8geyB2YWx1ZSB9IDogbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBXaGV0aGVyIHRoZSByb3cncyBkcmFmdCBkaWZmZXJzIGZyb20gdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQg4oCUIG9ubHlcbiAgLy8gY2hhbmdlZCByb3dzIGFyZSBwZXJzaXN0ZWQgb24gU2F2ZS5cbiAgcHJpdmF0ZSBfZGVmYXVsdENoYW5nZWQocm93OiBGaWx0ZXJEZWZhdWx0Um93KTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fbm9ybWFsaXplKHJvdy5ncm91cC5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCkpO1xuICAgIGNvbnN0IGFmdGVyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fbm9ybWFsaXplKHRoaXMuX3Jvd0RlZmF1bHQocm93KSkpO1xuXG4gICAgcmV0dXJuIGJlZm9yZSAhPT0gYWZ0ZXI7XG4gIH1cblxuICAvLyBBIHN0YWJsZSBjb21wYXJpc29uIGZvcm06IGRyb3AgcmVsYXRpdmUgKG5vdCBhdXRob3JlZCBoZXJlKSBhbmQgdW5kZWZpbmVkXG4gIC8vIGtleXMgc28gYSBuby1vcCBlZGl0IGRvZXNuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbiAgcHJpdmF0ZSBfbm9ybWFsaXplKHZhbHVlOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsKTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZDogRmlsdGVyR3JvdXBEZWZhdWx0ID0ge307XG4gICAgaWYgKHZhbHVlLnN0YXJ0KSB7XG4gICAgICBub3JtYWxpemVkLnN0YXJ0ID0gdmFsdWUuc3RhcnQ7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIG5vcm1hbGl6ZWQuZW5kID0gdmFsdWUuZW5kO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIG5vcm1hbGl6ZWQudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWUpIHtcbiAgICAgIG5vcm1hbGl6ZWQudmFsdWUgPSB2YWx1ZS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnJlbGF0aXZlKSB7XG4gICAgICBub3JtYWxpemVkLnJlbGF0aXZlID0gdmFsdWUucmVsYXRpdmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG5vcm1hbGl6ZWQpLmxlbmd0aCA/IG5vcm1hbGl6ZWQgOiBudWxsO1xuICB9XG59XG4iLCI8Zm9ybVxuICAgIGZzRm9ybVxuICAgIFtzdWJtaXRdPVwic2F2ZVwiPlxuICA8ZnMtZGlhbG9nPlxuICAgIDxoMSBtYXQtZGlhbG9nLXRpdGxlPlxuICAgICAgUmVwb3J0IFNldHRpbmdzXG4gICAgPC9oMT5cbiAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPG1hdC10YWItZ3JvdXAgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRUYWJcIj5cbiAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgIGxhYmVsPVwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgbmFtZT1cInNldHRpbmdzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIE5hbWVcbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgW2ZzRm9ybVJlcXVpcmVkXT1cInRydWVcIj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgUGFnZSBTaXplXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwicGFnZVNpemVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIndpZGVzY3JlZW5cIj5cbiAgICAgICAgICAgICAgICAgIFdpZGVzY3JlZW4gKDEzLjMzXCIgw5cgNy41XCIpXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibGV0dGVyXCI+XG4gICAgICAgICAgICAgICAgICBMZXR0ZXIgKDExXCIgw5cgOC41XCIpXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIE9yaWVudGF0aW9uXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWdlT3JpZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZ2VPcmllbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibGFuZHNjYXBlXCI+XG4gICAgICAgICAgICAgICAgICBMYW5kc2NhcGVcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJwb3J0cmFpdFwiPlxuICAgICAgICAgICAgICAgICAgUG9ydHJhaXRcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgTGF5b3V0XG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJsYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImxheW91dFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiZnJlZWZvcm1cIj5cbiAgICAgICAgICAgICAgICAgIEZyZWVmb3JtIOKAlCBwb3NpdGlvbiBjb21wb25lbnRzIGFueXdoZXJlIG9uIHRoZSBwYWdlXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiZmxvd1wiPlxuICAgICAgICAgICAgICAgICAgRmxvdyDigJQgY29tcG9uZW50cyBmbG93IGludG8gcm93cyBieSB3aWR0aCAlXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICBGcmVlZm9ybSBpcyBsaWtlIFBvd2VyUG9pbnQ7IEZsb3cgaXMgbGlrZSBhIHJlc3BvbnNpdmUgZGFzaGJvYXJkLlxuICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxmcy1haS1yZXBvcnQtdGltZXpvbmUtc2VsZWN0IFsodGltZXpvbmUpXT1cInRpbWV6b25lXCI+PC9mcy1haS1yZXBvcnQtdGltZXpvbmUtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIlN0eWxlc1wiXG4gICAgICAgICAgICBuYW1lPVwic3R5bGVzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIEhlYWRpbmcgU2l6ZVxuICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgbWluPVwiNlwiXG4gICAgICAgICAgICAgICAgbWF4PVwiOTZcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhZGluZ1NpemVcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJoZWFkaW5nU2l6ZVwiXG4gICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCI2XCJcbiAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cIjk2XCI+XG4gICAgICAgICAgICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgcHRcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgQXBwbGllcyB0byBjb21wb25lbnQgdGl0bGVzLiBQb2ludHMgbWFwIDE6MSB0byBQREYgYW5kIFBvd2VyUG9pbnQuXG4gICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkZpbHRlcnNcIlxuICAgICAgICAgICAgbmFtZT1cImZpbHRlcnNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gICAgICAgICAgICBAaWYgKGZpbHRlclJvd3MoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgQGZvciAocm93IG9mIGZpbHRlclJvd3MoKTsgdHJhY2sgcm93Lmdyb3VwLmlkKSB7XG4gICAgICAgICAgICAgICAgQHN3aXRjaCAocm93Lmdyb3VwLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnZGF0ZVJhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1zbS5hbGlnbi1jZW50ZXIgZnMtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZzLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgRnJvbSB7eyByb3cubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZzRGF0ZVBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5zdGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidzdGFydCcgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZzLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgVG8ge3sgcm93LmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmc0RhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2VuZCcgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnc2VsZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICA8ZnMtYXV0b2NvbXBsZXRlLWNoaXBzXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZzLWZsZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidEZWZhdWx0ICcgKyByb3cubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZldGNoXT1cInJvdy5mZXRjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy52YWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3ZhbHVlcycgKyByb3cuZ3JvdXAuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZldGNoT25Gb2N1c109XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZzQXV0b2NvbXBsZXRlQ2hpcHNUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtb2JqZWN0PVwib2JqZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBvYmplY3QubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZnMtYXV0b2NvbXBsZXRlLWNoaXBzPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmcy1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQge3sgcm93LmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3ZhbHVlJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxmcy1tZXNzYWdlLWluZm8+XG4gICAgICAgICAgICAgICAgVGhpcyByZXBvcnQgaGFzIG5vIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIHlldC4gQWRkIGEgZmlsdGVyIHRvIGFcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgKGl0cyBzZXR0aW5ncyDihpIgRmlsdGVycykgYW5kIHNob3cgaXQgaW4gdGhlIHJlcG9ydCBiYXIsXG4gICAgICAgICAgICAgICAgdGhlbiBzZXQgaXRzIGRlZmF1bHQgaGVyZS5cbiAgICAgICAgICAgICAgPC9mcy1tZXNzYWdlLWluZm8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgPGZzLWZvcm0tZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoKVwiPlxuICAgICAgICAgIERlbGV0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZnMtZm9ybS1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgPC9mcy1kaWFsb2c+XG48L2Zvcm0+Il19
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9kaWFsb2dzL3JlcG9ydC1zZXR0aW5ncy9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0gsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUs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QVk7d0JBQ1osa0JBQWtCO3dCQUNsQix5QkFBeUI7d0JBQ3pCLGFBQWE7d0JBQ2IsU0FBUzt3QkFDVCxjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLFFBQVE7d0JBQ1IsT0FBTzt3QkFDUCxTQUFTO3dCQUNULFFBQVE7d0JBQ1IsU0FBUzt3QkFDVCxTQUFTO3dCQUNULHVCQUF1QjtxQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBPbkluaXQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmLCBNYXREaWFsb2dUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1hdExhYmVsLCBNYXRIaW50LCBNYXRTdWZmaXggfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0T3B0aW9uLCBNYXRTZWxlY3QgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0VGFic01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuXG5pbXBvcnQgeyBGc0F1dG9jb21wbGV0ZUNoaXBzTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXV0b2NvbXBsZXRlLWNoaXBzJztcbmltcG9ydCB7IEZzRGF0ZVBpY2tlck1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5pbXBvcnQgeyBGc01lc3NhZ2UsIEZzTWVzc2FnZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNUYWJzTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvdGFicyc7XG5cbmltcG9ydCB7IFRpbWV6b25lU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy90aW1lem9uZS1zZWxlY3QvdGltZXpvbmUtc2VsZWN0LmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgREVGQVVMVF9IRUFESU5HX1NJWkUgfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHsgbG9hZEdyb3VwT3B0aW9ucywgbWF0Y2hPcHRpb25zLCByZXNvbHZlT3B0aW9uVmFsdWVzIH0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBkYXRlRnJvbUJvdW5kLCBkYXRlVG9Cb3VuZCB9IGZyb20gJy4vcmVwb3J0LXNldHRpbmdzLWRlZmF1bHQnO1xuXG5cbi8vIFdoYXQgdGhlIGRpYWxvZyBoYW5kcyBiYWNrIHdoZW4gaXQgY2xvc2VzLCBzbyB0aGUgcGFnZSBrbm93cyB3aGF0IGhhcHBlbmVkXG4vLyB3aXRob3V0IHNuaWZmaW5nIG1hZ2ljIHN0cmluZ3MuIEEgZGlzbWlzc2VkIGRpYWxvZyBjbG9zZXMgd2l0aCBgdW5kZWZpbmVkYC5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U2V0dGluZ3NSZXN1bHQge1xuICBhY3Rpb246ICdzYXZlZCcgfCAnZGVsZXRlZCc7XG59XG5cblxuLy8gT25lIHJlcG9ydC1sZXZlbCBmaWx0ZXIgaW4gdGhlIEZpbHRlcnMgdGFiOiBpdHMgZ3JvdXAsIHRoZSBpbmZlcnJlZCBpbnRlcmZhY2UsXG4vLyBhbmQgYW4gZWRpdGFibGUgZHJhZnQgZGVmYXVsdC4gVGhlIGRyYWZ0IGZpZWxkcyB1c2VkIGRlcGVuZCBvbiB0aGUgdHlwZVxuLy8gKGRhdGVSYW5nZSDihpIgc3RhcnQvZW5kIERhdGVzOyBzZWxlY3Qg4oaSIHZhbHVlczsga2V5d29yZCDihpIgdGV4dCkuIGBmZXRjaGAgbG9hZHNcbi8vIHRoZSBzZWxlY3Qgb3B0aW9ucyB0aGUgc2FtZSB3YXkgdGhlIHJlcG9ydCBiYXIgZG9lcy5cbmludGVyZmFjZSBGaWx0ZXJEZWZhdWx0Um93IHtcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwO1xuICBsYWJlbDogc3RyaW5nO1xuICBzdGFydDogRGF0ZSB8IG51bGw7XG4gIGVuZDogRGF0ZSB8IG51bGw7XG4gIHZhbHVlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXTtcbiAgdmFsdWU6IHN0cmluZztcbiAgZmV0Y2g6IChrZXl3b3JkPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+O1xufVxuXG5cbi8vIFJlcG9ydCBzZXR0aW5ncywgaW4gdGhyZWUgdGFiczpcbi8vICAgU2V0dGluZ3Mg4oCUIG5hbWUgKyBwYWdlIHNldHVwIChzaXplLCBvcmllbnRhdGlvbiwgbGF5b3V0IG1vZGUpLlxuLy8gICBTdHlsZXMgICDigJQgdGhlIHJlcG9ydCdzIHR5cG9ncmFwaGljIHN0eWxlcyAoc2l6ZXMgaW4gUE9JTlRTLCAxOjEgd2l0aFxuLy8gICBQREYvUG93ZXJQb2ludCk7IHRoZSBIZWFkaW5nIHNpemUgdG8gc3RhcnQuXG4vLyAgIEZpbHRlcnMgIOKAlCB0aGUgcmVwb3J0LWxldmVsIGZpbHRlcnMgYW5kIHRoZWlyIERFRkFVTFQgdmFsdWVzLiBBIGRlZmF1bHRcbi8vICAgc2VlZHMgdGhlIHJlcG9ydCBiYXIgb24gZXZlcnkgb3BlbiAoZm9yIGV2ZXJ5IHZpZXdlcikgYnV0IHN0YXlzXG4vLyAgIHVzZXItY2hhbmdlYWJsZSDigJQgaXQgcHJlLWZpbGxzIHRoZSBjb250cm9sLCBpdCBkb2Vzbid0IGxvY2sgaXQuIFRoaXMgaXMgdGhlXG4vLyAgIGZpeCBmb3IgaGVhdnkgcmVwb3J0cyBvcGVuaW5nIGJsYW5rIGFuZCB0aW1pbmcgb3V0OiBhIGRlZmF1bHQgbW9udGggK1xuLy8gICBvcmdhbml6YXRpb24gc2NvcGVzIHRoZSBsYW5kaW5nIHBhZ2UgZnJvbSB0aGUgZmlyc3QgbG9hZC5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vcmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVwb3J0LXNldHRpbmdzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgRnNGb3JtTW9kdWxlLFxuICAgIEZzRGlhbG9nTW9kdWxlLFxuICAgIEZzTWVzc2FnZU1vZHVsZSxcbiAgICBGc1RhYnNNb2R1bGUsXG4gICAgRnNEYXRlUGlja2VyTW9kdWxlLFxuICAgIEZzQXV0b2NvbXBsZXRlQ2hpcHNNb2R1bGUsXG4gICAgTWF0VGFic01vZHVsZSxcbiAgICBNYXRCdXR0b24sXG4gICAgTWF0RGlhbG9nVGl0bGUsXG4gICAgTWF0RGlhbG9nQ29udGVudCxcbiAgICBNYXREaWFsb2dBY3Rpb25zLFxuICAgIE1hdEZvcm1GaWVsZCxcbiAgICBNYXRMYWJlbCxcbiAgICBNYXRIaW50LFxuICAgIE1hdFN1ZmZpeCxcbiAgICBNYXRJbnB1dCxcbiAgICBNYXRTZWxlY3QsXG4gICAgTWF0T3B0aW9uLFxuICAgIFRpbWV6b25lU2VsZWN0Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIHNlbGVjdGVkVGFiID0gJ3NldHRpbmdzJztcblxuICBwdWJsaWMgbmFtZSA9ICcnO1xuICBwdWJsaWMgcGFnZVNpemU6ICd3aWRlc2NyZWVuJyB8ICdsZXR0ZXInID0gJ3dpZGVzY3JlZW4nO1xuICBwdWJsaWMgcGFnZU9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJyB8ICdwb3J0cmFpdCcgPSAnbGFuZHNjYXBlJztcbiAgcHVibGljIGxheW91dDogJ2ZyZWVmb3JtJyB8ICdmbG93JyA9ICdmcmVlZm9ybSc7XG4gIC8vIEVtcHR5IHVudGlsIHRoZSByZXBvcnQgaGFzIG9uZTsgYXBwLXRpbWV6b25lLXNlbGVjdCB0aGVuIGRlZmF1bHRzIGl0IHRvIHRoZVxuICAvLyB2aWV3ZXIncyBicm93c2VyIHpvbmUgKHdoaWNoIFNhdmUgcGVyc2lzdHMsIG1ha2luZyB0aGUgcmVwb3J0J3Mgem9uZSBleHBsaWNpdCkuXG4gIHB1YmxpYyB0aW1lem9uZSA9ICcnO1xuICBwdWJsaWMgaGVhZGluZ1NpemUgPSBERUZBVUxUX0hFQURJTkdfU0laRTtcblxuICAvLyBUaGUgcmVwb3J0LWxldmVsIGZpbHRlcnMgYW5kIHRoZWlyIGVkaXRhYmxlIGRlZmF1bHQgdmFsdWVzIChGaWx0ZXJzIHRhYikuXG4gIHB1YmxpYyByZWFkb25seSBmaWx0ZXJSb3dzID0gc2lnbmFsPEZpbHRlckRlZmF1bHRSb3dbXT4oW10pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RhdGE6IHsgcmVwb3J0OiBSZXBvcnQgfSA9IGluamVjdChNQVRfRElBTE9HX0RBVEEpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kaWFsb2dSZWYgPSBpbmplY3Q8TWF0RGlhbG9nUmVmPFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCBSZXBvcnRTZXR0aW5nc1Jlc3VsdD4+KE1hdERpYWxvZ1JlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2UgPSBpbmplY3QoRnNNZXNzYWdlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvbXB0ID0gaW5qZWN0KEZzUHJvbXB0KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fZGF0YS5yZXBvcnQ7XG4gICAgdGhpcy5uYW1lID0gcmVwb3J0Lm5hbWU7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHJlcG9ydC5wYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2VPcmllbnRhdGlvbiA9IHJlcG9ydC5wYWdlT3JpZW50YXRpb247XG4gICAgdGhpcy5sYXlvdXQgPSByZXBvcnQubGF5b3V0ID8/ICdmcmVlZm9ybSc7XG4gICAgdGhpcy50aW1lem9uZSA9IHJlcG9ydC50aW1lem9uZSA/PyAnJztcbiAgICB0aGlzLmhlYWRpbmdTaXplID0gcmVwb3J0LmNvbmZpZz8uc3R5bGVzPy5oZWFkaW5nPy5zaXplID8/IERFRkFVTFRfSEVBRElOR19TSVpFO1xuXG4gICAgdGhpcy5fYnVpbGRGaWx0ZXJSb3dzKHJlcG9ydCk7XG4gIH1cblxuICAvLyBDb25maXJtIGFuZCBkZWxldGUgaGVyZSwgd2hpbGUgdGhlIGRpYWxvZyBpcyBzdGlsbCBvcGVuLCB0aGVuIGNsb3NlIHdpdGhcbiAgLy8gYSBgZGVsZXRlZGAgcmVzdWx0LiBUaGUgcGFnZSByZWFjdHMgdG8gdGhlIHJlc3VsdDsgaXQgbm8gbG9uZ2VyIG93bnMgdGhlXG4gIC8vIHByb21wdCBvciB0aGUgQVBJIGNhbGwuXG4gIHB1YmxpYyBkZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdEZWxldGUgUmVwb3J0JyxcbiAgICAgIHRlbXBsYXRlOiBgRGVsZXRlIFwiJHt0aGlzLl9kYXRhLnJlcG9ydC5uYW1lfVwiPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZSh0aGlzLl9kYXRhLnJlcG9ydC5pZCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdSZXBvcnQgZGVsZXRlZCcpO1xuICAgICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoeyBhY3Rpb246ICdkZWxldGVkJyB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmUgPSAoKSA9PiB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLl9kYXRhLnJlcG9ydC5pZDtcblxuICAgIC8vIFBlcnNpc3QgdGhlIHJlcG9ydCBzZXR0aW5ncyBhbmQgZWFjaCBjaGFuZ2VkIGZpbHRlciBkZWZhdWx0IHRvZ2V0aGVyLCBzb1xuICAgIC8vIHRoZSBzaW5nbGUgU2F2ZSBjb3ZlcnMgYWxsIHRocmVlIHRhYnMuIFRoZSByZXBvcnQgcmVsb2FkcyBvbiB0aGUgYHNhdmVkYFxuICAgIC8vIHJlc3VsdCwgcmUtc2VlZGluZyB0aGUgYmFyIGZyb20gdGhlIG5ldyBkZWZhdWx0cy5cbiAgICBjb25zdCBzZXR0aW5ncyQgPSB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZShyZXBvcnRJZCwge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsXG4gICAgICBwYWdlT3JpZW50YXRpb246IHRoaXMucGFnZU9yaWVudGF0aW9uLFxuICAgICAgbGF5b3V0OiB0aGlzLmxheW91dCxcbiAgICAgIHRpbWV6b25lOiB0aGlzLnRpbWV6b25lLFxuICAgICAgc3R5bGVzOiB7IGhlYWRpbmc6IHsgc2l6ZTogdGhpcy5oZWFkaW5nU2l6ZSB9IH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZWZhdWx0cyQgPSB0aGlzLmZpbHRlclJvd3MoKVxuICAgICAgLmZpbHRlcigocm93KSA9PiB0aGlzLl9kZWZhdWx0Q2hhbmdlZChyb3cpKVxuICAgICAgLm1hcCgocm93KSA9PiB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZUZpbHRlckdyb3VwKHJlcG9ydElkLCByb3cuZ3JvdXAuaWQsIHtcbiAgICAgICAgZGVmYXVsdDogdGhpcy5fcm93RGVmYXVsdChyb3cpLFxuICAgICAgfSkpO1xuXG4gICAgcmV0dXJuIGZvcmtKb2luKFtzZXR0aW5ncyQsIC4uLmRlZmF1bHRzJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1JlcG9ydCBzZXR0aW5ncyBzYXZlZCcpO1xuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jbG9zZSh7IGFjdGlvbjogJ3NhdmVkJyB9KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9O1xuXG4gIC8vIEJ1aWxkIG9uZSBlZGl0YWJsZSByb3cgcGVyIHJlcG9ydC1sZXZlbCBmaWx0ZXIgZ3JvdXAgKGxldmVsIHJlcG9ydCBvciBib3RoKSxcbiAgLy8gaW4gYmFyIG9yZGVyLCBzZWVkaW5nIGVhY2ggZHJhZnQgZnJvbSB0aGUgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdC5cbiAgcHJpdmF0ZSBfYnVpbGRGaWx0ZXJSb3dzKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQuaWQ7XG5cbiAgICBjb25zdCBidWlsdCA9IChyZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKVxuICAgICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmxldmVsID09PSAncmVwb3J0JyB8fCBncm91cC5sZXZlbCA9PT0gJ2JvdGgnKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKVxuICAgICAgLm1hcCgoZ3JvdXApID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuICAgICAgICAvLyBPbmUgc2hhcmVkLCByZXBsYXllZCBvcHRpb24gc3RyZWFtIHBlciBncm91cDogdGhlIGNoaXBzIGZldGNoIGFuZCB0aGVcbiAgICAgICAgLy8gc3RvcmVkIGRlZmF1bHQncyBsYWJlbHMgcmVhZCB0aGUgc2FtZSBsaXN0LCBzbyBpdCBpcyBmZXRjaGVkIG9uY2UuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMkID0gbG9hZEdyb3VwT3B0aW9ucyhncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0SWQpO1xuXG4gICAgICAgIGNvbnN0IHJvdzogRmlsdGVyRGVmYXVsdFJvdyA9IHtcbiAgICAgICAgICBncm91cCxcbiAgICAgICAgICBsYWJlbDogZ3JvdXAubGFiZWwgfHwgZ3JvdXAuZmlsdGVycz8uWzBdPy5maWx0ZXJDb2x1bW4gfHwgJ0ZpbHRlcicsXG4gICAgICAgICAgc3RhcnQ6IGRhdGVGcm9tQm91bmQoZ3JvdXBEZWZhdWx0Py5zdGFydCksXG4gICAgICAgICAgZW5kOiBkYXRlRnJvbUJvdW5kKGdyb3VwRGVmYXVsdD8uZW5kKSxcbiAgICAgICAgICAvLyBOYW1lZCBiZWxvdywgb25jZSB0aGUgb3B0aW9uIGxpc3QgY2FycnlpbmcgdGhlaXIgbGFiZWxzIGlzIGluLlxuICAgICAgICAgIHZhbHVlczogW10sXG4gICAgICAgICAgdmFsdWU6IGdyb3VwRGVmYXVsdD8udmFsdWUgPz8gJycsXG4gICAgICAgICAgLy8gZnMtYXV0b2NvbXBsZXRlLWNoaXBzIGZldGNoOiB0aGUgZ3JvdXAncyBkaXN0aW5jdCBvcHRpb25zLCBuYW1lLWZpbHRlcmVkLlxuICAgICAgICAgIC8vIFNhbWUgbG9hZGVyIHRoZSByZXBvcnQgYmFyIHVzZXMsIHNvIHRoZSB0d28gbmV2ZXIgZHJpZnQuXG4gICAgICAgICAgZmV0Y2g6IChrZXl3b3JkPzogc3RyaW5nKSA9PiBtYXRjaE9wdGlvbnMob3B0aW9ucyQsIGtleXdvcmQpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7IHJvdywgb3B0aW9ucyQsIHZhbHVlczogZ3JvdXBEZWZhdWx0Py52YWx1ZXMgPz8gW10gfTtcbiAgICAgIH0pO1xuXG4gICAgY29uc3Qgcm93cyA9IGJ1aWx0Lm1hcCgoZW50cnkpID0+IGVudHJ5LnJvdyk7XG4gICAgY29uc3Qgc2VlZGVkID0gYnVpbHQuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkudmFsdWVzLmxlbmd0aCk7XG5cbiAgICAvLyBOb3RoaW5nIHRvIG5hbWUg4oCUIHB1Ymxpc2ggaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gd2FpdGluZyBvbiBhIHJlcXVlc3RcbiAgICAvLyBubyByb3cgbmVlZHMuXG4gICAgaWYgKCFzZWVkZWQubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlclJvd3Muc2V0KHJvd3MpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBzdG9yZWQgc2VsZWN0IGRlZmF1bHQgaG9sZHMgaWRzLCBzbyBpdHMgY2hpcHMgY2FuIG9ubHkgYmUgbmFtZWQgb25jZSB0aGVcbiAgICAvLyBvcHRpb24gbGlzdCBpcyBpbi4gUmVzb2x2ZSBldmVyeSBzZWVkZWQgcm93IGZpcnN0IGFuZCBwdWJsaXNoIHRoZSByb3dzIGluXG4gICAgLy8gb25lIGdvLCBzbyB0aGUgdGFiIG5ldmVyIHJlbmRlcnMgYSBjaGlwIHNob3dpbmcgYSByYXcgaWQuXG4gICAgZm9ya0pvaW4oc2VlZGVkLm1hcCgoZW50cnkpID0+IHJlc29sdmVPcHRpb25WYWx1ZXMoZW50cnkub3B0aW9ucyQsIGVudHJ5LnZhbHVlcykpKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgcmVzb2x2ZWQuZm9yRWFjaCgodmFsdWVzLCBpbmRleCkgPT4gc2VlZGVkW2luZGV4XS5yb3cudmFsdWVzID0gdmFsdWVzKTtcbiAgICAgICAgdGhpcy5maWx0ZXJSb3dzLnNldChyb3dzKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGRyYWZ0IGRlZmF1bHQgbm9ybWFsaXplZCB0byB0aGUgd2lyZSBzaGFwZSBmb3IgdGhpcyByb3cncyB0eXBlLCBvciBudWxsXG4gIC8vIHdoZW4gZW1wdHkgKHdoaWNoIGNsZWFycyB0aGUgc3RvcmVkIGRlZmF1bHQpLlxuICBwcml2YXRlIF9yb3dEZWZhdWx0KHJvdzogRmlsdGVyRGVmYXVsdFJvdyk6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwge1xuICAgIHN3aXRjaCAocm93Lmdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBkYXRlVG9Cb3VuZChyb3cuc3RhcnQpO1xuICAgICAgICBjb25zdCBlbmQgPSBkYXRlVG9Cb3VuZChyb3cuZW5kKTtcblxuICAgICAgICByZXR1cm4gKHN0YXJ0IHx8IGVuZCkgPyB7IHN0YXJ0OiBzdGFydCA/PyB1bmRlZmluZWQsIGVuZDogZW5kID8/IHVuZGVmaW5lZCB9IDogbnVsbDtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHJvdy52YWx1ZXMubGVuZ3RoID8geyB2YWx1ZXM6IHJvdy52YWx1ZXMubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSkgfSA6IG51bGw7XG5cbiAgICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvdy52YWx1ZS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlID8geyB2YWx1ZSB9IDogbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBXaGV0aGVyIHRoZSByb3cncyBkcmFmdCBkaWZmZXJzIGZyb20gdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQg4oCUIG9ubHlcbiAgLy8gY2hhbmdlZCByb3dzIGFyZSBwZXJzaXN0ZWQgb24gU2F2ZS5cbiAgcHJpdmF0ZSBfZGVmYXVsdENoYW5nZWQocm93OiBGaWx0ZXJEZWZhdWx0Um93KTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmVmb3JlID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fbm9ybWFsaXplKHJvdy5ncm91cC5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCkpO1xuICAgIGNvbnN0IGFmdGVyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5fbm9ybWFsaXplKHRoaXMuX3Jvd0RlZmF1bHQocm93KSkpO1xuXG4gICAgcmV0dXJuIGJlZm9yZSAhPT0gYWZ0ZXI7XG4gIH1cblxuICAvLyBBIHN0YWJsZSBjb21wYXJpc29uIGZvcm06IGRyb3AgcmVsYXRpdmUgKG5vdCBhdXRob3JlZCBoZXJlKSBhbmQgdW5kZWZpbmVkXG4gIC8vIGtleXMgc28gYSBuby1vcCBlZGl0IGRvZXNuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbiAgcHJpdmF0ZSBfbm9ybWFsaXplKHZhbHVlOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsKTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZDogRmlsdGVyR3JvdXBEZWZhdWx0ID0ge307XG4gICAgaWYgKHZhbHVlLnN0YXJ0KSB7XG4gICAgICBub3JtYWxpemVkLnN0YXJ0ID0gdmFsdWUuc3RhcnQ7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIG5vcm1hbGl6ZWQuZW5kID0gdmFsdWUuZW5kO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIG5vcm1hbGl6ZWQudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWUpIHtcbiAgICAgIG5vcm1hbGl6ZWQudmFsdWUgPSB2YWx1ZS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnJlbGF0aXZlKSB7XG4gICAgICBub3JtYWxpemVkLnJlbGF0aXZlID0gdmFsdWUucmVsYXRpdmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG5vcm1hbGl6ZWQpLmxlbmd0aCA/IG5vcm1hbGl6ZWQgOiBudWxsO1xuICB9XG59XG4iLCI8Zm9ybVxuICAgIGZzRm9ybVxuICAgIFtzdWJtaXRdPVwic2F2ZVwiPlxuICA8ZnMtZGlhbG9nPlxuICAgIDxoMSBtYXQtZGlhbG9nLXRpdGxlPlxuICAgICAgUmVwb3J0IFNldHRpbmdzXG4gICAgPC9oMT5cbiAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPG1hdC10YWItZ3JvdXAgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWRUYWJcIj5cbiAgICAgICAgPG1hdC10YWJcbiAgICAgICAgICAgIGxhYmVsPVwiU2V0dGluZ3NcIlxuICAgICAgICAgICAgbmFtZT1cInNldHRpbmdzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIE5hbWVcbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgW2ZzRm9ybVJlcXVpcmVkXT1cInRydWVcIj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgUGFnZSBTaXplXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwicGFnZVNpemVcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIndpZGVzY3JlZW5cIj5cbiAgICAgICAgICAgICAgICAgIFdpZGVzY3JlZW4gKDEzLjMzXCIgw5cgNy41XCIpXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibGV0dGVyXCI+XG4gICAgICAgICAgICAgICAgICBMZXR0ZXIgKDExXCIgw5cgOC41XCIpXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIE9yaWVudGF0aW9uXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwYWdlT3JpZW50YXRpb25cIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInBhZ2VPcmllbnRhdGlvblwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibGFuZHNjYXBlXCI+XG4gICAgICAgICAgICAgICAgICBMYW5kc2NhcGVcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJwb3J0cmFpdFwiPlxuICAgICAgICAgICAgICAgICAgUG9ydHJhaXRcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgTGF5b3V0XG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJsYXlvdXRcIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cImxheW91dFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiZnJlZWZvcm1cIj5cbiAgICAgICAgICAgICAgICAgIEZyZWVmb3JtIOKAlCBwb3NpdGlvbiBjb21wb25lbnRzIGFueXdoZXJlIG9uIHRoZSBwYWdlXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiZmxvd1wiPlxuICAgICAgICAgICAgICAgICAgRmxvdyDigJQgY29tcG9uZW50cyBmbG93IGludG8gcm93cyBieSB3aWR0aCAlXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICBGcmVlZm9ybSBpcyBsaWtlIFBvd2VyUG9pbnQ7IEZsb3cgaXMgbGlrZSBhIHJlc3BvbnNpdmUgZGFzaGJvYXJkLlxuICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxmcy1haS1yZXBvcnQtdGltZXpvbmUtc2VsZWN0IFsodGltZXpvbmUpXT1cInRpbWV6b25lXCI+PC9mcy1haS1yZXBvcnQtdGltZXpvbmUtc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIlN0eWxlc1wiXG4gICAgICAgICAgICBuYW1lPVwic3R5bGVzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWNvbHVtbiB0YWItYm9keVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIEhlYWRpbmcgU2l6ZVxuICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgbWluPVwiNlwiXG4gICAgICAgICAgICAgICAgbWF4PVwiOTZcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhZGluZ1NpemVcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJoZWFkaW5nU2l6ZVwiXG4gICAgICAgICAgICAgICAgW2ZzRm9ybU1pbl09XCI2XCJcbiAgICAgICAgICAgICAgICBbZnNGb3JtTWF4XT1cIjk2XCI+XG4gICAgICAgICAgICAgIDxzcGFuIG1hdFRleHRTdWZmaXg+XG4gICAgICAgICAgICAgICAgcHRcbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8bWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgQXBwbGllcyB0byBjb21wb25lbnQgdGl0bGVzLiBQb2ludHMgbWFwIDE6MSB0byBQREYgYW5kIFBvd2VyUG9pbnQuXG4gICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDxtYXQtdGFiXG4gICAgICAgICAgICBsYWJlbD1cIkZpbHRlcnNcIlxuICAgICAgICAgICAgbmFtZT1cImZpbHRlcnNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uIHRhYi1ib2R5XCI+XG4gICAgICAgICAgICBAaWYgKGZpbHRlclJvd3MoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgQGZvciAocm93IG9mIGZpbHRlclJvd3MoKTsgdHJhY2sgcm93Lmdyb3VwLmlkKSB7XG4gICAgICAgICAgICAgICAgQHN3aXRjaCAocm93Lmdyb3VwLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnZGF0ZVJhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1zbS5hbGlnbi1jZW50ZXIgZnMtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZzLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgRnJvbSB7eyByb3cubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZzRGF0ZVBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy5zdGFydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidzdGFydCcgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZzLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgVG8ge3sgcm93LmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmc0RhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cuZW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2VuZCcgKyByb3cuZ3JvdXAuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnc2VsZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICA8ZnMtYXV0b2NvbXBsZXRlLWNoaXBzXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZzLWZsZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidEZWZhdWx0ICcgKyByb3cubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZldGNoXT1cInJvdy5mZXRjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvdy52YWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3ZhbHVlcycgKyByb3cuZ3JvdXAuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZldGNoT25Gb2N1c109XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZzQXV0b2NvbXBsZXRlQ2hpcHNUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtb2JqZWN0PVwib2JqZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBvYmplY3QubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZnMtYXV0b2NvbXBsZXRlLWNoaXBzPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmcy1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQge3sgcm93LmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3cudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3ZhbHVlJyArIHJvdy5ncm91cC5pZFwiPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxmcy1tZXNzYWdlLWluZm8+XG4gICAgICAgICAgICAgICAgVGhpcyByZXBvcnQgaGFzIG5vIHJlcG9ydC1sZXZlbCBmaWx0ZXJzIHlldC4gQWRkIGEgZmlsdGVyIHRvIGFcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgKGl0cyBzZXR0aW5ncyDihpIgRmlsdGVycykgYW5kIHNob3cgaXQgaW4gdGhlIHJlcG9ydCBiYXIsXG4gICAgICAgICAgICAgICAgdGhlbiBzZXQgaXRzIGRlZmF1bHQgaGVyZS5cbiAgICAgICAgICAgICAgPC9mcy1tZXNzYWdlLWluZm8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgPGZzLWZvcm0tZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoKVwiPlxuICAgICAgICAgIERlbGV0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZnMtZm9ybS1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgPC9mcy1kaWFsb2c+XG48L2Zvcm0+Il19