tango-app-ui-analyse-trax 4.0.44 → 4.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/audit-v2/configure/audit-v2-configure.component.mjs +3 -3
- package/esm2022/lib/components/audit-v2/dashboard/audit-v2-dashboard.component.mjs +26 -4
- package/esm2022/lib/components/audit-v2/detail/audit-v2-detail.component.mjs +9 -3
- package/esm2022/lib/components/audit-v2/flags/audit-v2-flags.component.mjs +4 -5
- package/esm2022/lib/components/audit-v2/flags/flag-detail/audit-v2-flag-detail.component.mjs +3 -6
- package/esm2022/lib/components/audit-v2/gallery/audit-v2-gallery.component.mjs +17 -3
- package/esm2022/lib/components/audit-v2/manage/audit-v2-manage.component.mjs +3 -3
- package/esm2022/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.mjs +5 -5
- package/fesm2022/{tango-app-ui-analyse-trax-audit-v2.module-CDqx9ARW.mjs → tango-app-ui-analyse-trax-audit-v2.module-ByfsYp5i.mjs} +64 -26
- package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-ByfsYp5i.mjs.map +1 -0
- package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-A_TSuMI_.mjs → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-D4J7rG9i.mjs} +2 -2
- package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-A_TSuMI_.mjs.map → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-D4J7rG9i.mjs.map} +1 -1
- package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
- package/lib/components/audit-v2/dashboard/audit-v2-dashboard.component.d.ts +6 -0
- package/lib/components/audit-v2/detail/audit-v2-detail.component.d.ts +3 -3
- package/lib/components/audit-v2/flags/audit-v2-flags.component.d.ts +2 -1
- package/lib/components/audit-v2/gallery/audit-v2-gallery.component.d.ts +5 -0
- package/package.json +1 -1
- package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-CDqx9ARW.mjs.map +0 -1
|
@@ -306,12 +306,20 @@ export class AuditV2DashboardComponent {
|
|
|
306
306
|
this.cd.detectChanges();
|
|
307
307
|
});
|
|
308
308
|
}
|
|
309
|
+
/** By date: one month at most (the pickers' dateLimit, in days after the start; 30 = up to 31 days). */
|
|
310
|
+
maxRangeDays = 30;
|
|
309
311
|
/** Range picker: a new period reloads every feed, except inside the filter drawer, where Apply does. */
|
|
310
312
|
onRangePicked(e) {
|
|
311
313
|
const picked = fromPickerRange(e);
|
|
312
314
|
if (!picked || (picked.from === this.from && picked.to === this.to)) {
|
|
313
315
|
return;
|
|
314
316
|
}
|
|
317
|
+
// A longer range (typed, or a preset) is cut back to a month from its start.
|
|
318
|
+
if (dayjs(picked.to).diff(dayjs(picked.from), 'day') > this.maxRangeDays) {
|
|
319
|
+
picked.to = dayjs(picked.from).add(this.maxRangeDays, 'day').format('YYYY-MM-DD');
|
|
320
|
+
this.range = toPickerRange(picked.from, picked.to);
|
|
321
|
+
this.toast.getErrorToast('Pick up to one month — the range ends on ' + dayjs(picked.to).format('DD MMM YYYY'));
|
|
322
|
+
}
|
|
315
323
|
this.from = picked.from;
|
|
316
324
|
this.to = picked.to;
|
|
317
325
|
if (!this.filtersOpen) {
|
|
@@ -396,6 +404,20 @@ export class AuditV2DashboardComponent {
|
|
|
396
404
|
get trendBars() {
|
|
397
405
|
return this.grain === 'quarter' ? this.quarterTrend : this.trend;
|
|
398
406
|
}
|
|
407
|
+
/** More bars than fit their labels (a month by date): see showXLabel. */
|
|
408
|
+
get denseTrend() {
|
|
409
|
+
return this.trendBars.length > 12;
|
|
410
|
+
}
|
|
411
|
+
/** Dense chart: a label on every few bars (about 8 across), always on the first and last; otherwise every bar. */
|
|
412
|
+
showXLabel(i, last) {
|
|
413
|
+
const n = this.trendBars.length;
|
|
414
|
+
if (n <= 12) {
|
|
415
|
+
return true;
|
|
416
|
+
}
|
|
417
|
+
const step = Math.ceil(n / 8);
|
|
418
|
+
// The last label always shows; the regular one just before it is skipped when the two would touch.
|
|
419
|
+
return last || (i % step === 0 && n - 1 - i >= step - 1);
|
|
420
|
+
}
|
|
399
421
|
/** "Oct – Dec 2026" for a quarter key. */
|
|
400
422
|
quarterMonths(key) {
|
|
401
423
|
return this.fiscal.find(q => q.key === key)?.months || '';
|
|
@@ -553,7 +575,7 @@ export class AuditV2DashboardComponent {
|
|
|
553
575
|
scheduled: r?.scheduleRepeatedType ? this.titleCase(r.scheduleRepeatedType) : '—',
|
|
554
576
|
assigned: this.num(r?.storeCount) ?? 0,
|
|
555
577
|
submitted: this.num(r?.submittedChecklist) ?? 0,
|
|
556
|
-
//
|
|
578
|
+
// Questions with a store dispute (raised or reviewed) in the period; '—' only when the API sends none.
|
|
557
579
|
disputes: this.num(r?.disputes),
|
|
558
580
|
passMark: mark + '%',
|
|
559
581
|
score: score === null ? '—' : scorePct + '%',
|
|
@@ -1492,10 +1514,10 @@ export class AuditV2DashboardComponent {
|
|
|
1492
1514
|
});
|
|
1493
1515
|
}
|
|
1494
1516
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2DashboardComponent, deps: [{ token: i1.TraxService }, { token: i2.GlobalStateService }, { token: i3.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1495
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DashboardComponent, selector: "lib-audit-v2-dashboard", ngImport: i0, template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"db-chart-x\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n <div class=\"db-bandfilter\" *ngIf=\"listChipLabel\">\r\n <span class=\"db-bandchip\">\r\n {{ listChipLabel }}\r\n <span class=\"db-bandchip-x\" title=\"Close the store list\" (click)=\"closeStoreList()\">\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </span>\r\n </span>\r\n <a class=\"db-bandlink\" (click)=\"showAllStores()\">Show all stores</a>\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'unscored'\" (click)=\"setStatus('unscored')\"\r\n title=\"Audited, but compliance score is off for the audits\">Not scored</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- A store row spans several audits, so View opens this store's audit detail (same as the id link). -->\r\n <a class=\"db-viewbtn\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery on this audit's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"submittedParams(row)\" title=\"View the submitted audits in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Disputes are not recorded yet (the store-team dispute flow is not built), so no count and no link. -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\" title=\"Disputes are not recorded yet\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">Pick a custom start and end date.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'unscored'\" (click)=\"dr.setStatus('unscored')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'unscored'\">\r\n <svg *ngIf=\"dr.status === 'unscored'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not scored</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-bandfilter{display:flex;align-items:center;gap:8px;margin-top:4px;flex-wrap:wrap}.db-bandchip{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 10px;border-radius:9999px;background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;font-size:12px;font-weight:600;white-space:nowrap;color:#009bf3}.db-bandchip-x{width:16px;height:16px;border-radius:9999px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#ccedff}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:11%}.db-perftable--store th:nth-child(2){width:23%}.db-perftable--store th:nth-child(3){width:10%}.db-perftable--store th:nth-child(4){width:7%}.db-perftable--store th:nth-child(5),.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7){width:14%}.db-perftable--store th:nth-child(8){width:6%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "component", type: i8.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i9.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i10.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
|
|
1517
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DashboardComponent, selector: "lib-audit-v2-dashboard", ngImport: i0, template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n <div class=\"db-bandfilter\" *ngIf=\"listChipLabel\">\r\n <span class=\"db-bandchip\">\r\n {{ listChipLabel }}\r\n <span class=\"db-bandchip-x\" title=\"Close the store list\" (click)=\"closeStoreList()\">\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </span>\r\n </span>\r\n <a class=\"db-bandlink\" (click)=\"showAllStores()\">Show all stores</a>\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'unscored'\" (click)=\"setStatus('unscored')\"\r\n title=\"Audited, but compliance score is off for the audits\">Not scored</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- A store row spans several audits, so View opens this store's audit detail (same as the id link). -->\r\n <a class=\"db-viewbtn\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period; a count opens the audit's detail page on its disputed visits. -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <a *ngIf=\"row.disputes\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'disputed' })\"\r\n title=\"View the disputed visits\">{{ row.disputes }}</a>\r\n <span *ngIf=\"row.disputes === 0\">0</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">Pick a custom start and end date.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'unscored'\" (click)=\"dr.setStatus('unscored')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'unscored'\">\r\n <svg *ngIf=\"dr.status === 'unscored'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not scored</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-bandfilter{display:flex;align-items:center;gap:8px;margin-top:4px;flex-wrap:wrap}.db-bandchip{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 10px;border-radius:9999px;background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;font-size:12px;font-weight:600;white-space:nowrap;color:#009bf3}.db-bandchip-x{width:16px;height:16px;border-radius:9999px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#ccedff}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:11%}.db-perftable--store th:nth-child(2){width:23%}.db-perftable--store th:nth-child(3){width:10%}.db-perftable--store th:nth-child(4){width:7%}.db-perftable--store th:nth-child(5),.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7){width:14%}.db-perftable--store th:nth-child(8){width:6%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "component", type: i8.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i9.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i10.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
|
|
1496
1518
|
}
|
|
1497
1519
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2DashboardComponent, decorators: [{
|
|
1498
1520
|
type: Component,
|
|
1499
|
-
args: [{ selector: 'lib-audit-v2-dashboard', template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"db-chart-x\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n <div class=\"db-bandfilter\" *ngIf=\"listChipLabel\">\r\n <span class=\"db-bandchip\">\r\n {{ listChipLabel }}\r\n <span class=\"db-bandchip-x\" title=\"Close the store list\" (click)=\"closeStoreList()\">\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </span>\r\n </span>\r\n <a class=\"db-bandlink\" (click)=\"showAllStores()\">Show all stores</a>\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'unscored'\" (click)=\"setStatus('unscored')\"\r\n title=\"Audited, but compliance score is off for the audits\">Not scored</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- A store row spans several audits, so View opens this store's audit detail (same as the id link). -->\r\n <a class=\"db-viewbtn\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery on this audit's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"submittedParams(row)\" title=\"View the submitted audits in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Disputes are not recorded yet (the store-team dispute flow is not built), so no count and no link. -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\" title=\"Disputes are not recorded yet\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">Pick a custom start and end date.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'unscored'\" (click)=\"dr.setStatus('unscored')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'unscored'\">\r\n <svg *ngIf=\"dr.status === 'unscored'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not scored</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-bandfilter{display:flex;align-items:center;gap:8px;margin-top:4px;flex-wrap:wrap}.db-bandchip{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 10px;border-radius:9999px;background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;font-size:12px;font-weight:600;white-space:nowrap;color:#009bf3}.db-bandchip-x{width:16px;height:16px;border-radius:9999px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#ccedff}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:11%}.db-perftable--store th:nth-child(2){width:23%}.db-perftable--store th:nth-child(3){width:10%}.db-perftable--store th:nth-child(4){width:7%}.db-perftable--store th:nth-child(5),.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7){width:14%}.db-perftable--store th:nth-child(8){width:6%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"] }]
|
|
1521
|
+
args: [{ selector: 'lib-audit-v2-dashboard', template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n <div class=\"db-bandfilter\" *ngIf=\"listChipLabel\">\r\n <span class=\"db-bandchip\">\r\n {{ listChipLabel }}\r\n <span class=\"db-bandchip-x\" title=\"Close the store list\" (click)=\"closeStoreList()\">\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </span>\r\n </span>\r\n <a class=\"db-bandlink\" (click)=\"showAllStores()\">Show all stores</a>\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'unscored'\" (click)=\"setStatus('unscored')\"\r\n title=\"Audited, but compliance score is off for the audits\">Not scored</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- A store row spans several audits, so View opens this store's audit detail (same as the id link). -->\r\n <a class=\"db-viewbtn\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period; a count opens the audit's detail page on its disputed visits. -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <a *ngIf=\"row.disputes\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'disputed' })\"\r\n title=\"View the disputed visits\">{{ row.disputes }}</a>\r\n <span *ngIf=\"row.disputes === 0\">0</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">Pick a custom start and end date.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'unscored'\" (click)=\"dr.setStatus('unscored')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'unscored'\">\r\n <svg *ngIf=\"dr.status === 'unscored'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not scored</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-bandfilter{display:flex;align-items:center;gap:8px;margin-top:4px;flex-wrap:wrap}.db-bandchip{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 10px;border-radius:9999px;background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;font-size:12px;font-weight:600;white-space:nowrap;color:#009bf3}.db-bandchip-x{width:16px;height:16px;border-radius:9999px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#ccedff}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:11%}.db-perftable--store th:nth-child(2){width:23%}.db-perftable--store th:nth-child(3){width:10%}.db-perftable--store th:nth-child(4){width:7%}.db-perftable--store th:nth-child(5),.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7){width:14%}.db-perftable--store th:nth-child(8){width:6%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"] }]
|
|
1500
1522
|
}], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.GlobalStateService }, { type: i3.ToastService }, { type: i0.ChangeDetectorRef }] });
|
|
1501
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0LXYyLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQTRCLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7OztBQWtJL0gsTUFBTSxnQkFBZ0IsR0FBYztJQUNsQyxXQUFXLEVBQUUsR0FBRztJQUNoQixhQUFhLEVBQUUsR0FBRztJQUNsQixZQUFZLEVBQUUsR0FBRztJQUNqQixTQUFTLEVBQUUsR0FBRztJQUNkLFVBQVUsRUFBRSxHQUFHO0lBQ2YsU0FBUyxFQUFFLEdBQUc7SUFDZCxlQUFlLEVBQUUsR0FBRztJQUNwQixlQUFlLEVBQUUsR0FBRztJQUNwQixVQUFVLEVBQUUsR0FBRztJQUNmLGVBQWUsRUFBRSxF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QUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztLQUNyRyxDQUFDO0lBQ2UsYUFBYSxHQUFrRDtRQUM5RSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUTtRQUNwRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ3ZHLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUM7S0FDN0MsQ0FBQztJQUNlLGNBQWMsR0FBbUQ7UUFDaEYsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDdEYsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO0tBQ3BJLENBQUM7SUFDZSxhQUFhLEdBQWtEO1FBQzlFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDekcsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FB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QUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUM7Z0JBQ3JJLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4RSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMxRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztxQkFDcEYsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVB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MUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNyRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ3BCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxxR0FBcUc7SUFDckcsV0FBVyxDQUFDLElBQWMsRUFBRSxHQUFXO1FBQ3JDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FB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Qix5QkFBeUIsOERDN090Qyxxem1EQXMxQkE7OzRGRHptQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIG9mLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IEF1ZGl0QWNjZXNzLCBhdWRpdEFjY2VzcyB9IGZyb20gJy4uL2F1ZGl0LXYyLWFjY2Vzcyc7XHJcbmltcG9ydCB7IFBJQ0tFUl9MT0NBTEUsIFBpY2tlZERhdGVzLCBQaWNrZXJSYW5nZSwgZnJvbVBpY2tlclJhbmdlLCBwaWNrZXJSYW5nZXMsIHRvUGlja2VyUmFuZ2UgfSBmcm9tICcuLi9hdWRpdC12Mi1kYXRlcGlja2VyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRCYW5kIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHJhbmdlOiBzdHJpbmc7XHJcbiAgbG86IG51bWJlcjtcclxuICBoaTogbnVtYmVyO1xyXG4gIHNvZnQ6IHN0cmluZztcclxuICBiZzogc3RyaW5nO1xyXG4gIGZnOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRSb3cge1xyXG4gIGRhdGU6IHN0cmluZztcclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiAndW5zY29yZWQnID0gYXVkaXRlZCwgYnV0IG5vIHF1ZXN0aW9uIG9mIGl0cyBhdWRpdHMgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbiAobm8gc2NvcmUgdG8gc2hvdykuICovXHJcbiAgc3RhdHVzOiBTdG9yZVN0YXR1cztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFN0b3JlU3RhdHVzID0gJ3Bhc3MnIHwgJ2ZhaWwnIHwgJ25hJyB8ICd1bnNjb3JlZCc7XHJcbmV4cG9ydCB0eXBlIFN0YXR1c0ZpbHRlciA9ICdhbGwnIHwgU3RvcmVTdGF0dXM7XHJcblxyXG4vKiogQSBzb3J0YWJsZSBjb2x1bW4gb2YgYSBQZXJmb3JtYW5jZSB0YWJsZS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQZXJmQ29sdW1uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIFNvcnRWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0S3BpIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgbm90ZTogc3RyaW5nO1xyXG4gIG5vdGVDb2xvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNhdCB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgc3ViOiBzdHJpbmc7XHJcbiAgZGlydHk6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRQZXJmUm93IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaW5pdGlhbHM6IHN0cmluZztcclxuICBzY2hlZHVsZWQ6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIHN1Ym1pdHRlZDogbnVtYmVyO1xyXG4gIGRpc3B1dGVzOiBudW1iZXIgfCBudWxsO1xyXG4gIHBhc3NNYXJrOiBzdHJpbmc7XHJcbiAgc2NvcmU6IHN0cmluZztcclxuICBzY29yZVBjdDogbnVtYmVyO1xyXG4gIC8qKiAn4oCUJyB3aGVuIHRoZSBhdWRpdCBoYXMgbm8gY29tcGxpYW5jZSBzY29yaW5nIChubyBzY29yZSwgc28gbm8gcmVzdWx0KS4gKi9cclxuICByZXN1bHQ6ICdQYXNzJyB8ICdGYWlsJyB8ICfigJQnO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdG9yZVBlcmZSb3cge1xyXG4gIHN0b3JlSWQ6IHN0cmluZztcclxuICBzdG9yZTogc3RyaW5nO1xyXG4gIHNwb2M6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIGZsYWdzOiBudW1iZXIgfCBudWxsO1xyXG4gIGNvbXBsZXRpb246IHN0cmluZztcclxuICBjb21wbGlhbmNlOiBzdHJpbmc7XHJcbiAgcGVyZjogc3RyaW5nO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VyUGVyZlJvdyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHJlZG86IG51bWJlcjtcclxuICBjb21wbGV0aW9uOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZTogc3RyaW5nO1xyXG4gIHBlcmY6IHN0cmluZztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFza1BlcmZSb3cge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpbml0aWFsczogc3RyaW5nO1xyXG4gIHNjaGVkdWxlZDogc3RyaW5nO1xyXG4gIGNvdmVyYWdlOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBzdWJtaXR0ZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHRhc2tzOiBzdHJpbmc7XHJcbiAgcmVkbzogbnVtYmVyO1xyXG4gIGNvbXBsaWFuY2U6IHN0cmluZztcclxuICBjb21wbGlhbmNlUGN0OiBudW1iZXI7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG4vKiogVGFzay1tb2RlIHRpbGVzLCBhcyBkaXNwbGF5ZWQgKCfigJQnIHdoZW4gdGhlIEFQSSBoYXMgbm8gdmFsdWUpLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tTdGF0cyB7XHJcbiAgYWN0aXZlVGFza3M6IHN0cmluZztcclxuICB0YXNrSW5zdGFuY2VzOiBzdHJpbmc7XHJcbiAgbm90U3VibWl0dGVkOiBzdHJpbmc7XHJcbiAgb3BlblRhc2tzOiBzdHJpbmc7XHJcbiAgaW5Qcm9ncmVzczogc3RyaW5nO1xyXG4gIHN1Ym1pdHRlZDogc3RyaW5nO1xyXG4gIGNvbXBsZXRpb25TY29yZTogc3RyaW5nO1xyXG4gIGNvbXBsaWFuY2VTY29yZTogc3RyaW5nO1xyXG4gIHRvdGFsRmxhZ3M6IHN0cmluZztcclxuICBjb21wbGV0aW9uRGVsdGE6IHN0cmluZztcclxuICBjb21wbGlhbmNlRGVsdGE6IHN0cmluZztcclxuICBmbGFnc0RlbHRhOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRhc2tEZWx0YUtleSA9ICdjb21wbGV0aW9uJyB8ICdjb21wbGlhbmNlJyB8ICdmbGFncyc7XHJcblxyXG4vKiogT25lIGV4cG9ydGVkIGNvbHVtbjogaGVhZGVyIHRleHQgYW5kIHRoZSBjZWxsIHZhbHVlIGZvciBhIHJvdy4gKi9cclxuaW50ZXJmYWNlIEV4cG9ydENvbHVtbjxUPiB7XHJcbiAgaGVhZGVyOiBzdHJpbmc7XHJcbiAgdmFsdWU6IChyb3c6IFQpID0+IGFueTtcclxufVxyXG5cclxuY29uc3QgRU1QVFlfVEFTS19TVEFUUzogVGFza1N0YXRzID0ge1xyXG4gIGFjdGl2ZVRhc2tzOiAn4oCUJyxcclxuICB0YXNrSW5zdGFuY2VzOiAn4oCUJyxcclxuICBub3RTdWJtaXR0ZWQ6ICfigJQnLFxyXG4gIG9wZW5UYXNrczogJ+KAlCcsXHJcbiAgaW5Qcm9ncmVzczogJ+KAlCcsXHJcbiAgc3VibWl0dGVkOiAn4oCUJyxcclxuICBjb21wbGV0aW9uU2NvcmU6ICfigJQnLFxyXG4gIGNvbXBsaWFuY2VTY29yZTogJ+KAlCcsXHJcbiAgdG90YWxGbGFnczogJ+KAlCcsXHJcbiAgY29tcGxldGlvbkRlbHRhOiAnJyxcclxuICBjb21wbGlhbmNlRGVsdGE6ICcnLFxyXG4gIGZsYWdzRGVsdGE6ICcnXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZW5kQmFyIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBBdmVyYWdlIG9mIHRoZSBjb21wbGlhbmNlLXNjb3JlZCBhdWRpdHM7IG51bGwgd2hlbiBub25lLiAqL1xyXG4gIHZhbHVlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiBDb21wbGlhbmNlLXNjb3JlZCBhdWRpdHMgKHRoZSBvbmVzIHRoZSBhdmVyYWdlIHJlYWRzKS4gKi9cclxuICBjb3VudDogbnVtYmVyO1xyXG4gIC8qKiBFdmVyeSBzdWJtaXR0ZWQgYXVkaXQsIHNjb3JlZCBvciBub3QuICovXHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBPbmUgZmluYW5jaWFsIHF1YXJ0ZXI6IEFwcmlsLU1hcmNoIHllYXIsIG5hbWVkIGJ5IHRoZSB5ZWFyIGl0IHN0YXJ0cyBpbiAocHJvdG90eXBlOiBBdWcgMjAyNiA9IFEyIEZZMjYpLiAqL1xyXG5pbnRlcmZhY2UgRmlzY2FsUXVhcnRlciB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgZnJvbTogc3RyaW5nO1xyXG4gIHRvOiBzdHJpbmc7XHJcbiAgbW9udGhzOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBUaGUgbGFzdCBgbmAgZmluYW5jaWFsIHF1YXJ0ZXJzLCBvbGRlc3QgZmlyc3QsIGVuZGluZyB3aXRoIHRoZSBvbmUgYHRvZGF5YCBmYWxscyBpbi4gKi9cclxuZnVuY3Rpb24gZmlzY2FsUXVhcnRlcnModG9kYXkgPSBkYXlqcygpLCBuID0gNCk6IEZpc2NhbFF1YXJ0ZXJbXSB7XHJcbiAgY29uc3QgY3VycmVudCA9IHRvZGF5LnN0YXJ0T2YoJ21vbnRoJykuc3VidHJhY3QoKHRvZGF5Lm1vbnRoKCkgKyA5KSAlIDMsICdtb250aCcpO1xyXG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiB7XHJcbiAgICBjb25zdCBzdGFydCA9IGN1cnJlbnQuc3VidHJhY3QoMyAqIChuIC0gMSAtIGkpLCAnbW9udGgnKTtcclxuICAgIGNvbnN0IGVuZCA9IHN0YXJ0LmFkZCgyLCAnbW9udGgnKS5lbmRPZignbW9udGgnKTtcclxuICAgIGNvbnN0IGZ5ID0gc3RhcnQubW9udGgoKSA+PSAzID8gc3RhcnQueWVhcigpIDogc3RhcnQueWVhcigpIC0gMTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGtleTogJ1EnICsgKE1hdGguZmxvb3IoKChzdGFydC5tb250aCgpICsgOSkgJSAxMikgLyAzKSArIDEpICsgJyBGWScgKyBTdHJpbmcoZnkpLnNsaWNlKDIpLFxyXG4gICAgICBmcm9tOiBzdGFydC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgdG86IGVuZC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgbW9udGhzOiBzdGFydC5mb3JtYXQoJ01NTScpICsgJyDigJMgJyArIGVuZC5mb3JtYXQoJ01NTSBZWVlZJylcclxuICAgIH07XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKiBQYXNzIG1hcmsgYW5kIGNyaXRpY2FsIHRocmVzaG9sZCBmb3IgdGhlIGF1ZGl0IHByb2dyYW1tZSAobm8gcGVyLWF1ZGl0IHBhc3MgbWFyayBpbiB0aGUgZGF0YSB5ZXQpLiAqL1xyXG5jb25zdCBQQVNTX01BUksgPSA3NTtcclxuY29uc3QgQ1JJVElDQUxfTUFSSyA9IDYwO1xyXG5cclxuY29uc3QgQkFORFM6IEF1ZGl0QmFuZFtdID0gW1xyXG4gIHsga2V5OiAnZXhjZWxsZW50JywgbGFiZWw6ICdFeGNlbGxlbnQnLCByYW5nZTogJzkwLTEwMCUnLCBsbzogOTAsIGhpOiAxMDAsIHNvZnQ6ICcjOEZCRkE1JywgYmc6ICcjRUNGREYzJywgZmc6ICcjMDI3QTQ4JyB9LFxyXG4gIHsga2V5OiAnZ29vZCcsIGxhYmVsOiAnR29vZCcsIHJhbmdlOiAnNzUtODklJywgbG86IDc1LCBoaTogODksIHNvZnQ6ICcjOTZCNEQ2JywgYmc6ICcjRUZGOEZGJywgZmc6ICcjMTc1Q0QzJyB9LFxyXG4gIHsga2V5OiAnZmFpcicsIGxhYmVsOiAnTmVlZHMgaW1wcm92ZW1lbnQnLCByYW5nZTogJzYwLTc0JScsIGxvOiA2MCwgaGk6IDc0LCBzb2Z0OiAnI0RDQkU4QycsIGJnOiAnI0ZGRkFFQicsIGZnOiAnI0I1NDcwOCcgfSxcclxuICB7IGtleTogJ2NyaXRpY2FsJywgbGFiZWw6ICdDcml0aWNhbCcsIHJhbmdlOiAnQmVsb3cgNjAlJywgbG86IDAsIGhpOiA1OSwgc29mdDogJyNENkExOUInLCBiZzogJyNGRUYzRjInLCBmZzogJyNCNDIzMTgnIH0sXHJcbiAgeyBrZXk6ICd1bnNjb3JlZCcsIGxhYmVsOiAnTm90IHNjb3JlZCcsIHJhbmdlOiAnQ29tcGxpYW5jZSBzY29yZSBvZmYnLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNDN0Q3RkUnLCBiZzogJyNFRUY0RkYnLCBmZzogJyMzNTM4Q0QnIH0sXHJcbiAgeyBrZXk6ICduYScsIGxhYmVsOiAnTm90IGF1ZGl0ZWQnLCByYW5nZTogJ05vIHN1Ym1pc3Npb24nLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNENkRBRTAnLCBiZzogJyNGMkY0RjcnLCBmZzogJyM0NzU0NjcnIH1cclxuXTtcclxuXHJcbi8qKiBCYW5kcyB0aGF0IGhvbGQgc3RvcmVzIHdpdGhvdXQgYSBzY29yZTsgdGhleSBmaWx0ZXIgYnkgc3RhdHVzLCBub3QgYnkgc2NvcmUgcmFuZ2UuICovXHJcbmNvbnN0IFNUQVRVU19CQU5EUyA9IFsndW5zY29yZWQnLCAnbmEnXTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRUeXBlT3B0aW9uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGhlbHA6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgQUxMX0FVRElUUzogQXVkaXRUeXBlT3B0aW9uID0geyBrZXk6ICdhbGwnLCBsYWJlbDogJ0FsbCBBdWRpdHMnLCBoZWxwOiAnQmxlbmRlZCBzY29yZSBhY3Jvc3MgZXZlcnkgcHJvZ3JhbW1lLicgfTtcclxuXHJcbi8qKiBTdG9yZSBoaWVyYXJjaHkgcGlja3M6IGNpcmNsZSBoZWFkIC8gem9uZSBtYW5hZ2VyIC8gQU9NIG5hbWVzIGFzIHRoZSBkYXNoYm9hcmQgQVBJIHNlbmRzIHRoZW0sIHN0b3JlID0gc3RvcmVJZC4gKi9cclxuaW50ZXJmYWNlIFNjb3BlUGljayB7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIHN0b3JlOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEYXNoYm9hcmQuIFN0b3JlIGxpc3QsIHNjb3JlIGJhbmRzLCBLUElzIGFuZCB0aGUgYnktZGF0ZSB0cmVuZCBjb21lIGZyb20gdGhlIGF1ZGl0IEFQSVxyXG4gKiAoL3RyYXgvYXVkaXQvZGFzaGJvYXJkKTsgdGhlIEF1ZGl0IC8gVXNlciBQZXJmb3JtYW5jZSB0YWJzIHN0aWxsIHVzZSB0aGUgdjEgZGFzaGJvYXJkXHJcbiAqIGVuZHBvaW50cyAoY2hlY2tsaXN0UGVyZm9ybWFuY2UgLyB1c2VyUGVyZm9ybWFuY2UpLiBUYXNrIG1vZGUgKHRpbGVzICsgVGFzayBQZXJmb3JtYW5jZSkgcmVhZHNcclxuICogL3RyYXgvYXVkaXQvZGFzaGJvYXJkL3Rhc2tzOiBvbmx5IHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0cy5cclxuICogU2NvcGUgKGNsaWVudCwgc3RvcmVzLCBkYXRlcykgY29tZXMgZnJvbSB0aGUgZ2xvYmFsIGhlYWRlciBmaWx0ZXI7IHRoZSBwZXJpb2QgcGlja2VyIGNhbiBuYXJyb3cgdGhlIGRhdGVzLlxyXG4gKiBGaWx0ZXJzIGRyYXdlcjogU3RvcmUgaGllcmFyY2h5IG5hcnJvd3MgdGhlIHN0b3JlcyBhbmQgQXVkaXQgdHlwZSAoY2hlY2tsaXN0SWQpIHRoZSBhdWRpdCBvZiBldmVyeSBmZWVkIChyZWxvYWRlZFxyXG4gKiBvbiBBcHBseSk7IFNjb3JlIHJhbmdlIGFuZCBTdGF0dXMgb25seSBmaWx0ZXIgdGhlIGxvYWRlZCBzdG9yZSBsaXN0IGluIHRoZSBicm93c2VyLlxyXG4gKlxyXG4gKiBRdWFydGVybHk6IHRoZSB0cmVuZCBzaG93cyB0aGUgbGFzdCBmb3VyIGZpbmFuY2lhbCBxdWFydGVycyAoYnVpbHQgZnJvbSBvbmUgbW9udGhseS1idWNrZXQgY2FsbCBvZlxyXG4gKiB0aGUgc2FtZSBBUEkpIGFuZCB0aGUgcGlja2VkIHF1YXJ0ZXIgYmVjb21lcyB0aGUgcGVyaW9kIG9mIGV2ZXJ5IGZlZWQuIEJ5IGRhdGU6IHRoZSByYW5nZSBwaWNrZXIuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1kYXNoYm9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiBQYXNzIC8gY3JpdGljYWwgbWFya3MgY29tZSBmcm9tIHRoZSBhdWRpdCBkYXNoYm9hcmQgQVBJOyB0aGVzZSBhcmUgdGhlIGVtcHR5LXN0YXRlIGRlZmF1bHRzLiAqL1xyXG4gIHBhc3NNYXJrID0gUEFTU19NQVJLO1xyXG4gIGNyaXRpY2FsTWFyayA9IENSSVRJQ0FMX01BUks7XHJcbiAgcmVhZG9ubHkgYmFuZHMgPSBCQU5EUztcclxuICAvKiogXCJBbGwgQXVkaXRzXCIsIHRoZW4gdGhlIGNsaWVudCdzIGF1ZGl0cyAoUE9TVCAvdHJheC9hdWRpdC9saXN0KTsga2V5ID0gYXVkaXQgaWQsIHNlbnQgYXMgY2hlY2tsaXN0SWQuICovXHJcbiAgYXVkaXRUeXBlczogQXVkaXRUeXBlT3B0aW9uW10gPSBbQUxMX0FVRElUU107XHJcbiAgLyoqIENsaWVudCB0aGUgYXVkaXQgbGlzdCB3YXMgZmV0Y2hlZCBmb3IuICovXHJcbiAgcHJpdmF0ZSBhdWRpdFR5cGVzQ2xpZW50ID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmlvZCBzZWxlY3Rpb24uIGZyb20gLyB0byAoWVlZWS1NTS1ERCkgc3RhcnQgYXMgdGhlIGhlYWRlciBkYXRlIHJhbmdlIGFuZCBkcml2ZSBldmVyeSBmZWVkO1xyXG4gICAqIHRoZSByYW5nZSBwaWNrZXIgbmFycm93cyB0aGVtLCBhbmQgYSBoZWFkZXIgY2hhbmdlIHJlc2V0cyB0aGVtLlxyXG4gICAqL1xyXG4gIGdyYWluOiAncXVhcnRlcicgfCAnZGF0ZScgPSAnZGF0ZSc7XHJcbiAgcXVhcnRlciA9ICcnO1xyXG4gIHJlYWRvbmx5IGZpc2NhbCA9IGZpc2NhbFF1YXJ0ZXJzKCk7XHJcbiAgcmVhZG9ubHkgcXVhcnRlcnMgPSB0aGlzLmZpc2NhbC5tYXAocSA9PiBxLmtleSk7XHJcbiAgLyoqIFF1YXJ0ZXJseSB0cmVuZCBiYXJzLCBhbmQgdGhlIGNsaWVudCArIHN0b3JlcyB0aGV5IHdlcmUgZmV0Y2hlZCBmb3IuICovXHJcbiAgcXVhcnRlclRyZW5kOiBUcmVuZEJhcltdID0gW107XHJcbiAgcXVhcnRlclRyZW5kTG9hZGluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcXVhcnRlclRyZW5kU2NvcGUgPSAnJztcclxuICBmcm9tID0gJyc7XHJcbiAgdG8gPSAnJztcclxuICByYW5nZTogUGlja2VyUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuICByZWFkb25seSBwaWNrZXJMb2NhbGUgPSBQSUNLRVJfTE9DQUxFO1xyXG4gIHJlYWRvbmx5IHJhbmdlcyA9IHBpY2tlclJhbmdlcygpO1xyXG4gIHJlYWRvbmx5IHRvZGF5ID0gZGF5anMoKTtcclxuXHJcbiAgLyoqIEZpbHRlcnMuICovXHJcbiAgYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgc3RhdHVzOiBTdGF0dXNGaWx0ZXIgPSAnYWxsJztcclxuICBzZWFyY2ggPSAnJztcclxuICBzY29yZU1pbiA9IDA7XHJcbiAgc2NvcmVNYXggPSAxMDA7XHJcblxyXG4gIC8qKiBBdWRpdCAvIFRhc2sgc3dpdGNoLiAqL1xyXG4gIG1vZHVsZVRhYjogJ0F1ZGl0JyB8ICdUYXNrJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgbW9kdWxlVGFiczogQXJyYXk8J0F1ZGl0JyB8ICdUYXNrJz4gPSBbJ0F1ZGl0JywgJ1Rhc2snXTtcclxuXHJcbiAgLyoqIFNob3duIGluIHRoZSBwYWdlIGhlYWRlcjsgc3RhbXBlZCBvbiBldmVyeSBsb2FkLiAqL1xyXG4gIGxhc3RSZWZyZXNoZWQgPSAn4oCUJztcclxuXHJcbiAgLyoqIEZpbHRlciBkcmF3ZXIuICovXHJcbiAgZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICBhY3RpdmVDYXQgPSAncGVyaW9kJztcclxuICAvKipcclxuICAgKiBUaGUgZmlsdGVyIGRyYXdlcidzIGRyYWZ0IChRQSA5IE9jdCk6IE9iamVjdC5jcmVhdGUodGhpcyksIHNvIGV2ZXJ5IGdldHRlciB0aGUgZHJhd2VyIHNob3dzIHdvcmtzIG9uIHRoZSBkcmFmdCdzXHJcbiAgICogb3duIHZhbHVlcyB3aGlsZSB0aGUgcGFnZSBiZWhpbmQga2VlcHMgdGhlIGFwcGxpZWQgb25lcy4gQXBwbHkgY29waWVzIERSQUZUX0tFWVMgb250byB0aGUgcGFnZTsgQ2FuY2VsIGRyb3BzIGl0LlxyXG4gICAqL1xyXG4gIGRyYWZ0OiBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRFJBRlRfS0VZUyA9IFsnZ3JhaW4nLCAncXVhcnRlcicsICdmcm9tJywgJ3RvJywgJ3JhbmdlJywgJ2F1ZGl0VHlwZScsICdjaXJjbGUnLCAnem9uZScsICdhb20nLCAnc3RvcmUnLFxyXG4gICAgJ3Njb3JlTWluJywgJ3Njb3JlTWF4JywgJ3N0YXR1cycsICdzdG9yZUxpc3RPcGVuJywgJ2xpc3RCYW5kS2V5J10gYXMgY29uc3Q7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGhpZXJhcmNoeSBwaWNrcyBiZWluZyBlZGl0ZWQgaW4gdGhlIGRyYXdlciAoc3RvcmUgPSBzdG9yZUlkKS4gVGhlIGxpc3RzIGNvbWUgZnJvbSB0aGUgZGFzaGJvYXJkXHJcbiAgICogQVBJJ3Mgc3RvcmUgcm93cyBvZiB0aGUgaGVhZGVyIHNjb3BlOyBBcHBseSBuYXJyb3dzIGV2ZXJ5IGZlZWQgdG8gdGhlIHN0b3JlcyB0aGUgcGljayBjb3ZlcnMuXHJcbiAgICovXHJcbiAgY2lyY2xlID0gJyc7XHJcbiAgem9uZSA9ICcnO1xyXG4gIGFvbSA9ICcnO1xyXG4gIHN0b3JlID0gJyc7XHJcblxyXG4gIC8qKiBTdG9yZSByb3dzIG9mIHRoZSBoZWFkZXIgc2NvcGUsIG5vdCBuYXJyb3dlZCBieSB0aGUgaGllcmFyY2h5OiB0aGUgZHJhd2VyJ3MgbGlzdHMgYW5kIGVhY2ggcGljaydzIHN0b3Jlcy4gKi9cclxuICBwcml2YXRlIHNjb3BlUm93czogQXVkaXRSb3dbXSA9IFtdO1xyXG4gIC8qKiBIaWVyYXJjaHkgKyBhdWRpdCB0eXBlIHRoZSBmZWVkcyB3ZXJlIGxhc3QgbG9hZGVkIHdpdGg7IHRoZSBkcmF3ZXIgZWRpdHMgYSBkcmFmdCB1bnRpbCBBcHBseS4gKi9cclxuICBwcml2YXRlIGFwcGxpZWQ6IFNjb3BlUGljayAmIHsgYXVkaXRUeXBlOiBzdHJpbmcgfSA9IHsgY2lyY2xlOiAnJywgem9uZTogJycsIGFvbTogJycsIHN0b3JlOiAnJywgYXVkaXRUeXBlOiAnYWxsJyB9O1xyXG4gIC8qKiBDbGllbnQgKyBoZWFkZXIgc3RvcmVzOyBhIGNoYW5nZSByZXNldHMgdGhlIGhpZXJhcmNoeSBwaWNrcyAodGhlaXIgc3RvcmVzIG1heSBiZSBnb25lKS4gKi9cclxuICBwcml2YXRlIGhlYWRlclNjb3BlS2V5ID0gJyc7XHJcblxyXG4gIC8qKiBUYWJsZSBzdGF0ZS4gKi9cclxuICBzb3J0S2V5ID0gJ3Njb3JlJztcclxuICBzb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG4gIHBhZ2UgPSAxO1xyXG4gIC8qKiBTdG9yZSBsaXN0IHBhZ2VyOiAxMCByb3dzIGEgcGFnZSwgMTAgLyAyMCAvIDMwLCBhcyBvbiBldmVyeSBhdWRpdCBsaXN0LiAqL1xyXG4gIHBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGFnZVNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG5cclxuICBoZWFkZXJzOiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW1xyXG4gICAgeyBrZXk6ICdkYXRlJywgbGFiZWw6ICdBdWRpdCBkYXRlJyB9LFxyXG4gICAgLy8gVGhlIGNvbHVtbiBzaG93cyB0aGUgc3RvcmUncyBuYW1lIChyb3cuc3RvcmVJZCBob2xkcyBpdDsgc2VlIHRvQXVkaXRSb3cpLlxyXG4gICAgeyBrZXk6ICdzdG9yZUlkJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LFxyXG4gICAgeyBrZXk6ICdjaXJjbGUnLCBsYWJlbDogJ0NpcmNsZSBIZWFkJyB9LFxyXG4gICAgeyBrZXk6ICd6b25lJywgbGFiZWw6ICdab25lIE1hbmFnZXInIH0sXHJcbiAgICB7IGtleTogJ2FvbScsIGxhYmVsOiAnQU9NJyB9LFxyXG4gICAgeyBrZXk6ICdzY29yZScsIGxhYmVsOiAnU2NvcmUnIH0sXHJcbiAgICB7IGtleTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJyB9XHJcbiAgXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGFzayBtb2RlOiB0aWxlcyBhbmQgdGhlIFRhc2sgUGVyZm9ybWFuY2UgdGFibGUgZm9yIHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0c1xyXG4gICAqICgvdHJheC9hdWRpdC9kYXNoYm9hcmQvdGFza3MpLiBMb2FkZWQgd2hlbiB0aGUgVGFzayB0YWIgaXMgb3BlbiwgYW5kIGFnYWluIGFmdGVyIGEgaGVhZGVyIGNoYW5nZS5cclxuICAgKi9cclxuICB0YXNrU3RhdHM6IFRhc2tTdGF0cyA9IHsgLi4uRU1QVFlfVEFTS19TVEFUUyB9O1xyXG4gIHRhc2tQZXJmOiBUYXNrUGVyZlJvd1tdID0gW107XHJcbiAgdGFza0xvYWRpbmcgPSBmYWxzZTtcclxuICAvKiogQ2hhbmdlIHZzIHRoZSBwcmV2aW91cyBwZXJpb2QgKG51bGwgPSBub3RoaW5nIHRvIGNvbXBhcmUpOyBkcml2ZXMgdGhlIGRlbHRhIGFycm93IGFuZCBjb2xvdXIuICovXHJcbiAgcHJpdmF0ZSB0YXNrRGVsdGFWYWx1ZXM6IFJlY29yZDxUYXNrRGVsdGFLZXksIG51bWJlciB8IG51bGw+ID0geyBjb21wbGV0aW9uOiBudWxsLCBjb21wbGlhbmNlOiBudWxsLCBmbGFnczogbnVsbCB9O1xyXG4gIC8qKiBUcnVlIHVudGlsIHRoZSB0YXNrIGZpZ3VyZXMgYXJlIGxvYWRlZCBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuICovXHJcbiAgcHJpdmF0ZSB0YXNrc1N0YWxlID0gdHJ1ZTtcclxuICAvKiogSWdub3JlcyBhIHRhc2sgcmVzcG9uc2UgdGhhdCBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gKi9cclxuICBwcml2YXRlIHRhc2tSZXF1ZXN0ID0gMDtcclxuICAvKiogUERGIGRvd25sb2FkcyBpbiBmbGlnaHQsIGJ5IHZpc2l0IGlkLCBzbyBhIGRvdWJsZSBjbGljayBxdWV1ZXMgb25lIHJlcG9ydC4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IHBkZlF1ZXVlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAvKiogUGVyZm9ybWFuY2Ugc2VjdGlvbi4gKi9cclxuICBwZXJmVGFiOiAnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgcGVyZlRhYnM6IEFycmF5PCdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInPiA9IFsnQXVkaXQnLCAnU3RvcmUnLCAnVXNlciddO1xyXG4gIHBlcmZQZXJpb2QgPSAnJztcclxuICBwZXJmU2VhcmNoID0gJyc7XHJcbiAgLyoqIFBlcmZvcm1hbmNlIHRhYmxlcycgcGFnZXIgKHNoYXJlZCBsaWItcGFnaW5hdGlvbiwgYXMgdGhlIG90aGVyIGF1ZGl0IGxpc3RzKTogMTAgcm93cyBhIHBhZ2UsIDEwIC8gMjAgLyAzMC4gKi9cclxuICBwZXJmUGFnZSA9IDE7XHJcbiAgcGVyZlBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGVyZlBhZ2VTaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuICAvKiogQ29sdW1uIHNvcnQgb2YgdGhlIGFjdGl2ZSBQZXJmb3JtYW5jZSB0YWJsZSAoJycgPSB0aGUgQVBJJ3Mgb3JkZXIpOyByZXNldCB3aGVuIHRoZSB0YWIgY2hhbmdlcy4gKi9cclxuICBwZXJmU29ydEtleSA9ICcnO1xyXG4gIHBlcmZTb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAvKiogU29ydGFibGUgY29sdW1ucyBvZiBlYWNoIFBlcmZvcm1hbmNlIHRhYmxlLCBpbiBkaXNwbGF5IG9yZGVyIChBY3Rpb24gaXMgbm90IHNvcnRhYmxlKS4gKi9cclxuICByZWFkb25seSBhdWRpdFBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICAvLyBObyBTY2hlZHVsZWQgY29sdW1uIChRQSA5IE9jdCkuXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ0F1ZGl0IE5hbWUnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LFxyXG4gICAgeyBrZXk6ICdkaXNwdXRlcycsIGxhYmVsOiAnRGlzcHV0ZXMnIH0sIHsga2V5OiAncGFzc01hcmsnLCBsYWJlbDogJ1Bhc3MgTWFyaycgfSxcclxuICAgIHsga2V5OiAnc2NvcmUnLCBsYWJlbDogJ1Njb3JlJyB9LCB7IGtleTogJ3Jlc3VsdCcsIGxhYmVsOiAnUmVzdWx0JyB9XHJcbiAgXTtcclxuICByZWFkb25seSB0YXNrUGVyZkNvbHM6IFBlcmZDb2x1bW5bXSA9IFtcclxuICAgIHsga2V5OiAnbmFtZScsIGxhYmVsOiAnVGFzayBOYW1lJyB9LCB7IGtleTogJ3NjaGVkdWxlZCcsIGxhYmVsOiAnU2NoZWR1bGVkJyB9LCB7IGtleTogJ2NvdmVyYWdlJywgbGFiZWw6ICdDb3ZlcmFnZScgfSxcclxuICAgIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LCB7IGtleTogJ2ZsYWdzJywgbGFiZWw6ICdGbGFncycgfSxcclxuICAgIHsga2V5OiAndGFza3MnLCBsYWJlbDogJ1Rhc2tzJyB9LCB7IGtleTogJ3JlZG8nLCBsYWJlbDogJ1JlRG8nIH0sIHsga2V5OiAnY29tcGxpYW5jZScsIGxhYmVsOiAnUXVlc3Rpb24gQ29tcGxpYW5jZSAlJyB9XHJcbiAgXTtcclxuICByZWFkb25seSBzdG9yZVBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ3N0b3JlJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LCB7IGtleTogJ3Nwb2MnLCBsYWJlbDogJ1N0b3JlIFNwb2MnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkJyB9LFxyXG4gICAgeyBrZXk6ICdmbGFncycsIGxhYmVsOiAnRmxhZ3MnIH0sIHsga2V5OiAnY29tcGxldGlvbicsIGxhYmVsOiAnQ29tcGxldGlvbiAlJyB9LCB7IGtleTogJ2NvbXBsaWFuY2UnLCBsYWJlbDogJ0NvbXBsaWFuY2UgJScgfSxcclxuICAgIHsga2V5OiAncGVyZicsIGxhYmVsOiAnUGVyZm9ybWFuY2UgJScgfVxyXG4gIF07XHJcbiAgcmVhZG9ubHkgdXNlclBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ1VzZXIgTmFtZScgfSwgeyBrZXk6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkJyB9LFxyXG4gICAgeyBrZXk6ICdmbGFncycsIGxhYmVsOiAnRmxhZ3MnIH0sIHsga2V5OiAncmVkbycsIGxhYmVsOiAnUmVEbycgfSwgeyBrZXk6ICdjb21wbGV0aW9uJywgbGFiZWw6ICdDb21wbGV0aW9uICUnIH0sXHJcbiAgICB7IGtleTogJ2NvbXBsaWFuY2UnLCBsYWJlbDogJ0NvbXBsaWFuY2UgJScgfSwgeyBrZXk6ICdwZXJmJywgbGFiZWw6ICdQZXJmb3JtYW5jZSAlJyB9XHJcbiAgXTtcclxuXHJcbiAgLyoqIFdoYXQgZWFjaCBzb3J0YWJsZSBjb2x1bW4gc29ydHMgb246IG51bWJlcnMgZm9yIGNvdW50cyBhbmQgcGVyY2VudGFnZXMsIHRleHQgb3RoZXJ3aXNlOyBudWxsIHNvcnRzIGxhc3QuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhdWRpdFNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IEF1ZGl0UGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIG5hbWU6IHIgPT4gci5uYW1lLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBzdWJtaXR0ZWQ6IHIgPT4gci5zdWJtaXR0ZWQsXHJcbiAgICBkaXNwdXRlczogciA9PiByLmRpc3B1dGVzLCBwYXNzTWFyazogciA9PiB0aGlzLm51bShTdHJpbmcoci5wYXNzTWFyaykucmVwbGFjZSgnJScsICcnKSksXHJcbiAgICBzY29yZTogciA9PiAoci5zY29yZSA9PT0gJ+KAlCcgPyBudWxsIDogci5zY29yZVBjdCksIHJlc3VsdDogciA9PiAoci5yZXN1bHQgPT09ICfigJQnID8gbnVsbCA6IHIucmVzdWx0KVxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0YXNrU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogVGFza1BlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgc2NoZWR1bGVkOiByID0+IHIuc2NoZWR1bGVkLCBjb3ZlcmFnZTogciA9PiByLmNvdmVyYWdlLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLFxyXG4gICAgc3VibWl0dGVkOiByID0+IHIuc3VibWl0dGVkLCBmbGFnczogciA9PiByLmZsYWdzLCB0YXNrczogciA9PiB0aGlzLm51bShyLnJhdz8udGFza3MpLCByZWRvOiByID0+IHIucmVkbyxcclxuICAgIGNvbXBsaWFuY2U6IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsaWFuY2UpXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogU3RvcmVQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgc3RvcmU6IHIgPT4gci5zdG9yZSwgc3BvYzogciA9PiByLnNwb2MsIGFzc2lnbmVkOiByID0+IHIuYXNzaWduZWQsIGZsYWdzOiByID0+IHIuZmxhZ3MsXHJcbiAgICBjb21wbGV0aW9uOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGV0aW9uKSwgY29tcGxpYW5jZTogciA9PiB0aGlzLm51bShyLnJhdz8uY29tcGxpYW5jZSksIHBlcmY6IHIgPT4gdGhpcy5udW0oci5yYXc/LnBlcmZvcm1hbmNlKVxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogVXNlclBlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgZW1haWw6IHIgPT4gci5lbWFpbCwgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgZmxhZ3M6IHIgPT4gci5mbGFncywgcmVkbzogciA9PiByLnJlZG8sXHJcbiAgICBjb21wbGV0aW9uOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGV0aW9uKSwgY29tcGxpYW5jZTogciA9PiB0aGlzLm51bShyLnJhdz8uY29tcGxpYW5jZSksIHBlcmY6IHIgPT4gdGhpcy5udW0oci5yYXc/LnBlcmZvcm1hbmNlKVxyXG4gIH07XHJcblxyXG4gIGF1ZGl0UGVyZjogQXVkaXRQZXJmUm93W10gPSBbXTtcclxuICBzdG9yZVBlcmY6IFN0b3JlUGVyZlJvd1tdID0gW107XHJcbiAgdXNlclBlcmY6IFVzZXJQZXJmUm93W10gPSBbXTtcclxuXHJcbiAgcm93czogQXVkaXRSb3dbXSA9IFtdO1xyXG4gIHRyZW5kOiBUcmVuZEJhcltdID0gW107XHJcblxyXG4gIC8qKiBTdGFydHMgdHJ1ZSBzbyB0aGUgZmlyc3QgcGFpbnQgc2hpbW1lcnMgaW5zdGVhZCBvZiBmbGFzaGluZyBlbXB0eSB0aWxlcyBhbmQgdGFibGVzLiAqL1xyXG4gIGxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIGhlYWRlckRhdGE6IGFueTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJFbWFpbGVzOiBzdHJpbmdbXSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJzRW1haWwtaW5mbycpIHx8ICdbXScpO1xyXG4gIC8qKiBDcmVhdGUgQXVkaXQgc2hvd3Mgb25seSB3aXRoIHRoZSBDaGVja2xpc3QgYWRkIHBlcm1pc3Npb24uICovXHJcbiAgYWNjZXNzOiBBdWRpdEFjY2VzcyA9IHsgY2FuQWRkOiBmYWxzZSwgY2FuRWRpdDogZmFsc2UgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRyYXhTZXJ2aWNlOiBUcmF4U2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBhdWRpdEFjY2Vzcyh0aGlzLmdzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGFjY2VzcyA9PiB7XHJcbiAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWRhdGE/LmNsaWVudCkgeyByZXR1cm47IH1cclxuICAgICAgICBjb25zdCBjbGllbnRDaGFuZ2VkID0gZGF0YS5jbGllbnQgIT09IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIHRoaXMuaGVhZGVyRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5vbkhlYWRlclNjb3BlKGNsaWVudENoYW5nZWQpO1xyXG4gICAgICAgIC8vIEEgcXVhcnRlciBzdGF5cyBwaWNrZWQgYWNyb3NzIGhlYWRlciBjaGFuZ2VzIChuZXcgc3RvcmVzIC8gY2xpZW50KTsgQnkgZGF0ZSBmb2xsb3dzIHRoZSBoZWFkZXIuXHJcbiAgICAgICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJykgeyB0aGlzLmFwcGx5UXVhcnRlcih0aGlzLnF1YXJ0ZXIsIHRydWUpOyByZXR1cm47IH1cclxuICAgICAgICB0aGlzLmZyb20gPSBkYXRhLmRhdGU/LnN0YXJ0RGF0ZSB8fCAnJztcclxuICAgICAgICB0aGlzLnRvID0gZGF0YS5kYXRlPy5lbmREYXRlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMucmFuZ2UgPSB0b1BpY2tlclJhbmdlKHRoaXMuZnJvbSwgdGhpcy50byk7XHJcbiAgICAgICAgdGhpcy5yZWxvYWRQZXJpb2QoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWFkZXIgY2hhbmdlLiBOZXcgY2xpZW50OiB0aGUgYXVkaXQgdHlwZSBzdGFydHMgb3ZlciBhbmQgaXRzIGxpc3QgaXMgZmV0Y2hlZCBhZ2Fpbi4gTmV3IGNsaWVudCBvclxyXG4gICAqIHN0b3JlczogdGhlIGhpZXJhcmNoeSBwaWNrcyBzdGFydCBvdmVyICh0aGUgbmV4dCBsb2FkIHJlZmlsbHMgdGhlIGxpc3RzKS4gQSBkYXRlLW9ubHkgY2hhbmdlIGtlZXBzIGJvdGguXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvbkhlYWRlclNjb3BlKGNsaWVudENoYW5nZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuaGVhZGVyRGF0YS5jbGllbnQgKyAnfCcgKyB0aGlzLmhlYWRlclN0b3JlSWRzKCkuam9pbignLCcpO1xyXG4gICAgaWYgKGtleSAhPT0gdGhpcy5oZWFkZXJTY29wZUtleSkge1xyXG4gICAgICB0aGlzLmhlYWRlclNjb3BlS2V5ID0ga2V5O1xyXG4gICAgICB0aGlzLmNpcmNsZSA9IHRoaXMuem9uZSA9IHRoaXMuYW9tID0gdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgICB0aGlzLmFwcGxpZWQgPSB7IC4uLnRoaXMuYXBwbGllZCwgY2lyY2xlOiAnJywgem9uZTogJycsIGFvbTogJycsIHN0b3JlOiAnJyB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGNsaWVudENoYW5nZWQpIHtcclxuICAgICAgdGhpcy5hdWRpdFR5cGUgPSAnYWxsJztcclxuICAgICAgdGhpcy5hcHBsaWVkLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgICB0aGlzLmF1ZGl0VHlwZXMgPSBbQUxMX0FVRElUU107XHJcbiAgICAgIHRoaXMubG9hZEF1ZGl0VHlwZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBUaGUgY2xpZW50J3MgYXVkaXRzIGZvciB0aGUgQXVkaXQgdHlwZSBmaWx0ZXIsIG5ld2VzdCBmaXJzdCBhcyB0aGUgTWFuYWdlIGxpc3QuICovXHJcbiAgcHJpdmF0ZSBsb2FkQXVkaXRUeXBlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsaWVudElkID0gdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICBpZiAoIWNsaWVudElkIHx8IGNsaWVudElkID09PSB0aGlzLmF1ZGl0VHlwZXNDbGllbnQpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmF1ZGl0VHlwZXNDbGllbnQgPSBjbGllbnRJZDtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRMaXN0KHtcclxuICAgICAgY2xpZW50SWQsIGZyb21EYXRlOiB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSwgdG9EYXRlOiB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUsXHJcbiAgICAgIGxpbWl0OiA1MDAsIG9mZnNldDogMSwgc2VhcmNoOiAnJ1xyXG4gICAgfSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXM/LmNvZGUgIT09IDIwMCkgeyB0aGlzLmF1ZGl0VHlwZXNDbGllbnQgPSAnJzsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IGxpc3Q6IGFueVtdID0gcmVzLmRhdGE/LnJlc3VsdCB8fCBbXTtcclxuICAgICAgdGhpcy5hdWRpdFR5cGVzID0gW0FMTF9BVURJVFNdLmNvbmNhdChsaXN0Lm1hcChhID0+ICh7XHJcbiAgICAgICAga2V5OiBTdHJpbmcoYS5faWQpLFxyXG4gICAgICAgIGxhYmVsOiBhLmNoZWNrTGlzdE5hbWUgfHwgJ1VudGl0bGVkIGF1ZGl0JyxcclxuICAgICAgICBoZWxwOiAoYS5wdWJsaXNoID8gJ1B1Ymxpc2hlZCcgOiAnRHJhZnQnKSArICcgwrcgcGFzcyBtYXJrICcgKyAodGhpcy5udW0oYS5wYXNzTWFyaykgPz8gUEFTU19NQVJLKSArICclJ1xyXG4gICAgICB9KSkpO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJhbmdlIHBpY2tlcjogYSBuZXcgcGVyaW9kIHJlbG9hZHMgZXZlcnkgZmVlZCwgZXhjZXB0IGluc2lkZSB0aGUgZmlsdGVyIGRyYXdlciwgd2hlcmUgQXBwbHkgZG9lcy4gKi9cclxuICBvblJhbmdlUGlja2VkKGU6IFBpY2tlZERhdGVzIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGlja2VkID0gZnJvbVBpY2tlclJhbmdlKGUpO1xyXG4gICAgaWYgKCFwaWNrZWQgfHwgKHBpY2tlZC5mcm9tID09PSB0aGlzLmZyb20gJiYgcGlja2VkLnRvID09PSB0aGlzLnRvKSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuZnJvbSA9IHBpY2tlZC5mcm9tO1xyXG4gICAgdGhpcy50byA9IHBpY2tlZC50bztcclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbikgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbG9hZFBlcmlvZCgpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBlcmlvZCA9ICdCYXNlZCBvbiAnICsgdGhpcy5mbXQodGhpcy5mcm9tKSArICcgLSAnICsgdGhpcy5mbXQodGhpcy50byk7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgICAvLyBUYXNrIGZpZ3VyZXMgZm9sbG93IHRoZSBzYW1lIHNjb3BlOyBmZXRjaGVkIG5vdyBpbiBUYXNrIG1vZGUsIGVsc2Ugd2hlbiB0aGUgdGFiIG9wZW5zLlxyXG4gICAgdGhpcy50YXNrc1N0YWxlID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmlzVGFza01vZHVsZSkgeyB0aGlzLmxvYWRUYXNrcygpOyB9XHJcbiAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHRoaXMubG9hZFF1YXJ0ZXJUcmVuZCgpOyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZm91ciBxdWFydGVyIGJhcnM6IG9uZSBjYWxsIG92ZXIgdGhlIGZvdXIgcXVhcnRlcnMgKG1vcmUgdGhhbiAxMjAgZGF5cywgc28gdGhlIEFQSSBidWNrZXRzIHRoZVxyXG4gICAqIHRyZW5kIGJ5IG1vbnRoKSByb2xsZWQgdXAgcGVyIHF1YXJ0ZXIsIHdlaWdodGVkIGJ5IGVhY2ggbW9udGgncyBhdWRpdCBjb3VudC4gRmV0Y2hlZCBhZ2FpbiBvbmx5XHJcbiAgICogd2hlbiB0aGUgY2xpZW50IG9yIHN0b3JlcyBjaGFuZ2UuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkUXVhcnRlclRyZW5kKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmJhc2VQYXlsb2FkKCk7XHJcbiAgICBjb25zdCBrZXkgPSBzY29wZVsnY2xpZW50SWQnXSArICd8JyArIChzY29wZVsnc3RvcmVJZCddIHx8IFtdKS5qb2luKCcsJykgKyAnfCcgKyAoc2NvcGVbJ2NoZWNrbGlzdElkJ10gfHwgJycpO1xyXG4gICAgaWYgKGtleSA9PT0gdGhpcy5xdWFydGVyVHJlbmRTY29wZSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucXVhcnRlclRyZW5kU2NvcGUgPSBrZXk7XHJcbiAgICB0aGlzLnF1YXJ0ZXJUcmVuZExvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZCh7XHJcbiAgICAgIGNsaWVudElkOiBzY29wZVsnY2xpZW50SWQnXSwgZnJvbURhdGU6IHRoaXMuZmlzY2FsWzBdLmZyb20sIHRvRGF0ZTogdGhpcy50b2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgc3RvcmVJZDogc2NvcGVbJ3N0b3JlSWQnXSxcclxuICAgICAgLi4udGhpcy5hdWRpdEZpbHRlcigpXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgY29uc3Qgb2sgPSByZXM/LmNvZGUgPT09IDIwMDtcclxuICAgICAgaWYgKCFvaykgeyB0aGlzLnF1YXJ0ZXJUcmVuZFNjb3BlID0gJyc7IH1cclxuICAgICAgY29uc3QgYnVja2V0czogYW55W10gPSBvayA/IHJlcy5kYXRhPy50cmVuZCB8fCBbXSA6IFtdO1xyXG4gICAgICB0aGlzLnF1YXJ0ZXJUcmVuZCA9IHRoaXMuZmlzY2FsLm1hcChxID0+IHtcclxuICAgICAgICBjb25zdCBpblF1YXJ0ZXIgPSBidWNrZXRzLmZpbHRlcihiID0+IFN0cmluZyhiLmtleSkgPj0gcS5mcm9tICYmIFN0cmluZyhiLmtleSkgPD0gcS50byAmJiBiLnZhbHVlICE9PSBudWxsICYmIGIudmFsdWUgIT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBpblF1YXJ0ZXIucmVkdWNlKChuLCBiKSA9PiBuICsgKE51bWJlcihiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgY29uc3QgdG90YWwgPSBpblF1YXJ0ZXIucmVkdWNlKChuLCBiKSA9PiBuICsgTnVtYmVyKGIudmFsdWUpICogKE51bWJlcihiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgY29uc3Qgc3VibWl0dGVkID0gYnVja2V0cy5maWx0ZXIoYiA9PiBTdHJpbmcoYi5rZXkpID49IHEuZnJvbSAmJiBTdHJpbmcoYi5rZXkpIDw9IHEudG8pXHJcbiAgICAgICAgICAucmVkdWNlKChuLCBiKSA9PiBuICsgKE51bWJlcihiLnN1Ym1pdHRlZCA/PyBiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgcmV0dXJuIHsga2V5OiBxLmtleSwgbGFiZWw6IHEua2V5LCB2YWx1ZTogY291bnQgPyBNYXRoLnJvdW5kKHRvdGFsIC8gY291bnQpIDogbnVsbCwgY291bnQsIHN1Ym1pdHRlZCB9O1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5xdWFydGVyVHJlbmRMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogTWFrZSBhIHF1YXJ0ZXIgdGhlIHBlcmlvZCAodXAgdG8gdG9kYXkgZm9yIHRoZSBjdXJyZW50IG9uZSk7IHJlbG9hZHMgdW5sZXNzIHRoZSBmaWx0ZXIgZHJhd2VyIGlzIG9wZW4uICovXHJcbiAgcHJpdmF0ZSBhcHBseVF1YXJ0ZXIoa2V5OiBzdHJpbmcsIGZvcmNlID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLmZpc2NhbC5maW5kKHggPT4geC5rZXkgPT09IGtleSkgfHwgdGhpcy5maXNjYWxbdGhpcy5maXNjYWwubGVuZ3RoIC0gMV07XHJcbiAgICBjb25zdCB0b2RheSA9IHRoaXMudG9kYXkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICBjb25zdCB0byA9IHEudG8gPiB0b2RheSA/IHRvZGF5IDogcS50bztcclxuICAgIGlmICghZm9yY2UgJiYgcS5rZXkgPT09IHRoaXMucXVhcnRlciAmJiB0aGlzLmZyb20gPT09IHEuZnJvbSAmJiB0aGlzLnRvID09PSB0bykgeyByZXR1cm47IH1cclxuICAgIHRoaXMucXVhcnRlciA9IHEua2V5O1xyXG4gICAgdGhpcy5mcm9tID0gcS5mcm9tO1xyXG4gICAgdGhpcy50byA9IHRvO1xyXG4gICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbikgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICAvKiogUXVhcnRlcmx5OiBhIGJhciAob3IgYSBxdWFydGVyIGluIHRoZSBmaWx0ZXIgZHJhd2VyKSBwaWNrcyB0aGF0IHF1YXJ0ZXIuICovXHJcbiAgc2VsZWN0UXVhcnRlcihrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gIT09ICdxdWFydGVyJykgeyByZXR1cm47IH1cclxuICAgIHRoaXMuYXBwbHlRdWFydGVyKGtleSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHRyZW5kIGNhcmQgd2FpdHMgZm9yIHRoZSBwYWdlIGZlZWRzLCBhbmQgaW4gUXVhcnRlcmx5IGFsc28gZm9yIHRoZSBxdWFydGVyIGJhcnMuICovXHJcbiAgZ2V0IHRyZW5kTG9hZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJyAmJiB0aGlzLnF1YXJ0ZXJUcmVuZExvYWRpbmcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJhcnMgdGhlIHRyZW5kIGNoYXJ0IGRyYXdzOiB0aGUgZm91ciBxdWFydGVycywgb3IgdGhlIEFQSSdzIGJ5LWRhdGUgYnVja2V0cy4gKi9cclxuICBnZXQgdHJlbmRCYXJzKCk6IFRyZW5kQmFyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJyA/IHRoaXMucXVhcnRlclRyZW5kIDogdGhpcy50cmVuZDtcclxuICB9XHJcblxyXG4gIC8qKiBcIk9jdCDigJMgRGVjIDIwMjZcIiBmb3IgYSBxdWFydGVyIGtleS4gKi9cclxuICBxdWFydGVyTW9udGhzKGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZpc2NhbC5maW5kKHEgPT4gcS5rZXkgPT09IGtleSk/Lm1vbnRocyB8fCAnJztcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRpY2tlZCBpbiB0aGUgZ2xvYmFsIGhlYWRlci4gKi9cclxuICBwcml2YXRlIGhlYWRlclN0b3JlSWRzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiAodGhpcy5oZWFkZXJEYXRhPy5zdG9yZXMgfHwgW10pLmZpbHRlcigoczogYW55KSA9PiBzLmNoZWNrZWQpLm1hcCgoczogYW55KSA9PiBzLnN0b3JlSWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaGllcmFyY2h5QXBwbGllZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGEgPSB0aGlzLmFwcGxpZWQ7XHJcbiAgICByZXR1cm4gISEoYS5jaXJjbGUgfHwgYS56b25lIHx8IGEuYW9tIHx8IGEuc3RvcmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXRjaGVzU2NvcGUocjogQXVkaXRSb3csIHBpY2s6IFNjb3BlUGljayk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICghcGljay5jaXJjbGUgfHwgci5jaXJjbGUgPT09IHBpY2suY2lyY2xlKSAmJiAoIXBpY2suem9uZSB8fCByLnpvbmUgPT09IHBpY2suem9uZSlcclxuICAgICAgJiYgKCFwaWNrLmFvbSB8fCByLmFvbSA9PT0gcGljay5hb20pICYmICghcGljay5zdG9yZSB8fCBTdHJpbmcoci5yYXc/LnN0b3JlSWQpID09PSBwaWNrLnN0b3JlKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgc3RvcmVzIGV2ZXJ5IGZlZWQgcmVhZHM6IHRoZSBoZWFkZXIncywgbmFycm93ZWQgdG8gdGhlIGFwcGxpZWQgaGllcmFyY2h5IHBpY2suICovXHJcbiAgcHJpdmF0ZSBzY29wZWRTdG9yZUlkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIXRoaXMuaGllcmFyY2h5QXBwbGllZCkgeyByZXR1cm4gdGhpcy5oZWFkZXJTdG9yZUlkcygpOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgdGhpcy5hcHBsaWVkKSkubWFwKHIgPT4gU3RyaW5nKHIucmF3Py5zdG9yZUlkIHx8ICcnKSkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhcHBsaWVkIEF1ZGl0IHR5cGUgYXMgdGhlIEFQSXMgdGFrZSBpdCAobm90aGluZyBmb3IgQWxsIEF1ZGl0cykuICovXHJcbiAgcHJpdmF0ZSBhdWRpdEZpbHRlcigpOiB7IGNoZWNrbGlzdElkPzogc3RyaW5nIH0ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXBwbGllZC5hdWRpdFR5cGUgIT09ICdhbGwnID8geyBjaGVja2xpc3RJZDogdGhpcy5hcHBsaWVkLmF1ZGl0VHlwZSB9IDoge307XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJhc2VQYXlsb2FkKGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICAgIHRvRGF0ZTogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUsXHJcbiAgICAgIHN0b3JlSWQ6IHRoaXMuc2NvcGVkU3RvcmVJZHMoKSxcclxuICAgICAgLi4udGhpcy5hdWRpdEZpbHRlcigpLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIHVzZXJFbWFpbGVzOiB0aGlzLnVzZXJFbWFpbGVzLFxyXG4gICAgICBsaW1pdDogMTAwMCxcclxuICAgICAgb2Zmc2V0OiAwLFxyXG4gICAgICBzb3J0Qnk6ICcnLFxyXG4gICAgICBzb3J0Q29sdW1uTmFtZTogJycsXHJcbiAgICAgIHNlYXJjaFZhbHVlOiAnJyxcclxuICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgLi4uZXh0cmFcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGZvdXIgZmVlZHMgbG9hZCB0b2dldGhlcjsgYSBmYWlsdXJlIGluIG9uZSBsZWF2ZXMgdGhlIG90aGVycyBpbnRhY3QuICovXHJcbiAgcHJpdmF0ZSBsb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHNhZmUgPSAobzogYW55KSA9PiBvLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpO1xyXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmJhc2VQYXlsb2FkKCk7XHJcbiAgICAvLyBSb3dzIGZldGNoZWQgZm9yIHRoZSB3aG9sZSBoZWFkZXIgc2NvcGUgcmVmaWxsIHRoZSBoaWVyYXJjaHkgbGlzdHM7IG5hcnJvd2VkIG9uZXMgZG8gbm90LlxyXG4gICAgY29uc3QgbmFycm93ZWQgPSB0aGlzLmhpZXJhcmNoeUFwcGxpZWQ7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIC8vIFRoZSBhdWRpdCBkYXNoYm9hcmQgQVBJIHJlamVjdHMgdW5rbm93biBrZXlzLCBzbyBvbmx5IHRoZSBzY29wZSBpcyBzZW50LlxyXG4gICAgICBkYXNoOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXREYXNoYm9hcmQoe1xyXG4gICAgICAgIGNsaWVudElkOiBzY29wZVsnY2xpZW50SWQnXSwgZnJvbURhdGU6IHNjb3BlWydmcm9tRGF0ZSddLCB0b0RhdGU6IHNjb3BlWyd0b0RhdGUnXSwgc3RvcmVJZDogc2NvcGVbJ3N0b3JlSWQnXSxcclxuICAgICAgICAuLi50aGlzLmF1ZGl0RmlsdGVyKClcclxuICAgICAgfSkpLFxyXG4gICAgICAvLyBTYW1lIHRhYmxlcyBhcyB0aGUgY2hlY2tsaXN0IGRhc2hib2FyZCwgbGltaXRlZCBzZXJ2ZXItc2lkZSB0byB0aGlzIGNsaWVudCdzIGF1ZGl0cy5cclxuICAgICAgYXVkaXRzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRDaGVja2xpc3RQZXJmb3JtYW5jZSh0aGlzLmJhc2VQYXlsb2FkKHsgbGltaXQ6IDIwMCB9KSkpLFxyXG4gICAgICBzdG9yZXM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdFN0b3JlUGVyZm9ybWFuY2UodGhpcy5iYXNlUGF5bG9hZCh7IGxpbWl0OiAxMDAwIH0pKSksXHJcbiAgICAgIHVzZXJzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRVc2VyUGVyZm9ybWFuY2UodGhpcy5iYXNlUGF5bG9hZCh7IGxpbWl0OiA1MDAgfSkpKVxyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoeyBkYXNoLCBhdWRpdHMsIHN0b3JlcywgdXNlcnMgfTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBkYXNoPy5jb2RlID09PSAyMDAgPyAoZGFzaC5kYXRhIHx8IHt9KSA6IHt9O1xyXG4gICAgICBjb25zdCBhdWRpdExpc3QgPSBhdWRpdHM/LmNvZGUgPT09IDIwMCA/IChhdWRpdHMuZGF0YT8uY2hlY2tsaXN0UGVyZm9ybWFuY2UgfHwgW10pIDogW107XHJcbiAgICAgIGNvbnN0IHN0b3JlTGlzdCA9IHN0b3Jlcz8uY29kZSA9PT0gMjAwID8gKHN0b3Jlcy5kYXRhPy5zdG9yZVBlcmZvcm1hbmNlIHx8IFtdKSA6IFtdO1xyXG4gICAgICBjb25zdCB1c2VyTGlzdCA9IHVzZXJzPy5jb2RlID09PSAyMDAgPyAodXNlcnMuZGF0YT8udXNlclBlcmZvcm1hbmNlIHx8IFtdKSA6IFtdO1xyXG5cclxuICAgICAgdGhpcy5wYXNzTWFyayA9IE51bWJlcihkYXRhLnN1bW1hcnk/LnBhc3NNYXJrKSB8fCBQQVNTX01BUks7XHJcbiAgICAgIHRoaXMuY3JpdGljYWxNYXJrID0gTnVtYmVyKGRhdGEuc3VtbWFyeT8uY3JpdGljYWxNYXJrKSB8fCBDUklUSUNBTF9NQVJLO1xyXG4gICAgICB0aGlzLnJvd3MgPSAoZGF0YS5zdG9yZXMgfHwgW10pLm1hcCgoczogYW55KSA9PiB0aGlzLnRvQXVkaXRSb3cocykpO1xyXG4gICAgICBpZiAoIW5hcnJvd2VkICYmIGRhc2g/LmNvZGUgPT09IDIwMCkgeyB0aGlzLnNjb3BlUm93cyA9IHRoaXMucm93czsgfVxyXG4gICAgICB0aGlzLnN0b3JlUGVyZiA9IHN0b3JlTGlzdC5tYXAoKHI6IGFueSkgPT4gdGhpcy50b1N0b3JlUGVyZihyKSk7XHJcbiAgICAgIHRoaXMudHJlbmQgPSAoZGF0YS50cmVuZCB8fCBbXSkubWFwKChiOiBhbnkpID0+ICh7XHJcbiAgICAgICAga2V5OiBTdHJpbmcoYi5rZXkpLCBsYWJlbDogU3RyaW5nKGIubGFiZWwpLFxyXG4gICAgICAgIHZhbHVlOiBiLnZhbHVlID09PSBudWxsIHx8IGIudmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBOdW1iZXIoYi52YWx1ZSksXHJcbiAgICAgICAgY291bnQ6IE51bWJlcihiLmNvdW50KSB8fCAwLFxyXG4gICAgICAgIC8vIE9sZGVyIEFQSSBidWlsZHMgc2VuZCBvbmx5IGNvdW50IChldmVyeSBhdWRpdCB3YXMgc2NvcmVkIHRoZW4pLlxyXG4gICAgICAgIHN1Ym1pdHRlZDogTnVtYmVyKGIuc3VibWl0dGVkID8/IGIuY291bnQpIHx8IDBcclxuICAgICAgfSkpO1xyXG4gICAgICB0aGlzLmF1ZGl0UGVyZiA9IGF1ZGl0TGlzdC5tYXAoKHI6IGFueSkgPT4gdGhpcy50b0F1ZGl0UGVyZihyKSk7XHJcbiAgICAgIHRoaXMudXNlclBlcmYgPSB1c2VyTGlzdC5tYXAoKHI6IGFueSkgPT4gdGhpcy50b1VzZXJQZXJmKHIpKTtcclxuICAgICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgICAgIHRoaXMubGFzdFJlZnJlc2hlZCA9IGRheWpzKCkuZm9ybWF0KCdoaDptbTpzcyBBJyk7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT25lIHN0b3JlIGZyb20gdGhlIGF1ZGl0IGRhc2hib2FyZCBBUEk6IHNjb3JlIGlzIHRoZSBtZWFuIG9mIGl0cyBjb21wbGlhbmNlLXNjb3JlZCBhdWRpdHMgaW4gdGhlIHBlcmlvZCxcclxuICAgKiBudWxsIHdoZW4gbm9uZS4gQSBzdG9yZSB3aXRoIHN1Ym1pdHRlZCBhdWRpdHMgYnV0IG5vIHNjb3JlIGlzICd1bnNjb3JlZCcgKGl0cyBhdWRpdHMgaGF2ZSBubyBxdWVzdGlvbiB3aXRoXHJcbiAgICogY29tcGxpYW5jZSBzY29yaW5nIG9uKSwgbm90IFwiTm90IGF1ZGl0ZWRcIi5cclxuICAgKi9cclxuICBwcml2YXRlIHRvQXVkaXRSb3coczogYW55KTogQXVkaXRSb3cge1xyXG4gICAgY29uc3Qgc2NvcmUgPSB0aGlzLm51bShzPy5zY29yZSk7XHJcbiAgICBsZXQgc3RhdHVzOiBTdG9yZVN0YXR1cztcclxuICAgIGlmIChzY29yZSAhPT0gbnVsbCkge1xyXG4gICAgICBzdGF0dXMgPSBzY29yZSA+PSB0aGlzLnBhc3NNYXJrID8gJ3Bhc3MnIDogJ2ZhaWwnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3RhdHVzID0gcz8uc3RhdHVzID09PSAndW5zY29yZWQnIHx8ICh0aGlzLm51bShzPy5hdWRpdHMpID8/IDApID4gMCA/ICd1bnNjb3JlZCcgOiAnbmEnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGF0ZTogcz8ubGFzdEF1ZGl0RGF0ZSA/IHRoaXMuZm10KHMubGFzdEF1ZGl0RGF0ZSkgOiAn4oCUJyxcclxuICAgICAgLy8gVGhlIHN0b3JlJ3MgbmFtZSAoaGllcmFyY2h5LCBpdHMgc3VibWlzc2lvbnMsIG9yIHRoZSBzdG9yZXMgbGlzdCk7IFwi4oCUXCIgd2hlbiBpdCBoYXMgbm9uZSwgbmV2ZXIgdGhlIGlkLlxyXG4gICAgICBzdG9yZUlkOiBzPy5zdG9yZU5hbWUgfHwgJ+KAlCcsXHJcbiAgICAgIGNpcmNsZTogcz8uY2lyY2xlIHx8ICfigJQnLFxyXG4gICAgICB6b25lOiBzPy56b25lIHx8ICfigJQnLFxyXG4gICAgICBhb206IHM/LmFvbSB8fCAn4oCUJyxcclxuICAgICAgc2NvcmU6IHNjb3JlID09PSBudWxsID8gbnVsbCA6IE1hdGgucm91bmQoc2NvcmUpLFxyXG4gICAgICBzdGF0dXMsXHJcbiAgICAgIHJhdzogc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uZSBzdG9yZSBmcm9tIC9hdWRpdC9kYXNoYm9hcmQvc3RvcmVQZXJmb3JtYW5jZSAoYXVkaXQgY29weSBvZiB0aGUgY2hlY2tsaXN0IGRhc2hib2FyZCdzIHRhYmxlKTogZXZlcnkgYXVkaXRcclxuICAgKiB2aXNpdCBpbiB0aGUgcGVyaW9kLCBzbyBjb21wbGV0aW9uID0gc3VibWl0dGVkIC8gYXNzaWduZWQgYW5kIGZsYWdzIGNvdW50LCB1bmxpa2UgdGhlIHNjb3JlLW9ubHkgc3RvcmUgbGlzdC5cclxuICAgKi9cclxuICBwcml2YXRlIHRvU3RvcmVQZXJmKHI6IGFueSk6IFN0b3JlUGVyZlJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZUlkOiByPy5zdG9yZV9pZCB8fCAnJyxcclxuICAgICAgc3RvcmU6IHI/LnN0b3JlTmFtZSB8fCAn4oCUJyxcclxuICAgICAgc3BvYzogcj8udXNlckVtYWlsIHx8ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uY2hlY2tMaXN0Q291bnQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bShyPy5mbGFnZ2VkQ291bnQpLFxyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLnBjdFRleHQocj8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChyPy5jb21wbGlhbmNlKSxcclxuICAgICAgcGVyZjogdGhpcy5wY3RUZXh0KHI/LnBlcmZvcm1hbmNlKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFyIGZpbGwgZm9yIGEgcGVyY2VudGFnZSAobnVtYmVyLCBvciB0ZXh0IGxpa2UgXCI1MSVcIiAvIFwiLTI1JVwiKToga2VwdCB0byAwLTEwMC4gQSBuZWdhdGl2ZSBzY29yZSAob3B0aW9uXHJcbiAgICogc2NvcmVzIGNhbiBiZSBuZWdhdGl2ZSBwZW5hbHRpZXMpIHdvdWxkIG90aGVyd2lzZSBzZXQgYW4gaW52YWxpZCBuZWdhdGl2ZSB3aWR0aCwgd2hpY2ggdGhlIGJyb3dzZXIgZHJvcHMsXHJcbiAgICogZHJhd2luZyB0aGUgYmFyIGZ1bGw7IGl0IGlzIGVtcHR5IGluc3RlYWQsIHdoaWxlIHRoZSBudW1iZXIgYmVzaWRlIGl0IHN0aWxsIHNob3dzIHRoZSByZWFsIHNjb3JlLlxyXG4gICAqL1xyXG4gIGJhcldpZHRoKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG4gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KFN0cmluZyh2YWx1ZSA/PyAnJykucmVwbGFjZSgnJScsICcnKSk7XHJcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBuKSkgKyAnJScgOiAnMCUnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b0F1ZGl0UGVyZihyOiBhbnkpOiBBdWRpdFBlcmZSb3cge1xyXG4gICAgY29uc3QgbmFtZSA9IHI/LmNoZWNrTGlzdE5hbWUgfHwgJ+KAlCc7XHJcbiAgICAvLyBObyBxdWVzdGlvbiBvZiB0aGUgYXVkaXQgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbjogbm8gc2NvcmUgYW5kIG5vIHJlc3VsdCAodGhlIEFQSSBzZW5kcyBudWxsKS5cclxuICAgIGNvbnN0IHNjb3JlID0gcj8uY29tcGxpYW5jZUVuYWJsZWQgPT09IGZhbHNlID8gbnVsbCA6IHRoaXMubnVtKHI/LnF1ZXN0aW9uQ29tcGxpYW5jZSk7XHJcbiAgICBjb25zdCBzY29yZVBjdCA9IHNjb3JlID09PSBudWxsID8gMCA6IE1hdGgucm91bmQoc2NvcmUpO1xyXG4gICAgLy8gVGhlIGF1ZGl0J3Mgb3duIHBhc3MgbWFyayB3aGVuIHRoZSBBUEkgc2VuZHMgaXQsIGVsc2UgdGhlIGRhc2hib2FyZCdzIChzdW1tYXJ5LnBhc3NNYXJrKS5cclxuICAgIGNvbnN0IG1hcmsgPSB0aGlzLm51bShyPy5wYXNzTWFyaykgPz8gdGhpcy5wYXNzTWFyaztcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGluaXRpYWxzOiBTdHJpbmcocj8uY2hlY2tMaXN0Q2hhciB8fCBuYW1lLnNsaWNlKDAsIDIpKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBzY2hlZHVsZWQ6IHI/LnNjaGVkdWxlUmVwZWF0ZWRUeXBlID8gdGhpcy50aXRsZUNhc2Uoci5zY2hlZHVsZVJlcGVhdGVkVHlwZSkgOiAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHI/LnN0b3JlQ291bnQpID8/IDAsXHJcbiAgICAgIHN1Ym1pdHRlZDogdGhpcy5udW0ocj8uc3VibWl0dGVkQ2hlY2tsaXN0KSA/PyAwLFxyXG4gICAgICAvLyBObyBkaXNwdXRlIGRhdGEgZXhpc3RzIHlldCAocmVkbyBpcyBhIGRpZmZlcmVudCB0aGluZyksIHNvIHRoZSBjb2x1bW4gc2hvd3MgJ+KAlCcuXHJcbiAgICAgIGRpc3B1dGVzOiB0aGlzLm51bShyPy5kaXNwdXRlcyksXHJcbiAgICAgIHBhc3NNYXJrOiBtYXJrICsgJyUnLFxyXG4gICAgICBzY29yZTogc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IHNjb3JlUGN0ICsgJyUnLFxyXG4gICAgICBzY29yZVBjdCxcclxuICAgICAgcmVzdWx0OiBzY29yZSA9PT0gbnVsbCA/ICfigJQnIDogKHNjb3JlUGN0ID49IG1hcmsgPyAnUGFzcycgOiAnRmFpbCcpLFxyXG4gICAgICByYXc6IHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvVXNlclBlcmYocjogYW55KTogVXNlclBlcmZSb3cge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmFtZTogcj8udXNlck5hbWUgfHwgJ+KAlCcsXHJcbiAgICAgIGVtYWlsOiByPy51c2VyRW1haWwgfHwgJ+KAlCcsXHJcbiAgICAgIGFzc2lnbmVkOiB0aGlzLm51bShyPy5jaGVja0xpc3RDb3VudCkgPz8gMCxcclxuICAgICAgZmxhZ3M6IHRoaXMubnVtKHI/LmZsYWdnZWRDb3VudCkgPz8gMCxcclxuICAgICAgcmVkbzogdGhpcy5udW0ocj8ucmVkbykgPz8gMCxcclxuICAgICAgY29tcGxldGlvbjogdGhpcy5wY3RUZXh0KHI/LmNvbXBsZXRpb24pLFxyXG4gICAgICBjb21wbGlhbmNlOiB0aGlzLnBjdFRleHQocj8uY29tcGxpYW5jZSksXHJcbiAgICAgIHBlcmY6IHRoaXMucGN0VGV4dChyPy5wZXJmb3JtYW5jZSksXHJcbiAgICAgIHJhdzogclxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRhc2sgbW9kZTogdGlsZXMgKyBUYXNrIFBlcmZvcm1hbmNlIHJvd3MgZm9yIHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0cywgaW4gdGhlXHJcbiAgICogY3VycmVudCBzY29wZS4gQSBmYWlsZWQgY2FsbCBsZWF2ZXMgJ+KAlCcgZXZlcnl3aGVyZSBhbmQgcmV0cmllcyB0aGUgbmV4dCB0aW1lIHRoZSBUYXNrIHRhYiBvcGVucy5cclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRUYXNrcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5oZWFkZXJEYXRhKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy50YXNrc1N0YWxlID0gZmFsc2U7XHJcbiAgICB0aGlzLnRhc2tMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSArK3RoaXMudGFza1JlcXVlc3Q7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuYmFzZVBheWxvYWQoKTtcclxuICAgIC8vIFRoZSBlbmRwb2ludCByZWplY3RzIHVua25vd24ga2V5cywgc28gb25seSB0aGUgc2NvcGUgaXMgc2VudC5cclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXREYXNoYm9hcmRUYXNrcyh7XHJcbiAgICAgIGNsaWVudElkOiBzY29wZVsnY2xpZW50SWQnXSwgZnJvbURhdGU6IHNjb3BlWydmcm9tRGF0ZSddLCB0b0RhdGU6IHNjb3BlWyd0b0RhdGUnXSxcclxuICAgICAgc3RvcmVJZDogc2NvcGVbJ3N0b3JlSWQnXSwgdXNlckVtYWlsZXM6IHNjb3BlWyd1c2VyRW1haWxlcyddLCAuLi50aGlzLmF1ZGl0RmlsdGVyKClcclxuICAgIH0pLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy50YXNrUmVxdWVzdCkgeyByZXR1cm47IH1cclxuICAgICAgY29uc3QgZGF0YSA9IHJlcz8uY29kZSA9PT0gMjAwID8gKHJlcy5kYXRhIHx8IG51bGwpIDogbnVsbDtcclxuICAgICAgaWYgKCFkYXRhKSB7IHRoaXMudGFza3NTdGFsZSA9IHRydWU7IH1cclxuICAgICAgdGhpcy50YXNrU3RhdHMgPSB0aGlzLnRvVGFza1N0YXRzKGRhdGEpO1xyXG4gICAgICB0aGlzLnRhc2tQZXJmID0gKGRhdGE/LnRhc2tzIHx8IFtdKS5tYXAoKHQ6IGFueSkgPT4gdGhpcy50b1Rhc2tQZXJmKHQpKTtcclxuICAgICAgdGhpcy5sYXN0UmVmcmVzaGVkID0gZGF5anMoKS5mb3JtYXQoJ2hoOm1tOnNzIEEnKTtcclxuICAgICAgdGhpcy50YXNrTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b1Rhc2tTdGF0cyhkOiBhbnkpOiBUYXNrU3RhdHMge1xyXG4gICAgdGhpcy50YXNrRGVsdGFWYWx1ZXMgPSB7XHJcbiAgICAgIGNvbXBsZXRpb246IHRoaXMubnVtKGQ/LmRlbHRhcz8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMubnVtKGQ/LmRlbHRhcz8uY29tcGxpYW5jZSksXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bShkPy5kZWx0YXM/LmZsYWdzKVxyXG4gICAgfTtcclxuICAgIGlmICghZCkgeyByZXR1cm4geyAuLi5FTVBUWV9UQVNLX1NUQVRTIH07IH1cclxuICAgIGNvbnN0IGNvdW50ID0gKHY6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBuID0gdGhpcy5udW0odik7XHJcbiAgICAgIHJldHVybiBuID09PSBudWxsID8gJ+KAlCcgOiBuLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGRheXMgPSB0aGlzLm51bShkPy5wZXJpb2Q/LnByZXZpb3VzPy5kYXlzKSA/PyAxO1xyXG4gICAgY29uc3QgdnMgPSBkYXlzID09PSAxID8gJ3ZzIGxhc3QgZGF5JyA6ICd2cyBwcmV2aW91cyAnICsgZGF5cyArICcgZGF5cyc7XHJcbiAgICBjb25zdCBkZWx0YSA9ICh2OiBudW1iZXIgfCBudWxsKSA9PiAodiA9PT0gbnVsbCA/ICcnIDogTWF0aC5hYnModikgKyAnJSAnICsgdnMpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYWN0aXZlVGFza3M6IGNvdW50KGQuYWN0aXZlVGFza3MpLFxyXG4gICAgICB0YXNrSW5zdGFuY2VzOiBjb3VudChkLnRhc2tJbnN0YW5jZXMpLFxyXG4gICAgICBub3RTdWJtaXR0ZWQ6IGNvdW50KGQubm90U3VibWl0dGVkKSxcclxuICAgICAgb3BlblRhc2tzOiBjb3VudChkLm9wZW5UYXNrcyksXHJcbiAgICAgIGluUHJvZ3Jlc3M6IGNvdW50KGQuaW5Qcm9ncmVzcyksXHJcbiAgICAgIHN1Ym1pdHRlZDogY291bnQoZC5zdWJtaXR0ZWQpLFxyXG4gICAgICBjb21wbGV0aW9uU2NvcmU6IHRoaXMucGN0VGV4dChkLmNvbXBsZXRpb25TY29yZSksXHJcbiAgICAgIGNvbXBsaWFuY2VTY29yZTogdGhpcy5wY3RUZXh0KGQuY29tcGxpYW5jZVNjb3JlKSxcclxuICAgICAgdG90YWxGbGFnczogY291bnQoZC50b3RhbEZsYWdzKSxcclxuICAgICAgY29tcGxldGlvbkRlbHRhOiBkZWx0YSh0aGlzLnRhc2tEZWx0YVZhbHVlcy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZURlbHRhOiBkZWx0YSh0aGlzLnRhc2tEZWx0YVZhbHVlcy5jb21wbGlhbmNlKSxcclxuICAgICAgZmxhZ3NEZWx0YTogZGVsdGEodGhpcy50YXNrRGVsdGFWYWx1ZXMuZmxhZ3MpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIE9uZSB0YXNrIHJhaXNlZCBmcm9tIGFuIGF1ZGl0OyBjb21wbGlhbmNlIGlzICfigJQnIHdoaWxlIHRhc2sgaW5zdGFuY2VzIGNhcnJ5IG5vIHNjb3JlLiAqL1xyXG4gIHByaXZhdGUgdG9UYXNrUGVyZih0OiBhbnkpOiBUYXNrUGVyZlJvdyB7XHJcbiAgICBjb25zdCBuYW1lID0gdD8udGFza05hbWUgfHwgJ+KAlCc7XHJcbiAgICBjb25zdCBjb21wbGlhbmNlID0gdGhpcy5udW0odD8uY29tcGxpYW5jZSk7XHJcbiAgICBjb25zdCByYWlzZWQgPSB0aGlzLm51bSh0Py50YXNrcyk7XHJcbiAgICBsZXQgc2NoZWR1bGVkID0gJ+KAlCc7XHJcbiAgICBpZiAodD8uc2NoZWR1bGVSZXBlYXRlZFR5cGUpIHtcclxuICAgICAgc2NoZWR1bGVkID0gdGhpcy50aXRsZUNhc2UodC5zY2hlZHVsZVJlcGVhdGVkVHlwZSk7XHJcbiAgICB9IGVsc2UgaWYgKHQ/LmR1ZURhdGUpIHtcclxuICAgICAgc2NoZWR1bGVkID0gJ0R1ZSAnICsgdGhpcy5mbXQodC5kdWVEYXRlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGluaXRpYWxzOiBuYW1lLnNsaWNlKDAsIDIpLnRvVXBwZXJDYXNlKCksXHJcbiAgICAgIHNjaGVkdWxlZCxcclxuICAgICAgY292ZXJhZ2U6IHQ/LmNvdmVyYWdlID8gdGhpcy50aXRsZUNhc2UodC5jb3ZlcmFnZSkgOiAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHQ/LmFzc2lnbmVkKSA/PyAwLFxyXG4gICAgICBzdWJtaXR0ZWQ6IHRoaXMubnVtKHQ/LnN1Ym1pdHRlZCkgPz8gMCxcclxuICAgICAgZmxhZ3M6IHRoaXMubnVtKHQ/LmZsYWdzKSA/PyAwLFxyXG4gICAgICB0YXNrczogcmFpc2VkID09PSBudWxsID8gJ+KAlCcgOiBTdHJpbmcocmFpc2VkKSxcclxuICAgICAgcmVkbzogdGhpcy5udW0odD8ucmVkbykgPz8gMCxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5wY3RUZXh0KGNvbXBsaWFuY2UpLFxyXG4gICAgICBjb21wbGlhbmNlUGN0OiBjb21wbGlhbmNlID09PSBudWxsID8gMCA6IE1hdGgucm91bmQoY29tcGxpYW5jZSksXHJcbiAgICAgIHJhdzogdFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBEZWx0YSBzdHlsaW5nOiBhcnJvdyBkaXJlY3Rpb24sIGFuZCBjb2xvdXIgYnkgd2hldGhlciB0aGUgbW92ZSBpcyBnb29kIChtb3JlIGZsYWdzIGlzIGJhZCkuICovXHJcbiAgdGFza0RlbHRhQ2xhc3Moa2V5OiBUYXNrRGVsdGFLZXkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdiA9IHRoaXMudGFza0RlbHRhVmFsdWVzW2tleV07XHJcbiAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSAwKSB7IHJldHVybiAnaXMtZmxhdCc7IH1cclxuICAgIGNvbnN0IHVwID0gdiA+IDA7XHJcbiAgICBjb25zdCBnb29kID0ga2V5ID09PSAnZmxhZ3MnID8gIXVwIDogdXA7XHJcbiAgICByZXR1cm4gKHVwID8gJ2lzLXVwJyA6ICdpcy1kb3duJykgKyAnICcgKyAoZ29vZCA/ICdpcy1nb29kJyA6ICdpcy1iYWQnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbnVtKHY6IGFueSk6IG51bWJlciB8IG51bGwge1xyXG4gICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09ICcnKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICBjb25zdCBuID0gTnVtYmVyKHYpO1xyXG4gICAgcmV0dXJuIGlzTmFOKG4pID8gbnVsbCA6IG47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBjdFRleHQodjogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLm51bSh2KTtcclxuICAgIHJldHVybiBuID09PSBudWxsID8gJ+KAlCcgOiBNYXRoLnJvdW5kKG4pICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0aXRsZUNhc2Uodjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdi5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmbXQodjogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2ID8gZGF5anModikuZm9ybWF0KCdNTU0gREQsIFlZWVknKSA6ICfigJQnO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJvd3MgYWZ0ZXIgc2VhcmNoLCBzdGF0dXMgYW5kIHNjb3JlLWJhbmQgZmlsdGVycy4gKi9cclxuICBnZXQgZmlsdGVyZWRSb3dzKCk6IEF1ZGl0Um93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuc2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMucm93c1xyXG4gICAgICAuZmlsdGVyKHIgPT4gdGhpcy5zdGF0dXMgPT09ICdhbGwnIHx8IHIuc3RhdHVzID09PSB0aGlzLnN0YXR1cylcclxuICAgICAgLmZpbHRlcihyID0+IHtcclxuICAgICAgICBpZiAoci5zY29yZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2NvcmVNaW4gPT09IDAgJiYgdGhpcy5zY29yZU1heCA9PT0gMTAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBBIGxvd2VyIGJvdW5kIG9mIDAgaXMgb3BlbjogcGVuYWx0eSBzY29yZXMgY2FuIHRha2UgYSBzdG9yZSBiZWxvdyAwJSAoQ3JpdGljYWwpLlxyXG4gICAgICAgIHJldHVybiAodGhpcy5zY29yZU1pbiA8PSAwIHx8IHIuc2NvcmUgPj0gdGhpcy5zY29yZU1pbikgJiYgci5zY29yZSA8PSB0aGlzLnNjb3JlTWF4O1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKHIgPT4gIXEgfHwgW3Iuc3RvcmVJZCwgci5jaXJjbGUsIHIuem9uZSwgci5hb20sIHIucmF3Py5zdG9yZU5hbWUgfHwgJycsIHIucmF3Py5zdG9yZUlkIHx8ICcnXS5zb21lKHYgPT4gU3RyaW5nKHYpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpKVxyXG4gICAgICAuc29ydCgoYSwgYikgPT4gdGhpcy5jb21wYXJlKGEsIGIpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcGFyZShhOiBBdWRpdFJvdywgYjogQXVkaXRSb3cpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZGlyID0gdGhpcy5zb3J0RGlyID09PSAnYXNjJyA/IDEgOiAtMTtcclxuICAgIGlmICh0aGlzLnNvcnRLZXkgPT09ICdzY29yZScpIHtcclxuICAgICAgLy8gTm90LWF1ZGl0ZWQgc3RvcmVzIChubyBzY29yZSkgYWx3YXlzIGNvbWUgYWZ0ZXIgdGhlIGF1ZGl0ZWQgb25lcywgaW4gZWl0aGVyIGRpcmVjdGlvbixcclxuICAgICAgLy8gc28gdGhlIGZldyBhdWRpdGVkIHN0b3JlcyBhcmUgbm90IGJ1cmllZCB1bmRlciB0aG91c2FuZHMgb2YgXCJOb3QgYXVkaXRlZFwiIHJvd3MuXHJcbiAgICAgIGlmIChhLnNjb3JlID09PSBudWxsIHx8IGIuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gYS5zY29yZSA9PT0gYi5zY29yZSA/IDAgOiAoYS5zY29yZSA9PT0gbnVsbCA/IDEgOiAtMSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIChhLnNjb3JlIC0gYi5zY29yZSkgKiBkaXI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhdiA9IFN0cmluZyhhW3RoaXMuc29ydEtleSBhcyBrZXlvZiBBdWRpdFJvd10gPz8gJycpO1xyXG4gICAgY29uc3QgYnYgPSBTdHJpbmcoYlt0aGlzLnNvcnRLZXkgYXMga2V5b2YgQXVkaXRSb3ddID8/ICcnKTtcclxuICAgIHJldHVybiBhdi5sb2NhbGVDb21wYXJlKGJ2KSAqIGRpcjtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCAvIHRoaXMucGFnZVNpemUpKTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlUm93cygpOiBBdWRpdFJvd1tdIHtcclxuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMucGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZTtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLnBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGhhdCBjYXJyeSBhIHNjb3JlIGluIHRoZSBjdXJyZW50IHBlcmlvZC4gKi9cclxuICBwcml2YXRlIGdldCBldmFsdWF0ZWQoKTogQXVkaXRSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc2NvcmUgIT09IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlcyB3aXRoIGEgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QsIHNjb3JlZCBvciBub3QuICovXHJcbiAgcHJpdmF0ZSBnZXQgYXVkaXRlZENvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAnbmEnKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgYXZlcmFnZVNjb3JlKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgZXYgPSB0aGlzLmV2YWx1YXRlZDtcclxuICAgIGlmICghZXYubGVuZ3RoKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChldi5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKHIuc2NvcmUgYXMgbnVtYmVyKSwgMCkgLyBldi5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGtwaXMoKTogQXVkaXRLcGlbXSB7XHJcbiAgICBjb25zdCBldiA9IHRoaXMuZXZhbHVhdGVkO1xyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICBjb25zdCBwYXNzQ291bnQgPSBldi5maWx0ZXIociA9PiAoci5zY29yZSBhcyBudW1iZXIpID49IHRoaXMucGFzc01hcmspLmxlbmd0aDtcclxuICAgIGNvbnN0IGZhaWxDb3VudCA9IGV2Lmxlbmd0aCAtIHBhc3NDb3VudDtcclxuICAgIGNvbnN0IGNyaXRpY2FsID0gZXYuZmlsdGVyKHIgPT4gKHIuc2NvcmUgYXMgbnVtYmVyKSA8IHRoaXMuY3JpdGljYWxNYXJrKS5sZW5ndGg7XHJcbiAgICBjb25zdCBwZXJpb2RMYWJlbCA9IHRoaXMucGVyaW9kTGFiZWw7XHJcbiAgICBjb25zdCBhdWRpdGVkID0gdGhpcy5hdWRpdGVkQ291bnQ7XHJcbiAgICBsZXQgYXZnTm90ZSA9ICdBY3Jvc3MgYXVkaXRlZCBzdG9yZXMnO1xyXG4gICAgaWYgKGF2ZyA9PT0gbnVsbCkge1xyXG4gICAgICBhdmdOb3RlID0gYXVkaXRlZCA/ICdDb21wbGlhbmNlIHNjb3JlIGlzIG9mZiBmb3IgdGhlc2UgYXVkaXRzJyA6ICdObyBhdWRpdHMgaW4gdGhpcyBwZXJpb2QnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ0F2ZXJhZ2Ugc2NvcmUnLFxyXG4gICAgICAgIHZhbHVlOiBhdmcgPT09IG51bGwgPyAn4oCUJyA6IGF2ZyArICclJyxcclxuICAgICAgICBub3RlOiBhdmdOb3RlLFxyXG4gICAgICAgIG5vdGVDb2xvcjogYXZnICE9PSBudWxsICYmIGF2ZyA8IHRoaXMucGFzc01hcmsgPyAnI0Q5MkQyMCcgOiAnIzAyN0E0OCdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnUGFzcyByYXRlJyxcclxuICAgICAgICB2YWx1ZTogZXYubGVuZ3RoID8gTWF0aC5yb3VuZChwYXNzQ291bnQgLyBldi5sZW5ndGggKiAxMDApICsgJyUnIDogJ+KAlCcsXHJcbiAgICAgICAgbm90ZTogcGFzc0NvdW50ICsgJyBwYXNzLCAnICsgZmFpbENvdW50ICsgJyBmYWlsJyxcclxuICAgICAgICBub3RlQ29sb3I6ICcjNjY3MDg1J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdDcml0aWNhbCBzdG9yZXMnLFxyXG4gICAgICAgIHZhbHVlOiBTdHJpbmcoY3JpdGljYWwpLFxyXG4gICAgICAgIG5vdGU6ICdTY29yZSBiZWxvdyAnICsgdGhpcy5jcml0aWNhbE1hcmsgKyAnJScsXHJcbiAgICAgICAgbm90ZUNvbG9yOiBjcml0aWNhbCA/ICcjRDkyRDIwJyA6ICcjNjY3MDg1J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgLy8gU3VibWl0dGVkIGF1ZGl0cywgYXMgdGhlIHRyZW5kIGNvdW50cyB0aGVtOyB0aGUgbm90ZSBnaXZlcyB0aGUgc3RvcmVzIHRoZXkgY292ZXIuXHJcbiAgICAgICAgbGFiZWw6ICdBdWRpdHMgY29tcGxldGVkJyxcclxuICAgICAgICB2YWx1ZTogU3RyaW5nKHRoaXMucm93cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKE51bWJlcihyLnJhdz8uYXVkaXRzKSB8fCAwKSwgMCkpLFxyXG4gICAgICAgIG5vdGU6ICdhdCAnICsgYXVkaXRlZCArICcgb2YgJyArIHRoaXMucm93cy5sZW5ndGggKyAnIHN0b3JlcyBpbiBzY29wZSDCtyAnICsgcGVyaW9kTGFiZWwsXHJcbiAgICAgICAgbm90ZUNvbG9yOiAnIzY2NzA4NSdcclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldCBwZXJpb2RMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJyAmJiB0aGlzLnF1YXJ0ZXIpIHsgcmV0dXJuIHRoaXMucXVhcnRlciArICcgKCcgKyB0aGlzLnF1YXJ0ZXJNb250aHModGhpcy5xdWFydGVyKSArICcpJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm10KHRoaXMuZnJvbSkgKyAnIHRvICcgKyB0aGlzLmZtdCh0aGlzLnRvKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3RyaWJ1dGlvbiBvZiBzdG9yZXMgYWNyb3NzIHNjb3JlIGJhbmRzLiBOb3Qgc2NvcmVkIGlzIGxlZnQgb3V0IChRQSA5IE9jdCksIGFuZCBpdHMgc3RvcmVzXHJcbiAgICogd2l0aCBpdCwgc28gdGhlIHNoYXJlcyBzdGlsbCBhZGQgdXAgdG8gMTAwJS5cclxuICAgKi9cclxuICBnZXQgYmFuZFJvd3MoKTogQXJyYXk8eyBiYW5kOiBBdWRpdEJhbmQ7IGNvdW50OiBudW1iZXI7IHNoYXJlOiBzdHJpbmc7IHdpZHRoOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICd1bnNjb3JlZCcpLmxlbmd0aCB8fCAxO1xyXG4gICAgcmV0dXJuIHRoaXMuYmFuZHMuZmlsdGVyKGJhbmQgPT4gYmFuZC5rZXkgIT09ICd1bnNjb3JlZCcpLm1hcChiYW5kID0+IHtcclxuICAgICAgY29uc3QgY291bnQgPSBTVEFUVVNfQkFORFMuaW5jbHVkZXMoYmFuZC5rZXkpXHJcbiAgICAgICAgPyB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zdGF0dXMgPT09IGJhbmQua2V5KS5sZW5ndGhcclxuICAgICAgICA6IHRoaXMucm93cy5maWx0ZXIociA9PiByLnNjb3JlICE9PSBudWxsICYmIHRoaXMuaW5CYW5kKHIuc2NvcmUgYXMgbnVtYmVyLCBiYW5kKSkubGVuZ3RoO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGJhbmQsXHJcbiAgICAgICAgY291bnQsXHJcbiAgICAgICAgLy8gQSBmZXcgc3RvcmVzIG91dCBvZiB0aG91c2FuZHMgcm91bmQgdG8gMCU7IHNheSBcIjwxJVwiIGluc3RlYWQgb2YgMCUgbmV4dCB0byBhIG5vbi16ZXJvIGNvdW50LlxyXG4gICAgICAgIHNoYXJlOiBjb3VudCAmJiBjb3VudCAvIHRvdGFsICogMTAwIDwgMSA/ICc8MSUnIDogTWF0aC5yb3VuZChjb3VudCAvIHRvdGFsICogMTAwKSArICclJyxcclxuICAgICAgICB3aWR0aDogKGNvdW50IC8gdG90YWwgKiAxMDApICsgJyUnXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBCYW5kIGNvbG91cnMgb2YgYSBzdG9yZSByb3c6IGJ5IHNjb3JlLCBvciB0aGUgTm90IHNjb3JlZCAvIE5vdCBhdWRpdGVkIGJhbmQgd2hlbiBpdCBoYXMgbm9uZS4gKi9cclxuICBiYW5kRm9yKHJvdzogQXVkaXRSb3cpOiBBdWRpdEJhbmQge1xyXG4gICAgY29uc3QgbGFzdCA9IHRoaXMuYmFuZHNbdGhpcy5iYW5kcy5sZW5ndGggLSAxXTtcclxuICAgIGlmIChyb3cuc2NvcmUgPT09IG51bGwpIHsgcmV0dXJuIHRoaXMuYmFuZHMuZmluZChiID0+IGIua2V5ID09PSByb3cuc3RhdHVzKSA/PyBsYXN0OyB9XHJcbiAgICBjb25zdCBzY29yZSA9IHJvdy5zY29yZTtcclxuICAgIHJldHVybiB0aGlzLmJhbmRzLmZpbmQoYiA9PiAhU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGIua2V5KSAmJiB0aGlzLmluQmFuZChzY29yZSwgYikpID8/IGxhc3Q7XHJcbiAgfVxyXG5cclxuICAvKiogQSBzY29yZSBiYW5kJ3MgcmFuZ2U7IHRoZSBsb3dlc3QgYmFuZCAobG8gMCwgQ3JpdGljYWwpIGFsc28gdGFrZXMgbmVnYXRpdmUgc2NvcmVzIChwZW5hbHR5IG9wdGlvbnMpLiAqL1xyXG4gIHByaXZhdGUgaW5CYW5kKHNjb3JlOiBudW1iZXIsIGJhbmQ6IEF1ZGl0QmFuZCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChiYW5kLmxvIDw9IDAgfHwgc2NvcmUgPj0gYmFuZC5sbykgJiYgc2NvcmUgPD0gYmFuZC5oaTtcclxuICB9XHJcblxyXG4gIHN0YXR1c0xhYmVsKHJvdzogQXVkaXRSb3cpOiBzdHJpbmcge1xyXG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdwYXNzJykgeyByZXR1cm4gJ1Bhc3MnOyB9XHJcbiAgICBpZiAocm93LnN0YXR1cyA9PT0gJ2ZhaWwnKSB7IHJldHVybiAnRmFpbCc7IH1cclxuICAgIHJldHVybiByb3cuc3RhdHVzID09PSAndW5zY29yZWQnID8gJ05vdCBzY29yZWQnIDogJ05vdCBhdWRpdGVkJztcclxuICB9XHJcblxyXG4gIC8qKiBCYXIgaGVpZ2h0IGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgY2hhcnQgYXJlYS4gKi9cclxuICBiYXJIZWlnaHQoYmFyOiBUcmVuZEJhcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKGJhci52YWx1ZSA9PT0gbnVsbCA/IDIgOiBNYXRoLm1heCgzLCBiYXIudmFsdWUpKSArICclJztcclxuICB9XHJcblxyXG4gIC8qKiBIb3ZlciBjYXJkIHNpdHMganVzdCBhYm92ZSB0aGUgYmFyJ3MgdmFsdWUgbGFiZWw7IGNhcHBlZCBzbyBhIHRhbGwgYmFyJ3MgY2FyZCBzdGF5cyBpbnNpZGUgdGhlIGNoYXJ0LiAqL1xyXG4gIHRpcEJvdHRvbShiYXI6IFRyZW5kQmFyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGggPSBiYXIudmFsdWUgPT09IG51bGwgPyAyIDogTWF0aC5tYXgoMywgYmFyLnZhbHVlKTtcclxuICAgIHJldHVybiAnY2FsYygnICsgTWF0aC5taW4oaCwgNDUpICsgJyUgKyAyNnB4KSc7XHJcbiAgfVxyXG5cclxuICBiYXJGaWxsKGJhcjogVHJlbmRCYXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGJhci52YWx1ZSA9PT0gbnVsbCkgeyByZXR1cm4gJyNGMkY0RjcnOyB9XHJcbiAgICBjb25zdCBhY3RpdmUgPSBiYXIua2V5ID09PSB0aGlzLnF1YXJ0ZXI7XHJcbiAgICBpZiAoYmFyLnZhbHVlID49IHRoaXMucGFzc01hcmspIHsgcmV0dXJuIGFjdGl2ZSA/ICcjMTU3MEVGJyA6ICcjQjJEREZGJzsgfVxyXG4gICAgcmV0dXJuIGFjdGl2ZSA/ICcjRjA0NDM4JyA6ICcjRkVDRENBJztcclxuICB9XHJcblxyXG4gIHNldEdyYWluKGdyYWluOiAncXVhcnRlcicgfCAnZGF0ZScpOiB2b2lkIHtcclxuICAgIGlmIChncmFpbiA9PT0gdGhpcy5ncmFpbikgeyByZXR1cm47IH1cclxuICAgIHRoaXMuZ3JhaW4gPSBncmFpbjtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICBpZiAoZ3JhaW4gPT09ICdxdWFydGVyJykge1xyXG4gICAgICB0aGlzLmFwcGx5UXVhcnRlcih0aGlzLnF1YXJ0ZXJzLmluY2x1ZGVzKHRoaXMucXVhcnRlcikgPyB0aGlzLnF1YXJ0ZXIgOiB0aGlzLnF1YXJ0ZXJzW3RoaXMucXVhcnRlcnMubGVuZ3RoIC0gMV0sIHRydWUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBCYWNrIHRvIEJ5IGRhdGU6IHRoZSBoZWFkZXIncyByYW5nZSBhZ2Fpbi5cclxuICAgIHRoaXMuZnJvbSA9IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8IHRoaXMuZnJvbTtcclxuICAgIHRoaXMudG8gPSB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgdGhpcy50bztcclxuICAgIHRoaXMucmFuZ2UgPSB0b1BpY2tlclJhbmdlKHRoaXMuZnJvbSwgdGhpcy50byk7XHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc09wZW4pIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gIH1cclxuXHJcbiAgc2V0U3RhdHVzKHN0YXR1czogU3RhdHVzRmlsdGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICBzb3J0Qnkoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNvcnRLZXkgPT09IGtleSkge1xyXG4gICAgICB0aGlzLnNvcnREaXIgPSB0aGlzLnNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNvcnRLZXkgPSBrZXk7XHJcbiAgICAgIHRoaXMuc29ydERpciA9ICdhc2MnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2NvcmUgZGlzdHJpYnV0aW9uIC0+IFZpZXcgc3RvcmVzOiBuYXJyb3cgdGhlIHN0b3JlIGxpc3QgdG8gdGhhdCBiYW5kIChOb3QgYXVkaXRlZCAtPiB0aGVcclxuICAgKiBzdG9yZXMgd2l0aCBubyBzdWJtaXNzaW9uKSBhbmQgYnJpbmcgdGhlIGxpc3QgaW50byB2aWV3LlxyXG4gICAqL1xyXG4gIGFwcGx5QmFuZChiYW5kOiBBdWRpdEJhbmQpOiB2b2lkIHtcclxuICAgIGlmIChTVEFUVVNfQkFORFMuaW5jbHVkZXMoYmFuZC5rZXkpKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJCYW5kKCk7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gYmFuZC5rZXkgYXMgU3RvcmVTdGF0dXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNjb3JlTWluID0gYmFuZC5sbztcclxuICAgICAgdGhpcy5zY29yZU1heCA9IGJhbmQuaGk7XHJcbiAgICAgIHRoaXMuc3RhdHVzID0gJ2FsbCc7XHJcbiAgICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0b3JlTGlzdE9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5saXN0QmFuZEtleSA9IGJhbmQua2V5O1xyXG4gICAgLy8gRnJvbSB0aGUgZHJhd2VyLCBBcHBseSBzY3JvbGxzIG9uY2UgaXQgY2xvc2VzLlxyXG4gICAgaWYgKHRoaXMuZmlsdGVyc09wZW4pIHsgcmV0dXJuOyB9XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZC1zdG9yZS1saXN0Jyk/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckJhbmQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNjb3JlTWluID0gMDtcclxuICAgIHRoaXMuc2NvcmVNYXggPSAxMDA7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIFN0b3JlIGxpc3Qgc3RheXMgaGlkZGVuIHVudGlsIFNjb3JlIGRpc3RyaWJ1dGlvbiAtPiBWaWV3IHN0b3JlcyBvcGVucyBpdCAob3IgdGhlIEZpbHRlcnNcclxuICAgKiBkcmF3ZXIgc2V0cyBhIHNjb3JlIHJhbmdlKTsgdGhlIGNoaXAncyB4IGNsb3NlcyBpdCBhZ2Fpbi5cclxuICAgKi9cclxuICBzdG9yZUxpc3RPcGVuID0gZmFsc2U7XHJcbiAgLyoqIEJhbmQgdGhlIGxpc3Qgd2FzIG9wZW5lZCBmb3IgKCcnID0gYWxsIHN0b3JlcykuICovXHJcbiAgbGlzdEJhbmRLZXkgPSAnJztcclxuXHJcbiAgZ2V0IHNob3dTdG9yZUxpc3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZUxpc3RPcGVuIHx8IHRoaXMuYmFuZEZpbHRlckFjdGl2ZSB8fCB0aGlzLnN0YXR1cyAhPT0gJ2FsbCc7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hpcCBvdmVyIHRoZSBsaXN0OiB0aGUgYmFuZCBvciBzdGF0dXMgaXQgc2hvd3MsIG9yIFwiQWxsIHN0b3Jlc1wiLiAqL1xyXG4gIGdldCBsaXN0Q2hpcExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd1N0b3JlTGlzdCkgeyByZXR1cm4gJyc7IH1cclxuICAgIGlmICh0aGlzLmJhbmRGaWx0ZXJBY3RpdmUpIHsgcmV0dXJuIHRoaXMuYmFuZENoaXBMYWJlbDsgfVxyXG4gICAgY29uc3QgYmFuZCA9IHRoaXMuYmFuZHMuZmluZChiID0+IGIua2V5ID09PSB0aGlzLmxpc3RCYW5kS2V5KTtcclxuICAgIC8vIEEgc2NvcmUgYmFuZCB0aGUgcmFuZ2Ugbm8gbG9uZ2VyIG1hdGNoZXMgaXMgc3RhbGU7IGEgc3RhdHVzIGJhbmQgc3RpbGwgaG9sZHMgd2hpbGUgdGhlIHN0YXR1cyBkb2VzLlxyXG4gICAgaWYgKGJhbmQgJiYgYmFuZC5rZXkgPT09IHRoaXMuc3RhdHVzKSB7IHJldHVybiBiYW5kLmxhYmVsICsgJyDCtyAnICsgYmFuZC5yYW5nZTsgfVxyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzICE9PSAnYWxsJyA/IHRoaXMuc3RhdHVzRmlsdGVyTGFiZWwgOiAnQWxsIHN0b3Jlcyc7XHJcbiAgfVxyXG5cclxuICAvKiogRHJhd2VyIFNjb3JlIHJhbmdlOiB0aGUgYmFuZCB0aGUgY3VycmVudCByYW5nZSAob3Igc3RhdHVzIGJhbmQpIG1hdGNoZXMuICovXHJcbiAgaXNCYW5kT24oYmFuZDogQXVkaXRCYW5kKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGJhbmQua2V5KSkgeyByZXR1cm4gdGhpcy5zdGF0dXMgPT09IGJhbmQua2V5OyB9XHJcbiAgICByZXR1cm4gdGhpcy5zY29yZU1pbiA9PT0gYmFuZC5sbyAmJiB0aGlzLnNjb3JlTWF4ID09PSBiYW5kLmhpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENoaXAgXCJTaG93IGFsbCBzdG9yZXNcIjoga2VlcCB0aGUgbGlzdCBvcGVuLCB3aXRob3V0IHRoZSBiYW5kLiAqL1xyXG4gIHNob3dBbGxTdG9yZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyQmFuZCgpO1xyXG4gICAgdGhpcy5zdGF0dXMgPSAnYWxsJztcclxuICAgIHRoaXMubGlzdEJhbmRLZXkgPSAnJztcclxuICAgIHRoaXMuc3RvcmVMaXN0T3BlbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hpcCB4OiBoaWRlIHRoZSBsaXN0IGFnYWluLiAqL1xyXG4gIGNsb3NlU3RvcmVMaXN0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhckJhbmQoKTtcclxuICAgIHRoaXMuc3RhdHVzID0gJ2FsbCc7XHJcbiAgICB0aGlzLmxpc3RCYW5kS2V5ID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlTGlzdE9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldCBiYW5kRmlsdGVyQWN0aXZlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmVNaW4gIT09IDAgfHwgdGhpcy5zY29yZU1heCAhPT0gMTAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhbmRDaGlwTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGhpdCA9IHRoaXMuYmFuZHMuZmluZChiID0+ICFTVEFUVVNfQkFORFMuaW5jbHVkZXMoYi5rZXkpICYmIGIubG8gPT09IHRoaXMuc2NvcmVNaW4gJiYgYi5oaSA9PT0gdGhpcy5zY29yZU1heCk7XHJcbiAgICByZXR1cm4gaGl0ID8gaGl0LmxhYmVsICsgJyDCtyAnICsgaGl0LnJhbmdlIDogJ1Njb3JlICcgKyB0aGlzLnNjb3JlTWluICsgJ+KAkycgKyB0aGlzLnNjb3JlTWF4ICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBmaXZlIGZpbHRlciBjYXRlZ29yaWVzIHRoZSBkcmF3ZXIgbGlzdHMuICovXHJcbiAgZ2V0IGZpbHRlckNhdHMoKTogRmlsdGVyQ2F0W10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBrZXk6ICdwZXJpb2QnLCBsYWJlbDogJ1BlcmlvZCcsIHZhbHVlOiB0aGlzLnBlcmlvZExhYmVsLCB0aXRsZTogJ1BlcmlvZCcsXHJcbiAgICAgICAgc3ViOiAnU3RhcnRzIGFzIHRoZSBnbG9iYWwgaGVhZGVyIGRhdGUgcmFuZ2U7IHBpY2sgYSByYW5nZSB0byBuYXJyb3cgaXQuJyxcclxuICAgICAgICBkaXJ0eTogZmFsc2UgfSxcclxuICAgICAgeyBrZXk6ICdzY29wZScsIGxhYmVsOiAnU3RvcmUgaGllcmFyY2h5JywgdmFsdWU6IHRoaXMuc2NvcGVMYWJlbCwgdGl0bGU6ICdTdG9yZSBoaWVyYXJjaHknLFxyXG4gICAgICAgIHN1YjogJ1BpY2sgdGhlIGNpcmNsZSwgem9uZSwgQU9NIG9yIHN0b3JlIHRoZSB3aG9sZSBkYXNoYm9hcmQgcmVhZHMuJyxcclxuICAgICAgICBkaXJ0eTogISF0aGlzLmNpcmNsZSB9LFxyXG4gICAgICB7IGtleTogJ3R5cGUnLCBsYWJlbDogJ0F1ZGl0IHR5cGUnLCB2YWx1ZTogdGhpcy5hdWRpdFR5cGVMYWJlbCwgdGl0bGU6ICdBdWRpdCB0eXBlJyxcclxuICAgICAgICBzdWI6ICdXaGljaCBhdWRpdCBwcm9ncmFtbWUgdGhlIHNjb3JlcyBjb21lIGZyb20uJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5hdWRpdFR5cGUgIT09ICdhbGwnIH0sXHJcbiAgICAgIHsga2V5OiAnYmFuZCcsIGxhYmVsOiAnU2NvcmUgcmFuZ2UnLCB2YWx1ZTogdGhpcy5iYW5kQ2hpcExhYmVsLCB0aXRsZTogJ1Njb3JlIHJhbmdlJyxcclxuICAgICAgICBzdWI6ICdUYXAgYSBiYW5kIHRvIHNldCB0aGUgcmFuZ2UgdGhlIHN1bW1hcnkgcmVhZHMuJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5iYW5kRmlsdGVyQWN0aXZlIH0sXHJcbiAgICAgIHsga2V5OiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnLCB2YWx1ZTogdGhpcy5zdGF0dXNGaWx0ZXJMYWJlbCwgdGl0bGU6ICdTdGF0dXMnLFxyXG4gICAgICAgIHN1YjogJ1Nob3cgZXZlcnkgc3RvcmUsIG9yIG9ubHkgdGhlIG9uZXMgdGhhdCBwYXNzZWQgb3IgZmFpbGVkLicsXHJcbiAgICAgICAgZGlydHk6IHRoaXMuc3RhdHVzICE9PSAnYWxsJyB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFjdGl2ZUNhdE9iaigpOiBGaWx0ZXJDYXQge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQ2F0cy5maW5kKGMgPT4gYy5rZXkgPT09IHRoaXMuYWN0aXZlQ2F0KSB8fCB0aGlzLmZpbHRlckNhdHNbMF07XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckNhdHMuZmlsdGVyKGMgPT4gYy5kaXJ0eSkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlcyB0aGUgZHJhd2VyJ3MgaGllcmFyY2h5IHBpY2sgY292ZXJzICh3aGF0IEFwcGx5IHdpbGwgbG9hZCkuICovXHJcbiAgZ2V0IHN0b3Jlc0luU2NvcGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiB0aGlzLm1hdGNoZXNTY29wZShyLCB0aGlzKSkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNvcnRlZCBkaXN0aW5jdCBuYW1lcywgd2l0aG91dCB0aGUgXCLigJRcIiBvZiBzdG9yZXMgb3V0c2lkZSB0aGUgaGllcmFyY2h5LiAqL1xyXG4gIHByaXZhdGUgZGlzdGluY3QodmFsdWVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzLmZpbHRlcih2ID0+IHYgJiYgdiAhPT0gJ+KAlCcpKSkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcclxuICB9XHJcblxyXG4gIGdldCBjaXJjbGVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3RpbmN0KHRoaXMuc2NvcGVSb3dzLm1hcChyID0+IHIuY2lyY2xlKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgem9uZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGluY3QodGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gci5jaXJjbGUgPT09IHRoaXMuY2lyY2xlKS5tYXAociA9PiByLnpvbmUpKTtcclxuICB9XHJcblxyXG4gIGdldCBhb21zKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3RpbmN0KHRoaXMuc2NvcGVSb3dzLmZpbHRlcihyID0+IHIuY2lyY2xlID09PSB0aGlzLmNpcmNsZSAmJiByLnpvbmUgPT09IHRoaXMuem9uZSkubWFwKHIgPT4gci5hb20pKTtcclxuICB9XHJcblxyXG4gIGdldCBzY29wZVJlYWRpbmcoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLnN0b3Jlc0luU2NvcGU7XHJcbiAgICByZXR1cm4gdGhpcy5zY29wZUxhYmVsICsgJyDCtyAnICsgbiArIChuID09PSAxID8gJyBzdG9yZScgOiAnIHN0b3JlcycpO1xyXG4gIH1cclxuXHJcbiAgc2V0TW9kdWxlVGFiKHRhYjogJ0F1ZGl0JyB8ICdUYXNrJyk6IHZvaWQge1xyXG4gICAgaWYgKHRhYiAhPT0gdGhpcy5tb2R1bGVUYWIpIHtcclxuICAgICAgLy8gVGhlIGZpcnN0IFBlcmZvcm1hbmNlIHRhYmxlIGNoYW5nZXMgKEF1ZGl0IC8gVGFzayksIHNvIGl0cyBzb3J0IHN0YXJ0cyBvdmVyLlxyXG4gICAgICB0aGlzLnBlcmZTb3J0S2V5ID0gJyc7XHJcbiAgICAgIHRoaXMucGVyZlNvcnREaXIgPSAnYXNjJztcclxuICAgIH1cclxuICAgIHRoaXMubW9kdWxlVGFiID0gdGFiO1xyXG4gICAgaWYgKHRhYiA9PT0gJ1Rhc2snICYmIHRoaXMudGFza3NTdGFsZSkgeyB0aGlzLmxvYWRUYXNrcygpOyB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2NvcGVMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlID8gdGhpcy5zY29wZVJvd3MuZmluZChyID0+IFN0cmluZyhyLnJhdz8uc3RvcmVJZCkgPT09IHRoaXMuc3RvcmUpIDogdW5kZWZpbmVkO1xyXG4gICAgcmV0dXJuIChzdG9yZSA/IHN0b3JlLnJhdz8uc3RvcmVOYW1lIHx8IHRoaXMuc3RvcmUgOiB0aGlzLnN0b3JlKSB8fCB0aGlzLmFvbSB8fCB0aGlzLnpvbmUgfHwgdGhpcy5jaXJjbGUgfHwgJ0FsbCBzdG9yZXMnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF1ZGl0VHlwZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0ID0gdGhpcy5hdWRpdFR5cGVzLmZpbmQoeCA9PiB4LmtleSA9PT0gdGhpcy5hdWRpdFR5cGUpO1xyXG4gICAgcmV0dXJuIHQgPyB0LmxhYmVsIDogJ0FsbCBBdWRpdHMnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0YXR1c0ZpbHRlckxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdhbGwnKSB7IHJldHVybiAnQWxsIHN0b3Jlcyc7IH1cclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ3Bhc3MnKSB7IHJldHVybiAnUGFzcyBzdG9yZXMnOyB9XHJcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICd1bnNjb3JlZCcpIHsgcmV0dXJuICdOb3Qgc2NvcmVkJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSAnZmFpbCcgPyAnRmFpbCBzdG9yZXMnIDogJ05vdCBhdWRpdGVkJztcclxuICB9XHJcblxyXG4gIG9wZW5GaWx0ZXJzKGNhdD86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5kcmFmdCA9IE9iamVjdC5jcmVhdGUodGhpcykgYXMgQXVkaXRWMkRhc2hib2FyZENvbXBvbmVudDtcclxuICAgIHRoaXMuYWN0aXZlQ2F0ID0gY2F0IHx8IHRoaXMuYWN0aXZlQ2F0O1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDYXQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlQ2F0ID0ga2V5O1xyXG4gIH1cclxuXHJcbiAgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZCA9IHRoaXMuZHJhZnQ7XHJcbiAgICBjb25zdCBwZXJpb2RDaGFuZ2VkID0gISFkICYmIChkLmZyb20gIT09IHRoaXMuZnJvbSB8fCBkLnRvICE9PSB0aGlzLnRvKTtcclxuICAgIGlmIChkKSB7XHJcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzIGFzIGFueTtcclxuICAgICAgQXVkaXRWMkRhc2hib2FyZENvbXBvbmVudC5EUkFGVF9LRVlTLmZvckVhY2goayA9PiB7IHNlbGZba10gPSAoZCBhcyBhbnkpW2tdOyB9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IHNjb3BlQ2hhbmdlZCA9IHRoaXMuY29tbWl0U2NvcGUoKTtcclxuICAgIHRoaXMuZHJhZnQgPSBudWxsO1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIGlmIChwZXJpb2RDaGFuZ2VkIHx8IHNjb3BlQ2hhbmdlZCkgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgICAvLyBTY29yZSByYW5nZSBhbmQgU3RhdHVzIG9ubHkgZmlsdGVyIHRoZSBzdG9yZSBsaXN0LCBzbyBzaG93IGl0LlxyXG4gICAgaWYgKHRoaXMuYmFuZEZpbHRlckFjdGl2ZSB8fCB0aGlzLnN0YXR1cyAhPT0gJ2FsbCcpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWQtc3RvcmUtbGlzdCcpPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE1ha2UgdGhlIGRyYXdlcidzIGhpZXJhcmNoeSArIGF1ZGl0IHR5cGUgdGhlIGxvYWRlZCBvbmVzOyB0cnVlIHdoZW4gdGhleSBkaWZmZXIgZnJvbSBiZWZvcmUuICovXHJcbiAgcHJpdmF0ZSBjb21taXRTY29wZSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGEgPSB0aGlzLmFwcGxpZWQ7XHJcbiAgICBjb25zdCBjaGFuZ2VkID0gYS5jaXJjbGUgIT09IHRoaXMuY2lyY2xlIHx8IGEuem9uZSAhPT0gdGhpcy56b25lIHx8IGEuYW9tICE9PSB0aGlzLmFvbSB8fCBhLnN0b3JlICE9PSB0aGlzLnN0b3JlXHJcbiAgICAgIHx8IGEuYXVkaXRUeXBlICE9PSB0aGlzLmF1ZGl0VHlwZTtcclxuICAgIHRoaXMuYXBwbGllZCA9IHsgY2lyY2xlOiB0aGlzLmNpcmNsZSwgem9uZTogdGhpcy56b25lLCBhb206IHRoaXMuYW9tLCBzdG9yZTogdGhpcy5zdG9yZSwgYXVkaXRUeXBlOiB0aGlzLmF1ZGl0VHlwZSB9O1xyXG4gICAgcmV0dXJuIGNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogQ2FuY2VsIC8geCAvIGJhY2tkcm9wOiB0aGUgZHJhZnQgaXMgZHJvcHBlZDsgdGhlIHBhZ2UgbmV2ZXIgY2hhbmdlZC4gKi9cclxuICBjYW5jZWxGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kcmFmdCA9IG51bGw7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzZXQgZXZlcnkgZmlsdGVyIHRvIHRoZSBkb2N1bWVudGVkIGRlZmF1bHRzLiAqL1xyXG4gIGNsZWFyQWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hdWRpdFR5cGUgPSAnYWxsJztcclxuICAgIHRoaXMuZ3JhaW4gPSAnZGF0ZSc7XHJcbiAgICB0aGlzLmNpcmNsZSA9ICcnO1xyXG4gICAgdGhpcy56b25lID0gJyc7XHJcbiAgICB0aGlzLmFvbSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgdGhpcy5zY29yZU1pbiA9IDA7XHJcbiAgICB0aGlzLnNjb3JlTWF4ID0gMTAwO1xyXG4gICAgdGhpcy5zdGF0dXMgPSAnYWxsJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICAvLyBUaGUgY2hpcHMnIENsZWFyIGFsbCAoZHJhd2VyIGNsb3NlZCkgcmVsb2FkcyBub3c7IGluc2lkZSB0aGUgZHJhd2VyLCBBcHBseSBkb2VzLlxyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuICYmIHRoaXMuY29tbWl0U2NvcGUoKSkgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICAvKiogQ2hhbmdpbmcgYSBsZXZlbCBjbGVhcnMgdGhlIGxldmVscyBiZWxvdyBpdC4gKi9cclxuICBvbkNpcmNsZUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuem9uZSA9ICcnO1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICBvblpvbmVDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFvbSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIG9uQW9tQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIHJlc2V0U2NvcGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNpcmNsZSA9ICcnO1xyXG4gICAgdGhpcy56b25lID0gJyc7XHJcbiAgICB0aGlzLmFvbSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZSBkcm9wZG93bjogdGhlIHN0b3JlcyBvZiB0aGUgcGlja2VkIEFPTSwgYnkgbmFtZSAodmFsdWUgPSBzdG9yZUlkKS4gKi9cclxuICBnZXQgc3RvcmVQaWNrT3B0aW9ucygpOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3Qgc3RvcmVzID0gdGhpcy5zY29wZVJvd3NcclxuICAgICAgLmZpbHRlcihyID0+IHRoaXMubWF0Y2hlc1Njb3BlKHIsIHsgY2lyY2xlOiB0aGlzLmNpcmNsZSwgem9uZTogdGhpcy56b25lLCBhb206IHRoaXMuYW9tLCBzdG9yZTogJycgfSkpXHJcbiAgICAgIC5tYXAociA9PiAoeyB2YWx1ZTogU3RyaW5nKHIucmF3Py5zdG9yZUlkIHx8ICcnKSwgbGFiZWw6IFN0cmluZyhyLnJhdz8uc3RvcmVOYW1lIHx8ICfigJQnKSB9KSlcclxuICAgICAgLmZpbHRlcihvID0+IG8udmFsdWUpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxhYmVsLmxvY2FsZUNvbXBhcmUoYi5sYWJlbCkpO1xyXG4gICAgcmV0dXJuIFt7IHZhbHVlOiAnJywgbGFiZWw6ICdBbGwgc3RvcmVzJyB9XS5jb25jYXQoc3RvcmVzKTtcclxuICB9XHJcblxyXG4gIC8qKiBPcHRpb25zIGZvciB0aGUgZHJhd2VyJ3MgY3VzdG9tIGRyb3Bkb3ducyAobGliLWF1ZGl0LXYyLXNlbGVjdCk6IFwiQWxsIOKAplwiIGZpcnN0LCB0aGVuIHRoZSBsaXN0LiAqL1xyXG4gIHBpY2tPcHRpb25zKGxpc3Q6IHN0cmluZ1tdLCBhbGw6IHN0cmluZyk6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XHJcbiAgICByZXR1cm4gW3sgdmFsdWU6ICcnLCBsYWJlbDogYWxsIH1dLmNvbmNhdCgobGlzdCB8fCBbXSkubWFwKHYgPT4gKHsgdmFsdWU6IHYsIGxhYmVsOiB2IH0pKSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGZpcnN0IHBlcmZvcm1hbmNlIHRhYiBpcyBuYW1lZCBhZnRlciB0aGUgYWN0aXZlIG1vZHVsZS4gKi9cclxuICBnZXQgcGVyZlRhYnNGb3JNb2R1bGUoKTogQXJyYXk8J0F1ZGl0JyB8ICdTdG9yZScgfCAnVXNlcic+IHtcclxuICAgIHJldHVybiB0aGlzLnBlcmZUYWJzO1xyXG4gIH1cclxuXHJcbiAgcGVyZlRhYkRpc3BsYXkodGFiOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICh0YWIgPT09ICdBdWRpdCcgPyB0aGlzLm1vZHVsZVRhYiA6IHRhYikgKyAnIFBlcmZvcm1hbmNlJztcclxuICB9XHJcblxyXG4gIGdldCBwZXJmSW5mb1RpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnU3RvcmUnKSB7IHJldHVybiAnU3RvcmVzIEluZm8nOyB9XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnVXNlcicpIHsgcmV0dXJuICdVc2VyIEluZm8nOyB9XHJcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVUYWIgKyAnIEluZm8nO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmZDcmVhdGVMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICcrIENyZWF0ZSAnICsgdGhpcy5tb2R1bGVUYWI7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNUYXNrTW9kdWxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kdWxlVGFiID09PSAnVGFzayc7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRUYXNrUGVyZigpOiBUYXNrUGVyZlJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBlcmZTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0UGVyZlJvd3MocSA/IHRoaXMudGFza1BlcmYuZmlsdGVyKHIgPT4gci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy50YXNrUGVyZiwgdGhpcy50YXNrU29ydFZhbHVlKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJmVGFzayhfOiBudW1iZXIsIHJvdzogVGFza1BlcmZSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5yYXc/LnRhc2tJZCB8fCByb3cubmFtZTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgc2VsZWN0ZWQgdHJlbmQgYnVja2V0IGRyaXZlcyB0aGUgaGVhZGxpbmUgc2NvcmUgYWJvdmUgdGhlIGNoYXJ0LiAqL1xyXG4gIHByaXZhdGUgZ2V0IGZvY3VzQmFyKCk6IFRyZW5kQmFyIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicpIHsgcmV0dXJuIHRoaXMucXVhcnRlclRyZW5kLmZpbmQoYiA9PiBiLmtleSA9PT0gdGhpcy5xdWFydGVyKTsgfVxyXG4gICAgcmV0dXJuIHRoaXMudHJlbmQuZmluZChiID0+IGIua2V5ID09PSB0aGlzLnF1YXJ0ZXIpIHx8IHRoaXMudHJlbmRbMF07XHJcbiAgfVxyXG5cclxuICBnZXQgZm9jdXNTY29yZSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYiA9IHRoaXMuZm9jdXNCYXI7XHJcbiAgICBpZiAoYiAmJiBiLnZhbHVlICE9PSBudWxsKSB7IHJldHVybiBiLnZhbHVlICsgJyUnOyB9XHJcbiAgICAvLyBXaXRoIG5vIHRyZW5kIGJ1Y2tldHMsIHRoZSBoZWFkbGluZSBpcyB0aGUgcGVyaW9kIGF2ZXJhZ2UuXHJcbiAgICBjb25zdCBhdmcgPSB0aGlzLmF2ZXJhZ2VTY29yZTtcclxuICAgIHJldHVybiBhdmcgPT09IG51bGwgPyAn4oCUJyA6IGF2ZyArICclJztcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c1Bhc3NlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGIgPSB0aGlzLmZvY3VzQmFyO1xyXG4gICAgaWYgKGIgJiYgYi52YWx1ZSAhPT0gbnVsbCkgeyByZXR1cm4gYi52YWx1ZSA+PSB0aGlzLnBhc3NNYXJrOyB9XHJcbiAgICBjb25zdCBhdmcgPSB0aGlzLmF2ZXJhZ2VTY29yZTtcclxuICAgIHJldHVybiBhdmcgIT09IG51bGwgJiYgYXZnID49IHRoaXMucGFzc01hcms7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9jdXNTdGF0dXMoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGIgPSB0aGlzLmZvY3VzQmFyO1xyXG4gICAgY29uc3QgaGFzID0gKGIgJiYgYi52YWx1ZSAhPT0gbnVsbCkgfHwgdGhpcy5hdmVyYWdlU2NvcmUgIT09IG51bGw7XHJcbiAgICBpZiAoIWhhcykgeyByZXR1cm4gJ05vIGRhdGEnOyB9XHJcbiAgICByZXR1cm4gdGhpcy5mb2N1c1Bhc3NlZCA/ICdQYXNzJyA6ICdCZWxvdyBwYXNzIG1hcmsnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzTGluZSgpOiBzdHJpbmcge1xyXG4gICAgLy8gU3VibWl0dGVkIGF1ZGl0cywgYXMgdGhlIGJhcnMgY291bnQgdGhlbSAoXCIxMCBhdWRpdHNcIik7IGF1ZGl0ZWRDb3VudCBjb3VudHMgYXVkaXRlZCBzdG9yZXMuXHJcbiAgICBjb25zdCBuID0gdGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInXHJcbiAgICAgID8gKHRoaXMuZm9jdXNCYXI/LnN1Ym1pdHRlZCA/PyAwKVxyXG4gICAgICA6IHRoaXMudHJlbmQucmVkdWNlKChzdW0sIGIpID0+IHN1bSArIChiLnN1Ym1pdHRlZCB8fCAwKSwgMCk7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJpb2RMYWJlbCArICcgwrcgJyArIG4gKyAobiA9PT0gMSA/ICcgYXVkaXQgY29tcGxldGVkJyA6ICcgYXVkaXRzIGNvbXBsZXRlZCcpXHJcbiAgICAgICsgJyDCtyBwYXNzIG1hcmsgJyArIHRoaXMucGFzc01hcmsgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBzZXRQZXJmVGFiKHRhYjogJ0F1ZGl0JyB8ICdTdG9yZScgfCAnVXNlcicpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlRhYiA9IHRhYjtcclxuICAgIHRoaXMucGVyZlNlYXJjaCA9ICcnO1xyXG4gICAgdGhpcy5wZXJmU29ydEtleSA9ICcnO1xyXG4gICAgdGhpcy5wZXJmU29ydERpciA9ICdhc2MnO1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBpbiB0aGUgb3BlbiBwZXJmb3JtYW5jZSB0YWJsZSBhZnRlciBzZWFyY2ggLyBzb3J0ICh3aGF0IHRoZSBwYWdlciBjb3VudHMpLiAqL1xyXG4gIGdldCBwZXJmVG90YWwoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdBdWRpdCcpIHsgcmV0dXJuIHRoaXMuaXNUYXNrTW9kdWxlID8gdGhpcy5maWx0ZXJlZFRhc2tQZXJmLmxlbmd0aCA6IHRoaXMuZmlsdGVyZWRBdWRpdFBlcmYubGVuZ3RoOyB9XHJcbiAgICByZXR1cm4gdGhpcy5wZXJmVGFiID09PSAnU3RvcmUnID8gdGhpcy5maWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGggOiB0aGlzLmZpbHRlcmVkVXNlclBlcmYubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjdXJyZW50IHBhZ2Ugb2YgYSBwZXJmb3JtYW5jZSB0YWJsZTsgYSBzZWFyY2ggdGhhdCBzaHJpbmtzIHRoZSBsaXN0IHB1bGxzIHRoZSBwYWdlIGJhY2sgaW50byByYW5nZS4gKi9cclxuICBwZXJmUGFnZU9mPFQ+KGxpc3Q6IFRbXSk6IFRbXSB7XHJcbiAgICBjb25zdCBwYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsaXN0Lmxlbmd0aCAvIHRoaXMucGVyZlBhZ2VTaXplKSk7XHJcbiAgICBjb25zdCBwYWdlID0gTWF0aC5taW4odGhpcy5wZXJmUGFnZSwgcGFnZXMpO1xyXG4gICAgcmV0dXJuIGxpc3Quc2xpY2UoKHBhZ2UgLSAxKSAqIHRoaXMucGVyZlBhZ2VTaXplLCBwYWdlICogdGhpcy5wZXJmUGFnZVNpemUpO1xyXG4gIH1cclxuXHJcbiAgb25QZXJmUGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBhZ2UgPSBOdW1iZXIocGFnZSkgfHwgMTtcclxuICB9XHJcblxyXG4gIG9uUGVyZlBhZ2VTaXplKHNpemU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGFnZVNpemUgPSBOdW1iZXIoc2l6ZSkgfHwgMTA7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBBIG5ldyBzZWFyY2ggc3RhcnRzIG9uIHBhZ2UgMS4gKi9cclxuICBvblBlcmZTZWFyY2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBQZXJmb3JtYW5jZSBoZWFkZXIgY2xpY2s6IHNvcnQgYnkgdGhhdCBjb2x1bW4sIGFnYWluIHRvIHJldmVyc2UgKHNhbWUgdG9nZ2xlIGFzIHRoZSBzdG9yZSBsaXN0KS4gKi9cclxuICBzb3J0UGVyZihrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGVyZlNvcnRLZXkgPT09IGtleSkge1xyXG4gICAgICB0aGlzLnBlcmZTb3J0RGlyID0gdGhpcy5wZXJmU29ydERpciA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucGVyZlNvcnRLZXkgPSBrZXk7XHJcbiAgICAgIHRoaXMucGVyZlNvcnREaXIgPSAnYXNjJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJvd3MgaW4gdGhlIHBpY2tlZCBjb2x1bW4gb3JkZXIgKHRoZSBBUEkncyBvcmRlciB3aGVuIG5vbmUgaXMgcGlja2VkKS4gTnVtYmVycyBjb21wYXJlIGFzIG51bWJlcnMsIHRleHRcclxuICAgKiBjYXNlLWluc2Vuc2l0aXZlbHk7IGVtcHR5IHZhbHVlcyAoJ+KAlCcpIHN0YXkgYXQgdGhlIGJvdHRvbSBpbiBib3RoIGRpcmVjdGlvbnMsIGFzIGluIHRoZSBzdG9yZSBsaXN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydFBlcmZSb3dzPFQ+KHJvd3M6IFRbXSwgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCAocjogVCkgPT4gU29ydFZhbHVlPik6IFRbXSB7XHJcbiAgICBjb25zdCBnZXQgPSB2YWx1ZXNbdGhpcy5wZXJmU29ydEtleV07XHJcbiAgICBpZiAoIWdldCkgeyByZXR1cm4gcm93czsgfVxyXG4gICAgY29uc3QgZGlyID0gdGhpcy5wZXJmU29ydERpciA9PT0gJ2FzYycgPyAxIDogLTE7XHJcbiAgICBjb25zdCBlbXB0eSA9ICh2OiBTb3J0VmFsdWUpID0+IHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09ICcnIHx8IHYgPT09ICfigJQnO1xyXG4gICAgcmV0dXJuIFsuLi5yb3dzXS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGF2ID0gZ2V0KGEpO1xyXG4gICAgICBjb25zdCBidiA9IGdldChiKTtcclxuICAgICAgaWYgKGVtcHR5KGF2KSB8fCBlbXB0eShidikpIHsgcmV0dXJuIGVtcHR5KGF2KSA9PT0gZW1wdHkoYnYpID8gMCA6IChlbXB0eShhdikgPyAxIDogLTEpOyB9XHJcbiAgICAgIGlmICh0eXBlb2YgYXYgPT09ICdudW1iZXInICYmIHR5cGVvZiBidiA9PT0gJ251bWJlcicpIHsgcmV0dXJuIChhdiAtIGJ2KSAqIGRpcjsgfVxyXG4gICAgICByZXR1cm4gU3RyaW5nKGF2KS5sb2NhbGVDb21wYXJlKFN0cmluZyhidiksIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlLCBzZW5zaXRpdml0eTogJ2Jhc2UnIH0pICogZGlyO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogU3VibWl0dGVkIGNvdW50IC0+IHRoZSBHYWxsZXJ5IG9uIHRoaXMgYXVkaXQncyBzdWJtaXNzaW9ucyBpbiB0aGUgZGFzaGJvYXJkIHBlcmlvZC4gKi9cclxuICBzdWJtaXR0ZWRQYXJhbXMocm93OiBBdWRpdFBlcmZSb3cpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGF1ZGl0OiBTdHJpbmcocm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCB8fCAnJyksXHJcbiAgICAgIGZyb206IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSB8fCAnJyxcclxuICAgICAgdG86IHRoaXMudG8gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFRhc2sgU3VibWl0dGVkIGNvdW50IC0+IHRoZSBHYWxsZXJ5IHdpdGggVHlwZSBUYXNrIG9uIHRoaXMgdGFzaydzIHN1Ym1pc3Npb25zIGluIHRoZSBkYXNoYm9hcmQgcGVyaW9kLiAqL1xyXG4gIHRhc2tTdWJtaXR0ZWRQYXJhbXMocm93OiBUYXNrUGVyZlJvdyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYXVkaXQ6IFN0cmluZyhyb3cucmF3Py50YXNrSWQgfHwgJycpLFxyXG4gICAgICB0eXBlOiAndGFzaycsXHJcbiAgICAgIGZyb206IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSB8fCAnJyxcclxuICAgICAgdG86IHRoaXMudG8gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXVkaXQgLyBzdG9yZSAvIHVzZXIgZGV0YWlsIGxpbms6IHRoZSBzdWJqZWN0IHBsdXMgdGhlIGRhc2hib2FyZCBwZXJpb2QgKGZyb20gLyB0byksIHNvIHRoZSBkZXRhaWxcclxuICAgKiBwYWdlIHNob3dzIHRoZSBzYW1lIGRheXMgYXMgdGhlIHJvdyBjbGlja2VkLCBub3QgdGhlIGhlYWRlciByYW5nZSAodGhlIGRhc2hib2FyZCBrZWVwcyBpdHMgb3duIHBlcmlvZCkuXHJcbiAgICovXHJcbiAgZGV0YWlsUGFyYW1zKHN1YmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLnN1YmplY3QsXHJcbiAgICAgIGZyb206IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSB8fCAnJyxcclxuICAgICAgdG86IHRoaXMudG8gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcGVyZlRhYkxhYmVsKHRhYjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0YWIgKyAnIFBlcmZvcm1hbmNlJztcclxuICB9XHJcblxyXG4gIGdldCBwZXJmU2VhcmNoUGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHsgcmV0dXJuICdTZWFyY2ggYnkgU3RvcmUgTmFtZSc7IH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykgeyByZXR1cm4gJ1NlYXJjaCBieSBVc2VyIE5hbWUnOyB9XHJcbiAgICByZXR1cm4gJ1NlYXJjaCBieSAnICsgdGhpcy5tb2R1bGVUYWI7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRBdWRpdFBlcmYoKTogQXVkaXRQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy5hdWRpdFBlcmYuZmlsdGVyKHIgPT4gci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy5hdWRpdFBlcmYsIHRoaXMuYXVkaXRTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkU3RvcmVQZXJmKCk6IFN0b3JlUGVyZlJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBlcmZTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0UGVyZlJvd3MocSA/IHRoaXMuc3RvcmVQZXJmLmZpbHRlcihyID0+IChyLnN0b3JlICsgJyAnICsgci5zcG9jKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMuc3RvcmVQZXJmLCB0aGlzLnN0b3JlU29ydFZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFVzZXJQZXJmKCk6IFVzZXJQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy51c2VyUGVyZi5maWx0ZXIociA9PiAoci5uYW1lICsgJyAnICsgci5lbWFpbCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLnVzZXJQZXJmLCB0aGlzLnVzZXJTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZBdWRpdChfOiBudW1iZXIsIHJvdzogQXVkaXRQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93Lm5hbWU7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZlN0b3JlKF86IG51bWJlciwgcm93OiBTdG9yZVBlcmZSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5zdG9yZUlkIHx8IHJvdy5zdG9yZTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJmVXNlcihfOiBudW1iZXIsIHJvdzogVXNlclBlcmZSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5lbWFpbDtcclxuICB9XHJcblxyXG4gIG9uUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZSA9IE51bWJlcihwYWdlKSB8fCAxO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBOdW1iZXIoc2l6ZSkgfHwgMTA7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVN0b3JlKF86IG51bWJlciwgcm93OiBBdWRpdFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnN0b3JlSWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBmaWx0ZXJDYXRzIC8gYmFuZFJvd3MgYXJlIGdldHRlcnMgdGhhdCBidWlsZCBuZXcgb2JqZWN0cyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uLiBXaXRob3V0IGEga2V5XHJcbiAgICogbmdGb3IgcmVidWlsZHMgdGhlaXIgYnV0dG9ucyBvbiBlYWNoIHBhc3MsIGFuZCBhIHBhc3MgYmV0d2VlbiBtb3VzZWRvd24gYW5kIG1vdXNldXAgKHRoZSBoaWVyYXJjaHlcclxuICAgKiBkcm9wZG93biBsaXN0ZW5zIHRvIGRvY3VtZW50Om1vdXNlZG93bikgc3dhbGxvd3MgdGhlIGNsaWNrLlxyXG4gICAqL1xyXG4gIHRyYWNrQnlDYXQoXzogbnVtYmVyLCBjOiBGaWx0ZXJDYXQpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGMua2V5O1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeUJhbmQoXzogbnVtYmVyLCBiOiB7IGJhbmQ6IEF1ZGl0QmFuZCB9KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBiLmJhbmQua2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gRXhwb3J0IChjbGllbnQtc2lkZSAueGxzeCBvZiBleGFjdGx5IHRoZSBmaWx0ZXJlZCByb3dzIGFuZCB2aXNpYmxlIGNvbHVtbnMpIC0tLS0gKi9cclxuXHJcbiAgcHJpdmF0ZSBnZXQgZXhwb3J0UGVyaW9kKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5mcm9tICsgJ18nICsgdGhpcy50bztcclxuICB9XHJcblxyXG4gIC8qKiBIZWFkZXIgRXhwb3J0OiB0aGUgc3RvcmUgbGlzdCBiZWxvdyB0aGUgZmlsdGVycywgZXZlcnkgZmlsdGVyZWQgcm93IChhbGwgcGFnZXMpLCBpdHMgdmlzaWJsZSBjb2x1bW5zLiAqL1xyXG4gIGV4cG9ydFN0b3JlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmZpbHRlcmVkUm93cztcclxuICAgIGlmICh0aGlzLmxvYWRpbmcgfHwgIXJvd3MubGVuZ3RoKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPEF1ZGl0Um93PltdID0gdGhpcy5oZWFkZXJzLm1hcChoID0+ICh7XHJcbiAgICAgIGhlYWRlcjogaC5sYWJlbCxcclxuICAgICAgdmFsdWU6IChyOiBBdWRpdFJvdykgPT4ge1xyXG4gICAgICAgIGlmIChoLmtleSA9PT0gJ3Njb3JlJykgeyByZXR1cm4gci5zY29yZSA9PT0gbnVsbCA/ICfigJQnIDogci5zY29yZSArICclJzsgfVxyXG4gICAgICAgIGlmIChoLmtleSA9PT0gJ3N0YXR1cycpIHsgcmV0dXJuIHRoaXMuc3RhdHVzTGFiZWwocik7IH1cclxuICAgICAgICByZXR1cm4gcltoLmtleSBhcyBrZXlvZiBBdWRpdFJvd107XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3gocm93cywgY29sdW1ucywgJ0F1ZGl0LURhc2hib2FyZC1TdG9yZXMtJyArIHRoaXMuZXhwb3J0UGVyaW9kLCAnU3RvcmUgbGlzdCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJvd3Mgb2YgdGhlIGFjdGl2ZSBwZXJmb3JtYW5jZSB0YWIgYWZ0ZXIgaXRzIHNlYXJjaCAod2hhdCB0aGUgXCJUb3RhbFwiIGNvdW50ZXIgc2hvd3MpLiAqL1xyXG4gIGdldCBwZXJmUm93Q291bnQoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHsgcmV0dXJuIHRoaXMuZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoOyB9XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnVXNlcicpIHsgcmV0dXJuIHRoaXMuZmlsdGVyZWRVc2VyUGVyZi5sZW5ndGg7IH1cclxuICAgIHJldHVybiB0aGlzLmlzVGFza01vZHVsZSA/IHRoaXMuZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGggOiB0aGlzLmZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYWN0aXZlIHBlcmZvcm1hbmNlIHRhYiBpcyBzdGlsbCBsb2FkaW5nICh0aGUgVGFzayB0YWJsZSBoYXMgaXRzIG93biBmZWVkKS4gKi9cclxuICBnZXQgcGVyZkxvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJmVGFiID09PSAnQXVkaXQnICYmIHRoaXMuaXNUYXNrTW9kdWxlID8gdGhpcy50YXNrTG9hZGluZyA6IHRoaXMubG9hZGluZztcclxuICB9XHJcblxyXG4gIC8qKiBQZXJmb3JtYW5jZSBFeHBvcnQ6IHRoZSBhY3RpdmUgdGFiJ3MgZmlsdGVyZWQgbGlzdCB3aXRoIGl0cyB2aXNpYmxlIGNvbHVtbiBoZWFkZXJzIChBY3Rpb24gbGVmdCBvdXQpLiAqL1xyXG4gIGV4cG9ydFBlcmZvcm1hbmNlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGVyZkxvYWRpbmcgfHwgIXRoaXMucGVyZlJvd0NvdW50KSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgcGVyaW9kID0gdGhpcy5leHBvcnRQZXJpb2Q7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnU3RvcmUnKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxTdG9yZVBlcmZSb3c+W10gPSBbXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdG9yZSBOYW1lJywgdmFsdWU6IHIgPT4gci5zdG9yZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnU3RvcmUgU3BvYycsIHZhbHVlOiByID0+IHIuc3BvYyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQnLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgPz8gJ+KAlCcgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsZXRpb24gJScsIHZhbHVlOiByID0+IHIuY29tcGxldGlvbiB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdQZXJmb3JtYW5jZSAlJywgdmFsdWU6IHIgPT4gci5wZXJmIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkU3RvcmVQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVN0b3JlLVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdTdG9yZSBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnVXNlcicpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFVzZXJQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnVXNlciBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdFbWFpbCcsIHZhbHVlOiByID0+IHIuZW1haWwgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0Fzc2lnbmVkJywgdmFsdWU6IHIgPT4gci5hc3NpZ25lZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnRmxhZ3MnLCB2YWx1ZTogciA9PiByLmZsYWdzIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdSZURvJywgdmFsdWU6IHIgPT4gci5yZWRvIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb21wbGV0aW9uICUnLCB2YWx1ZTogciA9PiByLmNvbXBsZXRpb24gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsaWFuY2UgJScsIHZhbHVlOiByID0+IHIuY29tcGxpYW5jZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUGVyZm9ybWFuY2UgJScsIHZhbHVlOiByID0+IHIucGVyZiB9XHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZFVzZXJQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVVzZXItUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1VzZXIgUGVyZm9ybWFuY2UnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNUYXNrTW9kdWxlKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxUYXNrUGVyZlJvdz5bXSA9IFtcclxuICAgICAgICB7IGhlYWRlcjogJ1Rhc2sgTmFtZScsIHZhbHVlOiByID0+IHIubmFtZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnU2NoZWR1bGVkJywgdmFsdWU6IHIgPT4gci5zY2hlZHVsZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvdmVyYWdlJywgdmFsdWU6IHIgPT4gci5jb3ZlcmFnZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQgVG8nLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdWJtaXR0ZWQnLCB2YWx1ZTogciA9PiByLnN1Ym1pdHRlZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnRmxhZ3MnLCB2YWx1ZTogciA9PiByLmZsYWdzIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdUYXNrcycsIHZhbHVlOiByID0+IHIudGFza3MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1JlRG8nLCB2YWx1ZTogciA9PiByLnJlZG8gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1F1ZXN0aW9uIENvbXBsaWFuY2UgJScsIHZhbHVlOiByID0+IHIuY29tcGxpYW5jZSB9XHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZFRhc2tQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVRhc2stUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1Rhc2sgUGVyZm9ybWFuY2UnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPEF1ZGl0UGVyZlJvdz5bXSA9IFtcclxuICAgICAgeyBoZWFkZXI6ICdBdWRpdCBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQgVG8nLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnU3VibWl0dGVkJywgdmFsdWU6IHIgPT4gci5zdWJtaXR0ZWQgfSxcclxuICAgICAgeyBoZWFkZXI6ICdEaXNwdXRlcycsIHZhbHVlOiByID0+IHIuZGlzcHV0ZXMgPz8gJ+KAlCcgfSxcclxuICAgICAgeyBoZWFkZXI6ICdQYXNzIE1hcmsnLCB2YWx1ZTogciA9PiByLnBhc3NNYXJrIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnU2NvcmUnLCB2YWx1ZTogciA9PiByLnNjb3JlIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnUmVzdWx0JywgdmFsdWU6IHIgPT4gci5yZXN1bHQgfVxyXG4gICAgXTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZEF1ZGl0UGVyZiwgY29sdW1ucywgJ0F1ZGl0LURhc2hib2FyZC1BdWRpdC1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnQXVkaXQgUGVyZm9ybWFuY2UnKTtcclxuICB9XHJcblxyXG4gIC8qKiAtLS0tIFBlci1zdG9yZSBQREYgLS0tLSAqL1xyXG5cclxuICAvKiogVGhlIHN0b3JlJ3MgbGF0ZXN0IHN1Ym1pdHRlZCBhdWRpdCBpbiB0aGUgcGVyaW9kICh0aGUgZGFzaGJvYXJkIEFQSSdzIGxhc3RWaXNpdElkKSwgaWYgYW55LiAqL1xyXG4gIHBkZlZpc2l0SWQocm93OiBBdWRpdFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8ubGFzdFZpc2l0SWQgPyBTdHJpbmcocm93LnJhdy5sYXN0VmlzaXRJZCkgOiAnJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNhbWUgUERGIGRvd25sb2FkIGFzIHRoZSBkZXRhaWwgcGFnZXMnIERvd25sb2FkLCBmb3IgdGhlIHN0b3JlJ3MgbGF0ZXN0IHN1Ym1pdHRlZCBhdWRpdDpcclxuICAgKiBxdWV1ZWQsIHRoZW4gbGlzdGVkIHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMuXHJcbiAgICovXHJcbiAgZG93bmxvYWRQZGYocm93OiBBdWRpdFJvdyk6IHZvaWQge1xyXG4gICAgY29uc3QgdmlzaXRJZCA9IHRoaXMucGRmVmlzaXRJZChyb3cpO1xyXG4gICAgaWYgKCF2aXNpdElkIHx8IHRoaXMucGRmUXVldWVkLmhhcyh2aXNpdElkKSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucGRmUXVldWVkLmFkZCh2aXNpdElkKTtcclxuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcclxuICAgIGNvbnN0IHN0b3JlSWQgPSByb3cucmF3Py5zdG9yZUlkIHx8IHJvdy5zdG9yZUlkO1xyXG4gICAgLy8gVGhlIGRvd25sb2FkIG5hbWUgaXMgbWF0Y2hlZCBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzZXJ2ZXItc2lkZSwgc28gbGVhdmUgcmVnZXggY2hhcmFjdGVycyBvdXQuXHJcbiAgICBjb25zdCBuYW1lID0gU3RyaW5nKHJvdy5yYXc/LnN0b3JlTmFtZSB8fCBzdG9yZUlkKS5yZXBsYWNlKC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZywgJyAnKS50cmltKCkgKyAnIGF1ZGl0JztcclxuICAgIHRoaXMudHJheFNlcnZpY2UucmVwb3J0VGFibGVFeHBvcnQoe1xyXG4gICAgICBmcm9tRGF0ZTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlLFxyXG4gICAgICB0b0RhdGU6IHRoaXMudG8gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlLFxyXG4gICAgICBjaGVja2xpc3RJZDogW3Zpc2l0SWRdLFxyXG4gICAgICBzb3VyY2VDaGVja0xpc3RfaWQ6ICcnLFxyXG4gICAgICBjaGVja2xpc3ROYW1lOiBuYW1lLFxyXG4gICAgICBmaWxlVHlwZTogJ3BkZicsXHJcbiAgICAgIHN0b3JlSWRzOiBbc3RvcmVJZF0sXHJcbiAgICAgIHVzZXJJZDogdXNlcj8uX2lkLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIGRvd25sb2FkSW5zZXJ0RnJvbTogJ2Rhc2hib2FyZCcsXHJcbiAgICAgIGluc2VydFR5cGU6ICdjaGVja2xpc3QnLFxyXG4gICAgICBjaGVja0xpc3RUeXBlOiAnY3VzdG9tJ1xyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMucGRmUXVldWVkLmRlbGV0ZSh2aXNpdElkKTtcclxuICAgICAgICBpZiAocmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdEb3dubG9hZGluZyB5b3VyIHJlcG9ydC4gRmluZCBpdCB1bmRlciBOb3RpZmljYXRpb25zID4gRG93bmxvYWRzLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHtcclxuICAgICAgICB0aGlzLnBkZlF1ZXVlZC5kZWxldGUodmlzaXRJZCk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTb21ldGhpbmcgd2VudCB3cm9uZyEnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhdjItcGFnZSBhdWRpdC1kYXNoXCI+XHJcblxyXG4gIDwhLS0gUmVmcmVzaCBsaW5lICsgbW9kdWxlIHN3aXRjaCAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZGItdG9wbGluZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXJlZnJlc2hcIj5MYXN0IHJlZnJlc2hlZCBhdCB7eyBsYXN0UmVmcmVzaGVkIH19PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2R1bGVzd2l0Y2hcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtb2R1bGV0YWJcIiAqbmdGb3I9XCJsZXQgdCBvZiBtb2R1bGVUYWJzXCIgW2NsYXNzLm1vZHVsZXRhYi1vbl09XCJtb2R1bGVUYWIgPT09IHRcIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRNb2R1bGVUYWIodClcIj57eyB0IH19PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gQVVESVQgU0NPUkVDQVJEID09PT09PT09PT09PSAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGFza01vZHVsZVwiPlxyXG5cclxuICAgIDwhLS0gQ3J1bWIsIHNjb3BlIHRpdGxlLCBhY3Rpb25zIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXNjb3BlYmFyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zY29wZXRleHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY3J1bWJcIj5BdWRpdHMg4oC6IERhc2hib2FyZDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zY29wZVwiPnt7IHNjb3BlTGFiZWwgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIChjbGljayk9XCJvcGVuRmlsdGVycygpXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjRcIiB5MT1cIjdcIiB4Mj1cIjIwXCIgeTI9XCI3XCI+PC9saW5lPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCI3XCIgeTE9XCIxMlwiIHgyPVwiMTdcIiB5Mj1cIjEyXCI+PC9saW5lPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxMFwiIHkxPVwiMTdcIiB4Mj1cIjE0XCIgeTI9XCIxN1wiPjwvbGluZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICBGaWx0ZXJzXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jb3VudHBpbGxcIiAqbmdJZj1cImZpbHRlckNvdW50XCI+e3sgZmlsdGVyQ291bnQgfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiBbZGlzYWJsZWRdPVwibG9hZGluZyB8fCAhZmlsdGVyZWRSb3dzLmxlbmd0aFwiXHJcbiAgICAgICAgdGl0bGU9XCJEb3dubG9hZCB0aGUgc3RvcmUgbGlzdCBiZWxvdyBhcyBhbiBFeGNlbCBmaWxlXCIgKGNsaWNrKT1cImV4cG9ydFN0b3JlcygpXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTEyIDE2VjRcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNyA5IDEyIDQgMTcgOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTQgMTZ2NGgxNnYtNFwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICBFeHBvcnRcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEZpbHRlciBjaGlwcyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1jaGlwc1wiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLWNoaXBcIiAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJDYXRzOyB0cmFja0J5OiB0cmFja0J5Q2F0XCIgW2NsYXNzLmlzLWRpcnR5XT1cImMuZGlydHlcIlxyXG4gICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVycyhjLmtleSlcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoaXAtbGFiZWxcIj57eyBjLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hpcC12YWx1ZVwiPnt7IGMudmFsdWUgfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLWNsZWFyYWxsXCIgKm5nSWY9XCJmaWx0ZXJDb3VudFwiIChjbGljayk9XCJjbGVhckFsbCgpXCI+Q2xlYXIgYWxsPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEtQSSB0aWxlcyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1rcGlzXCI+XHJcbiAgICAgIDwhLS0gT2xkIENoZWNrbGlzdCBzdW1tYXJ5IGNhcmQ6IGZpZ3VyZSArIGxhYmVsIGluIHRoZSBncmFkaWVudCBzdHJpcCwgbm90ZSBiZWxvdy4gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmRcIiAqbmdGb3I9XCJsZXQga3BpIG9mIGtwaXNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWhlYWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtY291bnRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBkYi1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sga3BpLnZhbHVlIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtdGV4dFwiPnt7IGtwaS5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtYm9keVwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS1ub3RlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nXCIgY2xhc3M9XCJhdjItb2NhcmQtbm90ZVwiIFtzdHlsZS5jb2xvcl09XCJrcGkubm90ZUNvbG9yXCI+e3sga3BpLm5vdGUgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFRyZW5kICsgZGlzdHJpYnV0aW9uIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLWR1b1wiPlxyXG4gICAgICA8IS0tIFRyZW5kIC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImRiLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1oZWFkIGRiLWNhcmQtaGVhZC0td3JhcFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtdGl0bGUgZGItY2FyZC10aXRsZS0tZ3Jvd1wiPkF1ZGl0IHNjb3JlIHRyZW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2VnXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItc2VnLXRhYlwiIFtjbGFzcy5pcy1vbl09XCJncmFpbiA9PT0gJ3F1YXJ0ZXInXCIgKGNsaWNrKT1cInNldEdyYWluKCdxdWFydGVyJylcIj5RdWFydGVybHk8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1zZWctdGFiXCIgW2NsYXNzLmlzLW9uXT1cImdyYWluID09PSAnZGF0ZSdcIiAoY2xpY2spPVwic2V0R3JhaW4oJ2RhdGUnKVwiPkJ5IGRhdGU8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItZGF0ZXJvd1wiICpuZ0lmPVwiZ3JhaW4gPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1kYXRlcGlja1wiPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWljb25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cmVjdCB4PVwiM1wiIHk9XCI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCIyXCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTZcIiB5MT1cIjJcIiB4Mj1cIjE2XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiOFwiIHkxPVwiMlwiIHgyPVwiOFwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjNcIiB5MT1cIjEwXCIgeDI9XCIyMVwiIHkyPVwiMTBcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWlucHV0IGRiLWRhdGVyYW5nZVwiIG5neERhdGVyYW5nZXBpY2tlck1kIHJlYWRvbmx5IGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGF0ZSByYW5nZVwiIFsobmdNb2RlbCldPVwicmFuZ2VcIiBbbG9jYWxlXT1cInBpY2tlckxvY2FsZVwiIFttYXhEYXRlXT1cInRvZGF5XCJcclxuICAgICAgICAgICAgICBbcmFuZ2VzXT1cInJhbmdlc1wiIFtzaG93Q3VzdG9tUmFuZ2VMYWJlbF09XCJ0cnVlXCIgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtrZWVwQ2FsZW5kYXJPcGVuaW5nV2l0aFJhbmdlXT1cInRydWVcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJmYWxzZVwiIFtkcm9wc109XCInZG93bidcIiBbb3BlbnNdPVwiJ3JpZ2h0J1wiXHJcbiAgICAgICAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJvblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHJlbmRMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgYXYyLXNrLS1ibG9jayBkYi1zay1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0cmVuZExvYWRpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItZm9jdXNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtc2NvcmVcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1Njb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1mb2N1cy1waWxsXCIgW2NsYXNzLmlzLXBhc3NdPVwiZm9jdXNQYXNzZWRcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1N0YXR1cyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtbGluZVwiPnt7IGZvY3VzTGluZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZ2VuZFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1sZWdlbmQtZGFzaFwiPjwvc3Bhbj5QYXNzIG1hcmsge3sgcGFzc01hcmsgfX0lXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0LXlcIj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MFwiPjEwMCU8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOjUwJVwiPjUwJTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MTAwJVwiPjAlPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnQtYXJlYVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWdyaWRsaW5lXCIgc3R5bGU9XCJ0b3A6MFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjUwJVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjEwMCVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGFzc2xpbmVcIiBbc3R5bGUudG9wLiVdPVwiMTAwIC0gcGFzc01hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYXJzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhci1jb2xcIiAqbmdGb3I9XCJsZXQgYmFyIG9mIHRyZW5kQmFyczsgbGV0IGZpcnN0ID0gZmlyc3Q7IGxldCBsYXN0ID0gbGFzdFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhci12YWx1ZVwiIFtjbGFzcy5pcy1hY3RpdmVdPVwiYmFyLmtleSA9PT0gcXVhcnRlclwiIFtzdHlsZS5ib3R0b21dPVwiYmFySGVpZ2h0KGJhcilcIj5cclxuICAgICAgICAgICAgICAgICAge3sgYmFyLnZhbHVlID09PSBudWxsID8gJ+KAlCcgOiBiYXIudmFsdWUgKyAnJScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFyXCIgW3N0eWxlLmhlaWdodF09XCJiYXJIZWlnaHQoYmFyKVwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhckZpbGwoYmFyKVwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwXCIgW2NsYXNzLmlzLXN0YXJ0XT1cImZpcnN0ICYmICFsYXN0XCIgW2NsYXNzLmlzLWVuZF09XCJsYXN0ICYmICFmaXJzdFwiIFtzdHlsZS5ib3R0b21dPVwidGlwQm90dG9tKGJhcilcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1oZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgYmFyLmxhYmVsIH19PHNwYW4gY2xhc3M9XCJkYi10aXAtc3ViXCIgKm5nSWY9XCJncmFpbiA9PT0gJ3F1YXJ0ZXInXCI+IMK3IHt7IHF1YXJ0ZXJNb250aHMoYmFyLmtleSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLXNjb3JlXCIgKm5nSWY9XCJiYXIudmFsdWUgIT09IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRpcC1kb3RcIiBbY2xhc3MuaXMtZmFpbF09XCJiYXIudmFsdWUgPCBwYXNzTWFya1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRpcC12YWx1ZVwiPnt7IGJhci52YWx1ZSB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtc3RhdHVzXCIgW2NsYXNzLmlzLWZhaWxdPVwiYmFyLnZhbHVlIDwgcGFzc01hcmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGJhci52YWx1ZSA+PSBwYXNzTWFyayA/ICdQYXNzJyA6ICdCZWxvdyBwYXNzIG1hcmsnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1lbXB0eVwiICpuZ0lmPVwiYmFyLnZhbHVlID09PSBudWxsXCI+Tm8gc2NvcmVkIGF1ZGl0czwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLXJvd1wiPjxzcGFuPkF1ZGl0cyBjb21wbGV0ZWQ8L3NwYW4+PGI+e3sgYmFyLnN1Ym1pdHRlZCB9fTwvYj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIiAqbmdJZj1cImJhci5jb3VudCAhPT0gYmFyLnN1Ym1pdHRlZFwiPjxzcGFuPlNjb3JlZCBhdWRpdHM8L3NwYW4+PGI+e3sgYmFyLmNvdW50IH19PC9iPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLXJvd1wiPjxzcGFuPlBhc3MgbWFyazwvc3Bhbj48Yj57eyBwYXNzTWFyayB9fSU8L2I+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnQteFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGFydC14Y29sXCIgKm5nRm9yPVwibGV0IGJhciBvZiB0cmVuZEJhcnNcIiBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGxhYmVsXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJiYXIua2V5ID09PSBxdWFydGVyXCI+e3sgYmFyLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoYXJ0LXhjb3VudFwiPnt7IGJhci5zdWJtaXR0ZWQgPyBiYXIuc3VibWl0dGVkICsgJyBhdWRpdHMnIDogJ25vIGF1ZGl0cycgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDwhLS0gU2NvcmUgYmFuZHMgLS0+XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGItY2FyZCBkYi1jYXJkLS10aWdodFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLWhlYWQgZGItY2FyZC1oZWFkLS1iYXNlbGluZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtdGl0bGUgZGItY2FyZC10aXRsZS0tZ3Jvd1wiPlNjb3JlIGRpc3RyaWJ1dGlvbjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtc3ViXCI+e3sgc3RvcmVzSW5TY29wZSB9fSBpbiBzY29wZTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPlN0b3JlcyBieSBzY29yZSBiYW5kLCB7eyBwZXJpb2RMYWJlbCB9fTwvZGl2PlxyXG5cclxuICAgICAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJsb2FkaW5nXCIgW3Jvd3NdPVwiMlwiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYW5kYmFyXCIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICAgICAgPCEtLSBBIGJhbmQgd2l0aCBzdG9yZXMga2VlcHMgYSB2aXNpYmxlIHNsaXZlciAoMiBvZiAzNTc2IHN0b3JlcyBpcyB1bmRlciBhIHBpeGVsKTsgdGhlIGxhcmdlc3QgYmFuZCBnaXZlcyB3YXkuIC0tPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kc2VnXCIgKm5nRm9yPVwibGV0IGIgb2YgYmFuZFJvd3M7IHRyYWNrQnk6IHRyYWNrQnlCYW5kXCIgW3N0eWxlLndpZHRoXT1cImIud2lkdGhcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiLmJhbmQuc29mdFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5oYXMtc3RvcmVzXT1cImIuY291bnQgPiAwXCIgW3RpdGxlXT1cImIuYmFuZC5sYWJlbCArICc6ICcgKyBiLmNvdW50XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZHJvd3NcIiAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZHJvd1wiICpuZ0Zvcj1cImxldCBiIG9mIGJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRkb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiLmJhbmQuc29mdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kbGFiZWxcIj57eyBiLmJhbmQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHJhbmdlXCI+e3sgYi5iYW5kLnJhbmdlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRjb3VudFwiPnt7IGIuY291bnQgfX0ge3sgYi5jb3VudCA9PT0gMSA/ICdzdG9yZScgOiAnc3RvcmVzJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kc2hhcmVcIj57eyBiLnNoYXJlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRiLWJhbmRsaW5rXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJzdG9yZUxpc3RPcGVuICYmIGxpc3RCYW5kS2V5ID09PSBiLmJhbmQua2V5XCIgKGNsaWNrKT1cImFwcGx5QmFuZChiLmJhbmQpXCI+VmlldyBzdG9yZXM8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZGhpbnRcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFzaG93U3RvcmVMaXN0XCI+Q2xpY2sgPGI+VmlldyBzdG9yZXM8L2I+IG9uIGEgYmFuZCB0byBsaXN0IGl0cyBzdG9yZXMuPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU3RvcmUgbGVkZ2VyOiBvcGVuZWQgZnJvbSBTY29yZSBkaXN0cmlidXRpb24gLT4gVmlldyBzdG9yZXMgKG9yIGEgRmlsdGVycyBzY29yZSByYW5nZSkgLS0+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImRiLWNhcmQgZGItY2FyZC0tdGFibGVcIiBpZD1cImFkLXN0b3JlLWxpc3RcIiAqbmdJZj1cInNob3dTdG9yZUxpc3RcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZGdlci1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZGdlci10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC10aXRsZVwiPlN0b3JlIGxpc3Q8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPlxyXG4gICAgICAgICAgICB7eyBmaWx0ZXJlZFJvd3MubGVuZ3RoIH19IHt7IGZpbHRlcmVkUm93cy5sZW5ndGggPT09IDEgPyAnc3RvcmUnIDogJ3N0b3JlcycgfX0gwrcge3sgcGVyaW9kTGFiZWwgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRmaWx0ZXJcIiAqbmdJZj1cImxpc3RDaGlwTGFiZWxcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kY2hpcFwiPlxyXG4gICAgICAgICAgICAgIHt7IGxpc3RDaGlwTGFiZWwgfX1cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRjaGlwLXhcIiB0aXRsZT1cIkNsb3NlIHRoZSBzdG9yZSBsaXN0XCIgKGNsaWNrKT1cImNsb3NlU3RvcmVMaXN0KClcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI5XCIgaGVpZ2h0PVwiOVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjNcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItYmFuZGxpbmtcIiAoY2xpY2spPVwic2hvd0FsbFN0b3JlcygpXCI+U2hvdyBhbGwgc3RvcmVzPC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXYyLXNlYXJjaCBkYi1zZWFyY2hcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cclxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgIDxsaW5lIHgxPVwiMTYuNVwiIHkxPVwiMTYuNVwiIHgyPVwiMjFcIiB5Mj1cIjIxXCI+PC9saW5lPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJzZWFyY2hcIiAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaCgpXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBzdG9yZSBvciBvd25lclwiXHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VnbWVudGVkXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlZ3RhYlwiIFtjbGFzcy5zZWd0YWItb25dPVwic3RhdHVzID09PSAnYWxsJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ2FsbCcpXCI+QWxsPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlZ3RhYlwiIFtjbGFzcy5zZWd0YWItb25dPVwic3RhdHVzID09PSAnZmFpbCdcIiAoY2xpY2spPVwic2V0U3RhdHVzKCdmYWlsJylcIj5GYWlsPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlZ3RhYlwiIFtjbGFzcy5zZWd0YWItb25dPVwic3RhdHVzID09PSAncGFzcydcIiAoY2xpY2spPVwic2V0U3RhdHVzKCdwYXNzJylcIj5QYXNzPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlZ3RhYlwiIFtjbGFzcy5zZWd0YWItb25dPVwic3RhdHVzID09PSAndW5zY29yZWQnXCIgKGNsaWNrKT1cInNldFN0YXR1cygndW5zY29yZWQnKVwiXHJcbiAgICAgICAgICAgIHRpdGxlPVwiQXVkaXRlZCwgYnV0IGNvbXBsaWFuY2Ugc2NvcmUgaXMgb2ZmIGZvciB0aGUgYXVkaXRzXCI+Tm90IHNjb3JlZDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ25hJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ25hJylcIj5Ob3QgYXVkaXRlZDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cImxvYWRpbmdcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXRhYmxlXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGggb2YgaGVhZGVyc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInNvcnRLZXkgPT09IGgua2V5XCIgKGNsaWNrKT1cInNvcnRCeShoLmtleSlcIj5cclxuICAgICAgICAgICAgICAgIHt7IGgubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSBoLmtleVwiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj5cclxuICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGFnZVJvd3M7IHRyYWNrQnk6IHRyYWNrQnlTdG9yZVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImRiLW5vd3JhcFwiPnt7IHJvdy5kYXRlIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXN0b3JlaWRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCB9KVwiPnt7IHJvdy5zdG9yZUlkIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LmNpcmNsZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LnpvbmUgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPnt7IHJvdy5hb20gfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGlsbFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhbmRGb3Iocm93KS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJiYW5kRm9yKHJvdykuZmdcIj5cclxuICAgICAgICAgICAgICAgICAge3sgcm93LnNjb3JlID09PSBudWxsID8gJ+KAlCcgOiByb3cuc2NvcmUgKyAnJScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGlsbFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhbmRGb3Iocm93KS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJiYW5kRm9yKHJvdykuZmdcIj5cclxuICAgICAgICAgICAgICAgICAge3sgc3RhdHVzTGFiZWwocm93KSB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBBIHN0b3JlIHJvdyBzcGFucyBzZXZlcmFsIGF1ZGl0cywgc28gVmlldyBvcGVucyB0aGlzIHN0b3JlJ3MgYXVkaXQgZGV0YWlsIChzYW1lIGFzIHRoZSBpZCBsaW5rKS4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItdmlld2J0blwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQgfSlcIiB0aXRsZT1cIlZpZXcgdGhpcyBzdG9yZSdzIGF1ZGl0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgVmlld1xyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gUERGIG9mIHRoZSBzdG9yZSdzIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQgaW4gdGhlIHBlcmlvZCAocXVldWVkLCB0aGVuIHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMpLiAtLT5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1wZGZidG5cIiByb2xlPVwiYnV0dG9uXCIgW2NsYXNzLmlzLWRpc2FibGVkXT1cIiFwZGZWaXNpdElkKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIXBkZlZpc2l0SWQocm93KVwiIChjbGljayk9XCJkb3dubG9hZFBkZihyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwicGRmVmlzaXRJZChyb3cpID8gJ0Rvd25sb2FkIHRoZSBQREYgcmVwb3J0IG9mIHRoZSBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0IGZvciB0aGlzIHN0b3JlJyA6ICdObyBzdWJtaXR0ZWQgYXVkaXQgZm9yIHRoaXMgc3RvcmUgaW4gdGhpcyBwZXJpb2QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA0djEyXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgMTEgMTIgMTYgMTcgMTFcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDIwaDE2XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhcGFnZVJvd3MubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj5ObyBzdG9yZXMgbWF0Y2ggdGhlIGN1cnJlbnQgZmlsdGVycy48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIFNoYXJlZCBwYWdlciAoMTAgLyAyMCAvIDMwKSwgYXMgb24gdGhlIG90aGVyIGF1ZGl0IGxpc3RzLiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtcGFnZXJcIiAqbmdJZj1cImZpbHRlcmVkUm93cy5sZW5ndGhcIj5cclxuICAgICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJwYWdlU2l6ZVwiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnZVNpemVzXCJcclxuICAgICAgICAgIFtjdXJyZW50UGFnZV09XCJwYWdlXCIgW3RvdGFsSXRlbXNdPVwiZmlsdGVyZWRSb3dzLmxlbmd0aFwiIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IFRBU0sgU1VNTUFSWSA9PT09PT09PT09PT0gLS0+XHJcbiAgPCEtLSBUYXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0cywgaW4gdGhlIGhlYWRlciBzY29wZSAoc2hpbW1lciB2YWx1ZXMgd2hpbGUgbG9hZGluZykuIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJkYi1zdGF0c1wiICpuZ0lmPVwiaXNUYXNrTW9kdWxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYmlnXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBkYi1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMuYWN0aXZlVGFza3MgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1sYWJlbFwiPkFjdGl2ZSB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLnRhc2tJbnN0YW5jZXMgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+e3sgbW9kdWxlVGFiIH19IEluc3RhbmNlczwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1iaWdcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5ub3RTdWJtaXR0ZWQgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1sYWJlbFwiPk5vdCBTdWJtaXR0ZWQge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYm9keSBkYi1zdGF0LWJvZHktLTJcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbWlkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMub3BlblRhc2tzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPk9wZW4ge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5pblByb2dyZXNzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPkluIFByb2dyZXNzIHt7IG1vZHVsZVRhYiB9fXM8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYmlnXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBkYi1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMuc3VibWl0dGVkIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbGFiZWxcIj5TdWJtaXR0ZWQge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYm9keSBkYi1zdGF0LWJvZHktLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1jZWxsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5jb21wbGV0aW9uU2NvcmUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+Q29tcGxldGlvbiBTY29yZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtZGVsdGFcIiAqbmdJZj1cIiF0YXNrTG9hZGluZyAmJiB0YXNrU3RhdHMuY29tcGxldGlvbkRlbHRhXCIgW25nQ2xhc3NdPVwidGFza0RlbHRhQ2xhc3MoJ2NvbXBsZXRpb24nKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjQgNiAxMCAxMiAxNCA4IDIwIDE2XCI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTYgMjAgMTYgMjAgMTFcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyB0YXNrU3RhdHMuY29tcGxldGlvbkRlbHRhIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1jZWxsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5jb21wbGlhbmNlU2NvcmUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+Q29tcGxpYW5jZSBTY29yZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtZGVsdGFcIiAqbmdJZj1cIiF0YXNrTG9hZGluZyAmJiB0YXNrU3RhdHMuY29tcGxpYW5jZURlbHRhXCIgW25nQ2xhc3NdPVwidGFza0RlbHRhQ2xhc3MoJ2NvbXBsaWFuY2UnKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjQgNiAxMCAxMiAxNCA4IDIwIDE2XCI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTYgMjAgMTYgMjAgMTFcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyB0YXNrU3RhdHMuY29tcGxpYW5jZURlbHRhIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1jZWxsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWQgaXMtdW5kZXJsaW5lXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMudG90YWxGbGFncyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj5Ub3RhbCBGbGFnczwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtZGVsdGFcIiAqbmdJZj1cIiF0YXNrTG9hZGluZyAmJiB0YXNrU3RhdHMuZmxhZ3NEZWx0YVwiIFtuZ0NsYXNzXT1cInRhc2tEZWx0YUNsYXNzKCdmbGFncycpXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNCA2IDEwIDEyIDE0IDggMjAgMTZcIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9XCIxNSAxNiAyMCAxNiAyMCAxMVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IHRhc2tTdGF0cy5mbGFnc0RlbHRhIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gUEVSRk9STUFOQ0UgPT09PT09PT09PT09IC0tPlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwiZGItcGVyZlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXBlcmZ0YWJzXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItcGVyZnRhYlwiICpuZ0Zvcj1cImxldCB0IG9mIHBlcmZUYWJzXCIgW2NsYXNzLmlzLW9uXT1cInBlcmZUYWIgPT09IHRcIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRQZXJmVGFiKHQpXCI+e3sgcGVyZlRhYkRpc3BsYXkodCkgfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLWhlYWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtdGV4dFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLXRpdGxlXCI+XHJcbiAgICAgICAgICB7eyBwZXJmSW5mb1RpdGxlIH19XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRvdGFsXCI+XHJcbiAgICAgICAgICAgIHt7IHBlcmZUYWIgPT09ICdBdWRpdCcgPyAoaXNUYXNrTW9kdWxlID8gZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGggOiBmaWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGgpIDogKHBlcmZUYWIgPT09ICdTdG9yZScgPyBmaWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGggOiBmaWx0ZXJlZFVzZXJQZXJmLmxlbmd0aCkgfX0gVG90YWxcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj57eyBwZXJmUGVyaW9kIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiYXYyLXNlYXJjaCBkYi1wZXJmLXNlYXJjaFwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiMTYuNVwiIHkxPVwiMTYuNVwiIHgyPVwiMjFcIiB5Mj1cIjIxXCI+PC9saW5lPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJwZXJmU2VhcmNoUGxhY2Vob2xkZXJcIiBbKG5nTW9kZWwpXT1cInBlcmZTZWFyY2hcIiAobmdNb2RlbENoYW5nZSk9XCJvblBlcmZTZWFyY2goKVwiPlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiBbZGlzYWJsZWRdPVwicGVyZkxvYWRpbmcgfHwgIXBlcmZSb3dDb3VudFwiXHJcbiAgICAgICAgdGl0bGU9XCJEb3dubG9hZCB0aGlzIHRhYmxlIGFzIGFuIEV4Y2VsIGZpbGVcIiAoY2xpY2spPVwiZXhwb3J0UGVyZm9ybWFuY2UoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0xMiAxNlY0XCI+PC9wYXRoPlxyXG4gICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgOSAxMiA0IDE3IDlcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk00IDE2djRoMTZ2LTRcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRXhwb3J0XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gZGItY3JlYXRlXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnQXVkaXQnICYmIGFjY2Vzcy5jYW5BZGRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL21hbmFnZVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTEyIDV2MTRNNSAxMmgxNFwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICB7eyBwZXJmQ3JlYXRlTGFiZWwgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJwZXJmTG9hZGluZ1wiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwZXJmTG9hZGluZ1wiPlxyXG4gICAgPCEtLSBBdWRpdCBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiAhaXNUYXNrTW9kdWxlXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLWF1ZGl0XCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2YgYXVkaXRQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRBdWRpdFBlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZkF1ZGl0XCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1hdmF0YXJcIj57eyByb3cuaW5pdGlhbHMgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCB9KVwiPnt7IHJvdy5uYW1lIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDwhLS0gT3BlbnMgdGhlIEdhbGxlcnkgb24gdGhpcyBhdWRpdCdzIHN1Ym1pc3Npb25zIGluIHRoZSBkYXNoYm9hcmQgcGVyaW9kLiAtLT5cclxuICAgICAgICAgICAgICA8YSAqbmdJZj1cInJvdy5zdWJtaXR0ZWRcIiBjbGFzcz1cImRiLXVsaW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9nYWxsZXJ5XCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJzdWJtaXR0ZWRQYXJhbXMocm93KVwiIHRpdGxlPVwiVmlldyB0aGUgc3VibWl0dGVkIGF1ZGl0cyBpbiB0aGUgR2FsbGVyeVwiPnt7IHJvdy5zdWJtaXR0ZWQgfX08L2E+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93LnN1Ym1pdHRlZFwiPjA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwhLS0gRGlzcHV0ZXMgYXJlIG5vdCByZWNvcmRlZCB5ZXQgKHRoZSBzdG9yZS10ZWFtIGRpc3B1dGUgZmxvdyBpcyBub3QgYnVpbHQpLCBzbyBubyBjb3VudCBhbmQgbm8gbGluay4gLS0+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5kaXNwdXRlcyA9PT0gbnVsbFwiIGNsYXNzPVwiYXYyLWZhaW50XCIgdGl0bGU9XCJEaXNwdXRlcyBhcmUgbm90IHJlY29yZGVkIHlldFwiPuKAlDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5kaXNwdXRlcyAhPT0gbnVsbFwiPnt7IHJvdy5kaXNwdXRlcyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5wYXNzTWFyayB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LnNjb3JlID09PSAn4oCUJ1wiXHJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwicm93LnNjb3JlID09PSAn4oCUJyA/ICdDb21wbGlhbmNlIHNjb3JlIGlzIG9mZiBmb3IgdGhpcyBhdWRpdCcgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10cmFjayBkYi10cmFjay0tNlwiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuc2NvcmVQY3QpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJyb3cucmVzdWx0ID09PSAnUGFzcycgPyAnIzEyQjc2QScgOiAnI0YwNDQzOCdcIj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHRcIj57eyByb3cuc2NvcmUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5yZXN1bHQgIT09ICfigJQnXCIgY2xhc3M9XCJkYi1waWxsIGRiLXBpbGwtLXN0cm9uZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInJvdy5yZXN1bHQgPT09ICdQYXNzJyA/ICcjRUNGREYzJyA6ICcjRkVGM0YyJ1wiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwicm93LnJlc3VsdCA9PT0gJ1Bhc3MnID8gJyMwMjdBNDgnIDogJyNCNDIzMTgnXCI+e3sgcm93LnJlc3VsdCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5yZXN1bHQgPT09ICfigJQnXCIgY2xhc3M9XCJhdjItZmFpbnRcIiB0aXRsZT1cIkNvbXBsaWFuY2Ugc2NvcmUgaXMgb2ZmIGZvciB0aGlzIGF1ZGl0XCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgYXVkaXRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdFwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHBlcmZTZWFyY2gudHJpbSgpID8gJ05vIGF1ZGl0IG1hdGNoZXMgdGhpcyBzZWFyY2guJyA6ICdUaGVyZSBpcyBubyByZXN1bHQgZm9yIEF1ZGl0IFBlcmZvcm1hbmNlIGluIHRoaXMgcGVyaW9kLicgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFRhc2sgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdBdWRpdCcgJiYgaXNUYXNrTW9kdWxlXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLXRhc2tcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiB0YXNrUGVyZkNvbHNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzb3J0UGVyZihjLmtleSlcIj57eyBjLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCIgW2Rpcl09XCJwZXJmU29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwZXJmUGFnZU9mKGZpbHRlcmVkVGFza1BlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZlRhc2tcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWF2YXRhclwiPnt7IHJvdy5pbml0aWFscyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItbGlua1wiIFt0aXRsZV09XCJyb3cucmF3Py5hdWRpdE5hbWUgPyAnUmFpc2VkIGZyb20gJyArIHJvdy5yYXcuYXVkaXROYW1lIDogJydcIj57eyByb3cubmFtZSB9fTwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5zY2hlZHVsZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJkYi1tZWRpdW1cIj57eyByb3cuY292ZXJhZ2UgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDwhLS0gT3BlbnMgdGhlIEdhbGxlcnkgKFR5cGUgVGFzaykgb24gdGhpcyB0YXNrJ3Mgc3VibWlzc2lvbnMgaW4gdGhlIGRhc2hib2FyZCBwZXJpb2QuIC0tPlxyXG4gICAgICAgICAgICAgIDxhICpuZ0lmPVwicm93LnN1Ym1pdHRlZCAmJiByb3cucmF3Py50YXNrSWRcIiBjbGFzcz1cImRiLXVsaW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9nYWxsZXJ5XCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJ0YXNrU3VibWl0dGVkUGFyYW1zKHJvdylcIiB0aXRsZT1cIlZpZXcgdGhlIHN1Ym1pdHRlZCB0YXNrcyBpbiB0aGUgR2FsbGVyeVwiPnt7IHJvdy5zdWJtaXR0ZWQgfX08L2E+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93LnN1Ym1pdHRlZCB8fCAhcm93LnJhdz8udGFza0lkXCI+e3sgcm93LnN1Ym1pdHRlZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPjxhIGNsYXNzPVwiZGItdWxpbmtcIj57eyByb3cuZmxhZ3MgfX08L2E+PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWZhaW50XCI+e3sgcm93LnRhc2tzIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxhIGNsYXNzPVwiZGItdWxpbmtcIj57eyByb3cucmVkbyB9fTwvYT48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGlhbmNlID09PSAn4oCUJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10cmFjayBkYi10cmFjay0tNlwiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxpYW5jZVBjdClcIj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHRcIj57eyByb3cuY29tcGxpYW5jZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDwhLS0gT3BlbnMgdGhlIGF1ZGl0IHRoZSB0YXNrIHdhcyByYWlzZWQgZnJvbS4gLS0+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgdGhlIGF1ZGl0IHRoaXMgdGFzayB3YXMgcmFpc2VkIGZyb21cIlxyXG4gICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwicm93LnJhdz8uYXVkaXRJZCA/ICcvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0JyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5hdWRpdElkIH0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPk5vIHRhc2tzIHJhaXNlZCBmcm9tIGF1ZGl0cyBpbiB0aGlzIHBlcmlvZC48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN0b3JlIFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnU3RvcmUnXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLXN0b3JlXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2Ygc3RvcmVQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRTdG9yZVBlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZlN0b3JlXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnN0b3JlSWQgfHwgcm93LnN0b3JlIH0pXCI+e3sgcm93LnN0b3JlIH19PC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXMgYXYyLWRpbVwiPnt7IHJvdy5zcG9jIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5hc3NpZ25lZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuZmxhZ3MgPz8gJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGV0aW9uID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsZXRpb24pXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LmNvbXBsZXRpb24gfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxpYW5jZSA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGlhbmNlKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGlhbmNlIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LnBlcmYgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cucGVyZilcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cucGVyZiB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgc3RvcmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnN0b3JlSWQgfHwgcm93LnN0b3JlIH0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj57eyBwZXJmU2VhcmNoLnRyaW0oKSA/ICdObyBzdG9yZSBtYXRjaGVzIHRoaXMgc2VhcmNoLicgOiAnVGhlcmUgaXMgbm8gcmVzdWx0IGZvciBTdG9yZSBQZXJmb3JtYW5jZSBpbiB0aGlzIHBlcmlvZC4nIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBVc2VyIFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnVXNlcidcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tdXNlclwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIHVzZXJQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRVc2VyUGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmVXNlclwiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj48YSBjbGFzcz1cImRiLWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC91c2VyXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGVtYWlsOiByb3cuZW1haWwgfSlcIj57eyByb3cubmFtZSB9fTwvYT48L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXMgYXYyLWRpbVwiPnt7IHJvdy5lbWFpbCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmZsYWdzIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5yZWRvIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxldGlvbiA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGV0aW9uKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGV0aW9uIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsaWFuY2UgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxpYW5jZSlcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cuY29tcGxpYW5jZSB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5wZXJmID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LnBlcmYpXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LnBlcmYgfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItZXllXCIgdGl0bGU9XCJWaWV3IHVzZXJcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC91c2VyXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGVtYWlsOiByb3cuZW1haWwgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZFVzZXJQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+e3sgcGVyZlNlYXJjaC50cmltKCkgPyAnTm8gdXNlciBtYXRjaGVzIHRoaXMgc2VhcmNoLicgOiAnVGhlcmUgaXMgbm8gcmVzdWx0IGZvciBVc2VyIFBlcmZvcm1hbmNlIGluIHRoaXMgcGVyaW9kLicgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFNoYXJlZCBwYWdlciAoMTAgLyAyMCAvIDMwKSwgYXMgb24gdGhlIG90aGVyIGF1ZGl0IGxpc3RzLiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLXBhZ2VyXCIgKm5nSWY9XCJwZXJmVG90YWxcIj5cclxuICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwicGVyZlBhZ2VTaXplXCIgW3BhZ2VTaXplXT1cInBlcmZQYWdlU2l6ZVwiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGVyZlBhZ2VTaXplc1wiXHJcbiAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBlcmZQYWdlXCIgW3RvdGFsSXRlbXNdPVwicGVyZlRvdGFsXCIgKHBhZ2VDaGFuZ2UpPVwib25QZXJmUGFnZSgkZXZlbnQpXCJcclxuICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QZXJmUGFnZVNpemUoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvc2VjdGlvbj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gRklMVEVSIERSQVdFUiA9PT09PT09PT09PT0gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImZpbHRlci1iYWNrZHJvcFwiICpuZ0lmPVwiZmlsdGVyc09wZW5cIiAoY2xpY2spPVwiY2FuY2VsRmlsdGVycygpXCI+PC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItZHJhd2VyXCIgKm5nSWY9XCJmaWx0ZXJzT3BlbiAmJiBkcmFmdCBhcyBkclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1oZWFkXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZHJhd2VyLXRpdGxlXCI+RmlsdGVyczwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jb3VudHBpbGxcIiAqbmdJZj1cImRyLmZpbHRlckNvdW50XCI+e3sgZHIuZmlsdGVyQ291bnQgfX08L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlYnRuXCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiIHRpdGxlPVwiQ2xvc2VcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItYm9keVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLW5hdlwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZHJhd2VyLW5hdml0ZW1cIiAqbmdGb3I9XCJsZXQgYyBvZiBkci5maWx0ZXJDYXRzOyB0cmFja0J5OiB0cmFja0J5Q2F0XCIgW2NsYXNzLm5hdml0ZW0tYWN0aXZlXT1cImFjdGl2ZUNhdCA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdChjLmtleSlcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dGV4dFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRpdGxlXCI+e3sgYy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ2YWx1ZVwiIFtjbGFzcy5pcy1kaXJ0eV09XCJjLmRpcnR5XCI+e3sgYy52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlydHlkb3RcIiAqbmdJZj1cImMuZGlydHlcIj48L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1wYW5lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmV0aXRsZVwiPnt7IGRyLmFjdGl2ZUNhdE9iai50aXRsZSB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5laGludFwiPnt7IGRyLmFjdGl2ZUNhdE9iai5zdWIgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBQZXJpb2QgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3BlcmlvZCdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cImRyLmdyYWluID09PSAncXVhcnRlcidcIiAoY2xpY2spPVwiZHIuc2V0R3JhaW4oJ3F1YXJ0ZXInKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ3F1YXJ0ZXInXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLXRleHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tbGFiZWxcIj5RdWFydGVybHk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj5SZWFkIG9uZSBmaW5hbmNpYWwgcXVhcnRlciAoQXByaWzigJNNYXJjaCB5ZWFyKSBhdCBhIHRpbWUuPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ2RhdGUnXCIgKGNsaWNrKT1cImRyLnNldEdyYWluKCdkYXRlJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwiZHIuZ3JhaW4gPT09ICdkYXRlJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWxhYmVsXCI+QnkgZGF0ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24taGVscFwiPlBpY2sgYSBjdXN0b20gc3RhcnQgYW5kIGVuZCBkYXRlLjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtbGlzdFwiICpuZ0lmPVwiZHIuZ3JhaW4gPT09ICdxdWFydGVyJ1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiICpuZ0Zvcj1cImxldCBxIG9mIGRyLnF1YXJ0ZXJzXCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5xdWFydGVyID09PSBxXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZHIuc2VsZWN0UXVhcnRlcihxKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnF1YXJ0ZXIgPT09IHFcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5xdWFydGVyID09PSBxXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj57eyBxIH19IMK3IHt7IHF1YXJ0ZXJNb250aHMocSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtZmllbGRzXCIgKm5nSWY9XCJkci5ncmFpbiA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5EYXRlIHJhbmdlPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZGF0ZXBpY2sgYXYyLWRhdGVwaWNrLS1jb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWljb25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMlwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiMlwiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCI4XCIgeTE9XCIyXCIgeDI9XCI4XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWlucHV0IGRiLWRhdGVyYW5nZSBkYi1kYXRlcmFuZ2UtLWZpZWxkXCIgbmd4RGF0ZXJhbmdlcGlja2VyTWQgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGF0ZSByYW5nZVwiIFsobmdNb2RlbCldPVwiZHIucmFuZ2VcIiBbbG9jYWxlXT1cInBpY2tlckxvY2FsZVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cInRvZGF5XCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwidHJ1ZVwiIFtzaG93Q2FuY2VsXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgW2Ryb3BzXT1cIidkb3duJ1wiIFtvcGVuc109XCIncmlnaHQnXCIgKGRhdGVzVXBkYXRlZCk9XCJkci5vblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBTY29wZSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnc2NvcGUnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1zdGFja1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+Q2lyY2xlIEhlYWQgPHNwYW4gY2xhc3M9XCJmaWVsZC1tZXRhXCI+e3sgZHIuY2lyY2xlcy5sZW5ndGggfX0gdXNlcnM8L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZmllbGQtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkci5jaXJjbGVcIiAobmdNb2RlbENoYW5nZSk9XCJkci5vbkNpcmNsZUNoYW5nZSgpXCIgW29wdGlvbnNdPVwiZHIucGlja09wdGlvbnMoZHIuY2lyY2xlcywgJ0FsbCBDaXJjbGVzJylcIiBhcmlhTGFiZWw9XCJDaXJjbGVcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIiAqbmdJZj1cImRyLmNpcmNsZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5ab25lIE1hbmFnZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLnpvbmVcIiAobmdNb2RlbENoYW5nZSk9XCJkci5vblpvbmVDaGFuZ2UoKVwiIFtvcHRpb25zXT1cImRyLnBpY2tPcHRpb25zKGRyLnpvbmVzLCAnQWxsIHpvbmVzJylcIiBhcmlhTGFiZWw9XCJab25lXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCIgKm5nSWY9XCJkci56b25lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkFPTTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImZpZWxkLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHIuYW9tXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZHIub25Bb21DaGFuZ2UoKVwiIFtvcHRpb25zXT1cImRyLnBpY2tPcHRpb25zKGRyLmFvbXMsICdBbGwgQU9NcycpXCIgYXJpYUxhYmVsPVwiQU9NXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCIgKm5nSWY9XCJkci5hb21cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+U3RvcmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLnN0b3JlXCIgW29wdGlvbnNdPVwiZHIuc3RvcmVQaWNrT3B0aW9uc1wiIGFyaWFMYWJlbD1cIlN0b3JlXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlYWRpbmdyb3dcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlYWRpbmdsYWJlbFwiPlJlYWRpbmc8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWFkaW5ndmFsdWVcIj57eyBkci5zY29wZVJlYWRpbmcgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItZ3Jvd1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWJhbmRsaW5rXCIgKGNsaWNrKT1cImRyLnJlc2V0U2NvcGUoKVwiPlJlc2V0IHRvIGFsbCBjaXJjbGVzPC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEF1ZGl0IHR5cGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtbGlzdFwiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAndHlwZSdcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgKm5nRm9yPVwibGV0IHQgb2YgYXVkaXRUeXBlc1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuYXVkaXRUeXBlID09PSB0LmtleVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJkci5hdWRpdFR5cGUgPSB0LmtleVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5hdWRpdFR5cGUgPT09IHQua2V5XCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLmF1ZGl0VHlwZSA9PT0gdC5rZXlcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHR0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IHQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRtZXRhXCI+e3sgdC5oZWxwIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTY29yZSBiYW5kIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ2JhbmQnXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiICpuZ0Zvcj1cImxldCBiIG9mIGRyLmJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuaXNCYW5kT24oYi5iYW5kKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJkci5hcHBseUJhbmQoYi5iYW5kKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRkb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiLmJhbmQuc29mdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHR0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IGIuYmFuZC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdG1ldGFcIj57eyBiLmJhbmQucmFuZ2UgfX0gwrcge3sgYi5jb3VudCB9fSBzdG9yZXM8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtIHBhbmUtcmVzZXRidG5cIiAoY2xpY2spPVwiZHIuY2xlYXJCYW5kKClcIj5BbGwgc2NvcmVzPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU3RhdHVzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3N0YXR1cydcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICdhbGwnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygnYWxsJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAnYWxsJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICdhbGwnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5BbGwgc3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAnZmFpbCdcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCdmYWlsJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAnZmFpbCdcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAnZmFpbCdcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPkZhaWw8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICdwYXNzJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ3Bhc3MnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICdwYXNzJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICdwYXNzJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+UGFzczwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ3Vuc2NvcmVkJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAndW5zY29yZWQnXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+Tm90IHNjb3JlZDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnN0YXR1cyA9PT0gJ25hJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ25hJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAnbmEnXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnN0YXR1cyA9PT0gJ25hJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+Tm90IGF1ZGl0ZWQ8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWZvb3RcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0XCIgKGNsaWNrKT1cImRyLmNsZWFyQWxsKClcIj5DbGVhciBhbGw8L2J1dHRvbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdFwiIChjbGljayk9XCJjYW5jZWxGaWx0ZXJzKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLXByaW1hcnkgYXYyLWJ0bi0td2lkZVwiIChjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiPkFwcGx5IGZpbHRlcnM8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
1523
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0LXYyLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQTRCLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7OztBQWtJL0gsTUFBTSxnQkFBZ0IsR0FBYztJQUNsQyxXQUFXLEVBQUUsR0FBRztJQUNoQixhQUFhLEVBQUUsR0FBRztJQUNsQixZQUFZLEVBQUUsR0FBRztJQUNqQixTQUFTLEVBQUUsR0FBRztJQUNkLFVBQVUsRUFBRSxHQUFHO0lBQ2YsU0FBUyxFQUFFLEdBQUc7SUFDZCxlQUFlLEVBQUUsR0FBRztJQUNwQixlQUFlLEVBQUUsR0FBRztJQUNwQixVQUFVLEVBQUUsR0FBRztJQUNmLGVBQWUsRUFBRSxF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QUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztLQUNyRyxDQUFDO0lBQ2UsYUFBYSxHQUFrRDtRQUM5RSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUTtRQUNwRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ3ZHLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUM7S0FDN0MsQ0FBQztJQUNlLGNBQWMsR0FBbUQ7UUFDaEYsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDdEYsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO0tBQ3BJLENBQUM7SUFDZSxhQUFhLEdBQWtEO1FBQzlFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDekcsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FB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QUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQXg3Q1UseUJBQXlCOzRGQUF6Qix5QkFBeUIsOERDN090Qyxnbm9EQTQxQkE7OzRGRC9tQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIG9mLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IEF1ZGl0QWNjZXNzLCBhdWRpdEFjY2VzcyB9IGZyb20gJy4uL2F1ZGl0LXYyLWFjY2Vzcyc7XHJcbmltcG9ydCB7IFBJQ0tFUl9MT0NBTEUsIFBpY2tlZERhdGVzLCBQaWNrZXJSYW5nZSwgZnJvbVBpY2tlclJhbmdlLCBwaWNrZXJSYW5nZXMsIHRvUGlja2VyUmFuZ2UgfSBmcm9tICcuLi9hdWRpdC12Mi1kYXRlcGlja2VyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRCYW5kIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHJhbmdlOiBzdHJpbmc7XHJcbiAgbG86IG51bWJlcjtcclxuICBoaTogbnVtYmVyO1xyXG4gIHNvZnQ6IHN0cmluZztcclxuICBiZzogc3RyaW5nO1xyXG4gIGZnOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRSb3cge1xyXG4gIGRhdGU6IHN0cmluZztcclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiAndW5zY29yZWQnID0gYXVkaXRlZCwgYnV0IG5vIHF1ZXN0aW9uIG9mIGl0cyBhdWRpdHMgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbiAobm8gc2NvcmUgdG8gc2hvdykuICovXHJcbiAgc3RhdHVzOiBTdG9yZVN0YXR1cztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFN0b3JlU3RhdHVzID0gJ3Bhc3MnIHwgJ2ZhaWwnIHwgJ25hJyB8ICd1bnNjb3JlZCc7XHJcbmV4cG9ydCB0eXBlIFN0YXR1c0ZpbHRlciA9ICdhbGwnIHwgU3RvcmVTdGF0dXM7XHJcblxyXG4vKiogQSBzb3J0YWJsZSBjb2x1bW4gb2YgYSBQZXJmb3JtYW5jZSB0YWJsZS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQZXJmQ29sdW1uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIFNvcnRWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0S3BpIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgbm90ZTogc3RyaW5nO1xyXG4gIG5vdGVDb2xvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNhdCB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgc3ViOiBzdHJpbmc7XHJcbiAgZGlydHk6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRQZXJmUm93IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaW5pdGlhbHM6IHN0cmluZztcclxuICBzY2hlZHVsZWQ6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIHN1Ym1pdHRlZDogbnVtYmVyO1xyXG4gIGRpc3B1dGVzOiBudW1iZXIgfCBudWxsO1xyXG4gIHBhc3NNYXJrOiBzdHJpbmc7XHJcbiAgc2NvcmU6IHN0cmluZztcclxuICBzY29yZVBjdDogbnVtYmVyO1xyXG4gIC8qKiAn4oCUJyB3aGVuIHRoZSBhdWRpdCBoYXMgbm8gY29tcGxpYW5jZSBzY29yaW5nIChubyBzY29yZSwgc28gbm8gcmVzdWx0KS4gKi9cclxuICByZXN1bHQ6ICdQYXNzJyB8ICdGYWlsJyB8ICfigJQnO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdG9yZVBlcmZSb3cge1xyXG4gIHN0b3JlSWQ6IHN0cmluZztcclxuICBzdG9yZTogc3RyaW5nO1xyXG4gIHNwb2M6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIGZsYWdzOiBudW1iZXIgfCBudWxsO1xyXG4gIGNvbXBsZXRpb246IHN0cmluZztcclxuICBjb21wbGlhbmNlOiBzdHJpbmc7XHJcbiAgcGVyZjogc3RyaW5nO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VyUGVyZlJvdyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHJlZG86IG51bWJlcjtcclxuICBjb21wbGV0aW9uOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZTogc3RyaW5nO1xyXG4gIHBlcmY6IHN0cmluZztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFza1BlcmZSb3cge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpbml0aWFsczogc3RyaW5nO1xyXG4gIHNjaGVkdWxlZDogc3RyaW5nO1xyXG4gIGNvdmVyYWdlOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBzdWJtaXR0ZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHRhc2tzOiBzdHJpbmc7XHJcbiAgcmVkbzogbnVtYmVyO1xyXG4gIGNvbXBsaWFuY2U6IHN0cmluZztcclxuICBjb21wbGlhbmNlUGN0OiBudW1iZXI7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG4vKiogVGFzay1tb2RlIHRpbGVzLCBhcyBkaXNwbGF5ZWQgKCfigJQnIHdoZW4gdGhlIEFQSSBoYXMgbm8gdmFsdWUpLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tTdGF0cyB7XHJcbiAgYWN0aXZlVGFza3M6IHN0cmluZztcclxuICB0YXNrSW5zdGFuY2VzOiBzdHJpbmc7XHJcbiAgbm90U3VibWl0dGVkOiBzdHJpbmc7XHJcbiAgb3BlblRhc2tzOiBzdHJpbmc7XHJcbiAgaW5Qcm9ncmVzczogc3RyaW5nO1xyXG4gIHN1Ym1pdHRlZDogc3RyaW5nO1xyXG4gIGNvbXBsZXRpb25TY29yZTogc3RyaW5nO1xyXG4gIGNvbXBsaWFuY2VTY29yZTogc3RyaW5nO1xyXG4gIHRvdGFsRmxhZ3M6IHN0cmluZztcclxuICBjb21wbGV0aW9uRGVsdGE6IHN0cmluZztcclxuICBjb21wbGlhbmNlRGVsdGE6IHN0cmluZztcclxuICBmbGFnc0RlbHRhOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRhc2tEZWx0YUtleSA9ICdjb21wbGV0aW9uJyB8ICdjb21wbGlhbmNlJyB8ICdmbGFncyc7XHJcblxyXG4vKiogT25lIGV4cG9ydGVkIGNvbHVtbjogaGVhZGVyIHRleHQgYW5kIHRoZSBjZWxsIHZhbHVlIGZvciBhIHJvdy4gKi9cclxuaW50ZXJmYWNlIEV4cG9ydENvbHVtbjxUPiB7XHJcbiAgaGVhZGVyOiBzdHJpbmc7XHJcbiAgdmFsdWU6IChyb3c6IFQpID0+IGFueTtcclxufVxyXG5cclxuY29uc3QgRU1QVFlfVEFTS19TVEFUUzogVGFza1N0YXRzID0ge1xyXG4gIGFjdGl2ZVRhc2tzOiAn4oCUJyxcclxuICB0YXNrSW5zdGFuY2VzOiAn4oCUJyxcclxuICBub3RTdWJtaXR0ZWQ6ICfigJQnLFxyXG4gIG9wZW5UYXNrczogJ+KAlCcsXHJcbiAgaW5Qcm9ncmVzczogJ+KAlCcsXHJcbiAgc3VibWl0dGVkOiAn4oCUJyxcclxuICBjb21wbGV0aW9uU2NvcmU6ICfigJQnLFxyXG4gIGNvbXBsaWFuY2VTY29yZTogJ+KAlCcsXHJcbiAgdG90YWxGbGFnczogJ+KAlCcsXHJcbiAgY29tcGxldGlvbkRlbHRhOiAnJyxcclxuICBjb21wbGlhbmNlRGVsdGE6ICcnLFxyXG4gIGZsYWdzRGVsdGE6ICcnXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZW5kQmFyIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBBdmVyYWdlIG9mIHRoZSBjb21wbGlhbmNlLXNjb3JlZCBhdWRpdHM7IG51bGwgd2hlbiBub25lLiAqL1xyXG4gIHZhbHVlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiBDb21wbGlhbmNlLXNjb3JlZCBhdWRpdHMgKHRoZSBvbmVzIHRoZSBhdmVyYWdlIHJlYWRzKS4gKi9cclxuICBjb3VudDogbnVtYmVyO1xyXG4gIC8qKiBFdmVyeSBzdWJtaXR0ZWQgYXVkaXQsIHNjb3JlZCBvciBub3QuICovXHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBPbmUgZmluYW5jaWFsIHF1YXJ0ZXI6IEFwcmlsLU1hcmNoIHllYXIsIG5hbWVkIGJ5IHRoZSB5ZWFyIGl0IHN0YXJ0cyBpbiAocHJvdG90eXBlOiBBdWcgMjAyNiA9IFEyIEZZMjYpLiAqL1xyXG5pbnRlcmZhY2UgRmlzY2FsUXVhcnRlciB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgZnJvbTogc3RyaW5nO1xyXG4gIHRvOiBzdHJpbmc7XHJcbiAgbW9udGhzOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBUaGUgbGFzdCBgbmAgZmluYW5jaWFsIHF1YXJ0ZXJzLCBvbGRlc3QgZmlyc3QsIGVuZGluZyB3aXRoIHRoZSBvbmUgYHRvZGF5YCBmYWxscyBpbi4gKi9cclxuZnVuY3Rpb24gZmlzY2FsUXVhcnRlcnModG9kYXkgPSBkYXlqcygpLCBuID0gNCk6IEZpc2NhbFF1YXJ0ZXJbXSB7XHJcbiAgY29uc3QgY3VycmVudCA9IHRvZGF5LnN0YXJ0T2YoJ21vbnRoJykuc3VidHJhY3QoKHRvZGF5Lm1vbnRoKCkgKyA5KSAlIDMsICdtb250aCcpO1xyXG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiB7XHJcbiAgICBjb25zdCBzdGFydCA9IGN1cnJlbnQuc3VidHJhY3QoMyAqIChuIC0gMSAtIGkpLCAnbW9udGgnKTtcclxuICAgIGNvbnN0IGVuZCA9IHN0YXJ0LmFkZCgyLCAnbW9udGgnKS5lbmRPZignbW9udGgnKTtcclxuICAgIGNvbnN0IGZ5ID0gc3RhcnQubW9udGgoKSA+PSAzID8gc3RhcnQueWVhcigpIDogc3RhcnQueWVhcigpIC0gMTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGtleTogJ1EnICsgKE1hdGguZmxvb3IoKChzdGFydC5tb250aCgpICsgOSkgJSAxMikgLyAzKSArIDEpICsgJyBGWScgKyBTdHJpbmcoZnkpLnNsaWNlKDIpLFxyXG4gICAgICBmcm9tOiBzdGFydC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgdG86IGVuZC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgbW9udGhzOiBzdGFydC5mb3JtYXQoJ01NTScpICsgJyDigJMgJyArIGVuZC5mb3JtYXQoJ01NTSBZWVlZJylcclxuICAgIH07XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKiBQYXNzIG1hcmsgYW5kIGNyaXRpY2FsIHRocmVzaG9sZCBmb3IgdGhlIGF1ZGl0IHByb2dyYW1tZSAobm8gcGVyLWF1ZGl0IHBhc3MgbWFyayBpbiB0aGUgZGF0YSB5ZXQpLiAqL1xyXG5jb25zdCBQQVNTX01BUksgPSA3NTtcclxuY29uc3QgQ1JJVElDQUxfTUFSSyA9IDYwO1xyXG5cclxuY29uc3QgQkFORFM6IEF1ZGl0QmFuZFtdID0gW1xyXG4gIHsga2V5OiAnZXhjZWxsZW50JywgbGFiZWw6ICdFeGNlbGxlbnQnLCByYW5nZTogJzkwLTEwMCUnLCBsbzogOTAsIGhpOiAxMDAsIHNvZnQ6ICcjOEZCRkE1JywgYmc6ICcjRUNGREYzJywgZmc6ICcjMDI3QTQ4JyB9LFxyXG4gIHsga2V5OiAnZ29vZCcsIGxhYmVsOiAnR29vZCcsIHJhbmdlOiAnNzUtODklJywgbG86IDc1LCBoaTogODksIHNvZnQ6ICcjOTZCNEQ2JywgYmc6ICcjRUZGOEZGJywgZmc6ICcjMTc1Q0QzJyB9LFxyXG4gIHsga2V5OiAnZmFpcicsIGxhYmVsOiAnTmVlZHMgaW1wcm92ZW1lbnQnLCByYW5nZTogJzYwLTc0JScsIGxvOiA2MCwgaGk6IDc0LCBzb2Z0OiAnI0RDQkU4QycsIGJnOiAnI0ZGRkFFQicsIGZnOiAnI0I1NDcwOCcgfSxcclxuICB7IGtleTogJ2NyaXRpY2FsJywgbGFiZWw6ICdDcml0aWNhbCcsIHJhbmdlOiAnQmVsb3cgNjAlJywgbG86IDAsIGhpOiA1OSwgc29mdDogJyNENkExOUInLCBiZzogJyNGRUYzRjInLCBmZzogJyNCNDIzMTgnIH0sXHJcbiAgeyBrZXk6ICd1bnNjb3JlZCcsIGxhYmVsOiAnTm90IHNjb3JlZCcsIHJhbmdlOiAnQ29tcGxpYW5jZSBzY29yZSBvZmYnLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNDN0Q3RkUnLCBiZzogJyNFRUY0RkYnLCBmZzogJyMzNTM4Q0QnIH0sXHJcbiAgeyBrZXk6ICduYScsIGxhYmVsOiAnTm90IGF1ZGl0ZWQnLCByYW5nZTogJ05vIHN1Ym1pc3Npb24nLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNENkRBRTAnLCBiZzogJyNGMkY0RjcnLCBmZzogJyM0NzU0NjcnIH1cclxuXTtcclxuXHJcbi8qKiBCYW5kcyB0aGF0IGhvbGQgc3RvcmVzIHdpdGhvdXQgYSBzY29yZTsgdGhleSBmaWx0ZXIgYnkgc3RhdHVzLCBub3QgYnkgc2NvcmUgcmFuZ2UuICovXHJcbmNvbnN0IFNUQVRVU19CQU5EUyA9IFsndW5zY29yZWQnLCAnbmEnXTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRUeXBlT3B0aW9uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGhlbHA6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgQUxMX0FVRElUUzogQXVkaXRUeXBlT3B0aW9uID0geyBrZXk6ICdhbGwnLCBsYWJlbDogJ0FsbCBBdWRpdHMnLCBoZWxwOiAnQmxlbmRlZCBzY29yZSBhY3Jvc3MgZXZlcnkgcHJvZ3JhbW1lLicgfTtcclxuXHJcbi8qKiBTdG9yZSBoaWVyYXJjaHkgcGlja3M6IGNpcmNsZSBoZWFkIC8gem9uZSBtYW5hZ2VyIC8gQU9NIG5hbWVzIGFzIHRoZSBkYXNoYm9hcmQgQVBJIHNlbmRzIHRoZW0sIHN0b3JlID0gc3RvcmVJZC4gKi9cclxuaW50ZXJmYWNlIFNjb3BlUGljayB7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIHN0b3JlOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEYXNoYm9hcmQuIFN0b3JlIGxpc3QsIHNjb3JlIGJhbmRzLCBLUElzIGFuZCB0aGUgYnktZGF0ZSB0cmVuZCBjb21lIGZyb20gdGhlIGF1ZGl0IEFQSVxyXG4gKiAoL3RyYXgvYXVkaXQvZGFzaGJvYXJkKTsgdGhlIEF1ZGl0IC8gVXNlciBQZXJmb3JtYW5jZSB0YWJzIHN0aWxsIHVzZSB0aGUgdjEgZGFzaGJvYXJkXHJcbiAqIGVuZHBvaW50cyAoY2hlY2tsaXN0UGVyZm9ybWFuY2UgLyB1c2VyUGVyZm9ybWFuY2UpLiBUYXNrIG1vZGUgKHRpbGVzICsgVGFzayBQZXJmb3JtYW5jZSkgcmVhZHNcclxuICogL3RyYXgvYXVkaXQvZGFzaGJvYXJkL3Rhc2tzOiBvbmx5IHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0cy5cclxuICogU2NvcGUgKGNsaWVudCwgc3RvcmVzLCBkYXRlcykgY29tZXMgZnJvbSB0aGUgZ2xvYmFsIGhlYWRlciBmaWx0ZXI7IHRoZSBwZXJpb2QgcGlja2VyIGNhbiBuYXJyb3cgdGhlIGRhdGVzLlxyXG4gKiBGaWx0ZXJzIGRyYXdlcjogU3RvcmUgaGllcmFyY2h5IG5hcnJvd3MgdGhlIHN0b3JlcyBhbmQgQXVkaXQgdHlwZSAoY2hlY2tsaXN0SWQpIHRoZSBhdWRpdCBvZiBldmVyeSBmZWVkIChyZWxvYWRlZFxyXG4gKiBvbiBBcHBseSk7IFNjb3JlIHJhbmdlIGFuZCBTdGF0dXMgb25seSBmaWx0ZXIgdGhlIGxvYWRlZCBzdG9yZSBsaXN0IGluIHRoZSBicm93c2VyLlxyXG4gKlxyXG4gKiBRdWFydGVybHk6IHRoZSB0cmVuZCBzaG93cyB0aGUgbGFzdCBmb3VyIGZpbmFuY2lhbCBxdWFydGVycyAoYnVpbHQgZnJvbSBvbmUgbW9udGhseS1idWNrZXQgY2FsbCBvZlxyXG4gKiB0aGUgc2FtZSBBUEkpIGFuZCB0aGUgcGlja2VkIHF1YXJ0ZXIgYmVjb21lcyB0aGUgcGVyaW9kIG9mIGV2ZXJ5IGZlZWQuIEJ5IGRhdGU6IHRoZSByYW5nZSBwaWNrZXIuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1kYXNoYm9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiBQYXNzIC8gY3JpdGljYWwgbWFya3MgY29tZSBmcm9tIHRoZSBhdWRpdCBkYXNoYm9hcmQgQVBJOyB0aGVzZSBhcmUgdGhlIGVtcHR5LXN0YXRlIGRlZmF1bHRzLiAqL1xyXG4gIHBhc3NNYXJrID0gUEFTU19NQVJLO1xyXG4gIGNyaXRpY2FsTWFyayA9IENSSVRJQ0FMX01BUks7XHJcbiAgcmVhZG9ubHkgYmFuZHMgPSBCQU5EUztcclxuICAvKiogXCJBbGwgQXVkaXRzXCIsIHRoZW4gdGhlIGNsaWVudCdzIGF1ZGl0cyAoUE9TVCAvdHJheC9hdWRpdC9saXN0KTsga2V5ID0gYXVkaXQgaWQsIHNlbnQgYXMgY2hlY2tsaXN0SWQuICovXHJcbiAgYXVkaXRUeXBlczogQXVkaXRUeXBlT3B0aW9uW10gPSBbQUxMX0FVRElUU107XHJcbiAgLyoqIENsaWVudCB0aGUgYXVkaXQgbGlzdCB3YXMgZmV0Y2hlZCBmb3IuICovXHJcbiAgcHJpdmF0ZSBhdWRpdFR5cGVzQ2xpZW50ID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmlvZCBzZWxlY3Rpb24uIGZyb20gLyB0byAoWVlZWS1NTS1ERCkgc3RhcnQgYXMgdGhlIGhlYWRlciBkYXRlIHJhbmdlIGFuZCBkcml2ZSBldmVyeSBmZWVkO1xyXG4gICAqIHRoZSByYW5nZSBwaWNrZXIgbmFycm93cyB0aGVtLCBhbmQgYSBoZWFkZXIgY2hhbmdlIHJlc2V0cyB0aGVtLlxyXG4gICAqL1xyXG4gIGdyYWluOiAncXVhcnRlcicgfCAnZGF0ZScgPSAnZGF0ZSc7XHJcbiAgcXVhcnRlciA9ICcnO1xyXG4gIHJlYWRvbmx5IGZpc2NhbCA9IGZpc2NhbFF1YXJ0ZXJzKCk7XHJcbiAgcmVhZG9ubHkgcXVhcnRlcnMgPSB0aGlzLmZpc2NhbC5tYXAocSA9PiBxLmtleSk7XHJcbiAgLyoqIFF1YXJ0ZXJseSB0cmVuZCBiYXJzLCBhbmQgdGhlIGNsaWVudCArIHN0b3JlcyB0aGV5IHdlcmUgZmV0Y2hlZCBmb3IuICovXHJcbiAgcXVhcnRlclRyZW5kOiBUcmVuZEJhcltdID0gW107XHJcbiAgcXVhcnRlclRyZW5kTG9hZGluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcXVhcnRlclRyZW5kU2NvcGUgPSAnJztcclxuICBmcm9tID0gJyc7XHJcbiAgdG8gPSAnJztcclxuICByYW5nZTogUGlja2VyUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuICByZWFkb25seSBwaWNrZXJMb2NhbGUgPSBQSUNLRVJfTE9DQUxFO1xyXG4gIHJlYWRvbmx5IHJhbmdlcyA9IHBpY2tlclJhbmdlcygpO1xyXG4gIHJlYWRvbmx5IHRvZGF5ID0gZGF5anMoKTtcclxuXHJcbiAgLyoqIEZpbHRlcnMuICovXHJcbiAgYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgc3RhdHVzOiBTdGF0dXNGaWx0ZXIgPSAnYWxsJztcclxuICBzZWFyY2ggPSAnJztcclxuICBzY29yZU1pbiA9IDA7XHJcbiAgc2NvcmVNYXggPSAxMDA7XHJcblxyXG4gIC8qKiBBdWRpdCAvIFRhc2sgc3dpdGNoLiAqL1xyXG4gIG1vZHVsZVRhYjogJ0F1ZGl0JyB8ICdUYXNrJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgbW9kdWxlVGFiczogQXJyYXk8J0F1ZGl0JyB8ICdUYXNrJz4gPSBbJ0F1ZGl0JywgJ1Rhc2snXTtcclxuXHJcbiAgLyoqIFNob3duIGluIHRoZSBwYWdlIGhlYWRlcjsgc3RhbXBlZCBvbiBldmVyeSBsb2FkLiAqL1xyXG4gIGxhc3RSZWZyZXNoZWQgPSAn4oCUJztcclxuXHJcbiAgLyoqIEZpbHRlciBkcmF3ZXIuICovXHJcbiAgZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICBhY3RpdmVDYXQgPSAncGVyaW9kJztcclxuICAvKipcclxuICAgKiBUaGUgZmlsdGVyIGRyYXdlcidzIGRyYWZ0IChRQSA5IE9jdCk6IE9iamVjdC5jcmVhdGUodGhpcyksIHNvIGV2ZXJ5IGdldHRlciB0aGUgZHJhd2VyIHNob3dzIHdvcmtzIG9uIHRoZSBkcmFmdCdzXHJcbiAgICogb3duIHZhbHVlcyB3aGlsZSB0aGUgcGFnZSBiZWhpbmQga2VlcHMgdGhlIGFwcGxpZWQgb25lcy4gQXBwbHkgY29waWVzIERSQUZUX0tFWVMgb250byB0aGUgcGFnZTsgQ2FuY2VsIGRyb3BzIGl0LlxyXG4gICAqL1xyXG4gIGRyYWZ0OiBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRFJBRlRfS0VZUyA9IFsnZ3JhaW4nLCAncXVhcnRlcicsICdmcm9tJywgJ3RvJywgJ3JhbmdlJywgJ2F1ZGl0VHlwZScsICdjaXJjbGUnLCAnem9uZScsICdhb20nLCAnc3RvcmUnLFxyXG4gICAgJ3Njb3JlTWluJywgJ3Njb3JlTWF4JywgJ3N0YXR1cycsICdzdG9yZUxpc3RPcGVuJywgJ2xpc3RCYW5kS2V5J10gYXMgY29uc3Q7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGhpZXJhcmNoeSBwaWNrcyBiZWluZyBlZGl0ZWQgaW4gdGhlIGRyYXdlciAoc3RvcmUgPSBzdG9yZUlkKS4gVGhlIGxpc3RzIGNvbWUgZnJvbSB0aGUgZGFzaGJvYXJkXHJcbiAgICogQVBJJ3Mgc3RvcmUgcm93cyBvZiB0aGUgaGVhZGVyIHNjb3BlOyBBcHBseSBuYXJyb3dzIGV2ZXJ5IGZlZWQgdG8gdGhlIHN0b3JlcyB0aGUgcGljayBjb3ZlcnMuXHJcbiAgICovXHJcbiAgY2lyY2xlID0gJyc7XHJcbiAgem9uZSA9ICcnO1xyXG4gIGFvbSA9ICcnO1xyXG4gIHN0b3JlID0gJyc7XHJcblxyXG4gIC8qKiBTdG9yZSByb3dzIG9mIHRoZSBoZWFkZXIgc2NvcGUsIG5vdCBuYXJyb3dlZCBieSB0aGUgaGllcmFyY2h5OiB0aGUgZHJhd2VyJ3MgbGlzdHMgYW5kIGVhY2ggcGljaydzIHN0b3Jlcy4gKi9cclxuICBwcml2YXRlIHNjb3BlUm93czogQXVkaXRSb3dbXSA9IFtdO1xyXG4gIC8qKiBIaWVyYXJjaHkgKyBhdWRpdCB0eXBlIHRoZSBmZWVkcyB3ZXJlIGxhc3QgbG9hZGVkIHdpdGg7IHRoZSBkcmF3ZXIgZWRpdHMgYSBkcmFmdCB1bnRpbCBBcHBseS4gKi9cclxuICBwcml2YXRlIGFwcGxpZWQ6IFNjb3BlUGljayAmIHsgYXVkaXRUeXBlOiBzdHJpbmcgfSA9IHsgY2lyY2xlOiAnJywgem9uZTogJycsIGFvbTogJycsIHN0b3JlOiAnJywgYXVkaXRUeXBlOiAnYWxsJyB9O1xyXG4gIC8qKiBDbGllbnQgKyBoZWFkZXIgc3RvcmVzOyBhIGNoYW5nZSByZXNldHMgdGhlIGhpZXJhcmNoeSBwaWNrcyAodGhlaXIgc3RvcmVzIG1heSBiZSBnb25lKS4gKi9cclxuICBwcml2YXRlIGhlYWRlclNjb3BlS2V5ID0gJyc7XHJcblxyXG4gIC8qKiBUYWJsZSBzdGF0ZS4gKi9cclxuICBzb3J0S2V5ID0gJ3Njb3JlJztcclxuICBzb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG4gIHBhZ2UgPSAxO1xyXG4gIC8qKiBTdG9yZSBsaXN0IHBhZ2VyOiAxMCByb3dzIGEgcGFnZSwgMTAgLyAyMCAvIDMwLCBhcyBvbiBldmVyeSBhdWRpdCBsaXN0LiAqL1xyXG4gIHBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGFnZVNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG5cclxuICBoZWFkZXJzOiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW1xyXG4gICAgeyBrZXk6ICdkYXRlJywgbGFiZWw6ICdBdWRpdCBkYXRlJyB9LFxyXG4gICAgLy8gVGhlIGNvbHVtbiBzaG93cyB0aGUgc3RvcmUncyBuYW1lIChyb3cuc3RvcmVJZCBob2xkcyBpdDsgc2VlIHRvQXVkaXRSb3cpLlxyXG4gICAgeyBrZXk6ICdzdG9yZUlkJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LFxyXG4gICAgeyBrZXk6ICdjaXJjbGUnLCBsYWJlbDogJ0NpcmNsZSBIZWFkJyB9LFxyXG4gICAgeyBrZXk6ICd6b25lJywgbGFiZWw6ICdab25lIE1hbmFnZXInIH0sXHJcbiAgICB7IGtleTogJ2FvbScsIGxhYmVsOiAnQU9NJyB9LFxyXG4gICAgeyBrZXk6ICdzY29yZScsIGxhYmVsOiAnU2NvcmUnIH0sXHJcbiAgICB7IGtleTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJyB9XHJcbiAgXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGFzayBtb2RlOiB0aWxlcyBhbmQgdGhlIFRhc2sgUGVyZm9ybWFuY2UgdGFibGUgZm9yIHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0c1xyXG4gICAqICgvdHJheC9hdWRpdC9kYXNoYm9hcmQvdGFza3MpLiBMb2FkZWQgd2hlbiB0aGUgVGFzayB0YWIgaXMgb3BlbiwgYW5kIGFnYWluIGFmdGVyIGEgaGVhZGVyIGNoYW5nZS5cclxuICAgKi9cclxuICB0YXNrU3RhdHM6IFRhc2tTdGF0cyA9IHsgLi4uRU1QVFlfVEFTS19TVEFUUyB9O1xyXG4gIHRhc2tQZXJmOiBUYXNrUGVyZlJvd1tdID0gW107XHJcbiAgdGFza0xvYWRpbmcgPSBmYWxzZTtcclxuICAvKiogQ2hhbmdlIHZzIHRoZSBwcmV2aW91cyBwZXJpb2QgKG51bGwgPSBub3RoaW5nIHRvIGNvbXBhcmUpOyBkcml2ZXMgdGhlIGRlbHRhIGFycm93IGFuZCBjb2xvdXIuICovXHJcbiAgcHJpdmF0ZSB0YXNrRGVsdGFWYWx1ZXM6IFJlY29yZDxUYXNrRGVsdGFLZXksIG51bWJlciB8IG51bGw+ID0geyBjb21wbGV0aW9uOiBudWxsLCBjb21wbGlhbmNlOiBudWxsLCBmbGFnczogbnVsbCB9O1xyXG4gIC8qKiBUcnVlIHVudGlsIHRoZSB0YXNrIGZpZ3VyZXMgYXJlIGxvYWRlZCBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuICovXHJcbiAgcHJpdmF0ZSB0YXNrc1N0YWxlID0gdHJ1ZTtcclxuICAvKiogSWdub3JlcyBhIHRhc2sgcmVzcG9uc2UgdGhhdCBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gKi9cclxuICBwcml2YXRlIHRhc2tSZXF1ZXN0ID0gMDtcclxuICAvKiogUERGIGRvd25sb2FkcyBpbiBmbGlnaHQsIGJ5IHZpc2l0IGlkLCBzbyBhIGRvdWJsZSBjbGljayBxdWV1ZXMgb25lIHJlcG9ydC4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IHBkZlF1ZXVlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAvKiogUGVyZm9ybWFuY2Ugc2VjdGlvbi4gKi9cclxuICBwZXJmVGFiOiAnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgcGVyZlRhYnM6IEFycmF5PCdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInPiA9IFsnQXVkaXQnLCAnU3RvcmUnLCAnVXNlciddO1xyXG4gIHBlcmZQZXJpb2QgPSAnJztcclxuICBwZXJmU2VhcmNoID0gJyc7XHJcbiAgLyoqIFBlcmZvcm1hbmNlIHRhYmxlcycgcGFnZXIgKHNoYXJlZCBsaWItcGFnaW5hdGlvbiwgYXMgdGhlIG90aGVyIGF1ZGl0IGxpc3RzKTogMTAgcm93cyBhIHBhZ2UsIDEwIC8gMjAgLyAzMC4gKi9cclxuICBwZXJmUGFnZSA9IDE7XHJcbiAgcGVyZlBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGVyZlBhZ2VTaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuICAvKiogQ29sdW1uIHNvcnQgb2YgdGhlIGFjdGl2ZSBQZXJmb3JtYW5jZSB0YWJsZSAoJycgPSB0aGUgQVBJJ3Mgb3JkZXIpOyByZXNldCB3aGVuIHRoZSB0YWIgY2hhbmdlcy4gKi9cclxuICBwZXJmU29ydEtleSA9ICcnO1xyXG4gIHBlcmZTb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAvKiogU29ydGFibGUgY29sdW1ucyBvZiBlYWNoIFBlcmZvcm1hbmNlIHRhYmxlLCBpbiBkaXNwbGF5IG9yZGVyIChBY3Rpb24gaXMgbm90IHNvcnRhYmxlKS4gKi9cclxuICByZWFkb25seSBhdWRpdFBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICAvLyBObyBTY2hlZHVsZWQgY29sdW1uIChRQSA5IE9jdCkuXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ0F1ZGl0IE5hbWUnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LFxyXG4gICAgeyBrZXk6ICdkaXNwdXRlcycsIGxhYmVsOiAnRGlzcHV0ZXMnIH0sIHsga2V5OiAncGFzc01hcmsnLCBsYWJlbDogJ1Bhc3MgTWFyaycgfSxcclxuICAgIHsga2V5OiAnc2NvcmUnLCBsYWJlbDogJ1Njb3JlJyB9LCB7IGtleTogJ3Jlc3VsdCcsIGxhYmVsOiAnUmVzdWx0JyB9XHJcbiAgXTtcclxuICByZWFkb25seSB0YXNrUGVyZkNvbHM6IFBlcmZDb2x1bW5bXSA9IFtcclxuICAgIHsga2V5OiAnbmFtZScsIGxhYmVsOiAnVGFzayBOYW1lJyB9LCB7IGtleTogJ3NjaGVkdWxlZCcsIGxhYmVsOiAnU2NoZWR1bGVkJyB9LCB7IGtleTogJ2NvdmVyYWdlJywgbGFiZWw6ICdDb3ZlcmFnZScgfSxcclxuICAgIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LCB7IGtleTogJ2ZsYWdzJywgbGFiZWw6ICdGbGFncycgfSxcclxuICAgIHsga2V5OiAndGFza3MnLCBsYWJlbDogJ1Rhc2tzJyB9LCB7IGtleTogJ3JlZG8nLCBsYWJlbDogJ1JlRG8nIH0sIHsga2V5OiAnY29tcGxpYW5jZScsIGxhYmVsOiAnUXVlc3Rpb24gQ29tcGxpYW5jZSAlJyB9XHJcbiAgXTtcclxuICByZWFkb25seSBzdG9yZVBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ3N0b3JlJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LCB7IGtleTogJ3Nwb2MnLCBsYWJlbDogJ1N0b3JlIFNwb2MnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkJyB9LFxyXG4gICAgeyBrZXk6ICdmbGFncycsIGxhYmVsOiAnRmxhZ3MnIH0sIHsga2V5OiAnY29tcGxldGlvbicsIGxhYmVsOiAnQ29tcGxldGlvbiAlJyB9LCB7IGtleTogJ2NvbXBsaWFuY2UnLCBsYWJlbDogJ0NvbXBsaWFuY2UgJScgfSxcclxuICAgIHsga2V5OiAncGVyZicsIGxhYmVsOiAnUGVyZm9ybWFuY2UgJScgfVxyXG4gIF07XHJcbiAgcmVhZG9ubHkgdXNlclBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ1VzZXIgTmFtZScgfSwgeyBrZXk6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkJyB9LFxyXG4gICAgeyBrZXk6ICdmbGFncycsIGxhYmVsOiAnRmxhZ3MnIH0sIHsga2V5OiAncmVkbycsIGxhYmVsOiAnUmVEbycgfSwgeyBrZXk6ICdjb21wbGV0aW9uJywgbGFiZWw6ICdDb21wbGV0aW9uICUnIH0sXHJcbiAgICB7IGtleTogJ2NvbXBsaWFuY2UnLCBsYWJlbDogJ0NvbXBsaWFuY2UgJScgfSwgeyBrZXk6ICdwZXJmJywgbGFiZWw6ICdQZXJmb3JtYW5jZSAlJyB9XHJcbiAgXTtcclxuXHJcbiAgLyoqIFdoYXQgZWFjaCBzb3J0YWJsZSBjb2x1bW4gc29ydHMgb246IG51bWJlcnMgZm9yIGNvdW50cyBhbmQgcGVyY2VudGFnZXMsIHRleHQgb3RoZXJ3aXNlOyBudWxsIHNvcnRzIGxhc3QuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhdWRpdFNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IEF1ZGl0UGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIG5hbWU6IHIgPT4gci5uYW1lLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBzdWJtaXR0ZWQ6IHIgPT4gci5zdWJtaXR0ZWQsXHJcbiAgICBkaXNwdXRlczogciA9PiByLmRpc3B1dGVzLCBwYXNzTWFyazogciA9PiB0aGlzLm51bShTdHJpbmcoci5wYXNzTWFyaykucmVwbGFjZSgnJScsICcnKSksXHJcbiAgICBzY29yZTogciA9PiAoci5zY29yZSA9PT0gJ+KAlCcgPyBudWxsIDogci5zY29yZVBjdCksIHJlc3VsdDogciA9PiAoci5yZXN1bHQgPT09ICfigJQnID8gbnVsbCA6IHIucmVzdWx0KVxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0YXNrU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogVGFza1BlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgc2NoZWR1bGVkOiByID0+IHIuc2NoZWR1bGVkLCBjb3ZlcmFnZTogciA9PiByLmNvdmVyYWdlLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLFxyXG4gICAgc3VibWl0dGVkOiByID0+IHIuc3VibWl0dGVkLCBmbGFnczogciA9PiByLmZsYWdzLCB0YXNrczogciA9PiB0aGlzLm51bShyLnJhdz8udGFza3MpLCByZWRvOiByID0+IHIucmVkbyxcclxuICAgIGNvbXBsaWFuY2U6IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsaWFuY2UpXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogU3RvcmVQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgc3RvcmU6IHIgPT4gci5zdG9yZSwgc3BvYzogciA9PiByLnNwb2MsIGFzc2lnbmVkOiByID0+IHIuYXNzaWduZWQsIGZsYWdzOiByID0+IHIuZmxhZ3MsXHJcbiAgICBjb21wbGV0aW9uOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGV0aW9uKSwgY29tcGxpYW5jZTogciA9PiB0aGlzLm51bShyLnJhdz8uY29tcGxpYW5jZSksIHBlcmY6IHIgPT4gdGhpcy5udW0oci5yYXc/LnBlcmZvcm1hbmNlKVxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogVXNlclBlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgZW1haWw6IHIgPT4gci5lbWFpbCwgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgZmxhZ3M6IHIgPT4gci5mbGFncywgcmVkbzogciA9PiByLnJlZG8sXHJcbiAgICBjb21wbGV0aW9uOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGV0aW9uKSwgY29tcGxpYW5jZTogciA9PiB0aGlzLm51bShyLnJhdz8uY29tcGxpYW5jZSksIHBlcmY6IHIgPT4gdGhpcy5udW0oci5yYXc/LnBlcmZvcm1hbmNlKVxyXG4gIH07XHJcblxyXG4gIGF1ZGl0UGVyZjogQXVkaXRQZXJmUm93W10gPSBbXTtcclxuICBzdG9yZVBlcmY6IFN0b3JlUGVyZlJvd1tdID0gW107XHJcbiAgdXNlclBlcmY6IFVzZXJQZXJmUm93W10gPSBbXTtcclxuXHJcbiAgcm93czogQXVkaXRSb3dbXSA9IFtdO1xyXG4gIHRyZW5kOiBUcmVuZEJhcltdID0gW107XHJcblxyXG4gIC8qKiBTdGFydHMgdHJ1ZSBzbyB0aGUgZmlyc3QgcGFpbnQgc2hpbW1lcnMgaW5zdGVhZCBvZiBmbGFzaGluZyBlbXB0eSB0aWxlcyBhbmQgdGFibGVzLiAqL1xyXG4gIGxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIGhlYWRlckRhdGE6IGFueTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJFbWFpbGVzOiBzdHJpbmdbXSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXJzRW1haWwtaW5mbycpIHx8ICdbXScpO1xyXG4gIC8qKiBDcmVhdGUgQXVkaXQgc2hvd3Mgb25seSB3aXRoIHRoZSBDaGVja2xpc3QgYWRkIHBlcm1pc3Npb24uICovXHJcbiAgYWNjZXNzOiBBdWRpdEFjY2VzcyA9IHsgY2FuQWRkOiBmYWxzZSwgY2FuRWRpdDogZmFsc2UgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRyYXhTZXJ2aWNlOiBUcmF4U2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBhdWRpdEFjY2Vzcyh0aGlzLmdzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGFjY2VzcyA9PiB7XHJcbiAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWRhdGE/LmNsaWVudCkgeyByZXR1cm47IH1cclxuICAgICAgICBjb25zdCBjbGllbnRDaGFuZ2VkID0gZGF0YS5jbGllbnQgIT09IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50O1xyXG4gICAgICAgIHRoaXMuaGVhZGVyRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy5vbkhlYWRlclNjb3BlKGNsaWVudENoYW5nZWQpO1xyXG4gICAgICAgIC8vIEEgcXVhcnRlciBzdGF5cyBwaWNrZWQgYWNyb3NzIGhlYWRlciBjaGFuZ2VzIChuZXcgc3RvcmVzIC8gY2xpZW50KTsgQnkgZGF0ZSBmb2xsb3dzIHRoZSBoZWFkZXIuXHJcbiAgICAgICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJykgeyB0aGlzLmFwcGx5UXVhcnRlcih0aGlzLnF1YXJ0ZXIsIHRydWUpOyByZXR1cm47IH1cclxuICAgICAgICB0aGlzLmZyb20gPSBkYXRhLmRhdGU/LnN0YXJ0RGF0ZSB8fCAnJztcclxuICAgICAgICB0aGlzLnRvID0gZGF0YS5kYXRlPy5lbmREYXRlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMucmFuZ2UgPSB0b1BpY2tlclJhbmdlKHRoaXMuZnJvbSwgdGhpcy50byk7XHJcbiAgICAgICAgdGhpcy5yZWxvYWRQZXJpb2QoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWFkZXIgY2hhbmdlLiBOZXcgY2xpZW50OiB0aGUgYXVkaXQgdHlwZSBzdGFydHMgb3ZlciBhbmQgaXRzIGxpc3QgaXMgZmV0Y2hlZCBhZ2Fpbi4gTmV3IGNsaWVudCBvclxyXG4gICAqIHN0b3JlczogdGhlIGhpZXJhcmNoeSBwaWNrcyBzdGFydCBvdmVyICh0aGUgbmV4dCBsb2FkIHJlZmlsbHMgdGhlIGxpc3RzKS4gQSBkYXRlLW9ubHkgY2hhbmdlIGtlZXBzIGJvdGguXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvbkhlYWRlclNjb3BlKGNsaWVudENoYW5nZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuaGVhZGVyRGF0YS5jbGllbnQgKyAnfCcgKyB0aGlzLmhlYWRlclN0b3JlSWRzKCkuam9pbignLCcpO1xyXG4gICAgaWYgKGtleSAhPT0gdGhpcy5oZWFkZXJTY29wZUtleSkge1xyXG4gICAgICB0aGlzLmhlYWRlclNjb3BlS2V5ID0ga2V5O1xyXG4gICAgICB0aGlzLmNpcmNsZSA9IHRoaXMuem9uZSA9IHRoaXMuYW9tID0gdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgICB0aGlzLmFwcGxpZWQgPSB7IC4uLnRoaXMuYXBwbGllZCwgY2lyY2xlOiAnJywgem9uZTogJycsIGFvbTogJycsIHN0b3JlOiAnJyB9O1xyXG4gICAgfVxyXG4gICAgaWYgKGNsaWVudENoYW5nZWQpIHtcclxuICAgICAgdGhpcy5hdWRpdFR5cGUgPSAnYWxsJztcclxuICAgICAgdGhpcy5hcHBsaWVkLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgICB0aGlzLmF1ZGl0VHlwZXMgPSBbQUxMX0FVRElUU107XHJcbiAgICAgIHRoaXMubG9hZEF1ZGl0VHlwZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBUaGUgY2xpZW50J3MgYXVkaXRzIGZvciB0aGUgQXVkaXQgdHlwZSBmaWx0ZXIsIG5ld2VzdCBmaXJzdCBhcyB0aGUgTWFuYWdlIGxpc3QuICovXHJcbiAgcHJpdmF0ZSBsb2FkQXVkaXRUeXBlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsaWVudElkID0gdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICBpZiAoIWNsaWVudElkIHx8IGNsaWVudElkID09PSB0aGlzLmF1ZGl0VHlwZXNDbGllbnQpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmF1ZGl0VHlwZXNDbGllbnQgPSBjbGllbnRJZDtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRMaXN0KHtcclxuICAgICAgY2xpZW50SWQsIGZyb21EYXRlOiB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSwgdG9EYXRlOiB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUsXHJcbiAgICAgIGxpbWl0OiA1MDAsIG9mZnNldDogMSwgc2VhcmNoOiAnJ1xyXG4gICAgfSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXM/LmNvZGUgIT09IDIwMCkgeyB0aGlzLmF1ZGl0VHlwZXNDbGllbnQgPSAnJzsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IGxpc3Q6IGFueVtdID0gcmVzLmRhdGE/LnJlc3VsdCB8fCBbXTtcclxuICAgICAgdGhpcy5hdWRpdFR5cGVzID0gW0FMTF9BVURJVFNdLmNvbmNhdChsaXN0Lm1hcChhID0+ICh7XHJcbiAgICAgICAga2V5OiBTdHJpbmcoYS5faWQpLFxyXG4gICAgICAgIGxhYmVsOiBhLmNoZWNrTGlzdE5hbWUgfHwgJ1VudGl0bGVkIGF1ZGl0JyxcclxuICAgICAgICBoZWxwOiAoYS5wdWJsaXNoID8gJ1B1Ymxpc2hlZCcgOiAnRHJhZnQnKSArICcgwrcgcGFzcyBtYXJrICcgKyAodGhpcy5udW0oYS5wYXNzTWFyaykgPz8gUEFTU19NQVJLKSArICclJ1xyXG4gICAgICB9KSkpO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJ5IGRhdGU6IG9uZSBtb250aCBhdCBtb3N0ICh0aGUgcGlja2VycycgZGF0ZUxpbWl0LCBpbiBkYXlzIGFmdGVyIHRoZSBzdGFydDsgMzAgPSB1cCB0byAzMSBkYXlzKS4gKi9cclxuICByZWFkb25seSBtYXhSYW5nZURheXMgPSAzMDtcclxuXHJcbiAgLyoqIFJhbmdlIHBpY2tlcjogYSBuZXcgcGVyaW9kIHJlbG9hZHMgZXZlcnkgZmVlZCwgZXhjZXB0IGluc2lkZSB0aGUgZmlsdGVyIGRyYXdlciwgd2hlcmUgQXBwbHkgZG9lcy4gKi9cclxuICBvblJhbmdlUGlja2VkKGU6IFBpY2tlZERhdGVzIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGlja2VkID0gZnJvbVBpY2tlclJhbmdlKGUpO1xyXG4gICAgaWYgKCFwaWNrZWQgfHwgKHBpY2tlZC5mcm9tID09PSB0aGlzLmZyb20gJiYgcGlja2VkLnRvID09PSB0aGlzLnRvKSkgeyByZXR1cm47IH1cclxuICAgIC8vIEEgbG9uZ2VyIHJhbmdlICh0eXBlZCwgb3IgYSBwcmVzZXQpIGlzIGN1dCBiYWNrIHRvIGEgbW9udGggZnJvbSBpdHMgc3RhcnQuXHJcbiAgICBpZiAoZGF5anMocGlja2VkLnRvKS5kaWZmKGRheWpzKHBpY2tlZC5mcm9tKSwgJ2RheScpID4gdGhpcy5tYXhSYW5nZURheXMpIHtcclxuICAgICAgcGlja2VkLnRvID0gZGF5anMocGlja2VkLmZyb20pLmFkZCh0aGlzLm1heFJhbmdlRGF5cywgJ2RheScpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZShwaWNrZWQuZnJvbSwgcGlja2VkLnRvKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdQaWNrIHVwIHRvIG9uZSBtb250aCDigJQgdGhlIHJhbmdlIGVuZHMgb24gJyArIGRheWpzKHBpY2tlZC50bykuZm9ybWF0KCdERCBNTU0gWVlZWScpKTtcclxuICAgIH1cclxuICAgIHRoaXMuZnJvbSA9IHBpY2tlZC5mcm9tO1xyXG4gICAgdGhpcy50byA9IHBpY2tlZC50bztcclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbikgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbG9hZFBlcmlvZCgpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBlcmlvZCA9ICdCYXNlZCBvbiAnICsgdGhpcy5mbXQodGhpcy5mcm9tKSArICcgLSAnICsgdGhpcy5mbXQodGhpcy50byk7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgICAvLyBUYXNrIGZpZ3VyZXMgZm9sbG93IHRoZSBzYW1lIHNjb3BlOyBmZXRjaGVkIG5vdyBpbiBUYXNrIG1vZGUsIGVsc2Ugd2hlbiB0aGUgdGFiIG9wZW5zLlxyXG4gICAgdGhpcy50YXNrc1N0YWxlID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmlzVGFza01vZHVsZSkgeyB0aGlzLmxvYWRUYXNrcygpOyB9XHJcbiAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHRoaXMubG9hZFF1YXJ0ZXJUcmVuZCgpOyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZm91ciBxdWFydGVyIGJhcnM6IG9uZSBjYWxsIG92ZXIgdGhlIGZvdXIgcXVhcnRlcnMgKG1vcmUgdGhhbiAxMjAgZGF5cywgc28gdGhlIEFQSSBidWNrZXRzIHRoZVxyXG4gICAqIHRyZW5kIGJ5IG1vbnRoKSByb2xsZWQgdXAgcGVyIHF1YXJ0ZXIsIHdlaWdodGVkIGJ5IGVhY2ggbW9udGgncyBhdWRpdCBjb3VudC4gRmV0Y2hlZCBhZ2FpbiBvbmx5XHJcbiAgICogd2hlbiB0aGUgY2xpZW50IG9yIHN0b3JlcyBjaGFuZ2UuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkUXVhcnRlclRyZW5kKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmJhc2VQYXlsb2FkKCk7XHJcbiAgICBjb25zdCBrZXkgPSBzY29wZVsnY2xpZW50SWQnXSArICd8JyArIChzY29wZVsnc3RvcmVJZCddIHx8IFtdKS5qb2luKCcsJykgKyAnfCcgKyAoc2NvcGVbJ2NoZWNrbGlzdElkJ10gfHwgJycpO1xyXG4gICAgaWYgKGtleSA9PT0gdGhpcy5xdWFydGVyVHJlbmRTY29wZSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucXVhcnRlclRyZW5kU2NvcGUgPSBrZXk7XHJcbiAgICB0aGlzLnF1YXJ0ZXJUcmVuZExvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZCh7XHJcbiAgICAgIGNsaWVudElkOiBzY29wZVsnY2xpZW50SWQnXSwgZnJvbURhdGU6IHRoaXMuZmlzY2FsWzBdLmZyb20sIHRvRGF0ZTogdGhpcy50b2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgc3RvcmVJZDogc2NvcGVbJ3N0b3JlSWQnXSxcclxuICAgICAgLi4udGhpcy5hdWRpdEZpbHRlcigpXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgY29uc3Qgb2sgPSByZXM/LmNvZGUgPT09IDIwMDtcclxuICAgICAgaWYgKCFvaykgeyB0aGlzLnF1YXJ0ZXJUcmVuZFNjb3BlID0gJyc7IH1cclxuICAgICAgY29uc3QgYnVja2V0czogYW55W10gPSBvayA/IHJlcy5kYXRhPy50cmVuZCB8fCBbXSA6IFtdO1xyXG4gICAgICB0aGlzLnF1YXJ0ZXJUcmVuZCA9IHRoaXMuZmlzY2FsLm1hcChxID0+IHtcclxuICAgICAgICBjb25zdCBpblF1YXJ0ZXIgPSBidWNrZXRzLmZpbHRlcihiID0+IFN0cmluZyhiLmtleSkgPj0gcS5mcm9tICYmIFN0cmluZyhiLmtleSkgPD0gcS50byAmJiBiLnZhbHVlICE9PSBudWxsICYmIGIudmFsdWUgIT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBpblF1YXJ0ZXIucmVkdWNlKChuLCBiKSA9PiBuICsgKE51bWJlcihiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgY29uc3QgdG90YWwgPSBpblF1YXJ0ZXIucmVkdWNlKChuLCBiKSA9PiBuICsgTnVtYmVyKGIudmFsdWUpICogKE51bWJlcihiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgY29uc3Qgc3VibWl0dGVkID0gYnVja2V0cy5maWx0ZXIoYiA9PiBTdHJpbmcoYi5rZXkpID49IHEuZnJvbSAmJiBTdHJpbmcoYi5rZXkpIDw9IHEudG8pXHJcbiAgICAgICAgICAucmVkdWNlKChuLCBiKSA9PiBuICsgKE51bWJlcihiLnN1Ym1pdHRlZCA/PyBiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgcmV0dXJuIHsga2V5OiBxLmtleSwgbGFiZWw6IHEua2V5LCB2YWx1ZTogY291bnQgPyBNYXRoLnJvdW5kKHRvdGFsIC8gY291bnQpIDogbnVsbCwgY291bnQsIHN1Ym1pdHRlZCB9O1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5xdWFydGVyVHJlbmRMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogTWFrZSBhIHF1YXJ0ZXIgdGhlIHBlcmlvZCAodXAgdG8gdG9kYXkgZm9yIHRoZSBjdXJyZW50IG9uZSk7IHJlbG9hZHMgdW5sZXNzIHRoZSBmaWx0ZXIgZHJhd2VyIGlzIG9wZW4uICovXHJcbiAgcHJpdmF0ZSBhcHBseVF1YXJ0ZXIoa2V5OiBzdHJpbmcsIGZvcmNlID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLmZpc2NhbC5maW5kKHggPT4geC5rZXkgPT09IGtleSkgfHwgdGhpcy5maXNjYWxbdGhpcy5maXNjYWwubGVuZ3RoIC0gMV07XHJcbiAgICBjb25zdCB0b2RheSA9IHRoaXMudG9kYXkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICBjb25zdCB0byA9IHEudG8gPiB0b2RheSA/IHRvZGF5IDogcS50bztcclxuICAgIGlmICghZm9yY2UgJiYgcS5rZXkgPT09IHRoaXMucXVhcnRlciAmJiB0aGlzLmZyb20gPT09IHEuZnJvbSAmJiB0aGlzLnRvID09PSB0bykgeyByZXR1cm47IH1cclxuICAgIHRoaXMucXVhcnRlciA9IHEua2V5O1xyXG4gICAgdGhpcy5mcm9tID0gcS5mcm9tO1xyXG4gICAgdGhpcy50byA9IHRvO1xyXG4gICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbikgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICAvKiogUXVhcnRlcmx5OiBhIGJhciAob3IgYSBxdWFydGVyIGluIHRoZSBmaWx0ZXIgZHJhd2VyKSBwaWNrcyB0aGF0IHF1YXJ0ZXIuICovXHJcbiAgc2VsZWN0UXVhcnRlcihrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gIT09ICdxdWFydGVyJykgeyByZXR1cm47IH1cclxuICAgIHRoaXMuYXBwbHlRdWFydGVyKGtleSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHRyZW5kIGNhcmQgd2FpdHMgZm9yIHRoZSBwYWdlIGZlZWRzLCBhbmQgaW4gUXVhcnRlcmx5IGFsc28gZm9yIHRoZSBxdWFydGVyIGJhcnMuICovXHJcbiAgZ2V0IHRyZW5kTG9hZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJyAmJiB0aGlzLnF1YXJ0ZXJUcmVuZExvYWRpbmcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJhcnMgdGhlIHRyZW5kIGNoYXJ0IGRyYXdzOiB0aGUgZm91ciBxdWFydGVycywgb3IgdGhlIEFQSSdzIGJ5LWRhdGUgYnVja2V0cy4gKi9cclxuICBnZXQgdHJlbmRCYXJzKCk6IFRyZW5kQmFyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJyA/IHRoaXMucXVhcnRlclRyZW5kIDogdGhpcy50cmVuZDtcclxuICB9XHJcblxyXG4gIC8qKiBNb3JlIGJhcnMgdGhhbiBmaXQgdGhlaXIgbGFiZWxzIChhIG1vbnRoIGJ5IGRhdGUpOiBzZWUgc2hvd1hMYWJlbC4gKi9cclxuICBnZXQgZGVuc2VUcmVuZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRyZW5kQmFycy5sZW5ndGggPiAxMjtcclxuICB9XHJcblxyXG4gIC8qKiBEZW5zZSBjaGFydDogYSBsYWJlbCBvbiBldmVyeSBmZXcgYmFycyAoYWJvdXQgOCBhY3Jvc3MpLCBhbHdheXMgb24gdGhlIGZpcnN0IGFuZCBsYXN0OyBvdGhlcndpc2UgZXZlcnkgYmFyLiAqL1xyXG4gIHNob3dYTGFiZWwoaTogbnVtYmVyLCBsYXN0OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBuID0gdGhpcy50cmVuZEJhcnMubGVuZ3RoO1xyXG4gICAgaWYgKG4gPD0gMTIpIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIGNvbnN0IHN0ZXAgPSBNYXRoLmNlaWwobiAvIDgpO1xyXG4gICAgLy8gVGhlIGxhc3QgbGFiZWwgYWx3YXlzIHNob3dzOyB0aGUgcmVndWxhciBvbmUganVzdCBiZWZvcmUgaXQgaXMgc2tpcHBlZCB3aGVuIHRoZSB0d28gd291bGQgdG91Y2guXHJcbiAgICByZXR1cm4gbGFzdCB8fCAoaSAlIHN0ZXAgPT09IDAgJiYgbiAtIDEgLSBpID49IHN0ZXAgLSAxKTtcclxuICB9XHJcblxyXG4gIC8qKiBcIk9jdCDigJMgRGVjIDIwMjZcIiBmb3IgYSBxdWFydGVyIGtleS4gKi9cclxuICBxdWFydGVyTW9udGhzKGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZpc2NhbC5maW5kKHEgPT4gcS5rZXkgPT09IGtleSk/Lm1vbnRocyB8fCAnJztcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRpY2tlZCBpbiB0aGUgZ2xvYmFsIGhlYWRlci4gKi9cclxuICBwcml2YXRlIGhlYWRlclN0b3JlSWRzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiAodGhpcy5oZWFkZXJEYXRhPy5zdG9yZXMgfHwgW10pLmZpbHRlcigoczogYW55KSA9PiBzLmNoZWNrZWQpLm1hcCgoczogYW55KSA9PiBzLnN0b3JlSWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaGllcmFyY2h5QXBwbGllZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGEgPSB0aGlzLmFwcGxpZWQ7XHJcbiAgICByZXR1cm4gISEoYS5jaXJjbGUgfHwgYS56b25lIHx8IGEuYW9tIHx8IGEuc3RvcmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXRjaGVzU2NvcGUocjogQXVkaXRSb3csIHBpY2s6IFNjb3BlUGljayk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICghcGljay5jaXJjbGUgfHwgci5jaXJjbGUgPT09IHBpY2suY2lyY2xlKSAmJiAoIXBpY2suem9uZSB8fCByLnpvbmUgPT09IHBpY2suem9uZSlcclxuICAgICAgJiYgKCFwaWNrLmFvbSB8fCByLmFvbSA9PT0gcGljay5hb20pICYmICghcGljay5zdG9yZSB8fCBTdHJpbmcoci5yYXc/LnN0b3JlSWQpID09PSBwaWNrLnN0b3JlKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgc3RvcmVzIGV2ZXJ5IGZlZWQgcmVhZHM6IHRoZSBoZWFkZXIncywgbmFycm93ZWQgdG8gdGhlIGFwcGxpZWQgaGllcmFyY2h5IHBpY2suICovXHJcbiAgcHJpdmF0ZSBzY29wZWRTdG9yZUlkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIXRoaXMuaGllcmFyY2h5QXBwbGllZCkgeyByZXR1cm4gdGhpcy5oZWFkZXJTdG9yZUlkcygpOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgdGhpcy5hcHBsaWVkKSkubWFwKHIgPT4gU3RyaW5nKHIucmF3Py5zdG9yZUlkIHx8ICcnKSkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhcHBsaWVkIEF1ZGl0IHR5cGUgYXMgdGhlIEFQSXMgdGFrZSBpdCAobm90aGluZyBmb3IgQWxsIEF1ZGl0cykuICovXHJcbiAgcHJpdmF0ZSBhdWRpdEZpbHRlcigpOiB7IGNoZWNrbGlzdElkPzogc3RyaW5nIH0ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXBwbGllZC5hdWRpdFR5cGUgIT09ICdhbGwnID8geyBjaGVja2xpc3RJZDogdGhpcy5hcHBsaWVkLmF1ZGl0VHlwZSB9IDoge307XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJhc2VQYXlsb2FkKGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICAgIHRvRGF0ZTogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUsXHJcbiAgICAgIHN0b3JlSWQ6IHRoaXMuc2NvcGVkU3RvcmVJZHMoKSxcclxuICAgICAgLi4udGhpcy5hdWRpdEZpbHRlcigpLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIHVzZXJFbWFpbGVzOiB0aGlzLnVzZXJFbWFpbGVzLFxyXG4gICAgICBsaW1pdDogMTAwMCxcclxuICAgICAgb2Zmc2V0OiAwLFxyXG4gICAgICBzb3J0Qnk6ICcnLFxyXG4gICAgICBzb3J0Q29sdW1uTmFtZTogJycsXHJcbiAgICAgIHNlYXJjaFZhbHVlOiAnJyxcclxuICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgLi4uZXh0cmFcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGZvdXIgZmVlZHMgbG9hZCB0b2dldGhlcjsgYSBmYWlsdXJlIGluIG9uZSBsZWF2ZXMgdGhlIG90aGVycyBpbnRhY3QuICovXHJcbiAgcHJpdmF0ZSBsb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHNhZmUgPSAobzogYW55KSA9PiBvLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpO1xyXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmJhc2VQYXlsb2FkKCk7XHJcbiAgICAvLyBSb3dzIGZldGNoZWQgZm9yIHRoZSB3aG9sZSBoZWFkZXIgc2NvcGUgcmVmaWxsIHRoZSBoaWVyYXJjaHkgbGlzdHM7IG5hcnJvd2VkIG9uZXMgZG8gbm90LlxyXG4gICAgY29uc3QgbmFycm93ZWQgPSB0aGlzLmhpZXJhcmNoeUFwcGxpZWQ7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIC8vIFRoZSBhdWRpdCBkYXNoYm9hcmQgQVBJIHJlamVjdHMgdW5rbm93biBrZXlzLCBzbyBvbmx5IHRoZSBzY29wZSBpcyBzZW50LlxyXG4gICAgICBkYXNoOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXREYXNoYm9hcmQoe1xyXG4gICAgICAgIGNsaWVudElkOiBzY29wZVsnY2xpZW50SWQnXSwgZnJvbURhdGU6IHNjb3BlWydmcm9tRGF0ZSddLCB0b0RhdGU6IHNjb3BlWyd0b0RhdGUnXSwgc3RvcmVJZDogc2NvcGVbJ3N0b3JlSWQnXSxcclxuICAgICAgICAuLi50aGlzLmF1ZGl0RmlsdGVyKClcclxuICAgICAgfSkpLFxyXG4gICAgICAvLyBTYW1lIHRhYmxlcyBhcyB0aGUgY2hlY2tsaXN0IGRhc2hib2FyZCwgbGltaXRlZCBzZXJ2ZXItc2lkZSB0byB0aGlzIGNsaWVudCdzIGF1ZGl0cy5cclxuICAgICAgYXVkaXRzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRDaGVja2xpc3RQZXJmb3JtYW5jZSh0aGlzLmJhc2VQYXlsb2FkKHsgbGltaXQ6IDIwMCB9KSkpLFxyXG4gICAgICBzdG9yZXM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdFN0b3JlUGVyZm9ybWFuY2UodGhpcy5iYXNlUGF5bG9hZCh7IGxpbWl0OiAxMDAwIH0pKSksXHJcbiAgICAgIHVzZXJzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRVc2VyUGVyZm9ybWFuY2UodGhpcy5iYXNlUGF5bG9hZCh7IGxpbWl0OiA1MDAgfSkpKVxyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoeyBkYXNoLCBhdWRpdHMsIHN0b3JlcywgdXNlcnMgfTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBkYXNoPy5jb2RlID09PSAyMDAgPyAoZGFzaC5kYXRhIHx8IHt9KSA6IHt9O1xyXG4gICAgICBjb25zdCBhdWRpdExpc3QgPSBhdWRpdHM/LmNvZGUgPT09IDIwMCA/IChhdWRpdHMuZGF0YT8uY2hlY2tsaXN0UGVyZm9ybWFuY2UgfHwgW10pIDogW107XHJcbiAgICAgIGNvbnN0IHN0b3JlTGlzdCA9IHN0b3Jlcz8uY29kZSA9PT0gMjAwID8gKHN0b3Jlcy5kYXRhPy5zdG9yZVBlcmZvcm1hbmNlIHx8IFtdKSA6IFtdO1xyXG4gICAgICBjb25zdCB1c2VyTGlzdCA9IHVzZXJzPy5jb2RlID09PSAyMDAgPyAodXNlcnMuZGF0YT8udXNlclBlcmZvcm1hbmNlIHx8IFtdKSA6IFtdO1xyXG5cclxuICAgICAgdGhpcy5wYXNzTWFyayA9IE51bWJlcihkYXRhLnN1bW1hcnk/LnBhc3NNYXJrKSB8fCBQQVNTX01BUks7XHJcbiAgICAgIHRoaXMuY3JpdGljYWxNYXJrID0gTnVtYmVyKGRhdGEuc3VtbWFyeT8uY3JpdGljYWxNYXJrKSB8fCBDUklUSUNBTF9NQVJLO1xyXG4gICAgICB0aGlzLnJvd3MgPSAoZGF0YS5zdG9yZXMgfHwgW10pLm1hcCgoczogYW55KSA9PiB0aGlzLnRvQXVkaXRSb3cocykpO1xyXG4gICAgICBpZiAoIW5hcnJvd2VkICYmIGRhc2g/LmNvZGUgPT09IDIwMCkgeyB0aGlzLnNjb3BlUm93cyA9IHRoaXMucm93czsgfVxyXG4gICAgICB0aGlzLnN0b3JlUGVyZiA9IHN0b3JlTGlzdC5tYXAoKHI6IGFueSkgPT4gdGhpcy50b1N0b3JlUGVyZihyKSk7XHJcbiAgICAgIHRoaXMudHJlbmQgPSAoZGF0YS50cmVuZCB8fCBbXSkubWFwKChiOiBhbnkpID0+ICh7XHJcbiAgICAgICAga2V5OiBTdHJpbmcoYi5rZXkpLCBsYWJlbDogU3RyaW5nKGIubGFiZWwpLFxyXG4gICAgICAgIHZhbHVlOiBiLnZhbHVlID09PSBudWxsIHx8IGIudmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBOdW1iZXIoYi52YWx1ZSksXHJcbiAgICAgICAgY291bnQ6IE51bWJlcihiLmNvdW50KSB8fCAwLFxyXG4gICAgICAgIC8vIE9sZGVyIEFQSSBidWlsZHMgc2VuZCBvbmx5IGNvdW50IChldmVyeSBhdWRpdCB3YXMgc2NvcmVkIHRoZW4pLlxyXG4gICAgICAgIHN1Ym1pdHRlZDogTnVtYmVyKGIuc3VibWl0dGVkID8/IGIuY291bnQpIHx8IDBcclxuICAgICAgfSkpO1xyXG4gICAgICB0aGlzLmF1ZGl0UGVyZiA9IGF1ZGl0TGlzdC5tYXAoKHI6IGFueSkgPT4gdGhpcy50b0F1ZGl0UGVyZihyKSk7XHJcbiAgICAgIHRoaXMudXNlclBlcmYgPSB1c2VyTGlzdC5tYXAoKHI6IGFueSkgPT4gdGhpcy50b1VzZXJQZXJmKHIpKTtcclxuICAgICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgICAgIHRoaXMubGFzdFJlZnJlc2hlZCA9IGRheWpzKCkuZm9ybWF0KCdoaDptbTpzcyBBJyk7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT25lIHN0b3JlIGZyb20gdGhlIGF1ZGl0IGRhc2hib2FyZCBBUEk6IHNjb3JlIGlzIHRoZSBtZWFuIG9mIGl0cyBjb21wbGlhbmNlLXNjb3JlZCBhdWRpdHMgaW4gdGhlIHBlcmlvZCxcclxuICAgKiBudWxsIHdoZW4gbm9uZS4gQSBzdG9yZSB3aXRoIHN1Ym1pdHRlZCBhdWRpdHMgYnV0IG5vIHNjb3JlIGlzICd1bnNjb3JlZCcgKGl0cyBhdWRpdHMgaGF2ZSBubyBxdWVzdGlvbiB3aXRoXHJcbiAgICogY29tcGxpYW5jZSBzY29yaW5nIG9uKSwgbm90IFwiTm90IGF1ZGl0ZWRcIi5cclxuICAgKi9cclxuICBwcml2YXRlIHRvQXVkaXRSb3coczogYW55KTogQXVkaXRSb3cge1xyXG4gICAgY29uc3Qgc2NvcmUgPSB0aGlzLm51bShzPy5zY29yZSk7XHJcbiAgICBsZXQgc3RhdHVzOiBTdG9yZVN0YXR1cztcclxuICAgIGlmIChzY29yZSAhPT0gbnVsbCkge1xyXG4gICAgICBzdGF0dXMgPSBzY29yZSA+PSB0aGlzLnBhc3NNYXJrID8gJ3Bhc3MnIDogJ2ZhaWwnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3RhdHVzID0gcz8uc3RhdHVzID09PSAndW5zY29yZWQnIHx8ICh0aGlzLm51bShzPy5hdWRpdHMpID8/IDApID4gMCA/ICd1bnNjb3JlZCcgOiAnbmEnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGF0ZTogcz8ubGFzdEF1ZGl0RGF0ZSA/IHRoaXMuZm10KHMubGFzdEF1ZGl0RGF0ZSkgOiAn4oCUJyxcclxuICAgICAgLy8gVGhlIHN0b3JlJ3MgbmFtZSAoaGllcmFyY2h5LCBpdHMgc3VibWlzc2lvbnMsIG9yIHRoZSBzdG9yZXMgbGlzdCk7IFwi4oCUXCIgd2hlbiBpdCBoYXMgbm9uZSwgbmV2ZXIgdGhlIGlkLlxyXG4gICAgICBzdG9yZUlkOiBzPy5zdG9yZU5hbWUgfHwgJ+KAlCcsXHJcbiAgICAgIGNpcmNsZTogcz8uY2lyY2xlIHx8ICfigJQnLFxyXG4gICAgICB6b25lOiBzPy56b25lIHx8ICfigJQnLFxyXG4gICAgICBhb206IHM/LmFvbSB8fCAn4oCUJyxcclxuICAgICAgc2NvcmU6IHNjb3JlID09PSBudWxsID8gbnVsbCA6IE1hdGgucm91bmQoc2NvcmUpLFxyXG4gICAgICBzdGF0dXMsXHJcbiAgICAgIHJhdzogc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uZSBzdG9yZSBmcm9tIC9hdWRpdC9kYXNoYm9hcmQvc3RvcmVQZXJmb3JtYW5jZSAoYXVkaXQgY29weSBvZiB0aGUgY2hlY2tsaXN0IGRhc2hib2FyZCdzIHRhYmxlKTogZXZlcnkgYXVkaXRcclxuICAgKiB2aXNpdCBpbiB0aGUgcGVyaW9kLCBzbyBjb21wbGV0aW9uID0gc3VibWl0dGVkIC8gYXNzaWduZWQgYW5kIGZsYWdzIGNvdW50LCB1bmxpa2UgdGhlIHNjb3JlLW9ubHkgc3RvcmUgbGlzdC5cclxuICAgKi9cclxuICBwcml2YXRlIHRvU3RvcmVQZXJmKHI6IGFueSk6IFN0b3JlUGVyZlJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZUlkOiByPy5zdG9yZV9pZCB8fCAnJyxcclxuICAgICAgc3RvcmU6IHI/LnN0b3JlTmFtZSB8fCAn4oCUJyxcclxuICAgICAgc3BvYzogcj8udXNlckVtYWlsIHx8ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uY2hlY2tMaXN0Q291bnQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bShyPy5mbGFnZ2VkQ291bnQpLFxyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLnBjdFRleHQocj8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChyPy5jb21wbGlhbmNlKSxcclxuICAgICAgcGVyZjogdGhpcy5wY3RUZXh0KHI/LnBlcmZvcm1hbmNlKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFyIGZpbGwgZm9yIGEgcGVyY2VudGFnZSAobnVtYmVyLCBvciB0ZXh0IGxpa2UgXCI1MSVcIiAvIFwiLTI1JVwiKToga2VwdCB0byAwLTEwMC4gQSBuZWdhdGl2ZSBzY29yZSAob3B0aW9uXHJcbiAgICogc2NvcmVzIGNhbiBiZSBuZWdhdGl2ZSBwZW5hbHRpZXMpIHdvdWxkIG90aGVyd2lzZSBzZXQgYW4gaW52YWxpZCBuZWdhdGl2ZSB3aWR0aCwgd2hpY2ggdGhlIGJyb3dzZXIgZHJvcHMsXHJcbiAgICogZHJhd2luZyB0aGUgYmFyIGZ1bGw7IGl0IGlzIGVtcHR5IGluc3RlYWQsIHdoaWxlIHRoZSBudW1iZXIgYmVzaWRlIGl0IHN0aWxsIHNob3dzIHRoZSByZWFsIHNjb3JlLlxyXG4gICAqL1xyXG4gIGJhcldpZHRoKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG4gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KFN0cmluZyh2YWx1ZSA/PyAnJykucmVwbGFjZSgnJScsICcnKSk7XHJcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBuKSkgKyAnJScgOiAnMCUnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b0F1ZGl0UGVyZihyOiBhbnkpOiBBdWRpdFBlcmZSb3cge1xyXG4gICAgY29uc3QgbmFtZSA9IHI/LmNoZWNrTGlzdE5hbWUgfHwgJ+KAlCc7XHJcbiAgICAvLyBObyBxdWVzdGlvbiBvZiB0aGUgYXVkaXQgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbjogbm8gc2NvcmUgYW5kIG5vIHJlc3VsdCAodGhlIEFQSSBzZW5kcyBudWxsKS5cclxuICAgIGNvbnN0IHNjb3JlID0gcj8uY29tcGxpYW5jZUVuYWJsZWQgPT09IGZhbHNlID8gbnVsbCA6IHRoaXMubnVtKHI/LnF1ZXN0aW9uQ29tcGxpYW5jZSk7XHJcbiAgICBjb25zdCBzY29yZVBjdCA9IHNjb3JlID09PSBudWxsID8gMCA6IE1hdGgucm91bmQoc2NvcmUpO1xyXG4gICAgLy8gVGhlIGF1ZGl0J3Mgb3duIHBhc3MgbWFyayB3aGVuIHRoZSBBUEkgc2VuZHMgaXQsIGVsc2UgdGhlIGRhc2hib2FyZCdzIChzdW1tYXJ5LnBhc3NNYXJrKS5cclxuICAgIGNvbnN0IG1hcmsgPSB0aGlzLm51bShyPy5wYXNzTWFyaykgPz8gdGhpcy5wYXNzTWFyaztcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGluaXRpYWxzOiBTdHJpbmcocj8uY2hlY2tMaXN0Q2hhciB8fCBuYW1lLnNsaWNlKDAsIDIpKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBzY2hlZHVsZWQ6IHI/LnNjaGVkdWxlUmVwZWF0ZWRUeXBlID8gdGhpcy50aXRsZUNhc2Uoci5zY2hlZHVsZVJlcGVhdGVkVHlwZSkgOiAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHI/LnN0b3JlQ291bnQpID8/IDAsXHJcbiAgICAgIHN1Ym1pdHRlZDogdGhpcy5udW0ocj8uc3VibWl0dGVkQ2hlY2tsaXN0KSA/PyAwLFxyXG4gICAgICAvLyBRdWVzdGlvbnMgd2l0aCBhIHN0b3JlIGRpc3B1dGUgKHJhaXNlZCBvciByZXZpZXdlZCkgaW4gdGhlIHBlcmlvZDsgJ+KAlCcgb25seSB3aGVuIHRoZSBBUEkgc2VuZHMgbm9uZS5cclxuICAgICAgZGlzcHV0ZXM6IHRoaXMubnVtKHI/LmRpc3B1dGVzKSxcclxuICAgICAgcGFzc01hcms6IG1hcmsgKyAnJScsXHJcbiAgICAgIHNjb3JlOiBzY29yZSA9PT0gbnVsbCA/ICfigJQnIDogc2NvcmVQY3QgKyAnJScsXHJcbiAgICAgIHNjb3JlUGN0LFxyXG4gICAgICByZXN1bHQ6IHNjb3JlID09PSBudWxsID8gJ+KAlCcgOiAoc2NvcmVQY3QgPj0gbWFyayA/ICdQYXNzJyA6ICdGYWlsJyksXHJcbiAgICAgIHJhdzogclxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9Vc2VyUGVyZihyOiBhbnkpOiBVc2VyUGVyZlJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lOiByPy51c2VyTmFtZSB8fCAn4oCUJyxcclxuICAgICAgZW1haWw6IHI/LnVzZXJFbWFpbCB8fCAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHI/LmNoZWNrTGlzdENvdW50KSA/PyAwLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0ocj8uZmxhZ2dlZENvdW50KSA/PyAwLFxyXG4gICAgICByZWRvOiB0aGlzLm51bShyPy5yZWRvKSA/PyAwLFxyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLnBjdFRleHQocj8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChyPy5jb21wbGlhbmNlKSxcclxuICAgICAgcGVyZjogdGhpcy5wY3RUZXh0KHI/LnBlcmZvcm1hbmNlKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGFzayBtb2RlOiB0aWxlcyArIFRhc2sgUGVyZm9ybWFuY2Ugcm93cyBmb3IgdGhlIHRhc2tzIHJhaXNlZCBmcm9tIHRoaXMgY2xpZW50J3MgYXVkaXRzLCBpbiB0aGVcclxuICAgKiBjdXJyZW50IHNjb3BlLiBBIGZhaWxlZCBjYWxsIGxlYXZlcyAn4oCUJyBldmVyeXdoZXJlIGFuZCByZXRyaWVzIHRoZSBuZXh0IHRpbWUgdGhlIFRhc2sgdGFiIG9wZW5zLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFRhc2tzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmhlYWRlckRhdGEpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnRhc2tzU3RhbGUgPSBmYWxzZTtcclxuICAgIHRoaXMudGFza0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy50YXNrUmVxdWVzdDtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5iYXNlUGF5bG9hZCgpO1xyXG4gICAgLy8gVGhlIGVuZHBvaW50IHJlamVjdHMgdW5rbm93biBrZXlzLCBzbyBvbmx5IHRoZSBzY29wZSBpcyBzZW50LlxyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZFRhc2tzKHtcclxuICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogc2NvcGVbJ2Zyb21EYXRlJ10sIHRvRGF0ZTogc2NvcGVbJ3RvRGF0ZSddLFxyXG4gICAgICBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLCB1c2VyRW1haWxlczogc2NvcGVbJ3VzZXJFbWFpbGVzJ10sIC4uLnRoaXMuYXVkaXRGaWx0ZXIoKVxyXG4gICAgfSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnRhc2tSZXF1ZXN0KSB7IHJldHVybjsgfVxyXG4gICAgICBjb25zdCBkYXRhID0gcmVzPy5jb2RlID09PSAyMDAgPyAocmVzLmRhdGEgfHwgbnVsbCkgOiBudWxsO1xyXG4gICAgICBpZiAoIWRhdGEpIHsgdGhpcy50YXNrc1N0YWxlID0gdHJ1ZTsgfVxyXG4gICAgICB0aGlzLnRhc2tTdGF0cyA9IHRoaXMudG9UYXNrU3RhdHMoZGF0YSk7XHJcbiAgICAgIHRoaXMudGFza1BlcmYgPSAoZGF0YT8udGFza3MgfHwgW10pLm1hcCgodDogYW55KSA9PiB0aGlzLnRvVGFza1BlcmYodCkpO1xyXG4gICAgICB0aGlzLmxhc3RSZWZyZXNoZWQgPSBkYXlqcygpLmZvcm1hdCgnaGg6bW06c3MgQScpO1xyXG4gICAgICB0aGlzLnRhc2tMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvVGFza1N0YXRzKGQ6IGFueSk6IFRhc2tTdGF0cyB7XHJcbiAgICB0aGlzLnRhc2tEZWx0YVZhbHVlcyA9IHtcclxuICAgICAgY29tcGxldGlvbjogdGhpcy5udW0oZD8uZGVsdGFzPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5udW0oZD8uZGVsdGFzPy5jb21wbGlhbmNlKSxcclxuICAgICAgZmxhZ3M6IHRoaXMubnVtKGQ/LmRlbHRhcz8uZmxhZ3MpXHJcbiAgICB9O1xyXG4gICAgaWYgKCFkKSB7IHJldHVybiB7IC4uLkVNUFRZX1RBU0tfU1RBVFMgfTsgfVxyXG4gICAgY29uc3QgY291bnQgPSAodjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG4gPSB0aGlzLm51bSh2KTtcclxuICAgICAgcmV0dXJuIG4gPT09IG51bGwgPyAn4oCUJyA6IG4udG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGF5cyA9IHRoaXMubnVtKGQ/LnBlcmlvZD8ucHJldmlvdXM/LmRheXMpID8/IDE7XHJcbiAgICBjb25zdCB2cyA9IGRheXMgPT09IDEgPyAndnMgbGFzdCBkYXknIDogJ3ZzIHByZXZpb3VzICcgKyBkYXlzICsgJyBkYXlzJztcclxuICAgIGNvbnN0IGRlbHRhID0gKHY6IG51bWJlciB8IG51bGwpID0+ICh2ID09PSBudWxsID8gJycgOiBNYXRoLmFicyh2KSArICclICcgKyB2cyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3RpdmVUYXNrczogY291bnQoZC5hY3RpdmVUYXNrcyksXHJcbiAgICAgIHRhc2tJbnN0YW5jZXM6IGNvdW50KGQudGFza0luc3RhbmNlcyksXHJcbiAgICAgIG5vdFN1Ym1pdHRlZDogY291bnQoZC5ub3RTdWJtaXR0ZWQpLFxyXG4gICAgICBvcGVuVGFza3M6IGNvdW50KGQub3BlblRhc2tzKSxcclxuICAgICAgaW5Qcm9ncmVzczogY291bnQoZC5pblByb2dyZXNzKSxcclxuICAgICAgc3VibWl0dGVkOiBjb3VudChkLnN1Ym1pdHRlZCksXHJcbiAgICAgIGNvbXBsZXRpb25TY29yZTogdGhpcy5wY3RUZXh0KGQuY29tcGxldGlvblNjb3JlKSxcclxuICAgICAgY29tcGxpYW5jZVNjb3JlOiB0aGlzLnBjdFRleHQoZC5jb21wbGlhbmNlU2NvcmUpLFxyXG4gICAgICB0b3RhbEZsYWdzOiBjb3VudChkLnRvdGFsRmxhZ3MpLFxyXG4gICAgICBjb21wbGV0aW9uRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmNvbXBsZXRpb24pLFxyXG4gICAgICBjb21wbGlhbmNlRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmNvbXBsaWFuY2UpLFxyXG4gICAgICBmbGFnc0RlbHRhOiBkZWx0YSh0aGlzLnRhc2tEZWx0YVZhbHVlcy5mbGFncylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogT25lIHRhc2sgcmFpc2VkIGZyb20gYW4gYXVkaXQ7IGNvbXBsaWFuY2UgaXMgJ+KAlCcgd2hpbGUgdGFzayBpbnN0YW5jZXMgY2Fycnkgbm8gc2NvcmUuICovXHJcbiAgcHJpdmF0ZSB0b1Rhc2tQZXJmKHQ6IGFueSk6IFRhc2tQZXJmUm93IHtcclxuICAgIGNvbnN0IG5hbWUgPSB0Py50YXNrTmFtZSB8fCAn4oCUJztcclxuICAgIGNvbnN0IGNvbXBsaWFuY2UgPSB0aGlzLm51bSh0Py5jb21wbGlhbmNlKTtcclxuICAgIGNvbnN0IHJhaXNlZCA9IHRoaXMubnVtKHQ/LnRhc2tzKTtcclxuICAgIGxldCBzY2hlZHVsZWQgPSAn4oCUJztcclxuICAgIGlmICh0Py5zY2hlZHVsZVJlcGVhdGVkVHlwZSkge1xyXG4gICAgICBzY2hlZHVsZWQgPSB0aGlzLnRpdGxlQ2FzZSh0LnNjaGVkdWxlUmVwZWF0ZWRUeXBlKTtcclxuICAgIH0gZWxzZSBpZiAodD8uZHVlRGF0ZSkge1xyXG4gICAgICBzY2hlZHVsZWQgPSAnRHVlICcgKyB0aGlzLmZtdCh0LmR1ZURhdGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmFtZSxcclxuICAgICAgaW5pdGlhbHM6IG5hbWUuc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKSxcclxuICAgICAgc2NoZWR1bGVkLFxyXG4gICAgICBjb3ZlcmFnZTogdD8uY292ZXJhZ2UgPyB0aGlzLnRpdGxlQ2FzZSh0LmNvdmVyYWdlKSA6ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0odD8uYXNzaWduZWQpID8/IDAsXHJcbiAgICAgIHN1Ym1pdHRlZDogdGhpcy5udW0odD8uc3VibWl0dGVkKSA/PyAwLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0odD8uZmxhZ3MpID8/IDAsXHJcbiAgICAgIHRhc2tzOiByYWlzZWQgPT09IG51bGwgPyAn4oCUJyA6IFN0cmluZyhyYWlzZWQpLFxyXG4gICAgICByZWRvOiB0aGlzLm51bSh0Py5yZWRvKSA/PyAwLFxyXG4gICAgICBjb21wbGlhbmNlOiB0aGlzLnBjdFRleHQoY29tcGxpYW5jZSksXHJcbiAgICAgIGNvbXBsaWFuY2VQY3Q6IGNvbXBsaWFuY2UgPT09IG51bGwgPyAwIDogTWF0aC5yb3VuZChjb21wbGlhbmNlKSxcclxuICAgICAgcmF3OiB0XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIERlbHRhIHN0eWxpbmc6IGFycm93IGRpcmVjdGlvbiwgYW5kIGNvbG91ciBieSB3aGV0aGVyIHRoZSBtb3ZlIGlzIGdvb2QgKG1vcmUgZmxhZ3MgaXMgYmFkKS4gKi9cclxuICB0YXNrRGVsdGFDbGFzcyhrZXk6IFRhc2tEZWx0YUtleSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB2ID0gdGhpcy50YXNrRGVsdGFWYWx1ZXNba2V5XTtcclxuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IDApIHsgcmV0dXJuICdpcy1mbGF0JzsgfVxyXG4gICAgY29uc3QgdXAgPSB2ID4gMDtcclxuICAgIGNvbnN0IGdvb2QgPSBrZXkgPT09ICdmbGFncycgPyAhdXAgOiB1cDtcclxuICAgIHJldHVybiAodXAgPyAnaXMtdXAnIDogJ2lzLWRvd24nKSArICcgJyArIChnb29kID8gJ2lzLWdvb2QnIDogJ2lzLWJhZCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBudW0odjogYW55KTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIGNvbnN0IG4gPSBOdW1iZXIodik7XHJcbiAgICByZXR1cm4gaXNOYU4obikgPyBudWxsIDogbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGN0VGV4dCh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHRoaXMubnVtKHYpO1xyXG4gICAgcmV0dXJuIG4gPT09IG51bGwgPyAn4oCUJyA6IE1hdGgucm91bmQobikgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRpdGxlQ2FzZSh2OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZtdCh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyBkYXlqcyh2KS5mb3JtYXQoJ01NTSBERCwgWVlZWScpIDogJ+KAlCc7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBhZnRlciBzZWFyY2gsIHN0YXR1cyBhbmQgc2NvcmUtYmFuZCBmaWx0ZXJzLiAqL1xyXG4gIGdldCBmaWx0ZXJlZFJvd3MoKTogQXVkaXRSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5zZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzXHJcbiAgICAgIC5maWx0ZXIociA9PiB0aGlzLnN0YXR1cyA9PT0gJ2FsbCcgfHwgci5zdGF0dXMgPT09IHRoaXMuc3RhdHVzKVxyXG4gICAgICAuZmlsdGVyKHIgPT4ge1xyXG4gICAgICAgIGlmIChyLnNjb3JlID09PSBudWxsKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY29yZU1pbiA9PT0gMCAmJiB0aGlzLnNjb3JlTWF4ID09PSAxMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEEgbG93ZXIgYm91bmQgb2YgMCBpcyBvcGVuOiBwZW5hbHR5IHNjb3JlcyBjYW4gdGFrZSBhIHN0b3JlIGJlbG93IDAlIChDcml0aWNhbCkuXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3JlTWluIDw9IDAgfHwgci5zY29yZSA+PSB0aGlzLnNjb3JlTWluKSAmJiByLnNjb3JlIDw9IHRoaXMuc2NvcmVNYXg7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIociA9PiAhcSB8fCBbci5zdG9yZUlkLCByLmNpcmNsZSwgci56b25lLCByLmFvbSwgci5yYXc/LnN0b3JlTmFtZSB8fCAnJywgci5yYXc/LnN0b3JlSWQgfHwgJyddLnNvbWUodiA9PiBTdHJpbmcodikudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB0aGlzLmNvbXBhcmUoYSwgYikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wYXJlKGE6IEF1ZGl0Um93LCBiOiBBdWRpdFJvdyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLnNvcnREaXIgPT09ICdhc2MnID8gMSA6IC0xO1xyXG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0gJ3Njb3JlJykge1xyXG4gICAgICAvLyBOb3QtYXVkaXRlZCBzdG9yZXMgKG5vIHNjb3JlKSBhbHdheXMgY29tZSBhZnRlciB0aGUgYXVkaXRlZCBvbmVzLCBpbiBlaXRoZXIgZGlyZWN0aW9uLFxyXG4gICAgICAvLyBzbyB0aGUgZmV3IGF1ZGl0ZWQgc3RvcmVzIGFyZSBub3QgYnVyaWVkIHVuZGVyIHRob3VzYW5kcyBvZiBcIk5vdCBhdWRpdGVkXCIgcm93cy5cclxuICAgICAgaWYgKGEuc2NvcmUgPT09IG51bGwgfHwgYi5zY29yZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBhLnNjb3JlID09PSBiLnNjb3JlID8gMCA6IChhLnNjb3JlID09PSBudWxsID8gMSA6IC0xKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKGEuc2NvcmUgLSBiLnNjb3JlKSAqIGRpcjtcclxuICAgIH1cclxuICAgIGNvbnN0IGF2ID0gU3RyaW5nKGFbdGhpcy5zb3J0S2V5IGFzIGtleW9mIEF1ZGl0Um93XSA/PyAnJyk7XHJcbiAgICBjb25zdCBidiA9IFN0cmluZyhiW3RoaXMuc29ydEtleSBhcyBrZXlvZiBBdWRpdFJvd10gPz8gJycpO1xyXG4gICAgcmV0dXJuIGF2LmxvY2FsZUNvbXBhcmUoYnYpICogZGlyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsUGFnZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLmNlaWwodGhpcy5maWx0ZXJlZFJvd3MubGVuZ3RoIC8gdGhpcy5wYWdlU2l6ZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhZ2VSb3dzKCk6IEF1ZGl0Um93W10ge1xyXG4gICAgY29uc3Qgc3RhcnQgPSAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplO1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRSb3dzLnNsaWNlKHN0YXJ0LCBzdGFydCArIHRoaXMucGFnZVNpemUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlcyB0aGF0IGNhcnJ5IGEgc2NvcmUgaW4gdGhlIGN1cnJlbnQgcGVyaW9kLiAqL1xyXG4gIHByaXZhdGUgZ2V0IGV2YWx1YXRlZCgpOiBBdWRpdFJvd1tdIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zY29yZSAhPT0gbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHdpdGggYSBzdWJtaXR0ZWQgYXVkaXQgaW4gdGhlIHBlcmlvZCwgc2NvcmVkIG9yIG5vdC4gKi9cclxuICBwcml2YXRlIGdldCBhdWRpdGVkQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICduYScpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGdldCBhdmVyYWdlU2NvcmUoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBjb25zdCBldiA9IHRoaXMuZXZhbHVhdGVkO1xyXG4gICAgaWYgKCFldi5sZW5ndGgpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIHJldHVybiBNYXRoLnJvdW5kKGV2LnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyAoci5zY29yZSBhcyBudW1iZXIpLCAwKSAvIGV2Lmxlbmd0aCk7XHJcbiAgfVxyXG5cclxuICBnZXQga3BpcygpOiBBdWRpdEtwaVtdIHtcclxuICAgIGNvbnN0IGV2ID0gdGhpcy5ldmFsdWF0ZWQ7XHJcbiAgICBjb25zdCBhdmcgPSB0aGlzLmF2ZXJhZ2VTY29yZTtcclxuICAgIGNvbnN0IHBhc3NDb3VudCA9IGV2LmZpbHRlcihyID0+IChyLnNjb3JlIGFzIG51bWJlcikgPj0gdGhpcy5wYXNzTWFyaykubGVuZ3RoO1xyXG4gICAgY29uc3QgZmFpbENvdW50ID0gZXYubGVuZ3RoIC0gcGFzc0NvdW50O1xyXG4gICAgY29uc3QgY3JpdGljYWwgPSBldi5maWx0ZXIociA9PiAoci5zY29yZSBhcyBudW1iZXIpIDwgdGhpcy5jcml0aWNhbE1hcmspLmxlbmd0aDtcclxuICAgIGNvbnN0IHBlcmlvZExhYmVsID0gdGhpcy5wZXJpb2RMYWJlbDtcclxuICAgIGNvbnN0IGF1ZGl0ZWQgPSB0aGlzLmF1ZGl0ZWRDb3VudDtcclxuICAgIGxldCBhdmdOb3RlID0gJ0Fjcm9zcyBhdWRpdGVkIHN0b3Jlcyc7XHJcbiAgICBpZiAoYXZnID09PSBudWxsKSB7XHJcbiAgICAgIGF2Z05vdGUgPSBhdWRpdGVkID8gJ0NvbXBsaWFuY2Ugc2NvcmUgaXMgb2ZmIGZvciB0aGVzZSBhdWRpdHMnIDogJ05vIGF1ZGl0cyBpbiB0aGlzIHBlcmlvZCc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnQXZlcmFnZSBzY29yZScsXHJcbiAgICAgICAgdmFsdWU6IGF2ZyA9PT0gbnVsbCA/ICfigJQnIDogYXZnICsgJyUnLFxyXG4gICAgICAgIG5vdGU6IGF2Z05vdGUsXHJcbiAgICAgICAgbm90ZUNvbG9yOiBhdmcgIT09IG51bGwgJiYgYXZnIDwgdGhpcy5wYXNzTWFyayA/ICcjRDkyRDIwJyA6ICcjMDI3QTQ4J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdQYXNzIHJhdGUnLFxyXG4gICAgICAgIHZhbHVlOiBldi5sZW5ndGggPyBNYXRoLnJvdW5kKHBhc3NDb3VudCAvIGV2Lmxlbmd0aCAqIDEwMCkgKyAnJScgOiAn4oCUJyxcclxuICAgICAgICBub3RlOiBwYXNzQ291bnQgKyAnIHBhc3MsICcgKyBmYWlsQ291bnQgKyAnIGZhaWwnLFxyXG4gICAgICAgIG5vdGVDb2xvcjogJyM2NjcwODUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ0NyaXRpY2FsIHN0b3JlcycsXHJcbiAgICAgICAgdmFsdWU6IFN0cmluZyhjcml0aWNhbCksXHJcbiAgICAgICAgbm90ZTogJ1Njb3JlIGJlbG93ICcgKyB0aGlzLmNyaXRpY2FsTWFyayArICclJyxcclxuICAgICAgICBub3RlQ29sb3I6IGNyaXRpY2FsID8gJyNEOTJEMjAnIDogJyM2NjcwODUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICAvLyBTdWJtaXR0ZWQgYXVkaXRzLCBhcyB0aGUgdHJlbmQgY291bnRzIHRoZW07IHRoZSBub3RlIGdpdmVzIHRoZSBzdG9yZXMgdGhleSBjb3Zlci5cclxuICAgICAgICBsYWJlbDogJ0F1ZGl0cyBjb21wbGV0ZWQnLFxyXG4gICAgICAgIHZhbHVlOiBTdHJpbmcodGhpcy5yb3dzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyAoTnVtYmVyKHIucmF3Py5hdWRpdHMpIHx8IDApLCAwKSksXHJcbiAgICAgICAgbm90ZTogJ2F0ICcgKyBhdWRpdGVkICsgJyBvZiAnICsgdGhpcy5yb3dzLmxlbmd0aCArICcgc3RvcmVzIGluIHNjb3BlIMK3ICcgKyBwZXJpb2RMYWJlbCxcclxuICAgICAgICBub3RlQ29sb3I6ICcjNjY3MDg1J1xyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmlvZExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInICYmIHRoaXMucXVhcnRlcikgeyByZXR1cm4gdGhpcy5xdWFydGVyICsgJyAoJyArIHRoaXMucXVhcnRlck1vbnRocyh0aGlzLnF1YXJ0ZXIpICsgJyknOyB9XHJcbiAgICByZXR1cm4gdGhpcy5mbXQodGhpcy5mcm9tKSArICcgdG8gJyArIHRoaXMuZm10KHRoaXMudG8pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzdHJpYnV0aW9uIG9mIHN0b3JlcyBhY3Jvc3Mgc2NvcmUgYmFuZHMuIE5vdCBzY29yZWQgaXMgbGVmdCBvdXQgKFFBIDkgT2N0KSwgYW5kIGl0cyBzdG9yZXNcclxuICAgKiB3aXRoIGl0LCBzbyB0aGUgc2hhcmVzIHN0aWxsIGFkZCB1cCB0byAxMDAlLlxyXG4gICAqL1xyXG4gIGdldCBiYW5kUm93cygpOiBBcnJheTx7IGJhbmQ6IEF1ZGl0QmFuZDsgY291bnQ6IG51bWJlcjsgc2hhcmU6IHN0cmluZzsgd2lkdGg6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMucm93cy5maWx0ZXIociA9PiByLnN0YXR1cyAhPT0gJ3Vuc2NvcmVkJykubGVuZ3RoIHx8IDE7XHJcbiAgICByZXR1cm4gdGhpcy5iYW5kcy5maWx0ZXIoYmFuZCA9PiBiYW5kLmtleSAhPT0gJ3Vuc2NvcmVkJykubWFwKGJhbmQgPT4ge1xyXG4gICAgICBjb25zdCBjb3VudCA9IFNUQVRVU19CQU5EUy5pbmNsdWRlcyhiYW5kLmtleSlcclxuICAgICAgICA/IHRoaXMucm93cy5maWx0ZXIociA9PiByLnN0YXR1cyA9PT0gYmFuZC5rZXkpLmxlbmd0aFxyXG4gICAgICAgIDogdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc2NvcmUgIT09IG51bGwgJiYgdGhpcy5pbkJhbmQoci5zY29yZSBhcyBudW1iZXIsIGJhbmQpKS5sZW5ndGg7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgYmFuZCxcclxuICAgICAgICBjb3VudCxcclxuICAgICAgICAvLyBBIGZldyBzdG9yZXMgb3V0IG9mIHRob3VzYW5kcyByb3VuZCB0byAwJTsgc2F5IFwiPDElXCIgaW5zdGVhZCBvZiAwJSBuZXh0IHRvIGEgbm9uLXplcm8gY291bnQuXHJcbiAgICAgICAgc2hhcmU6IGNvdW50ICYmIGNvdW50IC8gdG90YWwgKiAxMDAgPCAxID8gJzwxJScgOiBNYXRoLnJvdW5kKGNvdW50IC8gdG90YWwgKiAxMDApICsgJyUnLFxyXG4gICAgICAgIHdpZHRoOiAoY291bnQgLyB0b3RhbCAqIDEwMCkgKyAnJSdcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJhbmQgY29sb3VycyBvZiBhIHN0b3JlIHJvdzogYnkgc2NvcmUsIG9yIHRoZSBOb3Qgc2NvcmVkIC8gTm90IGF1ZGl0ZWQgYmFuZCB3aGVuIGl0IGhhcyBub25lLiAqL1xyXG4gIGJhbmRGb3Iocm93OiBBdWRpdFJvdyk6IEF1ZGl0QmFuZCB7XHJcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5iYW5kc1t0aGlzLmJhbmRzLmxlbmd0aCAtIDFdO1xyXG4gICAgaWYgKHJvdy5zY29yZSA9PT0gbnVsbCkgeyByZXR1cm4gdGhpcy5iYW5kcy5maW5kKGIgPT4gYi5rZXkgPT09IHJvdy5zdGF0dXMpID8/IGxhc3Q7IH1cclxuICAgIGNvbnN0IHNjb3JlID0gcm93LnNjb3JlO1xyXG4gICAgcmV0dXJuIHRoaXMuYmFuZHMuZmluZChiID0+ICFTVEFUVVNfQkFORFMuaW5jbHVkZXMoYi5rZXkpICYmIHRoaXMuaW5CYW5kKHNjb3JlLCBiKSkgPz8gbGFzdDtcclxuICB9XHJcblxyXG4gIC8qKiBBIHNjb3JlIGJhbmQncyByYW5nZTsgdGhlIGxvd2VzdCBiYW5kIChsbyAwLCBDcml0aWNhbCkgYWxzbyB0YWtlcyBuZWdhdGl2ZSBzY29yZXMgKHBlbmFsdHkgb3B0aW9ucykuICovXHJcbiAgcHJpdmF0ZSBpbkJhbmQoc2NvcmU6IG51bWJlciwgYmFuZDogQXVkaXRCYW5kKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKGJhbmQubG8gPD0gMCB8fCBzY29yZSA+PSBiYW5kLmxvKSAmJiBzY29yZSA8PSBiYW5kLmhpO1xyXG4gIH1cclxuXHJcbiAgc3RhdHVzTGFiZWwocm93OiBBdWRpdFJvdyk6IHN0cmluZyB7XHJcbiAgICBpZiAocm93LnN0YXR1cyA9PT0gJ3Bhc3MnKSB7IHJldHVybiAnUGFzcyc7IH1cclxuICAgIGlmIChyb3cuc3RhdHVzID09PSAnZmFpbCcpIHsgcmV0dXJuICdGYWlsJzsgfVxyXG4gICAgcmV0dXJuIHJvdy5zdGF0dXMgPT09ICd1bnNjb3JlZCcgPyAnTm90IHNjb3JlZCcgOiAnTm90IGF1ZGl0ZWQnO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJhciBoZWlnaHQgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBjaGFydCBhcmVhLiAqL1xyXG4gIGJhckhlaWdodChiYXI6IFRyZW5kQmFyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAoYmFyLnZhbHVlID09PSBudWxsID8gMiA6IE1hdGgubWF4KDMsIGJhci52YWx1ZSkpICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhvdmVyIGNhcmQgc2l0cyBqdXN0IGFib3ZlIHRoZSBiYXIncyB2YWx1ZSBsYWJlbDsgY2FwcGVkIHNvIGEgdGFsbCBiYXIncyBjYXJkIHN0YXlzIGluc2lkZSB0aGUgY2hhcnQuICovXHJcbiAgdGlwQm90dG9tKGJhcjogVHJlbmRCYXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaCA9IGJhci52YWx1ZSA9PT0gbnVsbCA/IDIgOiBNYXRoLm1heCgzLCBiYXIudmFsdWUpO1xyXG4gICAgcmV0dXJuICdjYWxjKCcgKyBNYXRoLm1pbihoLCA0NSkgKyAnJSArIDI2cHgpJztcclxuICB9XHJcblxyXG4gIGJhckZpbGwoYmFyOiBUcmVuZEJhcik6IHN0cmluZyB7XHJcbiAgICBpZiAoYmFyLnZhbHVlID09PSBudWxsKSB7IHJldHVybiAnI0YyRjRGNyc7IH1cclxuICAgIGNvbnN0IGFjdGl2ZSA9IGJhci5rZXkgPT09IHRoaXMucXVhcnRlcjtcclxuICAgIGlmIChiYXIudmFsdWUgPj0gdGhpcy5wYXNzTWFyaykgeyByZXR1cm4gYWN0aXZlID8gJyMxNTcwRUYnIDogJyNCMkRERkYnOyB9XHJcbiAgICByZXR1cm4gYWN0aXZlID8gJyNGMDQ0MzgnIDogJyNGRUNEQ0EnO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JhaW4oZ3JhaW46ICdxdWFydGVyJyB8ICdkYXRlJyk6IHZvaWQge1xyXG4gICAgaWYgKGdyYWluID09PSB0aGlzLmdyYWluKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5ncmFpbiA9IGdyYWluO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIGlmIChncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlRdWFydGVyKHRoaXMucXVhcnRlcnMuaW5jbHVkZXModGhpcy5xdWFydGVyKSA/IHRoaXMucXVhcnRlciA6IHRoaXMucXVhcnRlcnNbdGhpcy5xdWFydGVycy5sZW5ndGggLSAxXSwgdHJ1ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEJhY2sgdG8gQnkgZGF0ZTogdGhlIGhlYWRlcidzIHJhbmdlIGFnYWluLlxyXG4gICAgdGhpcy5mcm9tID0gdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgdGhpcy5mcm9tO1xyXG4gICAgdGhpcy50byA9IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCB0aGlzLnRvO1xyXG4gICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbikgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICBzZXRTdGF0dXMoc3RhdHVzOiBTdGF0dXNGaWx0ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIHNvcnRCeShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0ga2V5KSB7XHJcbiAgICAgIHRoaXMuc29ydERpciA9IHRoaXMuc29ydERpciA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc29ydEtleSA9IGtleTtcclxuICAgICAgdGhpcy5zb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTY29yZSBkaXN0cmlidXRpb24gLT4gVmlldyBzdG9yZXM6IG5hcnJvdyB0aGUgc3RvcmUgbGlzdCB0byB0aGF0IGJhbmQgKE5vdCBhdWRpdGVkIC0+IHRoZVxyXG4gICAqIHN0b3JlcyB3aXRoIG5vIHN1Ym1pc3Npb24pIGFuZCBicmluZyB0aGUgbGlzdCBpbnRvIHZpZXcuXHJcbiAgICovXHJcbiAgYXBwbHlCYW5kKGJhbmQ6IEF1ZGl0QmFuZCk6IHZvaWQge1xyXG4gICAgaWYgKFNUQVRVU19CQU5EUy5pbmNsdWRlcyhiYW5kLmtleSkpIHtcclxuICAgICAgdGhpcy5jbGVhckJhbmQoKTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBiYW5kLmtleSBhcyBTdG9yZVN0YXR1cztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2NvcmVNaW4gPSBiYW5kLmxvO1xyXG4gICAgICB0aGlzLnNjb3JlTWF4ID0gYmFuZC5oaTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSAnYWxsJztcclxuICAgICAgdGhpcy5wYWdlID0gMTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVMaXN0T3BlbiA9IHRydWU7XHJcbiAgICB0aGlzLmxpc3RCYW5kS2V5ID0gYmFuZC5rZXk7XHJcbiAgICAvLyBGcm9tIHRoZSBkcmF3ZXIsIEFwcGx5IHNjcm9sbHMgb25jZSBpdCBjbG9zZXMuXHJcbiAgICBpZiAodGhpcy5maWx0ZXJzT3BlbikgeyByZXR1cm47IH1cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkLXN0b3JlLWxpc3QnKT8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pKTtcclxuICB9XHJcblxyXG4gIGNsZWFyQmFuZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2NvcmVNaW4gPSAwO1xyXG4gICAgdGhpcy5zY29yZU1heCA9IDEwMDtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgU3RvcmUgbGlzdCBzdGF5cyBoaWRkZW4gdW50aWwgU2NvcmUgZGlzdHJpYnV0aW9uIC0+IFZpZXcgc3RvcmVzIG9wZW5zIGl0IChvciB0aGUgRmlsdGVyc1xyXG4gICAqIGRyYXdlciBzZXRzIGEgc2NvcmUgcmFuZ2UpOyB0aGUgY2hpcCdzIHggY2xvc2VzIGl0IGFnYWluLlxyXG4gICAqL1xyXG4gIHN0b3JlTGlzdE9wZW4gPSBmYWxzZTtcclxuICAvKiogQmFuZCB0aGUgbGlzdCB3YXMgb3BlbmVkIGZvciAoJycgPSBhbGwgc3RvcmVzKS4gKi9cclxuICBsaXN0QmFuZEtleSA9ICcnO1xyXG5cclxuICBnZXQgc2hvd1N0b3JlTGlzdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlTGlzdE9wZW4gfHwgdGhpcy5iYW5kRmlsdGVyQWN0aXZlIHx8IHRoaXMuc3RhdHVzICE9PSAnYWxsJztcclxuICB9XHJcblxyXG4gIC8qKiBDaGlwIG92ZXIgdGhlIGxpc3Q6IHRoZSBiYW5kIG9yIHN0YXR1cyBpdCBzaG93cywgb3IgXCJBbGwgc3RvcmVzXCIuICovXHJcbiAgZ2V0IGxpc3RDaGlwTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5zaG93U3RvcmVMaXN0KSB7IHJldHVybiAnJzsgfVxyXG4gICAgaWYgKHRoaXMuYmFuZEZpbHRlckFjdGl2ZSkgeyByZXR1cm4gdGhpcy5iYW5kQ2hpcExhYmVsOyB9XHJcbiAgICBjb25zdCBiYW5kID0gdGhpcy5iYW5kcy5maW5kKGIgPT4gYi5rZXkgPT09IHRoaXMubGlzdEJhbmRLZXkpO1xyXG4gICAgLy8gQSBzY29yZSBiYW5kIHRoZSByYW5nZSBubyBsb25nZXIgbWF0Y2hlcyBpcyBzdGFsZTsgYSBzdGF0dXMgYmFuZCBzdGlsbCBob2xkcyB3aGlsZSB0aGUgc3RhdHVzIGRvZXMuXHJcbiAgICBpZiAoYmFuZCAmJiBiYW5kLmtleSA9PT0gdGhpcy5zdGF0dXMpIHsgcmV0dXJuIGJhbmQubGFiZWwgKyAnIMK3ICcgKyBiYW5kLnJhbmdlOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgIT09ICdhbGwnID8gdGhpcy5zdGF0dXNGaWx0ZXJMYWJlbCA6ICdBbGwgc3RvcmVzJztcclxuICB9XHJcblxyXG4gIC8qKiBEcmF3ZXIgU2NvcmUgcmFuZ2U6IHRoZSBiYW5kIHRoZSBjdXJyZW50IHJhbmdlIChvciBzdGF0dXMgYmFuZCkgbWF0Y2hlcy4gKi9cclxuICBpc0JhbmRPbihiYW5kOiBBdWRpdEJhbmQpOiBib29sZWFuIHtcclxuICAgIGlmIChTVEFUVVNfQkFORFMuaW5jbHVkZXMoYmFuZC5rZXkpKSB7IHJldHVybiB0aGlzLnN0YXR1cyA9PT0gYmFuZC5rZXk7IH1cclxuICAgIHJldHVybiB0aGlzLnNjb3JlTWluID09PSBiYW5kLmxvICYmIHRoaXMuc2NvcmVNYXggPT09IGJhbmQuaGk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hpcCBcIlNob3cgYWxsIHN0b3Jlc1wiOiBrZWVwIHRoZSBsaXN0IG9wZW4sIHdpdGhvdXQgdGhlIGJhbmQuICovXHJcbiAgc2hvd0FsbFN0b3JlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXJCYW5kKCk7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgdGhpcy5saXN0QmFuZEtleSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZUxpc3RPcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBDaGlwIHg6IGhpZGUgdGhlIGxpc3QgYWdhaW4uICovXHJcbiAgY2xvc2VTdG9yZUxpc3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyQmFuZCgpO1xyXG4gICAgdGhpcy5zdGF0dXMgPSAnYWxsJztcclxuICAgIHRoaXMubGlzdEJhbmRLZXkgPSAnJztcclxuICAgIHRoaXMuc3RvcmVMaXN0T3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhbmRGaWx0ZXJBY3RpdmUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zY29yZU1pbiAhPT0gMCB8fCB0aGlzLnNjb3JlTWF4ICE9PSAxMDA7XHJcbiAgfVxyXG5cclxuICBnZXQgYmFuZENoaXBMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaGl0ID0gdGhpcy5iYW5kcy5maW5kKGIgPT4gIVNUQVRVU19CQU5EUy5pbmNsdWRlcyhiLmtleSkgJiYgYi5sbyA9PT0gdGhpcy5zY29yZU1pbiAmJiBiLmhpID09PSB0aGlzLnNjb3JlTWF4KTtcclxuICAgIHJldHVybiBoaXQgPyBoaXQubGFiZWwgKyAnIMK3ICcgKyBoaXQucmFuZ2UgOiAnU2NvcmUgJyArIHRoaXMuc2NvcmVNaW4gKyAn4oCTJyArIHRoaXMuc2NvcmVNYXggKyAnJSc7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGZpdmUgZmlsdGVyIGNhdGVnb3JpZXMgdGhlIGRyYXdlciBsaXN0cy4gKi9cclxuICBnZXQgZmlsdGVyQ2F0cygpOiBGaWx0ZXJDYXRbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGtleTogJ3BlcmlvZCcsIGxhYmVsOiAnUGVyaW9kJywgdmFsdWU6IHRoaXMucGVyaW9kTGFiZWwsIHRpdGxlOiAnUGVyaW9kJyxcclxuICAgICAgICBzdWI6ICdTdGFydHMgYXMgdGhlIGdsb2JhbCBoZWFkZXIgZGF0ZSByYW5nZTsgcGljayBhIHJhbmdlIHRvIG5hcnJvdyBpdC4nLFxyXG4gICAgICAgIGRpcnR5OiBmYWxzZSB9LFxyXG4gICAgICB7IGtleTogJ3Njb3BlJywgbGFiZWw6ICdTdG9yZSBoaWVyYXJjaHknLCB2YWx1ZTogdGhpcy5zY29wZUxhYmVsLCB0aXRsZTogJ1N0b3JlIGhpZXJhcmNoeScsXHJcbiAgICAgICAgc3ViOiAnUGljayB0aGUgY2lyY2xlLCB6b25lLCBBT00gb3Igc3RvcmUgdGhlIHdob2xlIGRhc2hib2FyZCByZWFkcy4nLFxyXG4gICAgICAgIGRpcnR5OiAhIXRoaXMuY2lyY2xlIH0sXHJcbiAgICAgIHsga2V5OiAndHlwZScsIGxhYmVsOiAnQXVkaXQgdHlwZScsIHZhbHVlOiB0aGlzLmF1ZGl0VHlwZUxhYmVsLCB0aXRsZTogJ0F1ZGl0IHR5cGUnLFxyXG4gICAgICAgIHN1YjogJ1doaWNoIGF1ZGl0IHByb2dyYW1tZSB0aGUgc2NvcmVzIGNvbWUgZnJvbS4nLFxyXG4gICAgICAgIGRpcnR5OiB0aGlzLmF1ZGl0VHlwZSAhPT0gJ2FsbCcgfSxcclxuICAgICAgeyBrZXk6ICdiYW5kJywgbGFiZWw6ICdTY29yZSByYW5nZScsIHZhbHVlOiB0aGlzLmJhbmRDaGlwTGFiZWwsIHRpdGxlOiAnU2NvcmUgcmFuZ2UnLFxyXG4gICAgICAgIHN1YjogJ1RhcCBhIGJhbmQgdG8gc2V0IHRoZSByYW5nZSB0aGUgc3VtbWFyeSByZWFkcy4nLFxyXG4gICAgICAgIGRpcnR5OiB0aGlzLmJhbmRGaWx0ZXJBY3RpdmUgfSxcclxuICAgICAgeyBrZXk6ICdzdGF0dXMnLCBsYWJlbDogJ1N0YXR1cycsIHZhbHVlOiB0aGlzLnN0YXR1c0ZpbHRlckxhYmVsLCB0aXRsZTogJ1N0YXR1cycsXHJcbiAgICAgICAgc3ViOiAnU2hvdyBldmVyeSBzdG9yZSwgb3Igb25seSB0aGUgb25lcyB0aGF0IHBhc3NlZCBvciBmYWlsZWQuJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5zdGF0dXMgIT09ICdhbGwnIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgYWN0aXZlQ2F0T2JqKCk6IEZpbHRlckNhdCB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDYXRzLmZpbmQoYyA9PiBjLmtleSA9PT0gdGhpcy5hY3RpdmVDYXQpIHx8IHRoaXMuZmlsdGVyQ2F0c1swXTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQ2F0cy5maWx0ZXIoYyA9PiBjLmRpcnR5KS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRoZSBkcmF3ZXIncyBoaWVyYXJjaHkgcGljayBjb3ZlcnMgKHdoYXQgQXBwbHkgd2lsbCBsb2FkKS4gKi9cclxuICBnZXQgc3RvcmVzSW5TY29wZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcGVSb3dzLmZpbHRlcihyID0+IHRoaXMubWF0Y2hlc1Njb3BlKHIsIHRoaXMpKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogU29ydGVkIGRpc3RpbmN0IG5hbWVzLCB3aXRob3V0IHRoZSBcIuKAlFwiIG9mIHN0b3JlcyBvdXRzaWRlIHRoZSBoaWVyYXJjaHkuICovXHJcbiAgcHJpdmF0ZSBkaXN0aW5jdCh2YWx1ZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMuZmlsdGVyKHYgPT4gdiAmJiB2ICE9PSAn4oCUJykpKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNpcmNsZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGluY3QodGhpcy5zY29wZVJvd3MubWFwKHIgPT4gci5jaXJjbGUpKTtcclxuICB9XHJcblxyXG4gIGdldCB6b25lcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiByLmNpcmNsZSA9PT0gdGhpcy5jaXJjbGUpLm1hcChyID0+IHIuem9uZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFvbXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGluY3QodGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gci5jaXJjbGUgPT09IHRoaXMuY2lyY2xlICYmIHIuem9uZSA9PT0gdGhpcy56b25lKS5tYXAociA9PiByLmFvbSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3BlUmVhZGluZygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHRoaXMuc3RvcmVzSW5TY29wZTtcclxuICAgIHJldHVybiB0aGlzLnNjb3BlTGFiZWwgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIHN0b3JlJyA6ICcgc3RvcmVzJyk7XHJcbiAgfVxyXG5cclxuICBzZXRNb2R1bGVUYWIodGFiOiAnQXVkaXQnIHwgJ1Rhc2snKTogdm9pZCB7XHJcbiAgICBpZiAodGFiICE9PSB0aGlzLm1vZHVsZVRhYikge1xyXG4gICAgICAvLyBUaGUgZmlyc3QgUGVyZm9ybWFuY2UgdGFibGUgY2hhbmdlcyAoQXVkaXQgLyBUYXNrKSwgc28gaXRzIHNvcnQgc3RhcnRzIG92ZXIuXHJcbiAgICAgIHRoaXMucGVyZlNvcnRLZXkgPSAnJztcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9ICdhc2MnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2R1bGVUYWIgPSB0YWI7XHJcbiAgICBpZiAodGFiID09PSAnVGFzaycgJiYgdGhpcy50YXNrc1N0YWxlKSB7IHRoaXMubG9hZFRhc2tzKCk7IH1cclxuICB9XHJcblxyXG4gIGdldCBzY29wZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmUgPyB0aGlzLnNjb3BlUm93cy5maW5kKHIgPT4gU3RyaW5nKHIucmF3Py5zdG9yZUlkKSA9PT0gdGhpcy5zdG9yZSkgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gKHN0b3JlID8gc3RvcmUucmF3Py5zdG9yZU5hbWUgfHwgdGhpcy5zdG9yZSA6IHRoaXMuc3RvcmUpIHx8IHRoaXMuYW9tIHx8IHRoaXMuem9uZSB8fCB0aGlzLmNpcmNsZSB8fCAnQWxsIHN0b3Jlcyc7XHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaXRUeXBlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHQgPSB0aGlzLmF1ZGl0VHlwZXMuZmluZCh4ID0+IHgua2V5ID09PSB0aGlzLmF1ZGl0VHlwZSk7XHJcbiAgICByZXR1cm4gdCA/IHQubGFiZWwgOiAnQWxsIEF1ZGl0cyc7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RhdHVzRmlsdGVyTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ2FsbCcpIHsgcmV0dXJuICdBbGwgc3RvcmVzJzsgfVxyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAncGFzcycpIHsgcmV0dXJuICdQYXNzIHN0b3Jlcyc7IH1cclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJykgeyByZXR1cm4gJ05vdCBzY29yZWQnOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09ICdmYWlsJyA/ICdGYWlsIHN0b3JlcycgOiAnTm90IGF1ZGl0ZWQnO1xyXG4gIH1cclxuXHJcbiAgb3BlbkZpbHRlcnMoY2F0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzKSBhcyBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50O1xyXG4gICAgdGhpcy5hY3RpdmVDYXQgPSBjYXQgfHwgdGhpcy5hY3RpdmVDYXQ7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdChrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVDYXQgPSBrZXk7XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkID0gdGhpcy5kcmFmdDtcclxuICAgIGNvbnN0IHBlcmlvZENoYW5nZWQgPSAhIWQgJiYgKGQuZnJvbSAhPT0gdGhpcy5mcm9tIHx8IGQudG8gIT09IHRoaXMudG8pO1xyXG4gICAgaWYgKGQpIHtcclxuICAgICAgY29uc3Qgc2VsZiA9IHRoaXMgYXMgYW55O1xyXG4gICAgICBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50LkRSQUZUX0tFWVMuZm9yRWFjaChrID0+IHsgc2VsZltrXSA9IChkIGFzIGFueSlba107IH0pO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2NvcGVDaGFuZ2VkID0gdGhpcy5jb21taXRTY29wZSgpO1xyXG4gICAgdGhpcy5kcmFmdCA9IG51bGw7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgaWYgKHBlcmlvZENoYW5nZWQgfHwgc2NvcGVDaGFuZ2VkKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICAgIC8vIFNjb3JlIHJhbmdlIGFuZCBTdGF0dXMgb25seSBmaWx0ZXIgdGhlIHN0b3JlIGxpc3QsIHNvIHNob3cgaXQuXHJcbiAgICBpZiAodGhpcy5iYW5kRmlsdGVyQWN0aXZlIHx8IHRoaXMuc3RhdHVzICE9PSAnYWxsJykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZC1zdG9yZS1saXN0Jyk/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTWFrZSB0aGUgZHJhd2VyJ3MgaGllcmFyY2h5ICsgYXVkaXQgdHlwZSB0aGUgbG9hZGVkIG9uZXM7IHRydWUgd2hlbiB0aGV5IGRpZmZlciBmcm9tIGJlZm9yZS4gKi9cclxuICBwcml2YXRlIGNvbW1pdFNjb3BlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYSA9IHRoaXMuYXBwbGllZDtcclxuICAgIGNvbnN0IGNoYW5nZWQgPSBhLmNpcmNsZSAhPT0gdGhpcy5jaXJjbGUgfHwgYS56b25lICE9PSB0aGlzLnpvbmUgfHwgYS5hb20gIT09IHRoaXMuYW9tIHx8IGEuc3RvcmUgIT09IHRoaXMuc3RvcmVcclxuICAgICAgfHwgYS5hdWRpdFR5cGUgIT09IHRoaXMuYXVkaXRUeXBlO1xyXG4gICAgdGhpcy5hcHBsaWVkID0geyBjaXJjbGU6IHRoaXMuY2lyY2xlLCB6b25lOiB0aGlzLnpvbmUsIGFvbTogdGhpcy5hb20sIHN0b3JlOiB0aGlzLnN0b3JlLCBhdWRpdFR5cGU6IHRoaXMuYXVkaXRUeXBlIH07XHJcbiAgICByZXR1cm4gY2hhbmdlZDtcclxuICB9XHJcblxyXG4gIC8qKiBDYW5jZWwgLyB4IC8gYmFja2Ryb3A6IHRoZSBkcmFmdCBpcyBkcm9wcGVkOyB0aGUgcGFnZSBuZXZlciBjaGFuZ2VkLiAqL1xyXG4gIGNhbmNlbEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0ID0gbnVsbDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNldCBldmVyeSBmaWx0ZXIgdG8gdGhlIGRvY3VtZW50ZWQgZGVmYXVsdHMuICovXHJcbiAgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgdGhpcy5ncmFpbiA9ICdkYXRlJztcclxuICAgIHRoaXMuY2lyY2xlID0gJyc7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnNjb3JlTWluID0gMDtcclxuICAgIHRoaXMuc2NvcmVNYXggPSAxMDA7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIC8vIFRoZSBjaGlwcycgQ2xlYXIgYWxsIChkcmF3ZXIgY2xvc2VkKSByZWxvYWRzIG5vdzsgaW5zaWRlIHRoZSBkcmF3ZXIsIEFwcGx5IGRvZXMuXHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc09wZW4gJiYgdGhpcy5jb21taXRTY29wZSgpKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKiBDaGFuZ2luZyBhIGxldmVsIGNsZWFycyB0aGUgbGV2ZWxzIGJlbG93IGl0LiAqL1xyXG4gIG9uQ2lyY2xlQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy56b25lID0gJyc7XHJcbiAgICB0aGlzLmFvbSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIG9uWm9uZUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgb25Bb21DaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTY29wZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2lyY2xlID0gJyc7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlIGRyb3Bkb3duOiB0aGUgc3RvcmVzIG9mIHRoZSBwaWNrZWQgQU9NLCBieSBuYW1lICh2YWx1ZSA9IHN0b3JlSWQpLiAqL1xyXG4gIGdldCBzdG9yZVBpY2tPcHRpb25zKCk6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCBzdG9yZXMgPSB0aGlzLnNjb3BlUm93c1xyXG4gICAgICAuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgeyBjaXJjbGU6IHRoaXMuY2lyY2xlLCB6b25lOiB0aGlzLnpvbmUsIGFvbTogdGhpcy5hb20sIHN0b3JlOiAnJyB9KSlcclxuICAgICAgLm1hcChyID0+ICh7IHZhbHVlOiBTdHJpbmcoci5yYXc/LnN0b3JlSWQgfHwgJycpLCBsYWJlbDogU3RyaW5nKHIucmF3Py5zdG9yZU5hbWUgfHwgJ+KAlCcpIH0pKVxyXG4gICAgICAuZmlsdGVyKG8gPT4gby52YWx1ZSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEubGFiZWwubG9jYWxlQ29tcGFyZShiLmxhYmVsKSk7XHJcbiAgICByZXR1cm4gW3sgdmFsdWU6ICcnLCBsYWJlbDogJ0FsbCBzdG9yZXMnIH1dLmNvbmNhdChzdG9yZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBkcmF3ZXIncyBjdXN0b20gZHJvcGRvd25zIChsaWItYXVkaXQtdjItc2VsZWN0KTogXCJBbGwg4oCmXCIgZmlyc3QsIHRoZW4gdGhlIGxpc3QuICovXHJcbiAgcGlja09wdGlvbnMobGlzdDogc3RyaW5nW10sIGFsbDogc3RyaW5nKTogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiBhbGwgfV0uY29uY2F0KChsaXN0IHx8IFtdKS5tYXAodiA9PiAoeyB2YWx1ZTogdiwgbGFiZWw6IHYgfSkpKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZmlyc3QgcGVyZm9ybWFuY2UgdGFiIGlzIG5hbWVkIGFmdGVyIHRoZSBhY3RpdmUgbW9kdWxlLiAqL1xyXG4gIGdldCBwZXJmVGFic0Zvck1vZHVsZSgpOiBBcnJheTwnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJz4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYnM7XHJcbiAgfVxyXG5cclxuICBwZXJmVGFiRGlzcGxheSh0YWI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHRhYiA9PT0gJ0F1ZGl0JyA/IHRoaXMubW9kdWxlVGFiIDogdGFiKSArICcgUGVyZm9ybWFuY2UnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmZJbmZvVGl0bGUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHsgcmV0dXJuICdTdG9yZXMgSW5mbyc7IH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykgeyByZXR1cm4gJ1VzZXIgSW5mbyc7IH1cclxuICAgIHJldHVybiB0aGlzLm1vZHVsZVRhYiArICcgSW5mbyc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZkNyZWF0ZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJysgQ3JlYXRlICcgKyB0aGlzLm1vZHVsZVRhYjtcclxuICB9XHJcblxyXG4gIGdldCBpc1Rhc2tNb2R1bGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVUYWIgPT09ICdUYXNrJztcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFRhc2tQZXJmKCk6IFRhc2tQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy50YXNrUGVyZi5maWx0ZXIociA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLnRhc2tQZXJmLCB0aGlzLnRhc2tTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZUYXNrKF86IG51bWJlciwgcm93OiBUYXNrUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8udGFza0lkIHx8IHJvdy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCB0cmVuZCBidWNrZXQgZHJpdmVzIHRoZSBoZWFkbGluZSBzY29yZSBhYm92ZSB0aGUgY2hhcnQuICovXHJcbiAgcHJpdmF0ZSBnZXQgZm9jdXNCYXIoKTogVHJlbmRCYXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJykgeyByZXR1cm4gdGhpcy5xdWFydGVyVHJlbmQuZmluZChiID0+IGIua2V5ID09PSB0aGlzLnF1YXJ0ZXIpOyB9XHJcbiAgICByZXR1cm4gdGhpcy50cmVuZC5maW5kKGIgPT4gYi5rZXkgPT09IHRoaXMucXVhcnRlcikgfHwgdGhpcy50cmVuZFswXTtcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c1Njb3JlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGlmIChiICYmIGIudmFsdWUgIT09IG51bGwpIHsgcmV0dXJuIGIudmFsdWUgKyAnJSc7IH1cclxuICAgIC8vIFdpdGggbm8gdHJlbmQgYnVja2V0cywgdGhlIGhlYWRsaW5lIGlzIHRoZSBwZXJpb2QgYXZlcmFnZS5cclxuICAgIGNvbnN0IGF2ZyA9IHRoaXMuYXZlcmFnZVNjb3JlO1xyXG4gICAgcmV0dXJuIGF2ZyA9PT0gbnVsbCA/ICfigJQnIDogYXZnICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzUGFzc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYiA9IHRoaXMuZm9jdXNCYXI7XHJcbiAgICBpZiAoYiAmJiBiLnZhbHVlICE9PSBudWxsKSB7IHJldHVybiBiLnZhbHVlID49IHRoaXMucGFzc01hcms7IH1cclxuICAgIGNvbnN0IGF2ZyA9IHRoaXMuYXZlcmFnZVNjb3JlO1xyXG4gICAgcmV0dXJuIGF2ZyAhPT0gbnVsbCAmJiBhdmcgPj0gdGhpcy5wYXNzTWFyaztcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c1N0YXR1cygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYiA9IHRoaXMuZm9jdXNCYXI7XHJcbiAgICBjb25zdCBoYXMgPSAoYiAmJiBiLnZhbHVlICE9PSBudWxsKSB8fCB0aGlzLmF2ZXJhZ2VTY29yZSAhPT0gbnVsbDtcclxuICAgIGlmICghaGFzKSB7IHJldHVybiAnTm8gZGF0YSc7IH1cclxuICAgIHJldHVybiB0aGlzLmZvY3VzUGFzc2VkID8gJ1Bhc3MnIDogJ0JlbG93IHBhc3MgbWFyayc7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9jdXNMaW5lKCk6IHN0cmluZyB7XHJcbiAgICAvLyBTdWJtaXR0ZWQgYXVkaXRzLCBhcyB0aGUgYmFycyBjb3VudCB0aGVtIChcIjEwIGF1ZGl0c1wiKTsgYXVkaXRlZENvdW50IGNvdW50cyBhdWRpdGVkIHN0b3Jlcy5cclxuICAgIGNvbnN0IG4gPSB0aGlzLmdyYWluID09PSAncXVhcnRlcidcclxuICAgICAgPyAodGhpcy5mb2N1c0Jhcj8uc3VibWl0dGVkID8/IDApXHJcbiAgICAgIDogdGhpcy50cmVuZC5yZWR1Y2UoKHN1bSwgYikgPT4gc3VtICsgKGIuc3VibWl0dGVkIHx8IDApLCAwKTtcclxuICAgIHJldHVybiB0aGlzLnBlcmlvZExhYmVsICsgJyDCtyAnICsgbiArIChuID09PSAxID8gJyBhdWRpdCBjb21wbGV0ZWQnIDogJyBhdWRpdHMgY29tcGxldGVkJylcclxuICAgICAgKyAnIMK3IHBhc3MgbWFyayAnICsgdGhpcy5wYXNzTWFyayArICclJztcclxuICB9XHJcblxyXG4gIHNldFBlcmZUYWIodGFiOiAnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJyk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmVGFiID0gdGFiO1xyXG4gICAgdGhpcy5wZXJmU2VhcmNoID0gJyc7XHJcbiAgICB0aGlzLnBlcmZTb3J0S2V5ID0gJyc7XHJcbiAgICB0aGlzLnBlcmZTb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIGluIHRoZSBvcGVuIHBlcmZvcm1hbmNlIHRhYmxlIGFmdGVyIHNlYXJjaCAvIHNvcnQgKHdoYXQgdGhlIHBhZ2VyIGNvdW50cykuICovXHJcbiAgZ2V0IHBlcmZUb3RhbCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ0F1ZGl0JykgeyByZXR1cm4gdGhpcy5pc1Rhc2tNb2R1bGUgPyB0aGlzLmZpbHRlcmVkVGFza1BlcmYubGVuZ3RoIDogdGhpcy5maWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGg7IH1cclxuICAgIHJldHVybiB0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScgPyB0aGlzLmZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aCA6IHRoaXMuZmlsdGVyZWRVc2VyUGVyZi5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgcGFnZSBvZiBhIHBlcmZvcm1hbmNlIHRhYmxlOyBhIHNlYXJjaCB0aGF0IHNocmlua3MgdGhlIGxpc3QgcHVsbHMgdGhlIHBhZ2UgYmFjayBpbnRvIHJhbmdlLiAqL1xyXG4gIHBlcmZQYWdlT2Y8VD4obGlzdDogVFtdKTogVFtdIHtcclxuICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGxpc3QubGVuZ3RoIC8gdGhpcy5wZXJmUGFnZVNpemUpKTtcclxuICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1pbih0aGlzLnBlcmZQYWdlLCBwYWdlcyk7XHJcbiAgICByZXR1cm4gbGlzdC5zbGljZSgocGFnZSAtIDEpICogdGhpcy5wZXJmUGFnZVNpemUsIHBhZ2UgKiB0aGlzLnBlcmZQYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICBvblBlcmZQYWdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IE51bWJlcihwYWdlKSB8fCAxO1xyXG4gIH1cclxuXHJcbiAgb25QZXJmUGFnZVNpemUoc2l6ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZQYWdlU2l6ZSA9IE51bWJlcihzaXplKSB8fCAxMDtcclxuICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgbmV3IHNlYXJjaCBzdGFydHMgb24gcGFnZSAxLiAqL1xyXG4gIG9uUGVyZlNlYXJjaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBlcmZvcm1hbmNlIGhlYWRlciBjbGljazogc29ydCBieSB0aGF0IGNvbHVtbiwgYWdhaW4gdG8gcmV2ZXJzZSAoc2FtZSB0b2dnbGUgYXMgdGhlIHN0b3JlIGxpc3QpLiAqL1xyXG4gIHNvcnRQZXJmKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wZXJmU29ydEtleSA9PT0ga2V5KSB7XHJcbiAgICAgIHRoaXMucGVyZlNvcnREaXIgPSB0aGlzLnBlcmZTb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wZXJmU29ydEtleSA9IGtleTtcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9ICdhc2MnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUm93cyBpbiB0aGUgcGlja2VkIGNvbHVtbiBvcmRlciAodGhlIEFQSSdzIG9yZGVyIHdoZW4gbm9uZSBpcyBwaWNrZWQpLiBOdW1iZXJzIGNvbXBhcmUgYXMgbnVtYmVycywgdGV4dFxyXG4gICAqIGNhc2UtaW5zZW5zaXRpdmVseTsgZW1wdHkgdmFsdWVzICgn4oCUJykgc3RheSBhdCB0aGUgYm90dG9tIGluIGJvdGggZGlyZWN0aW9ucywgYXMgaW4gdGhlIHN0b3JlIGxpc3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzb3J0UGVyZlJvd3M8VD4ocm93czogVFtdLCB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIChyOiBUKSA9PiBTb3J0VmFsdWU+KTogVFtdIHtcclxuICAgIGNvbnN0IGdldCA9IHZhbHVlc1t0aGlzLnBlcmZTb3J0S2V5XTtcclxuICAgIGlmICghZ2V0KSB7IHJldHVybiByb3dzOyB9XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLnBlcmZTb3J0RGlyID09PSAnYXNjJyA/IDEgOiAtMTtcclxuICAgIGNvbnN0IGVtcHR5ID0gKHY6IFNvcnRWYWx1ZSkgPT4gdiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycgfHwgdiA9PT0gJ+KAlCc7XHJcbiAgICByZXR1cm4gWy4uLnJvd3NdLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgYXYgPSBnZXQoYSk7XHJcbiAgICAgIGNvbnN0IGJ2ID0gZ2V0KGIpO1xyXG4gICAgICBpZiAoZW1wdHkoYXYpIHx8IGVtcHR5KGJ2KSkgeyByZXR1cm4gZW1wdHkoYXYpID09PSBlbXB0eShidikgPyAwIDogKGVtcHR5KGF2KSA/IDEgOiAtMSk7IH1cclxuICAgICAgaWYgKHR5cGVvZiBhdiA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGJ2ID09PSAnbnVtYmVyJykgeyByZXR1cm4gKGF2IC0gYnYpICogZGlyOyB9XHJcbiAgICAgIHJldHVybiBTdHJpbmcoYXYpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGJ2KSwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiAnYmFzZScgfSkgKiBkaXI7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBTdWJtaXR0ZWQgY291bnQgLT4gdGhlIEdhbGxlcnkgb24gdGhpcyBhdWRpdCdzIHN1Ym1pc3Npb25zIGluIHRoZSBkYXNoYm9hcmQgcGVyaW9kLiAqL1xyXG4gIHN1Ym1pdHRlZFBhcmFtcyhyb3c6IEF1ZGl0UGVyZlJvdyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYXVkaXQ6IFN0cmluZyhyb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkIHx8ICcnKSxcclxuICAgICAgZnJvbTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnLFxyXG4gICAgICB0bzogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogVGFzayBTdWJtaXR0ZWQgY291bnQgLT4gdGhlIEdhbGxlcnkgd2l0aCBUeXBlIFRhc2sgb24gdGhpcyB0YXNrJ3Mgc3VibWlzc2lvbnMgaW4gdGhlIGRhc2hib2FyZCBwZXJpb2QuICovXHJcbiAgdGFza1N1Ym1pdHRlZFBhcmFtcyhyb3c6IFRhc2tQZXJmUm93KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhdWRpdDogU3RyaW5nKHJvdy5yYXc/LnRhc2tJZCB8fCAnJyksXHJcbiAgICAgIHR5cGU6ICd0YXNrJyxcclxuICAgICAgZnJvbTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnLFxyXG4gICAgICB0bzogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdWRpdCAvIHN0b3JlIC8gdXNlciBkZXRhaWwgbGluazogdGhlIHN1YmplY3QgcGx1cyB0aGUgZGFzaGJvYXJkIHBlcmlvZCAoZnJvbSAvIHRvKSwgc28gdGhlIGRldGFpbFxyXG4gICAqIHBhZ2Ugc2hvd3MgdGhlIHNhbWUgZGF5cyBhcyB0aGUgcm93IGNsaWNrZWQsIG5vdCB0aGUgaGVhZGVyIHJhbmdlICh0aGUgZGFzaGJvYXJkIGtlZXBzIGl0cyBvd24gcGVyaW9kKS5cclxuICAgKi9cclxuICBkZXRhaWxQYXJhbXMoc3ViamVjdDogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uc3ViamVjdCxcclxuICAgICAgZnJvbTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnLFxyXG4gICAgICB0bzogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwZXJmVGFiTGFiZWwodGFiOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRhYiArICcgUGVyZm9ybWFuY2UnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmZTZWFyY2hQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykgeyByZXR1cm4gJ1NlYXJjaCBieSBTdG9yZSBOYW1lJzsgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7IHJldHVybiAnU2VhcmNoIGJ5IFVzZXIgTmFtZSc7IH1cclxuICAgIHJldHVybiAnU2VhcmNoIGJ5ICcgKyB0aGlzLm1vZHVsZVRhYjtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZEF1ZGl0UGVyZigpOiBBdWRpdFBlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLmF1ZGl0UGVyZi5maWx0ZXIociA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLmF1ZGl0UGVyZiwgdGhpcy5hdWRpdFNvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRTdG9yZVBlcmYoKTogU3RvcmVQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy5zdG9yZVBlcmYuZmlsdGVyKHIgPT4gKHIuc3RvcmUgKyAnICcgKyByLnNwb2MpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy5zdG9yZVBlcmYsIHRoaXMuc3RvcmVTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkVXNlclBlcmYoKTogVXNlclBlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLnVzZXJQZXJmLmZpbHRlcihyID0+IChyLm5hbWUgKyAnICcgKyByLmVtYWlsKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMudXNlclBlcmYsIHRoaXMudXNlclNvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZkF1ZGl0KF86IG51bWJlciwgcm93OiBBdWRpdFBlcmZSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cubmFtZTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJmU3RvcmUoXzogbnVtYmVyLCByb3c6IFN0b3JlUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnN0b3JlSWQgfHwgcm93LnN0b3JlO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZVc2VyKF86IG51bWJlciwgcm93OiBVc2VyUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LmVtYWlsO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlID0gTnVtYmVyKHBhZ2UpIHx8IDE7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKHNpemU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IE51bWJlcihzaXplKSB8fCAxMDtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5U3RvcmUoXzogbnVtYmVyLCByb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuc3RvcmVJZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGZpbHRlckNhdHMgLyBiYW5kUm93cyBhcmUgZ2V0dGVycyB0aGF0IGJ1aWxkIG5ldyBvYmplY3RzIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24uIFdpdGhvdXQgYSBrZXlcclxuICAgKiBuZ0ZvciByZWJ1aWxkcyB0aGVpciBidXR0b25zIG9uIGVhY2ggcGFzcywgYW5kIGEgcGFzcyBiZXR3ZWVuIG1vdXNlZG93biBhbmQgbW91c2V1cCAodGhlIGhpZXJhcmNoeVxyXG4gICAqIGRyb3Bkb3duIGxpc3RlbnMgdG8gZG9jdW1lbnQ6bW91c2Vkb3duKSBzd2FsbG93cyB0aGUgY2xpY2suXHJcbiAgICovXHJcbiAgdHJhY2tCeUNhdChfOiBudW1iZXIsIGM6IEZpbHRlckNhdCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYy5rZXk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5QmFuZChfOiBudW1iZXIsIGI6IHsgYmFuZDogQXVkaXRCYW5kIH0pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGIuYmFuZC5rZXk7XHJcbiAgfVxyXG5cclxuICAvKiogLS0tLSBFeHBvcnQgKGNsaWVudC1zaWRlIC54bHN4IG9mIGV4YWN0bHkgdGhlIGZpbHRlcmVkIHJvd3MgYW5kIHZpc2libGUgY29sdW1ucykgLS0tLSAqL1xyXG5cclxuICBwcml2YXRlIGdldCBleHBvcnRQZXJpb2QoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZyb20gKyAnXycgKyB0aGlzLnRvO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhlYWRlciBFeHBvcnQ6IHRoZSBzdG9yZSBsaXN0IGJlbG93IHRoZSBmaWx0ZXJzLCBldmVyeSBmaWx0ZXJlZCByb3cgKGFsbCBwYWdlcyksIGl0cyB2aXNpYmxlIGNvbHVtbnMuICovXHJcbiAgZXhwb3J0U3RvcmVzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZmlsdGVyZWRSb3dzO1xyXG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCAhcm93cy5sZW5ndGgpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48QXVkaXRSb3c+W10gPSB0aGlzLmhlYWRlcnMubWFwKGggPT4gKHtcclxuICAgICAgaGVhZGVyOiBoLmxhYmVsLFxyXG4gICAgICB2YWx1ZTogKHI6IEF1ZGl0Um93KSA9PiB7XHJcbiAgICAgICAgaWYgKGgua2V5ID09PSAnc2NvcmUnKSB7IHJldHVybiByLnNjb3JlID09PSBudWxsID8gJ+KAlCcgOiByLnNjb3JlICsgJyUnOyB9XHJcbiAgICAgICAgaWYgKGgua2V5ID09PSAnc3RhdHVzJykgeyByZXR1cm4gdGhpcy5zdGF0dXNMYWJlbChyKTsgfVxyXG4gICAgICAgIHJldHVybiByW2gua2V5IGFzIGtleW9mIEF1ZGl0Um93XTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeChyb3dzLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVN0b3Jlcy0nICsgdGhpcy5leHBvcnRQZXJpb2QsICdTdG9yZSBsaXN0Jyk7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBvZiB0aGUgYWN0aXZlIHBlcmZvcm1hbmNlIHRhYiBhZnRlciBpdHMgc2VhcmNoICh3aGF0IHRoZSBcIlRvdGFsXCIgY291bnRlciBzaG93cykuICovXHJcbiAgZ2V0IHBlcmZSb3dDb3VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykgeyByZXR1cm4gdGhpcy5maWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGg7IH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykgeyByZXR1cm4gdGhpcy5maWx0ZXJlZFVzZXJQZXJmLmxlbmd0aDsgfVxyXG4gICAgcmV0dXJuIHRoaXMuaXNUYXNrTW9kdWxlID8gdGhpcy5maWx0ZXJlZFRhc2tQZXJmLmxlbmd0aCA6IHRoaXMuZmlsdGVyZWRBdWRpdFBlcmYubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhY3RpdmUgcGVyZm9ybWFuY2UgdGFiIGlzIHN0aWxsIGxvYWRpbmcgKHRoZSBUYXNrIHRhYmxlIGhhcyBpdHMgb3duIGZlZWQpLiAqL1xyXG4gIGdldCBwZXJmTG9hZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBlcmZUYWIgPT09ICdBdWRpdCcgJiYgdGhpcy5pc1Rhc2tNb2R1bGUgPyB0aGlzLnRhc2tMb2FkaW5nIDogdGhpcy5sb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBlcmZvcm1hbmNlIEV4cG9ydDogdGhlIGFjdGl2ZSB0YWIncyBmaWx0ZXJlZCBsaXN0IHdpdGggaXRzIHZpc2libGUgY29sdW1uIGhlYWRlcnMgKEFjdGlvbiBsZWZ0IG91dCkuICovXHJcbiAgZXhwb3J0UGVyZm9ybWFuY2UoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wZXJmTG9hZGluZyB8fCAhdGhpcy5wZXJmUm93Q291bnQpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBwZXJpb2QgPSB0aGlzLmV4cG9ydFBlcmlvZDtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFN0b3JlUGVyZlJvdz5bXSA9IFtcclxuICAgICAgICB7IGhlYWRlcjogJ1N0b3JlIE5hbWUnLCB2YWx1ZTogciA9PiByLnN0b3JlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdG9yZSBTcG9jJywgdmFsdWU6IHIgPT4gci5zcG9jIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCcsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0ZsYWdzJywgdmFsdWU6IHIgPT4gci5mbGFncyA/PyAn4oCUJyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxldGlvbiAlJywgdmFsdWU6IHIgPT4gci5jb21wbGV0aW9uIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb21wbGlhbmNlICUnLCB2YWx1ZTogciA9PiByLmNvbXBsaWFuY2UgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1BlcmZvcm1hbmNlICUnLCB2YWx1ZTogciA9PiByLnBlcmYgfVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHRoaXMuZmlsdGVyZWRTdG9yZVBlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtU3RvcmUtUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1N0b3JlIFBlcmZvcm1hbmNlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykge1xyXG4gICAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48VXNlclBlcmZSb3c+W10gPSBbXHJcbiAgICAgICAgeyBoZWFkZXI6ICdVc2VyIE5hbWUnLCB2YWx1ZTogciA9PiByLm5hbWUgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0VtYWlsJywgdmFsdWU6IHIgPT4gci5lbWFpbCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQnLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1JlRG8nLCB2YWx1ZTogciA9PiByLnJlZG8gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsZXRpb24gJScsIHZhbHVlOiByID0+IHIuY29tcGxldGlvbiB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdQZXJmb3JtYW5jZSAlJywgdmFsdWU6IHIgPT4gci5wZXJmIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkVXNlclBlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtVXNlci1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnVXNlciBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1Rhc2tNb2R1bGUpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFRhc2tQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnVGFzayBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTY2hlZHVsZWQnLCB2YWx1ZTogciA9PiByLnNjaGVkdWxlZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ292ZXJhZ2UnLCB2YWx1ZTogciA9PiByLmNvdmVyYWdlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCBUbycsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1N1Ym1pdHRlZCcsIHZhbHVlOiByID0+IHIuc3VibWl0dGVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1Rhc2tzJywgdmFsdWU6IHIgPT4gci50YXNrcyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUmVEbycsIHZhbHVlOiByID0+IHIucmVkbyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUXVlc3Rpb24gQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkVGFza1BlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtVGFzay1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnVGFzayBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48QXVkaXRQZXJmUm93PltdID0gW1xyXG4gICAgICB7IGhlYWRlcjogJ0F1ZGl0IE5hbWUnLCB2YWx1ZTogciA9PiByLm5hbWUgfSxcclxuICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCBUbycsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgeyBoZWFkZXI6ICdTdWJtaXR0ZWQnLCB2YWx1ZTogciA9PiByLnN1Ym1pdHRlZCB9LFxyXG4gICAgICB7IGhlYWRlcjogJ0Rpc3B1dGVzJywgdmFsdWU6IHIgPT4gci5kaXNwdXRlcyA/PyAn4oCUJyB9LFxyXG4gICAgICB7IGhlYWRlcjogJ1Bhc3MgTWFyaycsIHZhbHVlOiByID0+IHIucGFzc01hcmsgfSxcclxuICAgICAgeyBoZWFkZXI6ICdTY29yZScsIHZhbHVlOiByID0+IHIuc2NvcmUgfSxcclxuICAgICAgeyBoZWFkZXI6ICdSZXN1bHQnLCB2YWx1ZTogciA9PiByLnJlc3VsdCB9XHJcbiAgICBdO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkQXVkaXRQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLUF1ZGl0LVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdBdWRpdCBQZXJmb3JtYW5jZScpO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gUGVyLXN0b3JlIFBERiAtLS0tICovXHJcblxyXG4gIC8qKiBUaGUgc3RvcmUncyBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QgKHRoZSBkYXNoYm9hcmQgQVBJJ3MgbGFzdFZpc2l0SWQpLCBpZiBhbnkuICovXHJcbiAgcGRmVmlzaXRJZChyb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py5sYXN0VmlzaXRJZCA/IFN0cmluZyhyb3cucmF3Lmxhc3RWaXNpdElkKSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2FtZSBQREYgZG93bmxvYWQgYXMgdGhlIGRldGFpbCBwYWdlcycgRG93bmxvYWQsIGZvciB0aGUgc3RvcmUncyBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0OlxyXG4gICAqIHF1ZXVlZCwgdGhlbiBsaXN0ZWQgdW5kZXIgTm90aWZpY2F0aW9ucyA+IERvd25sb2Fkcy5cclxuICAgKi9cclxuICBkb3dubG9hZFBkZihyb3c6IEF1ZGl0Um93KTogdm9pZCB7XHJcbiAgICBjb25zdCB2aXNpdElkID0gdGhpcy5wZGZWaXNpdElkKHJvdyk7XHJcbiAgICBpZiAoIXZpc2l0SWQgfHwgdGhpcy5wZGZRdWV1ZWQuaGFzKHZpc2l0SWQpKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5wZGZRdWV1ZWQuYWRkKHZpc2l0SWQpO1xyXG4gICAgY29uc3QgdXNlciA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICd7fScpO1xyXG4gICAgY29uc3Qgc3RvcmVJZCA9IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQ7XHJcbiAgICAvLyBUaGUgZG93bmxvYWQgbmFtZSBpcyBtYXRjaGVkIGFzIGEgcmVndWxhciBleHByZXNzaW9uIHNlcnZlci1zaWRlLCBzbyBsZWF2ZSByZWdleCBjaGFyYWN0ZXJzIG91dC5cclxuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcocm93LnJhdz8uc3RvcmVOYW1lIHx8IHN0b3JlSWQpLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCAnICcpLnRyaW0oKSArICcgYXVkaXQnO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5yZXBvcnRUYWJsZUV4cG9ydCh7XHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICAgIHRvRGF0ZTogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUsXHJcbiAgICAgIGNoZWNrbGlzdElkOiBbdmlzaXRJZF0sXHJcbiAgICAgIHNvdXJjZUNoZWNrTGlzdF9pZDogJycsXHJcbiAgICAgIGNoZWNrbGlzdE5hbWU6IG5hbWUsXHJcbiAgICAgIGZpbGVUeXBlOiAncGRmJyxcclxuICAgICAgc3RvcmVJZHM6IFtzdG9yZUlkXSxcclxuICAgICAgdXNlcklkOiB1c2VyPy5faWQsXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgICAgZG93bmxvYWRJbnNlcnRGcm9tOiAnZGFzaGJvYXJkJyxcclxuICAgICAgaW5zZXJ0VHlwZTogJ2NoZWNrbGlzdCcsXHJcbiAgICAgIGNoZWNrTGlzdFR5cGU6ICdjdXN0b20nXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5wZGZRdWV1ZWQuZGVsZXRlKHZpc2l0SWQpO1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ0Rvd25sb2FkaW5nIHlvdXIgcmVwb3J0LiBGaW5kIGl0IHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGRmUXVldWVkLmRlbGV0ZSh2aXNpdElkKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1NvbWV0aGluZyB3ZW50IHdyb25nIScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImF2Mi1wYWdlIGF1ZGl0LWRhc2hcIj5cclxuXHJcbiAgPCEtLSBSZWZyZXNoIGxpbmUgKyBtb2R1bGUgc3dpdGNoIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJkYi10b3BsaW5lXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcmVmcmVzaFwiPkxhc3QgcmVmcmVzaGVkIGF0IHt7IGxhc3RSZWZyZXNoZWQgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZHVsZXN3aXRjaFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vZHVsZXRhYlwiICpuZ0Zvcj1cImxldCB0IG9mIG1vZHVsZVRhYnNcIiBbY2xhc3MubW9kdWxldGFiLW9uXT1cIm1vZHVsZVRhYiA9PT0gdFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNldE1vZHVsZVRhYih0KVwiPnt7IHQgfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tID09PT09PT09PT09PSBBVURJVCBTQ09SRUNBUkQgPT09PT09PT09PT09IC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUYXNrTW9kdWxlXCI+XHJcblxyXG4gICAgPCEtLSBDcnVtYiwgc2NvcGUgdGl0bGUsIGFjdGlvbnMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcGViYXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3BldGV4dFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jcnVtYlwiPkF1ZGl0cyDigLogRGFzaGJvYXJkPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3BlXCI+e3sgc2NvcGVMYWJlbCB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiNFwiIHkxPVwiN1wiIHgyPVwiMjBcIiB5Mj1cIjdcIj48L2xpbmU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjdcIiB5MT1cIjEyXCIgeDI9XCIxN1wiIHkyPVwiMTJcIj48L2xpbmU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjEwXCIgeTE9XCIxN1wiIHgyPVwiMTRcIiB5Mj1cIjE3XCI+PC9saW5lPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIEZpbHRlcnNcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNvdW50cGlsbFwiICpuZ0lmPVwiZmlsdGVyQ291bnRcIj57eyBmaWx0ZXJDb3VudCB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8ICFmaWx0ZXJlZFJvd3MubGVuZ3RoXCJcclxuICAgICAgICB0aXRsZT1cIkRvd25sb2FkIHRoZSBzdG9yZSBsaXN0IGJlbG93IGFzIGFuIEV4Y2VsIGZpbGVcIiAoY2xpY2spPVwiZXhwb3J0U3RvcmVzKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgMTZWNFwiPjwvcGF0aD5cclxuICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI3IDkgMTIgNCAxNyA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNNCAxNnY0aDE2di00XCI+PC9wYXRoPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIEV4cG9ydFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRmlsdGVyIGNoaXBzIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLWNoaXBzXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItY2hpcFwiICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlckNhdHM7IHRyYWNrQnk6IHRyYWNrQnlDYXRcIiBbY2xhc3MuaXMtZGlydHldPVwiYy5kaXJ0eVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKGMua2V5KVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hpcC1sYWJlbFwiPnt7IGMubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGlwLXZhbHVlXCI+e3sgYy52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItY2xlYXJhbGxcIiAqbmdJZj1cImZpbHRlckNvdW50XCIgKGNsaWNrKT1cImNsZWFyQWxsKClcIj5DbGVhciBhbGw8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gS1BJIHRpbGVzIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLWtwaXNcIj5cclxuICAgICAgPCEtLSBPbGQgQ2hlY2tsaXN0IHN1bW1hcnkgY2FyZDogZmlndXJlICsgbGFiZWwgaW4gdGhlIGdyYWRpZW50IHN0cmlwLCBub3RlIGJlbG93LiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZFwiICpuZ0Zvcj1cImxldCBrcGkgb2Yga3Bpc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtaGVhZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1jb3VudFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBrcGkudmFsdWUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC10ZXh0XCI+e3sga3BpLmxhYmVsIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLW5vdGVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmdcIiBjbGFzcz1cImF2Mi1vY2FyZC1ub3RlXCIgW3N0eWxlLmNvbG9yXT1cImtwaS5ub3RlQ29sb3JcIj57eyBrcGkubm90ZSB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVHJlbmQgKyBkaXN0cmlidXRpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItZHVvXCI+XHJcbiAgICAgIDwhLS0gVHJlbmQgLS0+XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGItY2FyZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLWhlYWQgZGItY2FyZC1oZWFkLS13cmFwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC10aXRsZSBkYi1jYXJkLXRpdGxlLS1ncm93XCI+QXVkaXQgc2NvcmUgdHJlbmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zZWdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1zZWctdGFiXCIgW2NsYXNzLmlzLW9uXT1cImdyYWluID09PSAncXVhcnRlcidcIiAoY2xpY2spPVwic2V0R3JhaW4oJ3F1YXJ0ZXInKVwiPlF1YXJ0ZXJseTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLXNlZy10YWJcIiBbY2xhc3MuaXMtb25dPVwiZ3JhaW4gPT09ICdkYXRlJ1wiIChjbGljayk9XCJzZXRHcmFpbignZGF0ZScpXCI+QnkgZGF0ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1kYXRlcm93XCIgKm5nSWY9XCJncmFpbiA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWRhdGVwaWNrXCI+XHJcbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJhdjItZGF0ZXBpY2staWNvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxyZWN0IHg9XCIzXCIgeT1cIjRcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjJcIj48L3JlY3Q+XHJcbiAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiMlwiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCI4XCIgeTE9XCIyXCIgeDI9XCI4XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhdjItZGF0ZXBpY2staW5wdXQgZGItZGF0ZXJhbmdlXCIgbmd4RGF0ZXJhbmdlcGlja2VyTWQgcmVhZG9ubHkgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBkYXRlIHJhbmdlXCIgWyhuZ01vZGVsKV09XCJyYW5nZVwiIFtsb2NhbGVdPVwicGlja2VyTG9jYWxlXCIgW21heERhdGVdPVwidG9kYXlcIlxyXG4gICAgICAgICAgICAgIFtkYXRlTGltaXRdPVwibWF4UmFuZ2VEYXlzXCIgW3Jhbmdlc109XCJyYW5nZXNcIiBbc2hvd0N1c3RvbVJhbmdlTGFiZWxdPVwidHJ1ZVwiIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICBba2VlcENhbGVuZGFyT3BlbmluZ1dpdGhSYW5nZV09XCJ0cnVlXCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgW3Nob3dDYW5jZWxdPVwiZmFsc2VcIiBbZHJvcHNdPVwiJ2Rvd24nXCIgW29wZW5zXT1cIidyaWdodCdcIlxyXG4gICAgICAgICAgICAgIChkYXRlc1VwZGF0ZWQpPVwib25SYW5nZVBpY2tlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRyZW5kTG9hZGluZ1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgYXYyLXNrLS10aXRsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tYmxvY2sgZGItc2stY2hhcnRcIj48L3NwYW4+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdHJlbmRMb2FkaW5nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWZvY3VzXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWZvY3VzLXNjb3JlXCIgW2NsYXNzLmlzLWZhaWxdPVwiIWZvY3VzUGFzc2VkXCI+e3sgZm9jdXNTY29yZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtcGlsbFwiIFtjbGFzcy5pcy1wYXNzXT1cImZvY3VzUGFzc2VkXCIgW2NsYXNzLmlzLWZhaWxdPVwiIWZvY3VzUGFzc2VkXCI+e3sgZm9jdXNTdGF0dXMgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWZvY3VzLWxpbmVcIj57eyBmb2N1c0xpbmUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWdlbmRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItbGVnZW5kLWRhc2hcIj48L3NwYW4+UGFzcyBtYXJrIHt7IHBhc3NNYXJrIH19JVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydC15XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOjBcIj4xMDAlPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cInRvcDo1MCVcIj41MCU8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOjEwMCVcIj4wJTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0LWFyZWFcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZ3JpZGxpbmVcIiBzdHlsZT1cInRvcDo1MCVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZ3JpZGxpbmVcIiBzdHlsZT1cInRvcDoxMDAlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXBhc3NsaW5lXCIgW3N0eWxlLnRvcC4lXT1cIjEwMCAtIHBhc3NNYXJrXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFyc1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYXItY29sXCIgKm5nRm9yPVwibGV0IGJhciBvZiB0cmVuZEJhcnM7IGxldCBmaXJzdCA9IGZpcnN0OyBsZXQgbGFzdCA9IGxhc3RcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLXBpY2thYmxlXT1cImdyYWluID09PSAncXVhcnRlcidcIiAoY2xpY2spPVwic2VsZWN0UXVhcnRlcihiYXIua2V5KVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYXItdmFsdWVcIiAqbmdJZj1cIiFkZW5zZVRyZW5kXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJiYXIua2V5ID09PSBxdWFydGVyXCIgW3N0eWxlLmJvdHRvbV09XCJiYXJIZWlnaHQoYmFyKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBiYXIudmFsdWUgPT09IG51bGwgPyAn4oCUJyA6IGJhci52YWx1ZSArICclJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYXJcIiBbc3R5bGUuaGVpZ2h0XT1cImJhckhlaWdodChiYXIpXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYmFyRmlsbChiYXIpXCI+PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXBcIiBbY2xhc3MuaXMtc3RhcnRdPVwiZmlyc3QgJiYgIWxhc3RcIiBbY2xhc3MuaXMtZW5kXT1cImxhc3QgJiYgIWZpcnN0XCIgW3N0eWxlLmJvdHRvbV09XCJ0aXBCb3R0b20oYmFyKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLWhlYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBiYXIubGFiZWwgfX08c3BhbiBjbGFzcz1cImRiLXRpcC1zdWJcIiAqbmdJZj1cImdyYWluID09PSAncXVhcnRlcidcIj4gwrcge3sgcXVhcnRlck1vbnRocyhiYXIua2V5KSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtc2NvcmVcIiAqbmdJZj1cImJhci52YWx1ZSAhPT0gbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdGlwLWRvdFwiIFtjbGFzcy5pcy1mYWlsXT1cImJhci52YWx1ZSA8IHBhc3NNYXJrXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdGlwLXZhbHVlXCI+e3sgYmFyLnZhbHVlIH19JTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRpcC1zdGF0dXNcIiBbY2xhc3MuaXMtZmFpbF09XCJiYXIudmFsdWUgPCBwYXNzTWFya1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgYmFyLnZhbHVlID49IHBhc3NNYXJrID8gJ1Bhc3MnIDogJ0JlbG93IHBhc3MgbWFyaycgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLWVtcHR5XCIgKm5nSWY9XCJiYXIudmFsdWUgPT09IG51bGxcIj5ObyBzY29yZWQgYXVkaXRzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtcm93XCI+PHNwYW4+QXVkaXRzIGNvbXBsZXRlZDwvc3Bhbj48Yj57eyBiYXIuc3VibWl0dGVkIH19PC9iPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLXJvd1wiICpuZ0lmPVwiYmFyLmNvdW50ICE9PSBiYXIuc3VibWl0dGVkXCI+PHNwYW4+U2NvcmVkIGF1ZGl0czwvc3Bhbj48Yj57eyBiYXIuY291bnQgfX08L2I+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtcm93XCI+PHNwYW4+UGFzcyBtYXJrPC9zcGFuPjxiPnt7IHBhc3NNYXJrIH19JTwvYj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gQSBtb250aCBieSBkYXRlIGhhcyB+MzAgYmFyczogZXZlcnkgZmV3IGRheXMgZ2V0IGEgbGFiZWwgKGZpcnN0IGFuZCBsYXN0IGFsd2F5cyksIGFuZCB0aGUgYXVkaXQgY291bnRzXHJcbiAgICAgICAgICAgICBtb3ZlIHRvIHRoZSBiYXIgdG9vbHRpcCwgc28gdGhlIGxhYmVscyBuZXZlciBydW4gaW50byBlYWNoIG90aGVyLiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnQteFwiIFtjbGFzcy5pcy1kZW5zZV09XCJkZW5zZVRyZW5kXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoYXJ0LXhjb2xcIiAqbmdGb3I9XCJsZXQgYmFyIG9mIHRyZW5kQmFyczsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCIgW2NsYXNzLmlzLXBpY2thYmxlXT1cImdyYWluID09PSAncXVhcnRlcidcIiAoY2xpY2spPVwic2VsZWN0UXVhcnRlcihiYXIua2V5KVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoYXJ0LXhsYWJlbFwiIFtjbGFzcy5pcy1hY3RpdmVdPVwiYmFyLmtleSA9PT0gcXVhcnRlclwiIFtzdHlsZS52aXNpYmlsaXR5XT1cInNob3dYTGFiZWwoaSwgbGFzdCkgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiPnt7IGJhci5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGFydC14Y291bnRcIiAqbmdJZj1cIiFkZW5zZVRyZW5kXCI+e3sgYmFyLnN1Ym1pdHRlZCA/IGJhci5zdWJtaXR0ZWQgKyAnIGF1ZGl0cycgOiAnbm8gYXVkaXRzJyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPCEtLSBTY29yZSBiYW5kcyAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJkYi1jYXJkIGRiLWNhcmQtLXRpZ2h0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtaGVhZCBkYi1jYXJkLWhlYWQtLWJhc2VsaW5lXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC10aXRsZSBkYi1jYXJkLXRpdGxlLS1ncm93XCI+U2NvcmUgZGlzdHJpYnV0aW9uPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj57eyBzdG9yZXNJblNjb3BlIH19IGluIHNjb3BlPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtc3ViXCI+U3RvcmVzIGJ5IHNjb3JlIGJhbmQsIHt7IHBlcmlvZExhYmVsIH19PC9kaXY+XHJcblxyXG4gICAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cImxvYWRpbmdcIiBbcm93c109XCIyXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRiYXJcIiAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgICAgICA8IS0tIEEgYmFuZCB3aXRoIHN0b3JlcyBrZWVwcyBhIHZpc2libGUgc2xpdmVyICgyIG9mIDM1NzYgc3RvcmVzIGlzIHVuZGVyIGEgcGl4ZWwpOyB0aGUgbGFyZ2VzdCBiYW5kIGdpdmVzIHdheS4gLS0+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRzZWdcIiAqbmdGb3I9XCJsZXQgYiBvZiBiYW5kUm93czsgdHJhY2tCeTogdHJhY2tCeUJhbmRcIiBbc3R5bGUud2lkdGhdPVwiYi53aWR0aFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImIuYmFuZC5zb2Z0XCJcclxuICAgICAgICAgICAgW2NsYXNzLmhhcy1zdG9yZXNdPVwiYi5jb3VudCA+IDBcIiBbdGl0bGVdPVwiYi5iYW5kLmxhYmVsICsgJzogJyArIGIuY291bnRcIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYW5kcm93c1wiICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYW5kcm93XCIgKm5nRm9yPVwibGV0IGIgb2YgYmFuZFJvd3M7IHRyYWNrQnk6IHRyYWNrQnlCYW5kXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImIuYmFuZC5zb2Z0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRsYWJlbFwiPnt7IGIuYmFuZC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kcmFuZ2VcIj57eyBiLmJhbmQucmFuZ2UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGNvdW50XCI+e3sgYi5jb3VudCB9fSB7eyBiLmNvdW50ID09PSAxID8gJ3N0b3JlJyA6ICdzdG9yZXMnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRzaGFyZVwiPnt7IGIuc2hhcmUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItYmFuZGxpbmtcIiBbY2xhc3MuaXMtYWN0aXZlXT1cInN0b3JlTGlzdE9wZW4gJiYgbGlzdEJhbmRLZXkgPT09IGIuYmFuZC5rZXlcIiAoY2xpY2spPVwiYXBwbHlCYW5kKGIuYmFuZClcIj5WaWV3IHN0b3JlczwvYT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYW5kaGludFwiICpuZ0lmPVwiIWxvYWRpbmcgJiYgIXNob3dTdG9yZUxpc3RcIj5DbGljayA8Yj5WaWV3IHN0b3JlczwvYj4gb24gYSBiYW5kIHRvIGxpc3QgaXRzIHN0b3Jlcy48L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTdG9yZSBsZWRnZXI6IG9wZW5lZCBmcm9tIFNjb3JlIGRpc3RyaWJ1dGlvbiAtPiBWaWV3IHN0b3JlcyAob3IgYSBGaWx0ZXJzIHNjb3JlIHJhbmdlKSAtLT5cclxuICAgIDxzZWN0aW9uIGNsYXNzPVwiZGItY2FyZCBkYi1jYXJkLS10YWJsZVwiIGlkPVwiYWQtc3RvcmUtbGlzdFwiICpuZ0lmPVwic2hvd1N0b3JlTGlzdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItbGVkZ2VyLWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItbGVkZ2VyLXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXRpdGxlXCI+U3RvcmUgbGlzdDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtc3ViXCI+XHJcbiAgICAgICAgICAgIHt7IGZpbHRlcmVkUm93cy5sZW5ndGggfX0ge3sgZmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gMSA/ICdzdG9yZScgOiAnc3RvcmVzJyB9fSDCtyB7eyBwZXJpb2RMYWJlbCB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZGZpbHRlclwiICpuZ0lmPVwibGlzdENoaXBMYWJlbFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRjaGlwXCI+XHJcbiAgICAgICAgICAgICAge3sgbGlzdENoaXBMYWJlbCB9fVxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGNoaXAteFwiIHRpdGxlPVwiQ2xvc2UgdGhlIHN0b3JlIGxpc3RcIiAoY2xpY2spPVwiY2xvc2VTdG9yZUxpc3QoKVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjlcIiBoZWlnaHQ9XCI5XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiM1wiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48bGluZSB4MT1cIjZcIiB5MT1cIjZcIiB4Mj1cIjE4XCIgeTI9XCIxOFwiPjwvbGluZT48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1iYW5kbGlua1wiIChjbGljayk9XCJzaG93QWxsU3RvcmVzKClcIj5TaG93IGFsbCBzdG9yZXM8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdjItc2VhcmNoIGRiLXNlYXJjaFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoKClcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHN0b3JlIG9yIG93bmVyXCJcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWdtZW50ZWRcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICdhbGwnXCIgKGNsaWNrKT1cInNldFN0YXR1cygnYWxsJylcIj5BbGw8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICdmYWlsJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ2ZhaWwnKVwiPkZhaWw8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICdwYXNzJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ3Bhc3MnKVwiPlBhc3M8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICd1bnNjb3JlZCdcIiAoY2xpY2spPVwic2V0U3RhdHVzKCd1bnNjb3JlZCcpXCJcclxuICAgICAgICAgICAgdGl0bGU9XCJBdWRpdGVkLCBidXQgY29tcGxpYW5jZSBzY29yZSBpcyBvZmYgZm9yIHRoZSBhdWRpdHNcIj5Ob3Qgc2NvcmVkPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlZ3RhYlwiIFtjbGFzcy5zZWd0YWItb25dPVwic3RhdHVzID09PSAnbmEnXCIgKGNsaWNrKT1cInNldFN0YXR1cygnbmEnKVwiPk5vdCBhdWRpdGVkPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwibG9hZGluZ1wiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwiZGItdGFibGVcIj5cclxuICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgaCBvZiBoZWFkZXJzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwic29ydEtleSA9PT0gaC5rZXlcIiAoY2xpY2spPVwic29ydEJ5KGgua2V5KVwiPlxyXG4gICAgICAgICAgICAgICAge3sgaC5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09IGgua2V5XCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwYWdlUm93czsgdHJhY2tCeTogdHJhY2tCeVN0b3JlXCI+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZGItbm93cmFwXCI+e3sgcm93LmRhdGUgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItc3RvcmVpZFwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCJcclxuICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IHN0b3JlOiByb3cucmF3Py5zdG9yZUlkIHx8IHJvdy5zdG9yZUlkIH0pXCI+e3sgcm93LnN0b3JlSWQgfX08L2E+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj57eyByb3cuY2lyY2xlIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj57eyByb3cuem9uZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LmFvbSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1waWxsXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYmFuZEZvcihyb3cpLmJnXCIgW3N0eWxlLmNvbG9yXT1cImJhbmRGb3Iocm93KS5mZ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7eyByb3cuc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IHJvdy5zY29yZSArICclJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1waWxsXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYmFuZEZvcihyb3cpLmJnXCIgW3N0eWxlLmNvbG9yXT1cImJhbmRGb3Iocm93KS5mZ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzdGF0dXNMYWJlbChyb3cpIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIEEgc3RvcmUgcm93IHNwYW5zIHNldmVyYWwgYXVkaXRzLCBzbyBWaWV3IG9wZW5zIHRoaXMgc3RvcmUncyBhdWRpdCBkZXRhaWwgKHNhbWUgYXMgdGhlIGlkIGxpbmspLiAtLT5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi12aWV3YnRuXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvc3RvcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCB9KVwiIHRpdGxlPVwiVmlldyB0aGlzIHN0b3JlJ3MgYXVkaXRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBWaWV3XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBQREYgb2YgdGhlIHN0b3JlJ3MgbGF0ZXN0IHN1Ym1pdHRlZCBhdWRpdCBpbiB0aGUgcGVyaW9kIChxdWV1ZWQsIHRoZW4gdW5kZXIgTm90aWZpY2F0aW9ucyA+IERvd25sb2FkcykuIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXBkZmJ0blwiIHJvbGU9XCJidXR0b25cIiBbY2xhc3MuaXMtZGlzYWJsZWRdPVwiIXBkZlZpc2l0SWQocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhcGRmVmlzaXRJZChyb3cpXCIgKGNsaWNrKT1cImRvd25sb2FkUGRmKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJwZGZWaXNpdElkKHJvdykgPyAnRG93bmxvYWQgdGhlIFBERiByZXBvcnQgb2YgdGhlIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQgZm9yIHRoaXMgc3RvcmUnIDogJ05vIHN1Ym1pdHRlZCBhdWRpdCBmb3IgdGhpcyBzdG9yZSBpbiB0aGlzIHBlcmlvZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDR2MTJcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNyAxMSAxMiAxNiAxNyAxMVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgMjBoMTZcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFwYWdlUm93cy5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPk5vIHN0b3JlcyBtYXRjaCB0aGUgY3VycmVudCBmaWx0ZXJzLjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gU2hhcmVkIHBhZ2VyICgxMCAvIDIwIC8gMzApLCBhcyBvbiB0aGUgb3RoZXIgYXVkaXQgbGlzdHMuIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi1wYWdlclwiICpuZ0lmPVwiZmlsdGVyZWRSb3dzLmxlbmd0aFwiPlxyXG4gICAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cInBhZ2VTaXplXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdlU2l6ZXNcIlxyXG4gICAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBhZ2VcIiBbdG90YWxJdGVtc109XCJmaWx0ZXJlZFJvd3MubGVuZ3RoXCIgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvc2VjdGlvbj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gVEFTSyBTVU1NQVJZID09PT09PT09PT09PSAtLT5cclxuICA8IS0tIFRhc2tzIHJhaXNlZCBmcm9tIHRoaXMgY2xpZW50J3MgYXVkaXRzLCBpbiB0aGUgaGVhZGVyIHNjb3BlIChzaGltbWVyIHZhbHVlcyB3aGlsZSBsb2FkaW5nKS4gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImRiLXN0YXRzXCIgKm5nSWY9XCJpc1Rhc2tNb2R1bGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1iaWdcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5hY3RpdmVUYXNrcyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWxhYmVsXCI+QWN0aXZlIHt7IG1vZHVsZVRhYiB9fXM8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWJvZHlcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbWlkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMudGFza0luc3RhbmNlcyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj57eyBtb2R1bGVUYWIgfX0gSW5zdGFuY2VzPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXN0YXRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWJpZ1wiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWUgZGItc2stdmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLm5vdFN1Ym1pdHRlZCB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWxhYmVsXCI+Tm90IFN1Ym1pdHRlZCB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1ib2R5IGRiLXN0YXQtYm9keS0tMlwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5vcGVuVGFza3MgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+T3BlbiB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLmluUHJvZ3Jlc3MgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+SW4gUHJvZ3Jlc3Mge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1iaWdcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5zdWJtaXR0ZWQgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1sYWJlbFwiPlN1Ym1pdHRlZCB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1ib2R5IGRiLXN0YXQtYm9keS0tM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWNlbGxcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLmNvbXBsZXRpb25TY29yZSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj5Db21wbGV0aW9uIFNjb3JlPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1kZWx0YVwiICpuZ0lmPVwiIXRhc2tMb2FkaW5nICYmIHRhc2tTdGF0cy5jb21wbGV0aW9uRGVsdGFcIiBbbmdDbGFzc109XCJ0YXNrRGVsdGFDbGFzcygnY29tcGxldGlvbicpXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNCA2IDEwIDEyIDE0IDggMjAgMTZcIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9XCIxNSAxNiAyMCAxNiAyMCAxMVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IHRhc2tTdGF0cy5jb21wbGV0aW9uRGVsdGEgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWNlbGxcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLmNvbXBsaWFuY2VTY29yZSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj5Db21wbGlhbmNlIFNjb3JlPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1kZWx0YVwiICpuZ0lmPVwiIXRhc2tMb2FkaW5nICYmIHRhc2tTdGF0cy5jb21wbGlhbmNlRGVsdGFcIiBbbmdDbGFzc109XCJ0YXNrRGVsdGFDbGFzcygnY29tcGxpYW5jZScpXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNCA2IDEwIDEyIDE0IDggMjAgMTZcIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9XCIxNSAxNiAyMCAxNiAyMCAxMVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IHRhc2tTdGF0cy5jb21wbGlhbmNlRGVsdGEgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWNlbGxcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZCBpcy11bmRlcmxpbmVcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy50b3RhbEZsYWdzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPlRvdGFsIEZsYWdzPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1kZWx0YVwiICpuZ0lmPVwiIXRhc2tMb2FkaW5nICYmIHRhc2tTdGF0cy5mbGFnc0RlbHRhXCIgW25nQ2xhc3NdPVwidGFza0RlbHRhQ2xhc3MoJ2ZsYWdzJylcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI0IDYgMTAgMTIgMTQgOCAyMCAxNlwiPjwvcG9seWxpbmU+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDE2IDIwIDE2IDIwIDExXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgdGFza1N0YXRzLmZsYWdzRGVsdGEgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tID09PT09PT09PT09PSBQRVJGT1JNQU5DRSA9PT09PT09PT09PT0gLS0+XHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJkYi1wZXJmXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZnRhYnNcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1wZXJmdGFiXCIgKm5nRm9yPVwibGV0IHQgb2YgcGVyZlRhYnNcIiBbY2xhc3MuaXMtb25dPVwicGVyZlRhYiA9PT0gdFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNldFBlcmZUYWIodClcIj57eyBwZXJmVGFiRGlzcGxheSh0KSB9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtaGVhZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi10ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtdGl0bGVcIj5cclxuICAgICAgICAgIHt7IHBlcmZJbmZvVGl0bGUgfX1cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdG90YWxcIj5cclxuICAgICAgICAgICAge3sgcGVyZlRhYiA9PT0gJ0F1ZGl0JyA/IChpc1Rhc2tNb2R1bGUgPyBmaWx0ZXJlZFRhc2tQZXJmLmxlbmd0aCA6IGZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aCkgOiAocGVyZlRhYiA9PT0gJ1N0b3JlJyA/IGZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aCA6IGZpbHRlcmVkVXNlclBlcmYubGVuZ3RoKSB9fSBUb3RhbFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPnt7IHBlcmZQZXJpb2QgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJhdjItc2VhcmNoIGRiLXBlcmYtc2VhcmNoXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInBlcmZTZWFyY2hQbGFjZWhvbGRlclwiIFsobmdNb2RlbCldPVwicGVyZlNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uUGVyZlNlYXJjaCgpXCI+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdFwiIFtkaXNhYmxlZF09XCJwZXJmTG9hZGluZyB8fCAhcGVyZlJvd0NvdW50XCJcclxuICAgICAgICB0aXRsZT1cIkRvd25sb2FkIHRoaXMgdGFibGUgYXMgYW4gRXhjZWwgZmlsZVwiIChjbGljayk9XCJleHBvcnRQZXJmb3JtYW5jZSgpXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTEyIDE2VjRcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNyA5IDEyIDQgMTcgOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTQgMTZ2NGgxNnYtNFwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICBFeHBvcnRcclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBkYi1jcmVhdGVcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdBdWRpdCcgJiYgYWNjZXNzLmNhbkFkZFwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvbWFuYWdlXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTIgNXYxNE01IDEyaDE0XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgIHt7IHBlcmZDcmVhdGVMYWJlbCB9fVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cInBlcmZMb2FkaW5nXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXBlcmZMb2FkaW5nXCI+XHJcbiAgICA8IS0tIEF1ZGl0IFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnQXVkaXQnICYmICFpc1Rhc2tNb2R1bGVcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tYXVkaXRcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiBhdWRpdFBlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZEF1ZGl0UGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmQXVkaXRcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWF2YXRhclwiPnt7IHJvdy5pbml0aWFscyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0XCJcclxuICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkIH0pXCI+e3sgcm93Lm5hbWUgfX08L2E+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBPcGVucyB0aGUgYXVkaXQncyBkZXRhaWwgcGFnZSAoYXMgdGhlIGV5ZSBkb2VzKSBvbiBpdHMgc3VibWl0dGVkIHZpc2l0cywgYXMgdGhlIHYxIENoZWNrbGlzdCBkYXNoYm9hcmQgZGlkLiAtLT5cclxuICAgICAgICAgICAgICA8YSAqbmdJZj1cInJvdy5zdWJtaXR0ZWRcIiBjbGFzcz1cImRiLXVsaW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXRcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkLCBzdGF0dXM6ICdzdWJtaXQnIH0pXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwiVmlldyB0aGUgc3VibWl0dGVkIHZpc2l0c1wiPnt7IHJvdy5zdWJtaXR0ZWQgfX08L2E+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93LnN1Ym1pdHRlZFwiPjA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwhLS0gU3RvcmUgZGlzcHV0ZXMgKHF1ZXN0aW9ucykgaW4gdGhlIHBlcmlvZDsgYSBjb3VudCBvcGVucyB0aGUgYXVkaXQncyBkZXRhaWwgcGFnZSBvbiBpdHMgZGlzcHV0ZWQgdmlzaXRzLiAtLT5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LmRpc3B1dGVzID09PSBudWxsXCIgY2xhc3M9XCJhdjItZmFpbnRcIj7igJQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGEgKm5nSWY9XCJyb3cuZGlzcHV0ZXNcIiBjbGFzcz1cImRiLXVsaW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXRcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkLCBzdGF0dXM6ICdkaXNwdXRlZCcgfSlcIlxyXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJWaWV3IHRoZSBkaXNwdXRlZCB2aXNpdHNcIj57eyByb3cuZGlzcHV0ZXMgfX08L2E+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuZGlzcHV0ZXMgPT09IDBcIj4wPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnBhc3NNYXJrIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuc2NvcmUgPT09ICfigJQnXCJcclxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyb3cuc2NvcmUgPT09ICfigJQnID8gJ0NvbXBsaWFuY2Ugc2NvcmUgaXMgb2ZmIGZvciB0aGlzIGF1ZGl0JyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRyYWNrIGRiLXRyYWNrLS02XCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5zY29yZVBjdClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInJvdy5yZXN1bHQgPT09ICdQYXNzJyA/ICcjMTJCNzZBJyA6ICcjRjA0NDM4J1wiPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dFwiPnt7IHJvdy5zY29yZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnJlc3VsdCAhPT0gJ+KAlCdcIiBjbGFzcz1cImRiLXBpbGwgZGItcGlsbC0tc3Ryb25nXCIgW3N0eWxlLmJhY2tncm91bmRdPVwicm93LnJlc3VsdCA9PT0gJ1Bhc3MnID8gJyNFQ0ZERjMnIDogJyNGRUYzRjInXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJyb3cucmVzdWx0ID09PSAnUGFzcycgPyAnIzAyN0E0OCcgOiAnI0I0MjMxOCdcIj57eyByb3cucmVzdWx0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnJlc3VsdCA9PT0gJ+KAlCdcIiBjbGFzcz1cImF2Mi1mYWludFwiIHRpdGxlPVwiQ29tcGxpYW5jZSBzY29yZSBpcyBvZmYgZm9yIHRoaXMgYXVkaXRcIj7igJQ8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyBhdWRpdFwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0XCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCB9KVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+e3sgcGVyZlNlYXJjaC50cmltKCkgPyAnTm8gYXVkaXQgbWF0Y2hlcyB0aGlzIHNlYXJjaC4nIDogJ1RoZXJlIGlzIG5vIHJlc3VsdCBmb3IgQXVkaXQgUGVyZm9ybWFuY2UgaW4gdGhpcyBwZXJpb2QuJyB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVGFzayBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiBpc1Rhc2tNb2R1bGVcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tdGFza1wiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIHRhc2tQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRUYXNrUGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmVGFza1wiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYXZhdGFyXCI+e3sgcm93LmluaXRpYWxzIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1saW5rXCIgW3RpdGxlXT1cInJvdy5yYXc/LmF1ZGl0TmFtZSA/ICdSYWlzZWQgZnJvbSAnICsgcm93LnJhdy5hdWRpdE5hbWUgOiAnJ1wiPnt7IHJvdy5uYW1lIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnNjaGVkdWxlZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImRiLW1lZGl1bVwiPnt7IHJvdy5jb3ZlcmFnZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBPcGVucyB0aGUgR2FsbGVyeSAoVHlwZSBUYXNrKSBvbiB0aGlzIHRhc2sncyBzdWJtaXNzaW9ucyBpbiB0aGUgZGFzaGJvYXJkIHBlcmlvZC4gLS0+XHJcbiAgICAgICAgICAgICAgPGEgKm5nSWY9XCJyb3cuc3VibWl0dGVkICYmIHJvdy5yYXc/LnRhc2tJZFwiIGNsYXNzPVwiZGItdWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2dhbGxlcnlcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInRhc2tTdWJtaXR0ZWRQYXJhbXMocm93KVwiIHRpdGxlPVwiVmlldyB0aGUgc3VibWl0dGVkIHRhc2tzIGluIHRoZSBHYWxsZXJ5XCI+e3sgcm93LnN1Ym1pdHRlZCB9fTwvYT5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFyb3cuc3VibWl0dGVkIHx8ICFyb3cucmF3Py50YXNrSWRcIj57eyByb3cuc3VibWl0dGVkIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGEgY2xhc3M9XCJkYi11bGlua1wiPnt7IHJvdy5mbGFncyB9fTwvYT48L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZmFpbnRcIj57eyByb3cudGFza3MgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGEgY2xhc3M9XCJkYi11bGlua1wiPnt7IHJvdy5yZWRvIH19PC9hPjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsaWFuY2UgPT09ICfigJQnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRyYWNrIGRiLXRyYWNrLS02XCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGlhbmNlUGN0KVwiPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dFwiPnt7IHJvdy5jb21wbGlhbmNlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBPcGVucyB0aGUgYXVkaXQgdGhlIHRhc2sgd2FzIHJhaXNlZCBmcm9tLiAtLT5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyB0aGUgYXVkaXQgdGhpcyB0YXNrIHdhcyByYWlzZWQgZnJvbVwiXHJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJyb3cucmF3Py5hdWRpdElkID8gJy9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXQnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LmF1ZGl0SWQgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZFRhc2tQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+Tm8gdGFza3MgcmFpc2VkIGZyb20gYXVkaXRzIGluIHRoaXMgcGVyaW9kLjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU3RvcmUgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdTdG9yZSdcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tc3RvcmVcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiBzdG9yZVBlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZFN0b3JlUGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmU3RvcmVcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IHN0b3JlOiByb3cuc3RvcmVJZCB8fCByb3cuc3RvcmUgfSlcIj57eyByb3cuc3RvcmUgfX08L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpcyBhdjItZGltXCI+e3sgcm93LnNwb2MgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5mbGFncyA/PyAn4oCUJyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsZXRpb24gPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxldGlvbilcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cuY29tcGxldGlvbiB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGlhbmNlID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsaWFuY2UpXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LmNvbXBsaWFuY2UgfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cucGVyZiA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5wZXJmKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5wZXJmIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyBzdG9yZVwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IHN0b3JlOiByb3cuc3RvcmVJZCB8fCByb3cuc3RvcmUgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHBlcmZTZWFyY2gudHJpbSgpID8gJ05vIHN0b3JlIG1hdGNoZXMgdGhpcyBzZWFyY2guJyA6ICdUaGVyZSBpcyBubyByZXN1bHQgZm9yIFN0b3JlIFBlcmZvcm1hbmNlIGluIHRoaXMgcGVyaW9kLicgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFVzZXIgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdVc2VyJ1wiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJkYi1wZXJmdGFibGUgZGItcGVyZnRhYmxlLS11c2VyXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2YgdXNlclBlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZFVzZXJQZXJmKTsgdHJhY2tCeTogdHJhY2tCeVBlcmZVc2VyXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPjxhIGNsYXNzPVwiZGItbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3VzZXJcIiBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgZW1haWw6IHJvdy5lbWFpbCB9KVwiPnt7IHJvdy5uYW1lIH19PC9hPjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpcyBhdjItZGltXCI+e3sgcm93LmVtYWlsIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5hc3NpZ25lZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuZmxhZ3MgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnJlZG8gfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGV0aW9uID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsZXRpb24pXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LmNvbXBsZXRpb24gfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxpYW5jZSA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGlhbmNlKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGlhbmNlIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LnBlcmYgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cucGVyZilcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cucGVyZiB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgdXNlclwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3VzZXJcIiBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgZW1haWw6IHJvdy5lbWFpbCB9KVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlcmVkVXNlclBlcmYubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj57eyBwZXJmU2VhcmNoLnRyaW0oKSA/ICdObyB1c2VyIG1hdGNoZXMgdGhpcyBzZWFyY2guJyA6ICdUaGVyZSBpcyBubyByZXN1bHQgZm9yIFVzZXIgUGVyZm9ybWFuY2UgaW4gdGhpcyBwZXJpb2QuJyB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU2hhcmVkIHBhZ2VyICgxMCAvIDIwIC8gMzApLCBhcyBvbiB0aGUgb3RoZXIgYXVkaXQgbGlzdHMuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtcGFnZXJcIiAqbmdJZj1cInBlcmZUb3RhbFwiPlxyXG4gICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJwZXJmUGFnZVNpemVcIiBbcGFnZVNpemVdPVwicGVyZlBhZ2VTaXplXCIgW3BhZ2luYXRpb25TaXplc109XCJwZXJmUGFnZVNpemVzXCJcclxuICAgICAgICBbY3VycmVudFBhZ2VdPVwicGVyZlBhZ2VcIiBbdG90YWxJdGVtc109XCJwZXJmVG90YWxcIiAocGFnZUNoYW5nZSk9XCJvblBlcmZQYWdlKCRldmVudClcIlxyXG4gICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBlcmZQYWdlU2l6ZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9zZWN0aW9uPlxyXG5cclxuICA8IS0tID09PT09PT09PT09PSBGSUxURVIgRFJBV0VSID09PT09PT09PT09PSAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWJhY2tkcm9wXCIgKm5nSWY9XCJmaWx0ZXJzT3BlblwiIChjbGljayk9XCJjYW5jZWxGaWx0ZXJzKClcIj48L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZpbHRlci1kcmF3ZXJcIiAqbmdJZj1cImZpbHRlcnNPcGVuICYmIGRyYWZ0IGFzIGRyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWhlYWRcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJkcmF3ZXItdGl0bGVcIj5GaWx0ZXJzPC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRiLWNvdW50cGlsbFwiICpuZ0lmPVwiZHIuZmlsdGVyQ291bnRcIj57eyBkci5maWx0ZXJDb3VudCB9fTwvc3Bhbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VidG5cIiAoY2xpY2spPVwiY2FuY2VsRmlsdGVycygpXCIgdGl0bGU9XCJDbG9zZVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1ib2R5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItbmF2XCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkcmF3ZXItbmF2aXRlbVwiICpuZ0Zvcj1cImxldCBjIG9mIGRyLmZpbHRlckNhdHM7IHRyYWNrQnk6IHRyYWNrQnlDYXRcIiBbY2xhc3MubmF2aXRlbS1hY3RpdmVdPVwiYWN0aXZlQ2F0ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2F0KGMua2V5KVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ0ZXh0XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dGl0bGVcIj57eyBjLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnZhbHVlXCIgW2NsYXNzLmlzLWRpcnR5XT1cImMuZGlydHlcIj57eyBjLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXJ0eWRvdFwiICpuZ0lmPVwiYy5kaXJ0eVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLXBhbmVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZXRpdGxlXCI+e3sgZHIuYWN0aXZlQ2F0T2JqLnRpdGxlIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVoaW50XCI+e3sgZHIuYWN0aXZlQ2F0T2JqLnN1YiB9fTwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFBlcmlvZCAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAncGVyaW9kJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwiZHIuZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJkci5zZXRHcmFpbigncXVhcnRlcicpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cImRyLmdyYWluID09PSAncXVhcnRlcidcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1sYWJlbFwiPlF1YXJ0ZXJseTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24taGVscFwiPlJlYWQgb25lIGZpbmFuY2lhbCBxdWFydGVyIChBcHJpbOKAk01hcmNoIHllYXIpIGF0IGEgdGltZS48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cImRyLmdyYWluID09PSAnZGF0ZSdcIiAoY2xpY2spPVwiZHIuc2V0R3JhaW4oJ2RhdGUnKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ2RhdGUnXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLXRleHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tbGFiZWxcIj5CeSBkYXRlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1oZWxwXCI+UGljayBhIGN1c3RvbSBzdGFydCBhbmQgZW5kIGRhdGUuPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJkci5ncmFpbiA9PT0gJ3F1YXJ0ZXInXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgKm5nRm9yPVwibGV0IHEgb2YgZHIucXVhcnRlcnNcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnF1YXJ0ZXIgPT09IHFcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJkci5zZWxlY3RRdWFydGVyKHEpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIucXVhcnRlciA9PT0gcVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnF1YXJ0ZXIgPT09IHFcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IHEgfX0gwrcge3sgcXVhcnRlck1vbnRocyhxKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1maWVsZHNcIiAqbmdJZj1cImRyLmdyYWluID09PSAnZGF0ZSdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkRhdGUgcmFuZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1kYXRlcGljayBhdjItZGF0ZXBpY2stLWNvbXBhY3RcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJhdjItZGF0ZXBpY2staWNvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cmVjdCB4PVwiM1wiIHk9XCI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCIyXCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8bGluZSB4MT1cIjE2XCIgeTE9XCIyXCIgeDI9XCIxNlwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjhcIiB5MT1cIjJcIiB4Mj1cIjhcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCIzXCIgeTE9XCIxMFwiIHgyPVwiMjFcIiB5Mj1cIjEwXCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhdjItZGF0ZXBpY2staW5wdXQgZGItZGF0ZXJhbmdlIGRiLWRhdGVyYW5nZS0tZmllbGRcIiBuZ3hEYXRlcmFuZ2VwaWNrZXJNZCByZWFkb25seVxyXG4gICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBkYXRlIHJhbmdlXCIgWyhuZ01vZGVsKV09XCJkci5yYW5nZVwiIFtsb2NhbGVdPVwicGlja2VyTG9jYWxlXCJcclxuICAgICAgICAgICAgICAgICAgW21heERhdGVdPVwidG9kYXlcIiBbZGF0ZUxpbWl0XT1cIm1heFJhbmdlRGF5c1wiIFthdXRvQXBwbHldPVwidHJ1ZVwiIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkcm9wc109XCInZG93bidcIiBbb3BlbnNdPVwiJ3JpZ2h0J1wiIChkYXRlc1VwZGF0ZWQpPVwiZHIub25SYW5nZVBpY2tlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gU2NvcGUgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3Njb3BlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtc3RhY2tcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkNpcmNsZSBIZWFkIDxzcGFuIGNsYXNzPVwiZmllbGQtbWV0YVwiPnt7IGRyLmNpcmNsZXMubGVuZ3RoIH19IHVzZXJzPC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImZpZWxkLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHIuY2lyY2xlXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZHIub25DaXJjbGVDaGFuZ2UoKVwiIFtvcHRpb25zXT1cImRyLnBpY2tPcHRpb25zKGRyLmNpcmNsZXMsICdBbGwgQ2lyY2xlcycpXCIgYXJpYUxhYmVsPVwiQ2lyY2xlXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCIgKm5nSWY9XCJkci5jaXJjbGVcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+Wm9uZSBNYW5hZ2VyPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZmllbGQtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkci56b25lXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZHIub25ab25lQ2hhbmdlKClcIiBbb3B0aW9uc109XCJkci5waWNrT3B0aW9ucyhkci56b25lcywgJ0FsbCB6b25lcycpXCIgYXJpYUxhYmVsPVwiWm9uZVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBmaWVsZC0tZnVsbFwiICpuZ0lmPVwiZHIuem9uZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5BT008L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLmFvbVwiIChuZ01vZGVsQ2hhbmdlKT1cImRyLm9uQW9tQ2hhbmdlKClcIiBbb3B0aW9uc109XCJkci5waWNrT3B0aW9ucyhkci5hb21zLCAnQWxsIEFPTXMnKVwiIGFyaWFMYWJlbD1cIkFPTVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBmaWVsZC0tZnVsbFwiICpuZ0lmPVwiZHIuYW9tXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlN0b3JlPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZmllbGQtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkci5zdG9yZVwiIFtvcHRpb25zXT1cImRyLnN0b3JlUGlja09wdGlvbnNcIiBhcmlhTGFiZWw9XCJTdG9yZVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWFkaW5ncm93XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWFkaW5nbGFiZWxcIj5SZWFkaW5nPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVhZGluZ3ZhbHVlXCI+e3sgZHIuc2NvcGVSZWFkaW5nIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLWdyb3dcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1iYW5kbGlua1wiIChjbGljayk9XCJkci5yZXNldFNjb3BlKClcIj5SZXNldCB0byBhbGwgY2lyY2xlczwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBBdWRpdCB0eXBlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3R5cGUnXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiICpuZ0Zvcj1cImxldCB0IG9mIGF1ZGl0VHlwZXNcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLmF1ZGl0VHlwZSA9PT0gdC5rZXlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZHIuYXVkaXRUeXBlID0gdC5rZXlcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuYXVkaXRUeXBlID09PSB0LmtleVwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5hdWRpdFR5cGUgPT09IHQua2V5XCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0dGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj57eyB0LmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bWV0YVwiPnt7IHQuaGVscCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2NvcmUgYmFuZCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdiYW5kJ1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiAqbmdGb3I9XCJsZXQgYiBvZiBkci5iYW5kUm93czsgdHJhY2tCeTogdHJhY2tCeUJhbmRcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLmlzQmFuZE9uKGIuYmFuZClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZHIuYXBwbHlCYW5kKGIuYmFuZClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0dGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj57eyBiLmJhbmQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRtZXRhXCI+e3sgYi5iYW5kLnJhbmdlIH19IMK3IHt7IGIuY291bnQgfX0gc3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbSBwYW5lLXJlc2V0YnRuXCIgKGNsaWNrKT1cImRyLmNsZWFyQmFuZCgpXCI+QWxsIHNjb3JlczwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFN0YXR1cyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdzdGF0dXMnXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAnYWxsJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ2FsbCcpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ2FsbCdcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAnYWxsJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+QWxsIHN0b3Jlczwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnN0YXR1cyA9PT0gJ2ZhaWwnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygnZmFpbCcpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ2ZhaWwnXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnN0YXR1cyA9PT0gJ2ZhaWwnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5GYWlsPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAncGFzcydcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCdwYXNzJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAncGFzcydcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAncGFzcydcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPlBhc3M8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICd1bnNjb3JlZCdcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCd1bnNjb3JlZCcpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICd1bnNjb3JlZCdcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPk5vdCBzY29yZWQ8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICduYSdcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCduYScpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ25hJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICduYSdcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPk5vdCBhdWRpdGVkPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1mb290XCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdFwiIChjbGljayk9XCJkci5jbGVhckFsbCgpXCI+Q2xlYXIgYWxsPC9idXR0b24+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiAoY2xpY2spPVwiY2FuY2VsRmlsdGVycygpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGF2Mi1idG4tLXdpZGVcIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIj5BcHBseSBmaWx0ZXJzPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
|