tango-app-ui-analyse-report 3.7.1-alpha.21 → 3.7.1-alpha.22

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.
@@ -17,10 +17,20 @@ const COMPARISON_TO_PAIR = {
17
17
  none: { rollup: 'None', previousPeriod: false },
18
18
  wtd: { rollup: 'WTD', previousPeriod: false },
19
19
  mtd: { rollup: 'MTD', previousPeriod: false },
20
- wow: { rollup: 'WTD', previousPeriod: true },
21
- mom: { rollup: 'MTD', previousPeriod: true },
20
+ wow: { rollup: 'WoW', previousPeriod: true },
21
+ mom: { rollup: 'MoM', previousPeriod: true },
22
22
  };
23
23
  function pairToComparison(pair) {
24
+ // Templates saved before WoW/MoM became their own rollup values encoded them
25
+ // as WTD/MTD + previousPeriod:true — keep reading that as the same choice.
26
+ if (pair.previousPeriod) {
27
+ if (pair.rollup === 'WTD') {
28
+ return 'wow';
29
+ }
30
+ if (pair.rollup === 'MTD') {
31
+ return 'mom';
32
+ }
33
+ }
24
34
  const match = Object.keys(COMPARISON_TO_PAIR).find((key) => {
25
35
  const candidate = COMPARISON_TO_PAIR[key];
26
36
  return candidate.rollup === pair.rollup && candidate.previousPeriod === pair.previousPeriod;
@@ -76,9 +86,8 @@ export class CustomReportBuilderComponent {
76
86
  return this.timeFilter === 'hour' && this.metrics.some((m) => m.value === 'nob' && m.checked);
77
87
  }
78
88
  get canNext() {
79
- if (this.activeStep === 0) {
80
- return this.metrics.some((m) => m.checked);
81
- }
89
+ // The Metrics step needs no selection: Footfall is always included (the
90
+ // locked default row), so a footfall-only report is valid.
82
91
  if (this.activeStep === 2 && this.nobHourConflict) {
83
92
  return false;
84
93
  }
@@ -116,16 +125,16 @@ export class CustomReportBuilderComponent {
116
125
  };
117
126
  }
118
127
  onView() {
119
- if (this.metrics.some((m) => m.checked) && !this.nobHourConflict) {
128
+ if (!this.nobHourConflict) {
120
129
  this.view.emit(this.currentSelections());
121
130
  }
122
131
  }
123
132
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomReportBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
124
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomReportBuilderComponent, selector: "lib-custom-report-builder", inputs: { metricsCatalog: "metricsCatalog", template: "template" }, outputs: { view: "view" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"card-body h-100px p-0\">\n <div class=\"card-label\">Please select your data points to add into the reports</div>\n <div class=\"btnheader step-tabs w-100 p-2 mt-5\">\n <span class=\"cursor-pointer px-2 step-tab\" *ngFor=\"let step of steps; let i = index\"\n [ngClass]=\"activeStep === i ? 'btn ' : ''\" (click)=\"setStep(i)\">{{ step }}</span>\n </div>\n\n <div class=\"overflow-auto\" style=\"height: auto\">\n <!-- Metrics -->\n <div *ngIf=\"activeStep === 0\">\n <div *ngFor=\"let metric of metrics; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"metric.checked\" id=\"metric-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"metric-{{ i }}\">{{ metric.name }}</label>\n </div>\n </div>\n\n <!-- Comparison -->\n <div *ngIf=\"activeStep === 1\">\n <div *ngFor=\"let option of comparisonOptions\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-start\" (click)=\"setComparisonChoice(option.value)\">\n <input [checked]=\"comparisonChoice === option.value\" type=\"radio\" class=\"radio mt-1\" />\n <span class=\"ms-5\">\n <span class=\"standard fs-4\">{{ option.label }}<span *ngIf=\"option.suffix\" class=\"comparison-suffix ms-1\">{{ option.suffix }}</span></span>\n <span *ngIf=\"option.secondLine\" class=\"comparison-suffix d-block\">{{ option.secondLine }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <!-- Time Filter -->\n <div *ngIf=\"activeStep === 2\">\n <div *ngFor=\"let filter of timeFilters\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-center\" (click)=\"setTimeFilter(filter)\">\n <input [checked]=\"timeFilter === filter\" type=\"radio\" class=\"radio\" />\n <span class=\"ms-5 standard fs-4\">{{ filter === 'hour' ? 'By Hour' : 'By Date' }}</span>\n </div>\n </div>\n <div *ngIf=\"nobHourConflict\" class=\"nob-hour-warning mt-5\">NoB cannot be displayed by hour</div>\n </div>\n\n <!-- Store info -->\n <div *ngIf=\"activeStep === 3\">\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-name\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-name\">Store Name</label>\n </div>\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-id\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-id\">Store ID</label>\n </div>\n <div *ngFor=\"let option of storeInfoOptions; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"option.checked\" id=\"store-info-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"store-info-{{ i }}\">{{ option.label }}</label>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex w-100 mt-5\">\n <button class=\"btn btn-default btn-outline w-50 me-3 mb-3\"\n [ngClass]=\"activeStep === 0 ? 'hidden' : ''\" (click)=\"back()\">Previous</button>\n <button *ngIf=\"!isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"!canNext\" (click)=\"next()\">Next</button>\n <button *ngIf=\"isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"nobHourConflict\" (click)=\"onView()\">View</button>\n </div>\n</div>", styles: [".card-label{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.standard{color:var(--Gray-700, #344054);font-size:16px;font-weight:500;line-height:24px}.radio{width:16px!important;height:16px!important}.btnheader{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--Gray-50, #F9FAFB)}.btnheader .btn{background:#fff!important;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f!important}.hidden{visibility:hidden}.comparison-suffix{color:var(--Gray-500, #667085);font-size:13px;font-weight:400;line-height:18px}.nob-hour-warning{color:var(--Error-600, #D92D20);font-size:13px;font-weight:500;line-height:18px}.step-tabs{display:flex;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:thin}.step-tabs::-webkit-scrollbar{height:4px}.step-tabs::-webkit-scrollbar-thumb{background:var(--Gray-200, #E4E7EC);border-radius:4px}.step-tabs::-webkit-scrollbar-track{background:transparent}.step-tab{flex-shrink:0;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
133
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomReportBuilderComponent, selector: "lib-custom-report-builder", inputs: { metricsCatalog: "metricsCatalog", template: "template" }, outputs: { view: "view" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"card-body h-100px p-0\">\n <div class=\"card-label\">Please select your data points to add into the reports</div>\n <div class=\"btnheader step-tabs w-100 p-2 mt-5\">\n <span class=\"cursor-pointer step-tab\" *ngFor=\"let step of steps; let i = index\"\n [class.active]=\"activeStep === i\" (click)=\"setStep(i)\">{{ step }}</span>\n </div>\n\n <div class=\"overflow-auto\" style=\"height: auto\">\n <!-- Metrics -->\n <div *ngIf=\"activeStep === 0\">\n <!-- Footfall is a base column the report always returns (never part of the\n metrics payload) \u2014 shown locked, same idiom as Store Name/Store ID. -->\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"metric-footfall\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"metric-footfall\">Footfall</label>\n </div>\n <div *ngFor=\"let metric of metrics; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"metric.checked\" id=\"metric-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"metric-{{ i }}\">{{ metric.name }}</label>\n </div>\n </div>\n\n <!-- Comparison -->\n <div *ngIf=\"activeStep === 1\">\n <div *ngFor=\"let option of comparisonOptions\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-start\" (click)=\"setComparisonChoice(option.value)\">\n <input [checked]=\"comparisonChoice === option.value\" type=\"radio\" class=\"radio mt-1\" />\n <span class=\"ms-5\">\n <span class=\"standard fs-4\">{{ option.label }}<span *ngIf=\"option.suffix\" class=\"comparison-suffix ms-1\">{{ option.suffix }}</span></span>\n <span *ngIf=\"option.secondLine\" class=\"comparison-suffix d-block\">{{ option.secondLine }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <!-- Time Filter -->\n <div *ngIf=\"activeStep === 2\">\n <div *ngFor=\"let filter of timeFilters\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-center\" (click)=\"setTimeFilter(filter)\">\n <input [checked]=\"timeFilter === filter\" type=\"radio\" class=\"radio\" />\n <span class=\"ms-5 standard fs-4\">{{ filter === 'hour' ? 'By Hour' : 'By Date' }}</span>\n </div>\n </div>\n <div *ngIf=\"nobHourConflict\" class=\"nob-hour-warning mt-5\">NoB cannot be displayed by hour</div>\n </div>\n\n <!-- Store info -->\n <div *ngIf=\"activeStep === 3\">\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-name\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-name\">Store Name</label>\n </div>\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-id\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-id\">Store ID</label>\n </div>\n <div *ngFor=\"let option of storeInfoOptions; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"option.checked\" id=\"store-info-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"store-info-{{ i }}\">{{ option.label }}</label>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex w-100 mt-5\">\n <button class=\"btn btn-default btn-outline w-50 me-3 mb-3\"\n [ngClass]=\"activeStep === 0 ? 'hidden' : ''\" (click)=\"back()\">Previous</button>\n <button *ngIf=\"!isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"!canNext\" (click)=\"next()\">Next</button>\n <button *ngIf=\"isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"nobHourConflict\" (click)=\"onView()\">View</button>\n </div>\n</div>", styles: [".card-label{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.standard{color:var(--Gray-700, #344054);font-size:16px;font-weight:500;line-height:24px}.radio{width:16px!important;height:16px!important}.btnheader{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--Gray-50, #F9FAFB)}.hidden{visibility:hidden}.comparison-suffix{color:var(--Gray-500, #667085);font-size:13px;font-weight:400;line-height:18px}.nob-hour-warning{color:var(--Error-600, #D92D20);font-size:13px;font-weight:500;line-height:18px}.step-tabs{display:flex;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:thin}.step-tabs::-webkit-scrollbar{height:4px}.step-tabs::-webkit-scrollbar-thumb{background:var(--Gray-200, #E4E7EC);border-radius:4px}.step-tabs::-webkit-scrollbar-track{background:transparent}.step-tab{flex:1 0 auto;text-align:center;white-space:nowrap;padding:6px 10px;border-radius:6px}.step-tab.active{background:#fff;color:var(--Gray-700, #344054);box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
125
134
  }
126
135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomReportBuilderComponent, decorators: [{
127
136
  type: Component,
128
- args: [{ selector: 'lib-custom-report-builder', template: "<div class=\"card-body h-100px p-0\">\n <div class=\"card-label\">Please select your data points to add into the reports</div>\n <div class=\"btnheader step-tabs w-100 p-2 mt-5\">\n <span class=\"cursor-pointer px-2 step-tab\" *ngFor=\"let step of steps; let i = index\"\n [ngClass]=\"activeStep === i ? 'btn ' : ''\" (click)=\"setStep(i)\">{{ step }}</span>\n </div>\n\n <div class=\"overflow-auto\" style=\"height: auto\">\n <!-- Metrics -->\n <div *ngIf=\"activeStep === 0\">\n <div *ngFor=\"let metric of metrics; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"metric.checked\" id=\"metric-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"metric-{{ i }}\">{{ metric.name }}</label>\n </div>\n </div>\n\n <!-- Comparison -->\n <div *ngIf=\"activeStep === 1\">\n <div *ngFor=\"let option of comparisonOptions\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-start\" (click)=\"setComparisonChoice(option.value)\">\n <input [checked]=\"comparisonChoice === option.value\" type=\"radio\" class=\"radio mt-1\" />\n <span class=\"ms-5\">\n <span class=\"standard fs-4\">{{ option.label }}<span *ngIf=\"option.suffix\" class=\"comparison-suffix ms-1\">{{ option.suffix }}</span></span>\n <span *ngIf=\"option.secondLine\" class=\"comparison-suffix d-block\">{{ option.secondLine }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <!-- Time Filter -->\n <div *ngIf=\"activeStep === 2\">\n <div *ngFor=\"let filter of timeFilters\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-center\" (click)=\"setTimeFilter(filter)\">\n <input [checked]=\"timeFilter === filter\" type=\"radio\" class=\"radio\" />\n <span class=\"ms-5 standard fs-4\">{{ filter === 'hour' ? 'By Hour' : 'By Date' }}</span>\n </div>\n </div>\n <div *ngIf=\"nobHourConflict\" class=\"nob-hour-warning mt-5\">NoB cannot be displayed by hour</div>\n </div>\n\n <!-- Store info -->\n <div *ngIf=\"activeStep === 3\">\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-name\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-name\">Store Name</label>\n </div>\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-id\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-id\">Store ID</label>\n </div>\n <div *ngFor=\"let option of storeInfoOptions; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"option.checked\" id=\"store-info-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"store-info-{{ i }}\">{{ option.label }}</label>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex w-100 mt-5\">\n <button class=\"btn btn-default btn-outline w-50 me-3 mb-3\"\n [ngClass]=\"activeStep === 0 ? 'hidden' : ''\" (click)=\"back()\">Previous</button>\n <button *ngIf=\"!isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"!canNext\" (click)=\"next()\">Next</button>\n <button *ngIf=\"isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"nobHourConflict\" (click)=\"onView()\">View</button>\n </div>\n</div>", styles: [".card-label{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.standard{color:var(--Gray-700, #344054);font-size:16px;font-weight:500;line-height:24px}.radio{width:16px!important;height:16px!important}.btnheader{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--Gray-50, #F9FAFB)}.btnheader .btn{background:#fff!important;box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f!important}.hidden{visibility:hidden}.comparison-suffix{color:var(--Gray-500, #667085);font-size:13px;font-weight:400;line-height:18px}.nob-hour-warning{color:var(--Error-600, #D92D20);font-size:13px;font-weight:500;line-height:18px}.step-tabs{display:flex;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:thin}.step-tabs::-webkit-scrollbar{height:4px}.step-tabs::-webkit-scrollbar-thumb{background:var(--Gray-200, #E4E7EC);border-radius:4px}.step-tabs::-webkit-scrollbar-track{background:transparent}.step-tab{flex-shrink:0;white-space:nowrap}\n"] }]
137
+ args: [{ selector: 'lib-custom-report-builder', template: "<div class=\"card-body h-100px p-0\">\n <div class=\"card-label\">Please select your data points to add into the reports</div>\n <div class=\"btnheader step-tabs w-100 p-2 mt-5\">\n <span class=\"cursor-pointer step-tab\" *ngFor=\"let step of steps; let i = index\"\n [class.active]=\"activeStep === i\" (click)=\"setStep(i)\">{{ step }}</span>\n </div>\n\n <div class=\"overflow-auto\" style=\"height: auto\">\n <!-- Metrics -->\n <div *ngIf=\"activeStep === 0\">\n <!-- Footfall is a base column the report always returns (never part of the\n metrics payload) \u2014 shown locked, same idiom as Store Name/Store ID. -->\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"metric-footfall\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"metric-footfall\">Footfall</label>\n </div>\n <div *ngFor=\"let metric of metrics; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"metric.checked\" id=\"metric-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"metric-{{ i }}\">{{ metric.name }}</label>\n </div>\n </div>\n\n <!-- Comparison -->\n <div *ngIf=\"activeStep === 1\">\n <div *ngFor=\"let option of comparisonOptions\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-start\" (click)=\"setComparisonChoice(option.value)\">\n <input [checked]=\"comparisonChoice === option.value\" type=\"radio\" class=\"radio mt-1\" />\n <span class=\"ms-5\">\n <span class=\"standard fs-4\">{{ option.label }}<span *ngIf=\"option.suffix\" class=\"comparison-suffix ms-1\">{{ option.suffix }}</span></span>\n <span *ngIf=\"option.secondLine\" class=\"comparison-suffix d-block\">{{ option.secondLine }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <!-- Time Filter -->\n <div *ngIf=\"activeStep === 2\">\n <div *ngFor=\"let filter of timeFilters\" class=\"mt-5\">\n <div class=\"cursor-pointer d-flex align-items-center\" (click)=\"setTimeFilter(filter)\">\n <input [checked]=\"timeFilter === filter\" type=\"radio\" class=\"radio\" />\n <span class=\"ms-5 standard fs-4\">{{ filter === 'hour' ? 'By Hour' : 'By Date' }}</span>\n </div>\n </div>\n <div *ngIf=\"nobHourConflict\" class=\"nob-hour-warning mt-5\">NoB cannot be displayed by hour</div>\n </div>\n\n <!-- Store info -->\n <div *ngIf=\"activeStep === 3\">\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-name\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-name\">Store Name</label>\n </div>\n <div class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input\" type=\"checkbox\" checked disabled id=\"store-info-id\" />\n </div>\n <label class=\"ms-5 standard fs-4\" for=\"store-info-id\">Store ID</label>\n </div>\n <div *ngFor=\"let option of storeInfoOptions; let i = index\" class=\"mt-5 d-flex align-items-center\">\n <div class=\"form-check form-check-custom form-check-solid\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [(ngModel)]=\"option.checked\" id=\"store-info-{{ i }}\" />\n </div>\n <label class=\"ms-5 standard fs-4 cursor-pointer\" for=\"store-info-{{ i }}\">{{ option.label }}</label>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex w-100 mt-5\">\n <button class=\"btn btn-default btn-outline w-50 me-3 mb-3\"\n [ngClass]=\"activeStep === 0 ? 'hidden' : ''\" (click)=\"back()\">Previous</button>\n <button *ngIf=\"!isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"!canNext\" (click)=\"next()\">Next</button>\n <button *ngIf=\"isLastStep\" class=\"btn btn-default btn-primary w-50 ms-3 mb-3\"\n [disabled]=\"nobHourConflict\" (click)=\"onView()\">View</button>\n </div>\n</div>", styles: [".card-label{color:var(--Gray-500, #667085);font-size:14px;font-weight:400;line-height:20px}.standard{color:var(--Gray-700, #344054);font-size:16px;font-weight:500;line-height:24px}.radio{width:16px!important;height:16px!important}.btnheader{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;border-radius:8px;border:1px solid var(--Gray-100, #F2F4F7);background:var(--Gray-50, #F9FAFB)}.hidden{visibility:hidden}.comparison-suffix{color:var(--Gray-500, #667085);font-size:13px;font-weight:400;line-height:18px}.nob-hour-warning{color:var(--Error-600, #D92D20);font-size:13px;font-weight:500;line-height:18px}.step-tabs{display:flex;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:thin}.step-tabs::-webkit-scrollbar{height:4px}.step-tabs::-webkit-scrollbar-thumb{background:var(--Gray-200, #E4E7EC);border-radius:4px}.step-tabs::-webkit-scrollbar-track{background:transparent}.step-tab{flex:1 0 auto;text-align:center;white-space:nowrap;padding:6px 10px;border-radius:6px}.step-tab.active{background:#fff;color:var(--Gray-700, #344054);box-shadow:0 1px 3px #1018281a,0 1px 2px #1018280f}\n"] }]
129
138
  }], propDecorators: { metricsCatalog: [{
130
139
  type: Input
131
140
  }], template: [{
@@ -133,4 +142,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
133
142
  }], view: [{
134
143
  type: Output
135
144
  }] } });
136
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtcmVwb3J0L3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tcmVwb3J0LWJ1aWxkZXIvY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtcmVwb3J0L3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tcmVwb3J0LWJ1aWxkZXIvY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFLTCxxQkFBcUIsRUFDckIsa0JBQWtCLEdBR25CLE1BQU0sMENBQTBDLENBQUM7Ozs7QUFJbEQ7MkZBQzJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQXVGO0lBQzdHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDeEQsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtJQUN6RCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDMUQsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0lBQzVELEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSx5Q0FBeUMsRUFBRTtDQUNqRyxD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Q2xDLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbEUsVUFBVSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUNyRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQXdCLENBQUM7WUFDdkcsWUFBWSxFQUFFLEVBQUUsY0FBYyxFQUFFO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7d0dBMUdVLDRCQUE0Qjs0RkFBNUIsNEJBQTRCLHFMQzlDekMsbThIQXlFTTs7NEZEM0JPLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSwyQkFBMkI7OEJBSzVCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxJQUFJO3NCQUFiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDdXN0b21SZXBvcnRDb21wYXJpc29uLFxuICBDdXN0b21SZXBvcnRTZWxlY3Rpb25zLFxuICBDdXN0b21SZXBvcnRUZW1wbGF0ZSxcbiAgTWV0cmljT3B0aW9uLFxuICBub3JtYWxpemVUYWJsZU9wdGlvbnMsXG4gIFNUT1JFX0lORk9fT1BUSU9OUyxcbiAgU3RvcmVJbmZvQ29sdW1uLFxuICBUaW1lRmlsdGVyLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2N1c3RvbS1yZXBvcnQuaW50ZXJmYWNlJztcblxudHlwZSBDb21wYXJpc29uQ2hvaWNlID0gJ25vbmUnIHwgJ3d0ZCcgfCAnbXRkJyB8ICd3b3cnIHwgJ21vbSc7XG5cbi8qKiBgc2Vjb25kTGluZWAgcmVuZGVycyBhcyBpdHMgb3duIG11dGVkIGxpbmUgYmVsb3cgdGhlIGxhYmVsIChwZXIgdGhlIFwiTm8gQ29tcGFyaXNvblwiIG1vY2t1cCk7XG4gKiAgYHN1ZmZpeGAgcmVuZGVycyBpbmxpbmUgbmV4dCB0byB0aGUgbGFiZWwgKHRoZSBzaG9ydCBXVEQvTVREL1dvVy9Nb00gYWJicmV2aWF0aW9ucykuICovXG5jb25zdCBDT01QQVJJU09OX09QVElPTlM6IHsgdmFsdWU6IENvbXBhcmlzb25DaG9pY2U7IGxhYmVsOiBzdHJpbmc7IHN1ZmZpeD86IHN0cmluZzsgc2Vjb25kTGluZT86IHN0cmluZyB9W10gPSBbXG4gIHsgdmFsdWU6ICd3dGQnLCBsYWJlbDogJ1dlZWsgdG8gRGF0ZScsIHN1ZmZpeDogJyhXVEQpJyB9LFxuICB7IHZhbHVlOiAnbXRkJywgbGFiZWw6ICdNb250aCB0byBEYXRlJywgc3VmZml4OiAnKE1URCknIH0sXG4gIHsgdmFsdWU6ICd3b3cnLCBsYWJlbDogJ1dlZWsgb3ZlciBXZWVrJywgc3VmZml4OiAnKFdvVyknIH0sXG4gIHsgdmFsdWU6ICdtb20nLCBsYWJlbDogJ01vbnRoIG92ZXIgTW9udGgnLCBzdWZmaXg6ICcoTW9NKScgfSxcbiAgeyB2YWx1ZTogJ25vbmUnLCBsYWJlbDogJ05vIENvbXBhcmlzb24nLCBzZWNvbmRMaW5lOiAnKERhdGEgRGlzcGxheWVkIGJhc2VkIG9uIFNlbGVjdGVkIERhdGUpJyB9LFxuXTtcblxuLyoqIEJpamVjdGl2ZSBtYXBwaW5nIGJldHdlZW4gdGhlIHdpemFyZCdzIHNpbmdsZSByYWRpbyBjaG9pY2UgYW5kIHRoZSBwZXJzaXN0ZWQgeyByb2xsdXAsIHByZXZpb3VzUGVyaW9kIH0gcGFpci4gKi9cbmNvbnN0IENPTVBBUklTT05fVE9fUEFJUjogUmVjb3JkPENvbXBhcmlzb25DaG9pY2UsIEN1c3RvbVJlcG9ydENvbXBhcmlzb24+ID0ge1xuICBub25lOiB7IHJvbGx1cDogJ05vbmUnLCBwcmV2aW91c1BlcmlvZDogZmFsc2UgfSxcbiAgd3RkOiB7IHJvbGx1cDogJ1dURCcsIHByZXZpb3VzUGVyaW9kOiBmYWxzZSB9LFxuICBtdGQ6IHsgcm9sbHVwOiAnTVREJywgcHJldmlvdXNQZXJpb2Q6IGZhbHNlIH0sXG4gIHdvdzogeyByb2xsdXA6ICdXVEQnLCBwcmV2aW91c1BlcmlvZDogdHJ1ZSB9LFxuICBtb206IHsgcm9sbHVwOiAnTVREJywgcHJldmlvdXNQZXJpb2Q6IHRydWUgfSxcbn07XG5cbmZ1bmN0aW9uIHBhaXJUb0NvbXBhcmlzb24ocGFpcjogQ3VzdG9tUmVwb3J0Q29tcGFyaXNvbik6IENvbXBhcmlzb25DaG9pY2Uge1xuICBjb25zdCBtYXRjaCA9IChPYmplY3Qua2V5cyhDT01QQVJJU09OX1RPX1BBSVIpIGFzIENvbXBhcmlzb25DaG9pY2VbXSkuZmluZCgoa2V5KSA9PiB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gQ09NUEFSSVNPTl9UT19QQUlSW2tleV07XG4gICAgcmV0dXJuIGNhbmRpZGF0ZS5yb2xsdXAgPT09IHBhaXIucm9sbHVwICYmIGNhbmRpZGF0ZS5wcmV2aW91c1BlcmlvZCA9PT0gcGFpci5wcmV2aW91c1BlcmlvZDtcbiAgfSk7XG4gIHJldHVybiBtYXRjaCA/PyAnbm9uZSc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXN0b20tcmVwb3J0LWJ1aWxkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2N1c3RvbS1yZXBvcnQtYnVpbGRlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlcG9ydEJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBtZXRyaWNzQ2F0YWxvZzogTWV0cmljT3B0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgdGVtcGxhdGU6IEN1c3RvbVJlcG9ydFRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XG4gIEBPdXRwdXQoKSB2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21SZXBvcnRTZWxlY3Rpb25zPigpO1xuXG4gIHJlYWRvbmx5IHN0ZXBzID0gWydNZXRyaWNzJywgJ0NvbXBhcmlzb24nLCAnVGltZSBGaWx0ZXInLCAnU3RvcmUgaW5mbyddO1xuICBhY3RpdmVTdGVwID0gMDtcblxuICBtZXRyaWNzOiBNZXRyaWNPcHRpb25bXSA9IFtdO1xuICByZWFkb25seSBjb21wYXJpc29uT3B0aW9ucyA9IENPTVBBUklTT05fT1BUSU9OUztcbiAgY29tcGFyaXNvbkNob2ljZTogQ29tcGFyaXNvbkNob2ljZSA9ICdub25lJztcbiAgcmVhZG9ubHkgdGltZUZpbHRlcnM6IFRpbWVGaWx0ZXJbXSA9IFsnZGF5JywgJ2hvdXInXTtcbiAgdGltZUZpbHRlcjogVGltZUZpbHRlciA9ICdkYXknO1xuICBzdG9yZUluZm9PcHRpb25zID0gU1RPUkVfSU5GT19PUFRJT05TLm1hcCgobykgPT4gKHsgLi4ubywgY2hlY2tlZDogZmFsc2UgfSkpO1xuICBzaG93QXZlcmFnZSA9IGZhbHNlO1xuICAvKiogTm9uLSdTaG93IEF2ZXJhZ2UnIGluY2x1ZGVDb2x1bW5zIGNhcnJpZWQgdGhyb3VnaCBmcm9tIGFuIGFwcGxpZWQgdGVtcGxhdGUgKHRoZSB3aXphcmQgaGFzIG5vIFVJIGZvciB0aGVzZSB5ZXQpLiAqL1xuICBwcml2YXRlIG90aGVySW5jbHVkZUNvbHVtbnM6IHN0cmluZ1tdID0gW107XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydtZXRyaWNzQ2F0YWxvZyddKSB7XG4gICAgICB0aGlzLm1ldHJpY3MgPSB0aGlzLm1ldHJpY3NDYXRhbG9nLm1hcCgobSkgPT4gKHsgLi4ubSwgY2hlY2tlZDogZmFsc2UgfSkpO1xuICAgICAgdGhpcy5hcHBseVRlbXBsYXRlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZSddKSB7XG4gICAgICB0aGlzLmFwcGx5VGVtcGxhdGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VGVtcGxhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWV0cmljcyA9IHRoaXMubWV0cmljcy5tYXAoKG0pID0+ICh7IC4uLm0sIGNoZWNrZWQ6IHRoaXMudGVtcGxhdGUhLm1ldHJpY3MuaW5jbHVkZXMobS52YWx1ZSkgfSkpO1xuICAgIHRoaXMuY29tcGFyaXNvbkNob2ljZSA9IHBhaXJUb0NvbXBhcmlzb24odGhpcy50ZW1wbGF0ZS5jb21wYXJpc29uKTtcbiAgICB0aGlzLnRpbWVGaWx0ZXIgPSB0aGlzLnRlbXBsYXRlLnRpbWVGaWx0ZXI7XG4gICAgdGhpcy5zdG9yZUluZm9PcHRpb25zID0gdGhpcy5zdG9yZUluZm9PcHRpb25zLm1hcCgobykgPT4gKHtcbiAgICAgIC4uLm8sXG4gICAgICBjaGVja2VkOiB0aGlzLnRlbXBsYXRlIS5zdG9yZUluZm9Db2x1bW5zLmluY2x1ZGVzKG8udmFsdWUpLFxuICAgIH0pKTtcbiAgICBub3JtYWxpemVUYWJsZU9wdGlvbnModGhpcy50ZW1wbGF0ZS50YWJsZU9wdGlvbnMpO1xuICAgIGNvbnN0IGluY2x1ZGVDb2x1bW5zID0gdGhpcy50ZW1wbGF0ZS50YWJsZU9wdGlvbnMuaW5jbHVkZUNvbHVtbnMgPz8gW107XG4gICAgdGhpcy5zaG93QXZlcmFnZSA9IGluY2x1ZGVDb2x1bW5zLmluY2x1ZGVzKCdTaG93IEF2ZXJhZ2UnKTtcbiAgICB0aGlzLm90aGVySW5jbHVkZUNvbHVtbnMgPSBpbmNsdWRlQ29sdW1ucy5maWx0ZXIoKGMpID0+IGMgIT09ICdTaG93IEF2ZXJhZ2UnKTtcbiAgICB0aGlzLmFjdGl2ZVN0ZXAgPSAwO1xuICB9XG5cbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlU3RlcCA9PT0gdGhpcy5zdGVwcy5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqIE5PQiAoaG91cmx5IGZvb3RmYWxsIGJyZWFrZG93bikgaGFzIG5vIGhvdXJseSBkYXRhIHNvdXJjZSDigJQgYmxvY2sgd2hlbmV2ZXIgYm90aCBob2xkLCByZWdhcmRsZXNzIG9mIHNlbGVjdGlvbiBvcmRlci4gKi9cbiAgZ2V0IG5vYkhvdXJDb25mbGljdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aW1lRmlsdGVyID09PSAnaG91cicgJiYgdGhpcy5tZXRyaWNzLnNvbWUoKG0pID0+IG0udmFsdWUgPT09ICdub2InICYmIG0uY2hlY2tlZCk7XG4gIH1cblxuICBnZXQgY2FuTmV4dCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5hY3RpdmVTdGVwID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLnNvbWUoKG0pID0+IG0uY2hlY2tlZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjdGl2ZVN0ZXAgPT09IDIgJiYgdGhpcy5ub2JIb3VyQ29uZmxpY3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXRTdGVwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVN0ZXAgPSBpbmRleDtcbiAgfVxuXG4gIG5leHQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGFzdFN0ZXAgJiYgdGhpcy5jYW5OZXh0KSB7XG4gICAgICB0aGlzLmFjdGl2ZVN0ZXArKztcbiAgICB9XG4gIH1cblxuICBiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZVN0ZXAgPiAwKSB7XG4gICAgICB0aGlzLmFjdGl2ZVN0ZXAtLTtcbiAgICB9XG4gIH1cblxuICBzZXRDb21wYXJpc29uQ2hvaWNlKGNob2ljZTogQ29tcGFyaXNvbkNob2ljZSk6IHZvaWQge1xuICAgIHRoaXMuY29tcGFyaXNvbkNob2ljZSA9IGNob2ljZTtcbiAgfVxuXG4gIHNldFRpbWVGaWx0ZXIoZmlsdGVyOiBUaW1lRmlsdGVyKTogdm9pZCB7XG4gICAgdGhpcy50aW1lRmlsdGVyID0gZmlsdGVyO1xuICB9XG5cbiAgY3VycmVudFNlbGVjdGlvbnMoKTogQ3VzdG9tUmVwb3J0U2VsZWN0aW9ucyB7XG4gICAgY29uc3QgaW5jbHVkZUNvbHVtbnMgPSB0aGlzLnNob3dBdmVyYWdlXG4gICAgICA/IFsnU2hvdyBBdmVyYWdlJywgLi4udGhpcy5vdGhlckluY2x1ZGVDb2x1bW5zXVxuICAgICAgOiBbLi4udGhpcy5vdGhlckluY2x1ZGVDb2x1bW5zXTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0cmljczogdGhpcy5tZXRyaWNzLmZpbHRlcigobSkgPT4gbS5jaGVja2VkKS5tYXAoKG0pID0+IG0udmFsdWUpLFxuICAgICAgY29tcGFyaXNvbjogQ09NUEFSSVNPTl9UT19QQUlSW3RoaXMuY29tcGFyaXNvbkNob2ljZV0sXG4gICAgICB0aW1lRmlsdGVyOiB0aGlzLnRpbWVGaWx0ZXIsXG4gICAgICBzdG9yZUluZm9Db2x1bW5zOiB0aGlzLnN0b3JlSW5mb09wdGlvbnMuZmlsdGVyKChvKSA9PiBvLmNoZWNrZWQpLm1hcCgobykgPT4gby52YWx1ZSBhcyBTdG9yZUluZm9Db2x1bW4pLFxuICAgICAgdGFibGVPcHRpb25zOiB7IGluY2x1ZGVDb2x1bW5zIH0sXG4gICAgfTtcbiAgfVxuXG4gIG9uVmlldygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXRyaWNzLnNvbWUoKG0pID0+IG0uY2hlY2tlZCkgJiYgIXRoaXMubm9iSG91ckNvbmZsaWN0KSB7XG4gICAgICB0aGlzLnZpZXcuZW1pdCh0aGlzLmN1cnJlbnRTZWxlY3Rpb25zKCkpO1xuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgaC0xMDBweCBwLTBcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtbGFiZWxcIj5QbGVhc2Ugc2VsZWN0IHlvdXIgZGF0YSBwb2ludHMgdG8gYWRkIGludG8gdGhlIHJlcG9ydHM8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ0bmhlYWRlciBzdGVwLXRhYnMgdy0xMDAgcC0yIG10LTVcIj5cbiAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHB4LTIgc3RlcC10YWJcIiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aXZlU3RlcCA9PT0gaSA/ICdidG4gJyA6ICcnXCIgKGNsaWNrKT1cInNldFN0ZXAoaSlcIj57eyBzdGVwIH19PC9zcGFuPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwib3ZlcmZsb3ctYXV0b1wiIHN0eWxlPVwiaGVpZ2h0OiBhdXRvXCI+XG4gICAgPCEtLSBNZXRyaWNzIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVTdGVwID09PSAwXCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtZXRyaWMgb2YgbWV0cmljczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibXQtNSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWRcIj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJtZXRyaWMuY2hlY2tlZFwiIGlkPVwibWV0cmljLXt7IGkgfX1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibXMtNSBzdGFuZGFyZCBmcy00IGN1cnNvci1wb2ludGVyXCIgZm9yPVwibWV0cmljLXt7IGkgfX1cIj57eyBtZXRyaWMubmFtZSB9fTwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQ29tcGFyaXNvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlU3RlcCA9PT0gMVwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGNvbXBhcmlzb25PcHRpb25zXCIgY2xhc3M9XCJtdC01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtc3RhcnRcIiAoY2xpY2spPVwic2V0Q29tcGFyaXNvbkNob2ljZShvcHRpb24udmFsdWUpXCI+XG4gICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cImNvbXBhcmlzb25DaG9pY2UgPT09IG9wdGlvbi52YWx1ZVwiIHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwicmFkaW8gbXQtMVwiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy01XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YW5kYXJkIGZzLTRcIj57eyBvcHRpb24ubGFiZWwgfX08c3BhbiAqbmdJZj1cIm9wdGlvbi5zdWZmaXhcIiBjbGFzcz1cImNvbXBhcmlzb24tc3VmZml4IG1zLTFcIj57eyBvcHRpb24uc3VmZml4IH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwib3B0aW9uLnNlY29uZExpbmVcIiBjbGFzcz1cImNvbXBhcmlzb24tc3VmZml4IGQtYmxvY2tcIj57eyBvcHRpb24uc2Vjb25kTGluZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRpbWUgRmlsdGVyIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVTdGVwID09PSAyXCI+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgdGltZUZpbHRlcnNcIiBjbGFzcz1cIm10LTVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiAoY2xpY2spPVwic2V0VGltZUZpbHRlcihmaWx0ZXIpXCI+XG4gICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cInRpbWVGaWx0ZXIgPT09IGZpbHRlclwiIHR5cGU9XCJyYWRpb1wiIGNsYXNzPVwicmFkaW9cIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtNSBzdGFuZGFyZCBmcy00XCI+e3sgZmlsdGVyID09PSAnaG91cicgPyAnQnkgSG91cicgOiAnQnkgRGF0ZScgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwibm9iSG91ckNvbmZsaWN0XCIgY2xhc3M9XCJub2ItaG91ci13YXJuaW5nIG10LTVcIj5Ob0IgY2Fubm90IGJlIGRpc3BsYXllZCBieSBob3VyPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFN0b3JlIGluZm8gLS0+XG4gICAgPGRpdiAqbmdJZj1cImFjdGl2ZVN0ZXAgPT09IDNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1jdXN0b20gZm9ybS1jaGVjay1zb2xpZFwiPlxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBjaGVja2VkIGRpc2FibGVkIGlkPVwic3RvcmUtaW5mby1uYW1lXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNFwiIGZvcj1cInN0b3JlLWluZm8tbmFtZVwiPlN0b3JlIE5hbWU8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibXQtNSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWRcIj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZCBkaXNhYmxlZCBpZD1cInN0b3JlLWluZm8taWRcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibXMtNSBzdGFuZGFyZCBmcy00XCIgZm9yPVwic3RvcmUtaW5mby1pZFwiPlN0b3JlIElEPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHN0b3JlSW5mb09wdGlvbnM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm10LTUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkXCI+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwib3B0aW9uLmNoZWNrZWRcIiBpZD1cInN0b3JlLWluZm8te3sgaSB9fVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJtcy01IHN0YW5kYXJkIGZzLTQgY3Vyc29yLXBvaW50ZXJcIiBmb3I9XCJzdG9yZS1pbmZvLXt7IGkgfX1cIj57eyBvcHRpb24ubGFiZWwgfX08L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgbXQtNVwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLW91dGxpbmUgdy01MCBtZS0zIG1iLTNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aXZlU3RlcCA9PT0gMCA/ICdoaWRkZW4nIDogJydcIiAoY2xpY2spPVwiYmFjaygpXCI+UHJldmlvdXM8L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiIWlzTGFzdFN0ZXBcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tcHJpbWFyeSB3LTUwIG1zLTMgbWItM1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbk5leHRcIiAoY2xpY2spPVwibmV4dCgpXCI+TmV4dDwvYnV0dG9uPlxuICAgIDxidXR0b24gKm5nSWY9XCJpc0xhc3RTdGVwXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXByaW1hcnkgdy01MCBtcy0zIG1iLTNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5vYkhvdXJDb25mbGljdFwiIChjbGljayk9XCJvblZpZXcoKVwiPlZpZXc8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtcmVwb3J0L3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tcmVwb3J0LWJ1aWxkZXIvY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtcmVwb3J0L3NyYy9saWIvY29tcG9uZW50cy9jdXN0b20tcmVwb3J0LWJ1aWxkZXIvY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFLTCxxQkFBcUIsRUFDckIsa0JBQWtCLEdBR25CLE1BQU0sMENBQTBDLENBQUM7Ozs7QUFJbEQ7MkZBQzJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQXVGO0lBQzdHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDeEQsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtJQUN6RCxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDMUQsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0lBQzVELEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSx5Q0FBeUMsRUFBRTtDQUNqRyxD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LEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQy9DLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEMsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsRSxVQUFVLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3JELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBd0IsQ0FBQztZQUN2RyxZQUFZLEVBQUUsRUFBRSxjQUFjLEVBQUU7U0FDakMsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztTQUMxQztJQUNILENBQUM7d0dBekdVLDRCQUE0Qjs0RkFBNUIsNEJBQTRCLHFMQ3BEekMsNDdJQWlGTTs7NEZEN0JPLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSwyQkFBMkI7OEJBSzVCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxJQUFJO3NCQUFiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDdXN0b21SZXBvcnRDb21wYXJpc29uLFxuICBDdXN0b21SZXBvcnRTZWxlY3Rpb25zLFxuICBDdXN0b21SZXBvcnRUZW1wbGF0ZSxcbiAgTWV0cmljT3B0aW9uLFxuICBub3JtYWxpemVUYWJsZU9wdGlvbnMsXG4gIFNUT1JFX0lORk9fT1BUSU9OUyxcbiAgU3RvcmVJbmZvQ29sdW1uLFxuICBUaW1lRmlsdGVyLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2N1c3RvbS1yZXBvcnQuaW50ZXJmYWNlJztcblxudHlwZSBDb21wYXJpc29uQ2hvaWNlID0gJ25vbmUnIHwgJ3d0ZCcgfCAnbXRkJyB8ICd3b3cnIHwgJ21vbSc7XG5cbi8qKiBgc2Vjb25kTGluZWAgcmVuZGVycyBhcyBpdHMgb3duIG11dGVkIGxpbmUgYmVsb3cgdGhlIGxhYmVsIChwZXIgdGhlIFwiTm8gQ29tcGFyaXNvblwiIG1vY2t1cCk7XG4gKiAgYHN1ZmZpeGAgcmVuZGVycyBpbmxpbmUgbmV4dCB0byB0aGUgbGFiZWwgKHRoZSBzaG9ydCBXVEQvTVREL1dvVy9Nb00gYWJicmV2aWF0aW9ucykuICovXG5jb25zdCBDT01QQVJJU09OX09QVElPTlM6IHsgdmFsdWU6IENvbXBhcmlzb25DaG9pY2U7IGxhYmVsOiBzdHJpbmc7IHN1ZmZpeD86IHN0cmluZzsgc2Vjb25kTGluZT86IHN0cmluZyB9W10gPSBbXG4gIHsgdmFsdWU6ICd3dGQnLCBsYWJlbDogJ1dlZWsgdG8gRGF0ZScsIHN1ZmZpeDogJyhXVEQpJyB9LFxuICB7IHZhbHVlOiAnbXRkJywgbGFiZWw6ICdNb250aCB0byBEYXRlJywgc3VmZml4OiAnKE1URCknIH0sXG4gIHsgdmFsdWU6ICd3b3cnLCBsYWJlbDogJ1dlZWsgb3ZlciBXZWVrJywgc3VmZml4OiAnKFdvVyknIH0sXG4gIHsgdmFsdWU6ICdtb20nLCBsYWJlbDogJ01vbnRoIG92ZXIgTW9udGgnLCBzdWZmaXg6ICcoTW9NKScgfSxcbiAgeyB2YWx1ZTogJ25vbmUnLCBsYWJlbDogJ05vIENvbXBhcmlzb24nLCBzZWNvbmRMaW5lOiAnKERhdGEgRGlzcGxheWVkIGJhc2VkIG9uIFNlbGVjdGVkIERhdGUpJyB9LFxuXTtcblxuLyoqIEJpamVjdGl2ZSBtYXBwaW5nIGJldHdlZW4gdGhlIHdpemFyZCdzIHNpbmdsZSByYWRpbyBjaG9pY2UgYW5kIHRoZSBwZXJzaXN0ZWQgeyByb2xsdXAsIHByZXZpb3VzUGVyaW9kIH0gcGFpci4gKi9cbmNvbnN0IENPTVBBUklTT05fVE9fUEFJUjogUmVjb3JkPENvbXBhcmlzb25DaG9pY2UsIEN1c3RvbVJlcG9ydENvbXBhcmlzb24+ID0ge1xuICBub25lOiB7IHJvbGx1cDogJ05vbmUnLCBwcmV2aW91c1BlcmlvZDogZmFsc2UgfSxcbiAgd3RkOiB7IHJvbGx1cDogJ1dURCcsIHByZXZpb3VzUGVyaW9kOiBmYWxzZSB9LFxuICBtdGQ6IHsgcm9sbHVwOiAnTVREJywgcHJldmlvdXNQZXJpb2Q6IGZhbHNlIH0sXG4gIHdvdzogeyByb2xsdXA6ICdXb1cnLCBwcmV2aW91c1BlcmlvZDogdHJ1ZSB9LFxuICBtb206IHsgcm9sbHVwOiAnTW9NJywgcHJldmlvdXNQZXJpb2Q6IHRydWUgfSxcbn07XG5cbmZ1bmN0aW9uIHBhaXJUb0NvbXBhcmlzb24ocGFpcjogQ3VzdG9tUmVwb3J0Q29tcGFyaXNvbik6IENvbXBhcmlzb25DaG9pY2Uge1xuICAvLyBUZW1wbGF0ZXMgc2F2ZWQgYmVmb3JlIFdvVy9Nb00gYmVjYW1lIHRoZWlyIG93biByb2xsdXAgdmFsdWVzIGVuY29kZWQgdGhlbVxuICAvLyBhcyBXVEQvTVREICsgcHJldmlvdXNQZXJpb2Q6dHJ1ZSDigJQga2VlcCByZWFkaW5nIHRoYXQgYXMgdGhlIHNhbWUgY2hvaWNlLlxuICBpZiAocGFpci5wcmV2aW91c1BlcmlvZCkge1xuICAgIGlmIChwYWlyLnJvbGx1cCA9PT0gJ1dURCcpIHsgcmV0dXJuICd3b3cnOyB9XG4gICAgaWYgKHBhaXIucm9sbHVwID09PSAnTVREJykgeyByZXR1cm4gJ21vbSc7IH1cbiAgfVxuICBjb25zdCBtYXRjaCA9IChPYmplY3Qua2V5cyhDT01QQVJJU09OX1RPX1BBSVIpIGFzIENvbXBhcmlzb25DaG9pY2VbXSkuZmluZCgoa2V5KSA9PiB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gQ09NUEFSSVNPTl9UT19QQUlSW2tleV07XG4gICAgcmV0dXJuIGNhbmRpZGF0ZS5yb2xsdXAgPT09IHBhaXIucm9sbHVwICYmIGNhbmRpZGF0ZS5wcmV2aW91c1BlcmlvZCA9PT0gcGFpci5wcmV2aW91c1BlcmlvZDtcbiAgfSk7XG4gIHJldHVybiBtYXRjaCA/PyAnbm9uZSc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXN0b20tcmVwb3J0LWJ1aWxkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY3VzdG9tLXJlcG9ydC1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2N1c3RvbS1yZXBvcnQtYnVpbGRlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlcG9ydEJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBtZXRyaWNzQ2F0YWxvZzogTWV0cmljT3B0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgdGVtcGxhdGU6IEN1c3RvbVJlcG9ydFRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XG4gIEBPdXRwdXQoKSB2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21SZXBvcnRTZWxlY3Rpb25zPigpO1xuXG4gIHJlYWRvbmx5IHN0ZXBzID0gWydNZXRyaWNzJywgJ0NvbXBhcmlzb24nLCAnVGltZSBGaWx0ZXInLCAnU3RvcmUgaW5mbyddO1xuICBhY3RpdmVTdGVwID0gMDtcblxuICBtZXRyaWNzOiBNZXRyaWNPcHRpb25bXSA9IFtdO1xuICByZWFkb25seSBjb21wYXJpc29uT3B0aW9ucyA9IENPTVBBUklTT05fT1BUSU9OUztcbiAgY29tcGFyaXNvbkNob2ljZTogQ29tcGFyaXNvbkNob2ljZSA9ICdub25lJztcbiAgcmVhZG9ubHkgdGltZUZpbHRlcnM6IFRpbWVGaWx0ZXJbXSA9IFsnZGF5JywgJ2hvdXInXTtcbiAgdGltZUZpbHRlcjogVGltZUZpbHRlciA9ICdkYXknO1xuICBzdG9yZUluZm9PcHRpb25zID0gU1RPUkVfSU5GT19PUFRJT05TLm1hcCgobykgPT4gKHsgLi4ubywgY2hlY2tlZDogZmFsc2UgfSkpO1xuICBzaG93QXZlcmFnZSA9IGZhbHNlO1xuICAvKiogTm9uLSdTaG93IEF2ZXJhZ2UnIGluY2x1ZGVDb2x1bW5zIGNhcnJpZWQgdGhyb3VnaCBmcm9tIGFuIGFwcGxpZWQgdGVtcGxhdGUgKHRoZSB3aXphcmQgaGFzIG5vIFVJIGZvciB0aGVzZSB5ZXQpLiAqL1xuICBwcml2YXRlIG90aGVySW5jbHVkZUNvbHVtbnM6IHN0cmluZ1tdID0gW107XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydtZXRyaWNzQ2F0YWxvZyddKSB7XG4gICAgICB0aGlzLm1ldHJpY3MgPSB0aGlzLm1ldHJpY3NDYXRhbG9nLm1hcCgobSkgPT4gKHsgLi4ubSwgY2hlY2tlZDogZmFsc2UgfSkpO1xuICAgICAgdGhpcy5hcHBseVRlbXBsYXRlKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZSddKSB7XG4gICAgICB0aGlzLmFwcGx5VGVtcGxhdGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VGVtcGxhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWV0cmljcyA9IHRoaXMubWV0cmljcy5tYXAoKG0pID0+ICh7IC4uLm0sIGNoZWNrZWQ6IHRoaXMudGVtcGxhdGUhLm1ldHJpY3MuaW5jbHVkZXMobS52YWx1ZSkgfSkpO1xuICAgIHRoaXMuY29tcGFyaXNvbkNob2ljZSA9IHBhaXJUb0NvbXBhcmlzb24odGhpcy50ZW1wbGF0ZS5jb21wYXJpc29uKTtcbiAgICB0aGlzLnRpbWVGaWx0ZXIgPSB0aGlzLnRlbXBsYXRlLnRpbWVGaWx0ZXI7XG4gICAgdGhpcy5zdG9yZUluZm9PcHRpb25zID0gdGhpcy5zdG9yZUluZm9PcHRpb25zLm1hcCgobykgPT4gKHtcbiAgICAgIC4uLm8sXG4gICAgICBjaGVja2VkOiB0aGlzLnRlbXBsYXRlIS5zdG9yZUluZm9Db2x1bW5zLmluY2x1ZGVzKG8udmFsdWUpLFxuICAgIH0pKTtcbiAgICBub3JtYWxpemVUYWJsZU9wdGlvbnModGhpcy50ZW1wbGF0ZS50YWJsZU9wdGlvbnMpO1xuICAgIGNvbnN0IGluY2x1ZGVDb2x1bW5zID0gdGhpcy50ZW1wbGF0ZS50YWJsZU9wdGlvbnMuaW5jbHVkZUNvbHVtbnMgPz8gW107XG4gICAgdGhpcy5zaG93QXZlcmFnZSA9IGluY2x1ZGVDb2x1bW5zLmluY2x1ZGVzKCdTaG93IEF2ZXJhZ2UnKTtcbiAgICB0aGlzLm90aGVySW5jbHVkZUNvbHVtbnMgPSBpbmNsdWRlQ29sdW1ucy5maWx0ZXIoKGMpID0+IGMgIT09ICdTaG93IEF2ZXJhZ2UnKTtcbiAgICB0aGlzLmFjdGl2ZVN0ZXAgPSAwO1xuICB9XG5cbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlU3RlcCA9PT0gdGhpcy5zdGVwcy5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqIE5PQiAoaG91cmx5IGZvb3RmYWxsIGJyZWFrZG93bikgaGFzIG5vIGhvdXJseSBkYXRhIHNvdXJjZSDigJQgYmxvY2sgd2hlbmV2ZXIgYm90aCBob2xkLCByZWdhcmRsZXNzIG9mIHNlbGVjdGlvbiBvcmRlci4gKi9cbiAgZ2V0IG5vYkhvdXJDb25mbGljdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aW1lRmlsdGVyID09PSAnaG91cicgJiYgdGhpcy5tZXRyaWNzLnNvbWUoKG0pID0+IG0udmFsdWUgPT09ICdub2InICYmIG0uY2hlY2tlZCk7XG4gIH1cblxuICBnZXQgY2FuTmV4dCgpOiBib29sZWFuIHtcbiAgICAvLyBUaGUgTWV0cmljcyBzdGVwIG5lZWRzIG5vIHNlbGVjdGlvbjogRm9vdGZhbGwgaXMgYWx3YXlzIGluY2x1ZGVkICh0aGVcbiAgICAvLyBsb2NrZWQgZGVmYXVsdCByb3cpLCBzbyBhIGZvb3RmYWxsLW9ubHkgcmVwb3J0IGlzIHZhbGlkLlxuICAgIGlmICh0aGlzLmFjdGl2ZVN0ZXAgPT09IDIgJiYgdGhpcy5ub2JIb3VyQ29uZmxpY3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXRTdGVwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZVN0ZXAgPSBpbmRleDtcbiAgfVxuXG4gIG5leHQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGFzdFN0ZXAgJiYgdGhpcy5jYW5OZXh0KSB7XG4gICAgICB0aGlzLmFjdGl2ZVN0ZXArKztcbiAgICB9XG4gIH1cblxuICBiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2ZVN0ZXAgPiAwKSB7XG4gICAgICB0aGlzLmFjdGl2ZVN0ZXAtLTtcbiAgICB9XG4gIH1cblxuICBzZXRDb21wYXJpc29uQ2hvaWNlKGNob2ljZTogQ29tcGFyaXNvbkNob2ljZSk6IHZvaWQge1xuICAgIHRoaXMuY29tcGFyaXNvbkNob2ljZSA9IGNob2ljZTtcbiAgfVxuXG4gIHNldFRpbWVGaWx0ZXIoZmlsdGVyOiBUaW1lRmlsdGVyKTogdm9pZCB7XG4gICAgdGhpcy50aW1lRmlsdGVyID0gZmlsdGVyO1xuICB9XG5cbiAgY3VycmVudFNlbGVjdGlvbnMoKTogQ3VzdG9tUmVwb3J0U2VsZWN0aW9ucyB7XG4gICAgY29uc3QgaW5jbHVkZUNvbHVtbnMgPSB0aGlzLnNob3dBdmVyYWdlXG4gICAgICA/IFsnU2hvdyBBdmVyYWdlJywgLi4udGhpcy5vdGhlckluY2x1ZGVDb2x1bW5zXVxuICAgICAgOiBbLi4udGhpcy5vdGhlckluY2x1ZGVDb2x1bW5zXTtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0cmljczogdGhpcy5tZXRyaWNzLmZpbHRlcigobSkgPT4gbS5jaGVja2VkKS5tYXAoKG0pID0+IG0udmFsdWUpLFxuICAgICAgY29tcGFyaXNvbjogQ09NUEFSSVNPTl9UT19QQUlSW3RoaXMuY29tcGFyaXNvbkNob2ljZV0sXG4gICAgICB0aW1lRmlsdGVyOiB0aGlzLnRpbWVGaWx0ZXIsXG4gICAgICBzdG9yZUluZm9Db2x1bW5zOiB0aGlzLnN0b3JlSW5mb09wdGlvbnMuZmlsdGVyKChvKSA9PiBvLmNoZWNrZWQpLm1hcCgobykgPT4gby52YWx1ZSBhcyBTdG9yZUluZm9Db2x1bW4pLFxuICAgICAgdGFibGVPcHRpb25zOiB7IGluY2x1ZGVDb2x1bW5zIH0sXG4gICAgfTtcbiAgfVxuXG4gIG9uVmlldygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubm9iSG91ckNvbmZsaWN0KSB7XG4gICAgICB0aGlzLnZpZXcuZW1pdCh0aGlzLmN1cnJlbnRTZWxlY3Rpb25zKCkpO1xuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgaC0xMDBweCBwLTBcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtbGFiZWxcIj5QbGVhc2Ugc2VsZWN0IHlvdXIgZGF0YSBwb2ludHMgdG8gYWRkIGludG8gdGhlIHJlcG9ydHM8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ0bmhlYWRlciBzdGVwLXRhYnMgdy0xMDAgcC0yIG10LTVcIj5cbiAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHN0ZXAtdGFiXCIgKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU3RlcCA9PT0gaVwiIChjbGljayk9XCJzZXRTdGVwKGkpXCI+e3sgc3RlcCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm92ZXJmbG93LWF1dG9cIiBzdHlsZT1cImhlaWdodDogYXV0b1wiPlxuICAgIDwhLS0gTWV0cmljcyAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlU3RlcCA9PT0gMFwiPlxuICAgICAgPCEtLSBGb290ZmFsbCBpcyBhIGJhc2UgY29sdW1uIHRoZSByZXBvcnQgYWx3YXlzIHJldHVybnMgKG5ldmVyIHBhcnQgb2YgdGhlXG4gICAgICAgICAgIG1ldHJpY3MgcGF5bG9hZCkg4oCUIHNob3duIGxvY2tlZCwgc2FtZSBpZGlvbSBhcyBTdG9yZSBOYW1lL1N0b3JlIElELiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1jdXN0b20gZm9ybS1jaGVjay1zb2xpZFwiPlxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBjaGVja2VkIGRpc2FibGVkIGlkPVwibWV0cmljLWZvb3RmYWxsXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNFwiIGZvcj1cIm1ldHJpYy1mb290ZmFsbFwiPkZvb3RmYWxsPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIG1ldHJpY3M7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm10LTUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkXCI+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwibWV0cmljLmNoZWNrZWRcIiBpZD1cIm1ldHJpYy17eyBpIH19XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNCBjdXJzb3ItcG9pbnRlclwiIGZvcj1cIm1ldHJpYy17eyBpIH19XCI+e3sgbWV0cmljLm5hbWUgfX08L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIENvbXBhcmlzb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImFjdGl2ZVN0ZXAgPT09IDFcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb21wYXJpc29uT3B0aW9uc1wiIGNsYXNzPVwibXQtNVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0XCIgKGNsaWNrKT1cInNldENvbXBhcmlzb25DaG9pY2Uob3B0aW9uLnZhbHVlKVwiPlxuICAgICAgICAgIDxpbnB1dCBbY2hlY2tlZF09XCJjb21wYXJpc29uQ2hvaWNlID09PSBvcHRpb24udmFsdWVcIiB0eXBlPVwicmFkaW9cIiBjbGFzcz1cInJhZGlvIG10LTFcIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtNVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGFuZGFyZCBmcy00XCI+e3sgb3B0aW9uLmxhYmVsIH19PHNwYW4gKm5nSWY9XCJvcHRpb24uc3VmZml4XCIgY2xhc3M9XCJjb21wYXJpc29uLXN1ZmZpeCBtcy0xXCI+e3sgb3B0aW9uLnN1ZmZpeCB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIm9wdGlvbi5zZWNvbmRMaW5lXCIgY2xhc3M9XCJjb21wYXJpc29uLXN1ZmZpeCBkLWJsb2NrXCI+e3sgb3B0aW9uLnNlY29uZExpbmUgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUaW1lIEZpbHRlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlU3RlcCA9PT0gMlwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsdGVyIG9mIHRpbWVGaWx0ZXJzXCIgY2xhc3M9XCJtdC01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgKGNsaWNrKT1cInNldFRpbWVGaWx0ZXIoZmlsdGVyKVwiPlxuICAgICAgICAgIDxpbnB1dCBbY2hlY2tlZF09XCJ0aW1lRmlsdGVyID09PSBmaWx0ZXJcIiB0eXBlPVwicmFkaW9cIiBjbGFzcz1cInJhZGlvXCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNFwiPnt7IGZpbHRlciA9PT0gJ2hvdXInID8gJ0J5IEhvdXInIDogJ0J5IERhdGUnIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIm5vYkhvdXJDb25mbGljdFwiIGNsYXNzPVwibm9iLWhvdXItd2FybmluZyBtdC01XCI+Tm9CIGNhbm5vdCBiZSBkaXNwbGF5ZWQgYnkgaG91cjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdG9yZSBpbmZvIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVTdGVwID09PSAzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibXQtNSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWRcIj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZCBkaXNhYmxlZCBpZD1cInN0b3JlLWluZm8tbmFtZVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJtcy01IHN0YW5kYXJkIGZzLTRcIiBmb3I9XCJzdG9yZS1pbmZvLW5hbWVcIj5TdG9yZSBOYW1lPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm10LTUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkXCI+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGNoZWNrZWQgZGlzYWJsZWQgaWQ9XCJzdG9yZS1pbmZvLWlkXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1zLTUgc3RhbmRhcmQgZnMtNFwiIGZvcj1cInN0b3JlLWluZm8taWRcIj5TdG9yZSBJRDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzdG9yZUluZm9PcHRpb25zOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJtdC01IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1jaGVjay1jdXN0b20gZm9ybS1jaGVjay1zb2xpZFwiPlxuICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cIm9wdGlvbi5jaGVja2VkXCIgaWQ9XCJzdG9yZS1pbmZvLXt7IGkgfX1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibXMtNSBzdGFuZGFyZCBmcy00IGN1cnNvci1wb2ludGVyXCIgZm9yPVwic3RvcmUtaW5mby17eyBpIH19XCI+e3sgb3B0aW9uLmxhYmVsIH19PC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIG10LTVcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1vdXRsaW5lIHctNTAgbWUtMyBtYi0zXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGl2ZVN0ZXAgPT09IDAgPyAnaGlkZGVuJyA6ICcnXCIgKGNsaWNrKT1cImJhY2soKVwiPlByZXZpb3VzPC9idXR0b24+XG4gICAgPGJ1dHRvbiAqbmdJZj1cIiFpc0xhc3RTdGVwXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXByaW1hcnkgdy01MCBtcy0zIG1iLTNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5OZXh0XCIgKGNsaWNrKT1cIm5leHQoKVwiPk5leHQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiaXNMYXN0U3RlcFwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1wcmltYXJ5IHctNTAgbXMtMyBtYi0zXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJub2JIb3VyQ29uZmxpY3RcIiAoY2xpY2spPVwib25WaWV3KClcIj5WaWV3PC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+Il19