tango-app-ui-analyse-trax 4.0.48 → 4.0.49
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 +120 -4
- package/esm2022/lib/components/audit-v2/reports/audit-v2-reports.component.mjs +103 -50
- package/esm2022/lib/components/audit-v2/schedule/audit-v2-schedule-detail.component.mjs +12 -6
- package/esm2022/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.mjs +14 -6
- package/fesm2022/{tango-app-ui-analyse-trax-audit-v2.module-D2O6kj8t.mjs → tango-app-ui-analyse-trax-audit-v2.module-Bpm0GYMw.mjs} +250 -68
- package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-Bpm0GYMw.mjs.map +1 -0
- package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-C4oOKSEZ.mjs → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-Cuk5lK5L.mjs} +2 -2
- package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-C4oOKSEZ.mjs.map → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-Cuk5lK5L.mjs.map} +1 -1
- package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
- package/lib/components/audit-v2/configure/audit-v2-configure.component.d.ts +17 -1
- package/lib/components/audit-v2/reports/audit-v2-reports.component.d.ts +10 -6
- package/lib/components/audit-v2/schedule/audit-v2-schedule-detail.component.d.ts +4 -1
- package/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.d.ts +3 -1
- package/package.json +1 -1
- package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-D2O6kj8t.mjs.map +0 -1
|
@@ -858,15 +858,23 @@ export class AuditV2ScheduleEditorComponent {
|
|
|
858
858
|
? n + ' of ' + total + ' rows selected'
|
|
859
859
|
: total + (total === 1 ? ' row' : ' rows') + ' in this schedule';
|
|
860
860
|
}
|
|
861
|
+
/** Rows the header checkbox acts on: past (locked) rows cannot be selected. */
|
|
862
|
+
get selectableRows() {
|
|
863
|
+
return this.shownRows.filter(r => !this.isLocked(r));
|
|
864
|
+
}
|
|
861
865
|
get allRowsSelected() {
|
|
862
|
-
|
|
866
|
+
const rows = this.selectableRows;
|
|
867
|
+
return rows.length > 0 && rows.every(r => r.selected);
|
|
863
868
|
}
|
|
864
869
|
toggleAllRows() {
|
|
865
870
|
const on = !this.allRowsSelected;
|
|
866
|
-
this.
|
|
871
|
+
this.selectableRows.forEach(r => this.groupRows(r).forEach(m => m.selected = on));
|
|
867
872
|
}
|
|
868
|
-
/** A shown row's checkbox selects every audit of its group. */
|
|
873
|
+
/** A shown row's checkbox selects every audit of its group; a past (locked) row cannot be selected. */
|
|
869
874
|
toggleRow(row) {
|
|
875
|
+
if (this.isLocked(row)) {
|
|
876
|
+
return;
|
|
877
|
+
}
|
|
870
878
|
const on = !row.selected;
|
|
871
879
|
this.groupRows(row).forEach(m => m.selected = on);
|
|
872
880
|
}
|
|
@@ -1447,11 +1455,11 @@ export class AuditV2ScheduleEditorComponent {
|
|
|
1447
1455
|
URL.revokeObjectURL(url);
|
|
1448
1456
|
}
|
|
1449
1457
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2ScheduleEditorComponent, deps: [{ token: i1.TraxService }, { token: i2.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1450
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2ScheduleEditorComponent, selector: "lib-audit-v2-schedule-editor", inputs: { clientId: "clientId", audits: "audits", preselect: "preselect", lockAudits: "lockAudits", backLabel: "backLabel", scheduleId: "scheduleId" }, outputs: { closed: "closed" }, host: { listeners: { "window:scroll": "onViewportChange()", "window:resize": "onViewportChange()" } }, viewQueries: [{ propertyName: "csvInput", first: true, predicate: ["csvInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<input #csvInput type=\"file\" accept=\".xlsx,.csv,text/csv\" class=\"se-hidden\" (change)=\"onCsvPicked($event)\">\n\n<!-- Editing opens on the Rows step, so its skeleton mirrors that screen. -->\n<ng-container *ngIf=\"loadingEdit\">\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <span class=\"av2-sk se-sk-crumb\"></span>\n <span class=\"av2-sk av2-sk--title se-sk-name\"></span>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <lib-audit-v2-shimmer></lib-audit-v2-shimmer>\n </div>\n</ng-container>\n\n<!-- ============ Create schedule ============ -->\n<ng-container *ngIf=\"step === 'create' && !loadingEdit\">\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\"><a href=\"#\" (click)=\"back($event)\">Schedule</a> \u203A {{ scheduleId ? name || 'Schedule' : 'Create schedule' }}</div>\n </div>\n\n <div class=\"se-create\">\n <div class=\"se-card se-card--form\">\n <span class=\"se-badge\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8v8M8 12h8\"></path></svg>\n </span>\n <div class=\"se-head\">\n <div class=\"se-title\">{{ scheduleId ? 'Edit schedule' : 'Create schedule' }}</div>\n <div class=\"se-sub\">{{ scheduleId ? 'Rename the schedule, or add rows from the template.' : (locked ? 'Name the schedule, then add rows for this audit.' : 'Name the schedule, then add rows.') }}</div>\n </div>\n\n <!-- Opened from an audit's Configure page: that audit is the schedule's audit, named once here\n instead of an audit picker card (QA: the card is not needed when the audit is already chosen). -->\n <div class=\"se-fixed-audit\" *ngIf=\"locked\">\n <span class=\"se-label\">{{ pickedAudits.length > 1 ? 'Audits' : 'Audit' }}</span>\n <span class=\"se-fixed-audit-name\">{{ lockedAuditNames || 'Loading audit\u2026' }}</span>\n </div>\n\n <label class=\"se-field\">\n <span class=\"se-label\">Schedule name</span>\n <input type=\"text\" class=\"se-input\" [(ngModel)]=\"name\" placeholder=\"e.g. February hygiene round\">\n </label>\n\n <!-- Every audit, with the ones picked on the previous page (Not scheduled) already ticked.\n Create only: Edit schedule keeps the schedule's audits and does not ask for them (QA).\n Hidden for now on both (showAuditPicker). -->\n <div class=\"se-field\" *ngIf=\"showAuditPicker && !locked && !scheduleId\">\n <div class=\"se-row\">\n <span class=\"se-label se-grow\">Audits to schedule</span>\n <span class=\"se-count\">{{ pickCount }}</span>\n </div>\n <label class=\"se-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"pickQuery\" placeholder=\"Search audits\">\n <a class=\"se-clear\" *ngIf=\"pickQuery.trim()\" title=\"Clear search\" (click)=\"pickQuery = ''\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\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>\n </a>\n </label>\n <div class=\"se-picklist\">\n <div class=\"se-pickrow se-pickrow--all\" (click)=\"toggleAllPicks()\">\n <span class=\"se-box\" [class.is-on]=\"allPicked\">\n <svg *ngIf=\"allPicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">{{ allLabel }}</span>\n </div>\n <div class=\"se-empty-sm\" *ngIf=\"!pickables.length\">No audits match that search.</div>\n <div class=\"se-pickrow\" *ngFor=\"let a of pickables; trackBy: trackByAudit\" [class.is-on]=\"isPicked(a)\" (click)=\"togglePick(a)\">\n <span class=\"se-box\" [class.is-on]=\"isPicked(a)\">\n <svg *ngIf=\"isPicked(a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\">\n <span class=\"se-ellipsis\">{{ a.name }}</span>\n <span class=\"se-meta\">{{ a.meta }}{{ a.questions ? ' \u00B7 ' + a.questions + ' questions' : '' }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <ol class=\"se-steps\">\n <li>Use the template to schedule multiple users at once.</li>\n <li>Download the template here \u2014 <a href=\"#\" (click)=\"downloadTemplate($event)\">{{ templateLoading || templateWaiting ? 'Preparing\u2026' : 'Download template' }}</a></li>\n <li>Add your data, then upload it below.</li>\n </ol>\n\n <div class=\"se-actions\">\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--primary\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"importCsv()\">Import from CSV</button>\n <span class=\"se-or\">or</span>\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--ghost\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"addSingle()\">Add a single row</button>\n </div>\n </div>\n\n <!-- Hidden for now on both Create and Edit (showTemplatePreview). -->\n <div class=\"se-card se-card--side\" *ngIf=\"showTemplatePreview\">\n <div class=\"se-head\">\n <div class=\"se-side-title\">What the template expects</div>\n <div class=\"se-sub\">One row per user, store and date. These are the rows the downloaded template will hold for the selected\n {{ picks.length === 1 ? 'audit' : 'audits' }} \u2014 edit or add rows in the file, then import it.</div>\n </div>\n <div class=\"se-sample\">\n <div class=\"se-sample-row se-sample-row--head\">\n <span>Date</span><span>User email</span><span>Assign store</span><span>Assign audit</span>\n </div>\n <lib-audit-v2-shimmer *ngIf=\"templateLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\n <ng-container *ngIf=\"!templateLoading\">\n <!-- The selected audits' assigned stores / users: the same rows Download template writes. -->\n <div class=\"se-sample-row\" *ngFor=\"let r of previewRows\">\n <span [title]=\"r.date\">{{ r.date }}</span><span [title]=\"r.email\">{{ r.email }}</span>\n <span [title]=\"r.store\">{{ r.store }}</span><span [title]=\"r.audit\">{{ r.audit }}</span>\n </div>\n <div class=\"se-sample-more\" *ngIf=\"previewMore\">+ {{ previewMore }} more {{ previewMore === 1 ? 'row' : 'rows' }} in the file</div>\n <div class=\"se-sample-more\" *ngIf=\"!previewRows.length\">Pick an audit to see its template rows.</div>\n </ng-container>\n </div>\n <span class=\"se-note se-note--warn\" *ngIf=\"!templateLoading && unassignedAudits.length\">\n {{ unassignedAudits.join(', ') }} {{ unassignedAudits.length === 1 ? 'has' : 'have' }} no store assigned yet \u2014 fill in Date, User email\n and Store name for {{ unassignedAudits.length === 1 ? 'its row' : 'their rows' }}.</span>\n <span class=\"se-note\">Visit start and Visit end (HH:mm) are optional \u2014 leave them blank to use the store's open and close time (10:00 to 22:00 when the store has none).</span>\n <span class=\"se-note\">Rows with an unknown store, email or audit are reported before anything is saved. Draft audits\n are published when the schedule is published.</span>\n </div>\n </div>\n</ng-container>\n\n<!-- ============ Rows ============ -->\n<ng-container *ngIf=\"step === 'rows' && !loadingEdit\">\n <!-- Back + crumb on one line, as on the Create step; the name and actions below, left edges aligned.\n Edit has no \"Edit schedule\" step in the crumb (QA 9 Oct): it opens on, and stays on, the rows. -->\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\">\n <a href=\"#\" (click)=\"back($event)\">Schedule</a> \u203A\n <ng-container *ngIf=\"!scheduleId\"><a href=\"#\" (click)=\"backToCreate($event)\">Create schedule</a> \u203A</ng-container>\n Rows\n </div>\n </div>\n\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <div class=\"se-name\">{{ name.trim() || 'Untitled schedule' }}</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"saving\" (click)=\"saveDraft()\">Save as draft</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm se-publish\" [class.is-off]=\"!canPublish\" (click)=\"publish()\">\n {{ saving ? 'Saving\u2026' : (published ? 'Save & publish' : 'Publish schedule') }}\n </button>\n </div>\n\n <div class=\"se-ready\" [class.is-ok]=\"readyOk\">\n <svg *ngIf=\"readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\"></path><path d=\"M8 12.5l2.7 2.7L16 9.5\"></path></svg>\n <svg *ngIf=\"!readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 4l9 16H3z\"></path><path d=\"M12 10v4M12 17h.01\"></path></svg>\n <span>{{ readyLabel }}</span>\n </div>\n\n <div class=\"se-metrics\">\n <div class=\"av2-ocard\" *ngFor=\"let m of metrics\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count\">{{ m.value }}</div>\n <div class=\"av2-ocard-text\">{{ m.label }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <div class=\"se-tablehead\">\n <div class=\"se-titletext\">\n <div class=\"se-side-title\">Schedule rows</div>\n <div class=\"se-sub\">Every row is one user, at one store, on one date.</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"addRow()\">Add row</button>\n <label class=\"se-search se-search--sm\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"rowQuery\" placeholder=\"Search rows\">\n </label>\n </div>\n\n <div class=\"se-scroll\" (scroll)=\"onViewportChange()\">\n <div class=\"se-grid se-grid--head\">\n <div class=\"se-center\" (click)=\"toggleAllRows()\" title=\"Select all rows\">\n <span class=\"se-box\" [class.is-on]=\"allRowsSelected\">\n <svg *ngIf=\"allRowsSelected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n <div>Schedule date</div><div>User email</div><div>Assigned store</div><div>Audit assigned</div><div>Visit window</div><div></div>\n </div>\n\n <div class=\"se-grid se-grid--row\" *ngFor=\"let r of shownRows; trackBy: trackByRow\" [class.is-selected]=\"r.selected\">\n <div class=\"se-center\" (click)=\"toggleRow(r)\">\n <span class=\"se-box\" [class.is-on]=\"r.selected\">\n <svg *ngIf=\"r.selected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n\n <input type=\"date\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'date')\" [attr.title]=\"cellError(r, 'date') || null\" [attr.min]=\"today\"\n [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.date\" (ngModelChange)=\"touch(r, 'date')\">\n\n <!-- User: search by name or email -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'userEmail')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\" [class.is-bad]=\"cellError(r, 'userEmail')\" [attr.title]=\"cellError(r, 'userEmail') || null\"\n placeholder=\"Search user\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.userEmail\" (ngModelChange)=\"onPickerInput(r, 'userEmail')\"\n (focus)=\"openPicker(r, 'userEmail', $event)\" (click)=\"openPicker(r, 'userEmail', $event)\" (keydown)=\"onPickerKey(r, 'userEmail', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'userEmail')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let u of userSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"u.email === r.userEmail.trim().toLowerCase()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickUser(r, u, $event)\">\n <span class=\"se-opt-avatar\">{{ initials(u.name || u.email) }}</span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ u.name || u.email }}</span>\n <span class=\"se-opt-sub\">{{ u.email }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"u.email === r.userEmail.trim().toLowerCase()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!userSuggestions(r).length\">{{ users.length ? 'No user matches \u201C' + r.userEmail + '\u201D' : 'Loading users\u2026' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(userSuggestions(r).length, userMatches(r).length, 'users')\">\n {{ moreLabel(userSuggestions(r).length, userMatches(r).length, 'users') }}\n </div>\n </div>\n </div>\n\n <!-- Store: search and show by store name (or city); the store code is never shown or asked for -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'storeId')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\"\n [class.is-bad]=\"cellError(r, 'storeId')\" [attr.title]=\"cellError(r, 'storeId') || null\"\n placeholder=\"Search store\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [ngModel]=\"r.storeText\" (ngModelChange)=\"onStoreTyped(r, $event)\"\n (focus)=\"openPicker(r, 'storeId', $event)\" (click)=\"openPicker(r, 'storeId', $event)\" (keydown)=\"onPickerKey(r, 'storeId', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'storeId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let s of storeSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"s.storeId === r.storeId.trim()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickStore(r, s, $event)\">\n <span class=\"se-opt-icon\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1.5-5h15L21 9\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ s.storeName || s.storeId }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"s.city\">{{ s.city }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"s.storeId === r.storeId.trim()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!storeSuggestions(r).length\">{{ stores.length ? 'No store matches \u201C' + r.storeText + '\u201D' : 'Loading stores\u2026' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores')\">\n {{ moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores') }}\n </div>\n </div>\n </div>\n\n <!-- Audit assigned: multi-select with search over the published audits (rowAuditOptions). Ticking another audit\n adds a row for it with the same date, user, store and window; unticking removes that row. No column when\n the schedule has one fixed audit. -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'checkListId')\">\n <button type=\"button\" class=\"se-cell se-select\" [class.is-bad]=\"cellError(r, 'checkListId')\" [attr.title]=\"cellError(r, 'checkListId') || null\"\n [disabled]=\"isLocked(r)\" (click)=\"openPicker(r, 'checkListId', $event)\" (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n <span class=\"se-ellipsis\" [class.se-placeholder]=\"!groupAuditFirst(r)\" [attr.title]=\"groupAuditLabel(r) || null\">{{ groupAuditFirst(r) || 'Select audits' }}</span>\n <span class=\"se-more\" *ngIf=\"groupAuditMore(r)\" [attr.title]=\"groupAuditLabel(r)\">+{{ groupAuditMore(r) }}</span>\n <svg class=\"se-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\n </button>\n <div class=\"se-menu se-menu--multi\" *ngIf=\"isOpen(r, 'checkListId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <label class=\"se-menu-search\" (mousedown)=\"$event.stopPropagation()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" placeholder=\"Search audits\" autocomplete=\"off\" [(ngModel)]=\"auditQuery\" (ngModelChange)=\"activeIndex = 0\"\n (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n </label>\n <div class=\"se-opt\" *ngFor=\"let a of auditMatches(); let i = index; trackBy: trackByAudit\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"auditTicked(r, a)\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"toggleAudit(r, a, $event)\">\n <span class=\"se-box\" [class.is-on]=\"auditTicked(r, a)\">\n <svg *ngIf=\"auditTicked(r, a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ a.name }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"a.questions\">{{ a.questions }} {{ a.questions === 1 ? 'question' : 'questions' }}</span>\n </span>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!auditMatches().length\">{{ rowAuditOptions.length ? 'No audit matches \u201C' + auditQuery + '\u201D' : 'No published audits yet' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"auditTickCount(r) > 1\">{{ auditTickCount(r) }} audits on this row \u00B7 same user, store, date and window</div>\n </div>\n </div>\n\n <div class=\"se-window\" [attr.title]=\"cellError(r, 'window') || null\">\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.start\" (ngModelChange)=\"touch(r, 'window')\">\n <span class=\"se-dash\">\u2013</span>\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.end\" (ngModelChange)=\"touch(r, 'window')\">\n </div>\n\n <div class=\"se-center\">\n <span class=\"se-lock\" *ngIf=\"isLocked(r)\" title=\"Past visit: already raised, so it cannot be edited or deleted\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"11\" width=\"14\" height=\"10\" rx=\"2\"></rect><path d=\"M8 11V7a4 4 0 0 1 8 0v4\"></path></svg>\n </span>\n <a class=\"se-del\" *ngIf=\"!isLocked(r)\" title=\"Delete row\" (click)=\"deleteRow(r)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7h16\"></path><path d=\"M7 7l1 13h8l1-13M9 7V4h6v3\"></path></svg>\n </a>\n </div>\n\n <!-- Why the row is red, in words. -->\n <ng-container *ngIf=\"rowMessages(r) as msgs\">\n <div class=\"se-rowerr\" *ngIf=\"msgs.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\n <span>{{ msgs.join(' \u00B7 ') }}</span>\n <a class=\"se-invite-link\" *ngIf=\"inviteable(r)\" (click)=\"openInvite(newUserEmails(groupRows(r)))\">Invite user</a>\n </div>\n </ng-container>\n <!-- Hints: allowed (Publish is not blocked), e.g. the same visit in another schedule. -->\n <ng-container *ngIf=\"rowHints(r) as hints\">\n <div class=\"se-rowerr se-rowhint\" *ngIf=\"hints.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\n <span>{{ hints.join(' \u00B7 ') }}</span>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"!shownRows.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ rows.length ? 'No rows match this search.' : 'No rows yet. Add a row or import the template.' }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-foot\">\n <!-- Row count + visit-window hint removed (user, 11 Oct); the count shows only while rows are selected. -->\n <span class=\"se-foot-text\" *ngIf=\"selectedCount\">{{ selectionLabel }}</span>\n <span class=\"se-foot-actions\">\n <button type=\"button\" class=\"se-bulk\" [class.is-off]=\"!selectedCount\" (click)=\"duplicateSelected()\">Duplicate</button>\n <button type=\"button\" class=\"se-bulk se-bulk--danger\" [class.is-off]=\"!selectedCount\" (click)=\"deleteSelected()\">Delete</button>\n </span>\n </div>\n </div>\n</ng-container>\n\n<!-- New User found (as the v1 checklist upload): emails with no user yet, after an import or from a row's Invite user. -->\n<ng-container *ngIf=\"inviteOpen\">\n <div class=\"se-inv-backdrop\" (click)=\"closeInvite()\"></div>\n <div class=\"se-inv\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"se-inv-title\">\n <span class=\"se-inv-icon\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.3 3.9L1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z\"></path><path d=\"M12 9v4M12 17h.01\"></path></svg>\n </span>\n <div class=\"se-inv-title\" id=\"se-inv-title\">{{ inviteEmails.length === 1 ? 'New user found' : 'New users found' }}</div>\n <div class=\"se-inv-text\">\n {{ inviteEmails.length === 1 ? 'This email is not a user yet.' : 'These emails are not users yet.' }}\n Invite them to add them as users of this client, or add them in User Management under the Manage menu.\n </div>\n\n <div class=\"se-inv-list\">\n <div class=\"se-pickrow se-pickrow--all\" *ngIf=\"inviteEmails.length > 1\" (click)=\"toggleAllInvite()\">\n <span class=\"se-box\" [class.is-on]=\"allInvitePicked\">\n <svg *ngIf=\"allInvitePicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">Select all ({{ inviteEmails.length }})</span>\n </div>\n <div class=\"se-pickrow\" *ngFor=\"let e of inviteEmails\" [class.is-on]=\"invitePicked.has(e)\" (click)=\"toggleInvite(e)\">\n <span class=\"se-box\" [class.is-on]=\"invitePicked.has(e)\">\n <svg *ngIf=\"invitePicked.has(e)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\"><span class=\"se-ellipsis\">{{ e }}</span></span>\n </div>\n </div>\n\n <div class=\"se-inv-foot\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"inviting\" (click)=\"closeInvite()\">Skip</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"inviting || !invitePicked.size\" (click)=\"inviteSelected()\">\n {{ inviting ? 'Inviting\u2026' : 'Invite selected' + (invitePicked.size ? ' (' + invitePicked.size + ')' : '') }}\n </button>\n </div>\n </div>\n</ng-container>\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{display:flex;flex-direction:column;gap:20px}.se-hidden{display:none}.se-grow{flex:1;min-width:0}.se-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-sk-crumb{width:180px;height:12px;margin:4px 0}.se-sk-name{height:22px;margin:4px 0}.se-crumb{font-size:13px;line-height:20px;color:#667085}.se-crumb a{font-weight:600;color:#00a3ff;text-decoration:none;cursor:pointer}.se-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.se-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.se-fixed-audit{display:flex;flex-direction:column;gap:4px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0}.se-fixed-audit-name{font-size:14px;line-height:20px;font-weight:600;color:#101828}.se-create{display:flex;flex-wrap:wrap;gap:20px;max-width:1180px}.se-card{min-width:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;display:flex;flex-direction:column}.se-card--form{flex:1 1 420px;padding:28px;gap:20px}.se-card--side{flex:1 1 380px;padding:28px;gap:16px}.se-badge{width:44px;height:44px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.se-head{display:flex;flex-direction:column;gap:4px}.se-title{font-size:24px;line-height:32px;font-weight:700;color:#101828}.se-side-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.se-sub{font-size:14px;line-height:20px;color:#667085}.se-field{display:flex;flex-direction:column;gap:6px;margin:0}.se-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.se-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.se-count{font-size:12px;line-height:18px;color:#667085;white-space:nowrap}.se-input{height:44px;padding:0 14px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:14px;color:#101828;outline:none}.se-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #ccedff}.se-search{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;margin:0;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#667085}.se-search input{flex:1;min-width:0;height:38px;border:none;outline:none;background:transparent;font-size:14px;font-family:inherit;color:#101828}.se-search--sm{flex:0 1 240px;min-width:180px;height:36px}.se-search--sm input{height:34px;font-size:13px}.se-clear{display:flex;cursor:pointer;color:#98a2b3}.se-picklist{display:flex;flex-direction:column;gap:2px;max-height:220px;overflow-y:auto;padding:8px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.se-pickrow{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer}.se-pickrow:hover{background:#f9fafb}.se-pickrow.is-on{background:#f5fbff}.se-pickrow--all{border-bottom:1px solid #F2F4F7}.se-pickrow--fixed{cursor:default;background:#f9fafb}.se-pickrow--fixed:hover{background:#f9fafb}.se-pickall{font-size:14px;line-height:20px;font-weight:600;color:#344054}.se-pickname{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.se-pickname .se-ellipsis{font-size:14px;line-height:20px;font-weight:500;color:#101828}.se-meta{font-size:12px;line-height:18px;color:#667085}.se-empty-sm{padding:14px 10px;font-size:13px;line-height:20px;color:#667085}.se-box{width:16px;height:16px;flex-shrink:0;border-radius:4px;display:flex;align-items:center;justify-content:center;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#00a3ff}.se-box.is-on{background:#eaf8ff;box-shadow:inset 0 0 0 1px #00a3ff}.se-steps{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.se-steps a{font-weight:600;color:#00a3ff;cursor:pointer}.se-actions{display:flex;flex-direction:column;gap:12px}.se-or{text-align:center;font-size:14px;color:#98a2b3}.se-btn-lg{height:44px;border:none;border-radius:8px;font-family:inherit;font-size:15px;font-weight:600;cursor:pointer}.se-btn-lg--primary{background:#00a3ff;color:#fff}.se-btn-lg--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054}.se-btn-lg--ghost:hover{background:#f9fafb}.se-btn-lg.is-off{cursor:not-allowed}.se-btn-lg--primary.is-off{background:#f2f4f7;color:#98a2b3}.se-btn-lg--ghost.is-off{color:#98a2b3}.se-btn-lg--ghost.is-off:hover{background:#fff}.se-sample{display:flex;flex-direction:column;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden}.se-sample-row{display:grid;grid-template-columns:.8fr 1.4fr 1fr 1.3fr;gap:8px;padding:10px 12px;border-top:1px solid #EAECF0;font-size:12px;line-height:18px;color:#344054}.se-sample-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-sample-row--head{border-top:none;background:#f9fafb;font-weight:600;color:#475467}.se-note{font-size:12px;line-height:18px;color:#667085;text-wrap:pretty}.se-note--warn{color:#b54708}.se-sample-more{padding:10px 12px;border-top:1px solid #EAECF0;font-size:12px;line-height:18px;color:#667085}.se-titlebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.se-backbar+.se-titlebar{margin-top:-8px}.se-titletext{flex:1 1 240px;min-width:0;display:flex;flex-direction:column;gap:2px}.se-name{font-size:20px;line-height:30px;font-weight:700;color:#101828}.se-publish.is-off{background:#f2f4f7;color:#98a2b3;cursor:not-allowed;box-shadow:none}.se-ready{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px 20px;border-radius:8px;background:#fffcf5;box-shadow:inset 0 0 0 1px #fedf89;color:#b54708;font-size:14px;line-height:20px;font-weight:600}.se-ready svg{flex-shrink:0}.se-ready span{flex:1;min-width:0}.se-ready.is-ok{background:#f6fef9;box-shadow:inset 0 0 0 1px #a6f4c5;color:#027a48}.se-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.se-tablehead{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:20px 24px}.se-scroll{overflow-x:auto}.se-grid{min-width:1120px;display:grid;grid-template-columns:36px 1fr 1.5fr 1fr 1.5fr 1.6fr 40px;gap:12px;align-items:center;padding:10px 24px}.se-grid--head{background:#f9fafb;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;font-weight:600;color:#475467}.se-grid--row{border-bottom:1px solid #F2F4F7}.se-grid--row.is-selected{background:#f5fbff}.se-center{display:flex;justify-content:center;cursor:pointer}.se-rowerr{grid-column:2/-1;margin-top:-4px;display:flex;align-items:flex-start;gap:6px;font-size:12px;line-height:18px;color:#d92d20}.se-rowerr svg{flex-shrink:0;margin-top:2px}.se-rowhint{color:#667085}.se-invite-link{flex-shrink:0;font-weight:600;color:#00a3ff;cursor:pointer;text-decoration:none}.se-invite-link:hover{text-decoration:underline}.se-inv-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.se-inv{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:480px;max-width:calc(100vw - 32px);max-height:90vh;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.se-inv-icon{width:48px;height:48px;border-radius:9999px;background:#fef0c7;box-shadow:0 0 0 8px #fffaeb;color:#dc6803;display:flex;align-items:center;justify-content:center;margin:4px 0 8px 4px}.se-inv-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.se-inv-text{font-size:14px;line-height:20px;color:#475467}.se-inv-list{max-height:260px;overflow-y:auto;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:4px}.se-inv-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:8px}.se-cell{width:100%;height:36px;min-width:0;padding:0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;color:#101828;outline:none}.se-cell:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.se-cell.is-bad{box-shadow:inset 0 0 0 1px #fda29b}.se-select{display:flex;align-items:center;justify-content:space-between;gap:6px;text-align:left;cursor:pointer}.se-select svg{flex-shrink:0;color:#667085}.se-placeholder{color:#98a2b3}.se-pick{position:relative;min-width:0}.se-cell--pick{padding-right:10px;text-overflow:ellipsis}.se-cell--tagged{padding-right:88px}.se-pick.is-open .se-cell{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.se-pick.is-open .se-chev{transform:rotate(180deg)}.se-chev{transition:transform .15s ease}.se-tag{position:absolute;top:50%;right:8px;transform:translateY(-50%);max-width:76px;padding:2px 8px;border-radius:9999px;background:#f2f4f7;color:#344054;font-size:11px;line-height:16px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none}.se-menu{position:fixed;z-index:1060;width:max-content;max-width:380px;max-height:288px;overflow-y:auto;padding:6px;border-radius:10px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.se-opt{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer}.se-opt.is-active{background:#f9fafb}.se-opt.is-on{background:#f5fbff}.se-opt.is-on.is-active{background:#eaf8ff}.se-opt-avatar{width:28px;height:28px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.se-opt-icon{width:28px;height:28px;flex-shrink:0;border-radius:8px;background:#f2f4f7;color:#475467;display:flex;align-items:center;justify-content:center}.se-opt-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.se-opt-main{font-size:13px;line-height:18px;font-weight:500;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-opt-sub{font-size:12px;line-height:16px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-opt-check{flex-shrink:0;color:#00a3ff}.se-menu-empty{padding:12px 10px;font-size:13px;color:#667085}.se-menu--multi{min-width:260px}.se-menu-search{position:sticky;top:-6px;z-index:1;margin:-6px -6px 4px;padding:8px 10px;display:flex;align-items:center;gap:8px;background:#fff;border-bottom:1px solid #F2F4F7;color:#667085;cursor:text}.se-menu-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;line-height:18px;color:#101828}.se-menu-note{margin:4px -6px -6px;padding:8px 16px;border-top:1px solid #F2F4F7;background:#fcfcfd;font-size:12px;line-height:16px;color:#667085;position:sticky;bottom:-6px}.se-window{display:flex;align-items:center;gap:6px;min-width:0}.se-window .se-cell{flex:1;padding:0 6px}.se-dash{color:#98a2b3;font-size:13px}.se-lock{width:28px;height:28px;display:flex;align-items:center;justify-content:center;color:#98a2b3;cursor:help}.se-del{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#667085;cursor:pointer}.se-del:hover{background:#fffbfa;color:#d92d20}.se-empty{padding:36px 24px;text-align:center;font-size:13px;color:#667085}.se-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;padding:16px 24px}.se-foot-text{display:flex;flex-direction:column;gap:2px;font-size:14px;line-height:20px;color:#667085}.se-foot-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.se-bulk{height:36px;padding:0 14px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:13px;font-weight:600;color:#344054;cursor:pointer}.se-bulk:hover{background:#f9fafb}.se-bulk--danger{color:#d92d20}.se-bulk--danger:hover{background:#fffbfa}.se-bulk.is-off{color:#98a2b3;cursor:not-allowed}.se-bulk.is-off:hover{background:transparent}.se-select .se-ellipsis{flex:0 1 auto;min-width:0}.se-select .se-chev{margin-left:auto}.se-more{flex-shrink:0;min-width:24px;height:20px;padding:0 7px;border-radius:9999px;background:#f2f4f7;color:#344054;font-size:12px;font-weight:600;line-height:20px;text-align:center}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i6.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }] });
|
|
1458
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2ScheduleEditorComponent, selector: "lib-audit-v2-schedule-editor", inputs: { clientId: "clientId", audits: "audits", preselect: "preselect", lockAudits: "lockAudits", backLabel: "backLabel", scheduleId: "scheduleId" }, outputs: { closed: "closed" }, host: { listeners: { "window:scroll": "onViewportChange()", "window:resize": "onViewportChange()" } }, viewQueries: [{ propertyName: "csvInput", first: true, predicate: ["csvInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<input #csvInput type=\"file\" accept=\".xlsx,.csv,text/csv\" class=\"se-hidden\" (change)=\"onCsvPicked($event)\">\n\n<!-- Editing opens on the Rows step, so its skeleton mirrors that screen. -->\n<ng-container *ngIf=\"loadingEdit\">\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <span class=\"av2-sk se-sk-crumb\"></span>\n <span class=\"av2-sk av2-sk--title se-sk-name\"></span>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <lib-audit-v2-shimmer></lib-audit-v2-shimmer>\n </div>\n</ng-container>\n\n<!-- ============ Create schedule ============ -->\n<ng-container *ngIf=\"step === 'create' && !loadingEdit\">\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\"><a href=\"#\" (click)=\"back($event)\">Schedule</a> \u203A {{ scheduleId ? name || 'Schedule' : 'Create schedule' }}</div>\n </div>\n\n <div class=\"se-create\">\n <div class=\"se-card se-card--form\">\n <span class=\"se-badge\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8v8M8 12h8\"></path></svg>\n </span>\n <div class=\"se-head\">\n <div class=\"se-title\">{{ scheduleId ? 'Edit schedule' : 'Create schedule' }}</div>\n <div class=\"se-sub\">{{ scheduleId ? 'Rename the schedule, or add rows from the template.' : (locked ? 'Name the schedule, then add rows for this audit.' : 'Name the schedule, then add rows.') }}</div>\n </div>\n\n <!-- Opened from an audit's Configure page: that audit is the schedule's audit, named once here\n instead of an audit picker card (QA: the card is not needed when the audit is already chosen). -->\n <div class=\"se-fixed-audit\" *ngIf=\"locked\">\n <span class=\"se-label\">{{ pickedAudits.length > 1 ? 'Audits' : 'Audit' }}</span>\n <span class=\"se-fixed-audit-name\">{{ lockedAuditNames || 'Loading audit\u2026' }}</span>\n </div>\n\n <label class=\"se-field\">\n <span class=\"se-label\">Schedule name</span>\n <input type=\"text\" class=\"se-input\" [(ngModel)]=\"name\" placeholder=\"e.g. February hygiene round\">\n </label>\n\n <!-- Every audit, with the ones picked on the previous page (Not scheduled) already ticked.\n Create only: Edit schedule keeps the schedule's audits and does not ask for them (QA).\n Hidden for now on both (showAuditPicker). -->\n <div class=\"se-field\" *ngIf=\"showAuditPicker && !locked && !scheduleId\">\n <div class=\"se-row\">\n <span class=\"se-label se-grow\">Audits to schedule</span>\n <span class=\"se-count\">{{ pickCount }}</span>\n </div>\n <label class=\"se-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"pickQuery\" placeholder=\"Search audits\">\n <a class=\"se-clear\" *ngIf=\"pickQuery.trim()\" title=\"Clear search\" (click)=\"pickQuery = ''\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\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>\n </a>\n </label>\n <div class=\"se-picklist\">\n <div class=\"se-pickrow se-pickrow--all\" (click)=\"toggleAllPicks()\">\n <span class=\"se-box\" [class.is-on]=\"allPicked\">\n <svg *ngIf=\"allPicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">{{ allLabel }}</span>\n </div>\n <div class=\"se-empty-sm\" *ngIf=\"!pickables.length\">No audits match that search.</div>\n <div class=\"se-pickrow\" *ngFor=\"let a of pickables; trackBy: trackByAudit\" [class.is-on]=\"isPicked(a)\" (click)=\"togglePick(a)\">\n <span class=\"se-box\" [class.is-on]=\"isPicked(a)\">\n <svg *ngIf=\"isPicked(a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\">\n <span class=\"se-ellipsis\">{{ a.name }}</span>\n <span class=\"se-meta\">{{ a.meta }}{{ a.questions ? ' \u00B7 ' + a.questions + ' questions' : '' }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <ol class=\"se-steps\">\n <li>Use the template to schedule multiple users at once.</li>\n <li>Download the template here \u2014 <a href=\"#\" (click)=\"downloadTemplate($event)\">{{ templateLoading || templateWaiting ? 'Preparing\u2026' : 'Download template' }}</a></li>\n <li>Add your data, then upload it below.</li>\n </ol>\n\n <div class=\"se-actions\">\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--primary\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"importCsv()\">Import from CSV</button>\n <span class=\"se-or\">or</span>\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--ghost\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"addSingle()\">Add a single row</button>\n </div>\n </div>\n\n <!-- Hidden for now on both Create and Edit (showTemplatePreview). -->\n <div class=\"se-card se-card--side\" *ngIf=\"showTemplatePreview\">\n <div class=\"se-head\">\n <div class=\"se-side-title\">What the template expects</div>\n <div class=\"se-sub\">One row per user, store and date. These are the rows the downloaded template will hold for the selected\n {{ picks.length === 1 ? 'audit' : 'audits' }} \u2014 edit or add rows in the file, then import it.</div>\n </div>\n <div class=\"se-sample\">\n <div class=\"se-sample-row se-sample-row--head\">\n <span>Date</span><span>User email</span><span>Assign store</span><span>Assign audit</span>\n </div>\n <lib-audit-v2-shimmer *ngIf=\"templateLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\n <ng-container *ngIf=\"!templateLoading\">\n <!-- The selected audits' assigned stores / users: the same rows Download template writes. -->\n <div class=\"se-sample-row\" *ngFor=\"let r of previewRows\">\n <span [title]=\"r.date\">{{ r.date }}</span><span [title]=\"r.email\">{{ r.email }}</span>\n <span [title]=\"r.store\">{{ r.store }}</span><span [title]=\"r.audit\">{{ r.audit }}</span>\n </div>\n <div class=\"se-sample-more\" *ngIf=\"previewMore\">+ {{ previewMore }} more {{ previewMore === 1 ? 'row' : 'rows' }} in the file</div>\n <div class=\"se-sample-more\" *ngIf=\"!previewRows.length\">Pick an audit to see its template rows.</div>\n </ng-container>\n </div>\n <span class=\"se-note se-note--warn\" *ngIf=\"!templateLoading && unassignedAudits.length\">\n {{ unassignedAudits.join(', ') }} {{ unassignedAudits.length === 1 ? 'has' : 'have' }} no store assigned yet \u2014 fill in Date, User email\n and Store name for {{ unassignedAudits.length === 1 ? 'its row' : 'their rows' }}.</span>\n <span class=\"se-note\">Visit start and Visit end (HH:mm) are optional \u2014 leave them blank to use the store's open and close time (10:00 to 22:00 when the store has none).</span>\n <span class=\"se-note\">Rows with an unknown store, email or audit are reported before anything is saved. Draft audits\n are published when the schedule is published.</span>\n </div>\n </div>\n</ng-container>\n\n<!-- ============ Rows ============ -->\n<ng-container *ngIf=\"step === 'rows' && !loadingEdit\">\n <!-- Back + crumb on one line, as on the Create step; the name and actions below, left edges aligned.\n Edit has no \"Edit schedule\" step in the crumb (QA 9 Oct): it opens on, and stays on, the rows. -->\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\">\n <a href=\"#\" (click)=\"back($event)\">Schedule</a> \u203A\n <ng-container *ngIf=\"!scheduleId\"><a href=\"#\" (click)=\"backToCreate($event)\">Create schedule</a> \u203A</ng-container>\n Rows\n </div>\n </div>\n\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <div class=\"se-name\">{{ name.trim() || 'Untitled schedule' }}</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"saving\" (click)=\"saveDraft()\">Save as draft</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm se-publish\" [class.is-off]=\"!canPublish\" (click)=\"publish()\">\n {{ saving ? 'Saving\u2026' : (published ? 'Save & publish' : 'Publish schedule') }}\n </button>\n </div>\n\n <div class=\"se-ready\" [class.is-ok]=\"readyOk\">\n <svg *ngIf=\"readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\"></path><path d=\"M8 12.5l2.7 2.7L16 9.5\"></path></svg>\n <svg *ngIf=\"!readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 4l9 16H3z\"></path><path d=\"M12 10v4M12 17h.01\"></path></svg>\n <span>{{ readyLabel }}</span>\n </div>\n\n <div class=\"se-metrics\">\n <div class=\"av2-ocard\" *ngFor=\"let m of metrics\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count\">{{ m.value }}</div>\n <div class=\"av2-ocard-text\">{{ m.label }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <div class=\"se-tablehead\">\n <div class=\"se-titletext\">\n <div class=\"se-side-title\">Schedule rows</div>\n <div class=\"se-sub\">Every row is one user, at one store, on one date.</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"addRow()\">Add row</button>\n <label class=\"se-search se-search--sm\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"rowQuery\" placeholder=\"Search rows\">\n </label>\n </div>\n\n <div class=\"se-scroll\" (scroll)=\"onViewportChange()\">\n <div class=\"se-grid se-grid--head\">\n <div class=\"se-center\" (click)=\"toggleAllRows()\" title=\"Select all rows\">\n <span class=\"se-box\" [class.is-on]=\"allRowsSelected\">\n <svg *ngIf=\"allRowsSelected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n <div>Schedule date</div><div>User email</div><div>Assigned store</div><div>Audit assigned</div><div>Visit window</div><div></div>\n </div>\n\n <div class=\"se-grid se-grid--row\" *ngFor=\"let r of shownRows; trackBy: trackByRow\" [class.is-selected]=\"r.selected\" [class.is-locked]=\"isLocked(r)\">\n <div class=\"se-center\" [class.is-off]=\"isLocked(r)\" [attr.title]=\"isLocked(r) ? 'Past visit: already raised, so it cannot be selected' : null\" (click)=\"toggleRow(r)\">\n <span class=\"se-box\" [class.is-on]=\"r.selected\">\n <svg *ngIf=\"r.selected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n\n <input type=\"date\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'date')\" [attr.title]=\"cellError(r, 'date') || null\" [attr.min]=\"today\"\n [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.date\" (ngModelChange)=\"touch(r, 'date')\">\n\n <!-- User: search by name or email -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'userEmail')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\" [class.is-bad]=\"cellError(r, 'userEmail')\" [attr.title]=\"cellError(r, 'userEmail') || null\"\n placeholder=\"Search user\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.userEmail\" (ngModelChange)=\"onPickerInput(r, 'userEmail')\"\n (focus)=\"openPicker(r, 'userEmail', $event)\" (click)=\"openPicker(r, 'userEmail', $event)\" (keydown)=\"onPickerKey(r, 'userEmail', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'userEmail')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let u of userSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"u.email === r.userEmail.trim().toLowerCase()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickUser(r, u, $event)\">\n <span class=\"se-opt-avatar\">{{ initials(u.name || u.email) }}</span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ u.name || u.email }}</span>\n <span class=\"se-opt-sub\">{{ u.email }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"u.email === r.userEmail.trim().toLowerCase()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!userSuggestions(r).length\">{{ users.length ? 'No user matches \u201C' + r.userEmail + '\u201D' : 'Loading users\u2026' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(userSuggestions(r).length, userMatches(r).length, 'users')\">\n {{ moreLabel(userSuggestions(r).length, userMatches(r).length, 'users') }}\n </div>\n </div>\n </div>\n\n <!-- Store: search and show by store name (or city); the store code is never shown or asked for -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'storeId')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\"\n [class.is-bad]=\"cellError(r, 'storeId')\" [attr.title]=\"cellError(r, 'storeId') || null\"\n placeholder=\"Search store\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [ngModel]=\"r.storeText\" (ngModelChange)=\"onStoreTyped(r, $event)\"\n (focus)=\"openPicker(r, 'storeId', $event)\" (click)=\"openPicker(r, 'storeId', $event)\" (keydown)=\"onPickerKey(r, 'storeId', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'storeId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let s of storeSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"s.storeId === r.storeId.trim()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickStore(r, s, $event)\">\n <span class=\"se-opt-icon\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1.5-5h15L21 9\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ s.storeName || s.storeId }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"s.city\">{{ s.city }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"s.storeId === r.storeId.trim()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!storeSuggestions(r).length\">{{ stores.length ? 'No store matches \u201C' + r.storeText + '\u201D' : 'Loading stores\u2026' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores')\">\n {{ moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores') }}\n </div>\n </div>\n </div>\n\n <!-- Audit assigned: multi-select with search over the published audits (rowAuditOptions). Ticking another audit\n adds a row for it with the same date, user, store and window; unticking removes that row. No column when\n the schedule has one fixed audit. -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'checkListId')\">\n <button type=\"button\" class=\"se-cell se-select\" [class.is-bad]=\"cellError(r, 'checkListId')\" [attr.title]=\"cellError(r, 'checkListId') || null\"\n [disabled]=\"isLocked(r)\" (click)=\"openPicker(r, 'checkListId', $event)\" (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n <span class=\"se-ellipsis\" [class.se-placeholder]=\"!groupAuditFirst(r)\" [attr.title]=\"groupAuditLabel(r) || null\">{{ groupAuditFirst(r) || 'Select audits' }}</span>\n <span class=\"se-more\" *ngIf=\"groupAuditMore(r)\" [attr.title]=\"groupAuditLabel(r)\">+{{ groupAuditMore(r) }}</span>\n <svg class=\"se-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\n </button>\n <div class=\"se-menu se-menu--multi\" *ngIf=\"isOpen(r, 'checkListId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <label class=\"se-menu-search\" (mousedown)=\"$event.stopPropagation()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" placeholder=\"Search audits\" autocomplete=\"off\" [(ngModel)]=\"auditQuery\" (ngModelChange)=\"activeIndex = 0\"\n (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n </label>\n <div class=\"se-opt\" *ngFor=\"let a of auditMatches(); let i = index; trackBy: trackByAudit\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"auditTicked(r, a)\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"toggleAudit(r, a, $event)\">\n <span class=\"se-box\" [class.is-on]=\"auditTicked(r, a)\">\n <svg *ngIf=\"auditTicked(r, a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ a.name }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"a.questions\">{{ a.questions }} {{ a.questions === 1 ? 'question' : 'questions' }}</span>\n </span>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!auditMatches().length\">{{ rowAuditOptions.length ? 'No audit matches \u201C' + auditQuery + '\u201D' : 'No published audits yet' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"auditTickCount(r) > 1\">{{ auditTickCount(r) }} audits on this row \u00B7 same user, store, date and window</div>\n </div>\n </div>\n\n <div class=\"se-window\" [attr.title]=\"cellError(r, 'window') || null\">\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.start\" (ngModelChange)=\"touch(r, 'window')\">\n <span class=\"se-dash\">\u2013</span>\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.end\" (ngModelChange)=\"touch(r, 'window')\">\n </div>\n\n <div class=\"se-center\">\n <span class=\"se-lock\" *ngIf=\"isLocked(r)\" title=\"Past visit: already raised, so it cannot be edited or deleted\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"11\" width=\"14\" height=\"10\" rx=\"2\"></rect><path d=\"M8 11V7a4 4 0 0 1 8 0v4\"></path></svg>\n </span>\n <a class=\"se-del\" *ngIf=\"!isLocked(r)\" title=\"Delete row\" (click)=\"deleteRow(r)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7h16\"></path><path d=\"M7 7l1 13h8l1-13M9 7V4h6v3\"></path></svg>\n </a>\n </div>\n\n <!-- Why the row is red, in words. -->\n <ng-container *ngIf=\"rowMessages(r) as msgs\">\n <div class=\"se-rowerr\" *ngIf=\"msgs.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\n <span>{{ msgs.join(' \u00B7 ') }}</span>\n <a class=\"se-invite-link\" *ngIf=\"inviteable(r)\" (click)=\"openInvite(newUserEmails(groupRows(r)))\">Invite user</a>\n </div>\n </ng-container>\n <!-- Hints: allowed (Publish is not blocked), e.g. the same visit in another schedule. -->\n <ng-container *ngIf=\"rowHints(r) as hints\">\n <div class=\"se-rowerr se-rowhint\" *ngIf=\"hints.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\n <span>{{ hints.join(' \u00B7 ') }}</span>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"!shownRows.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ rows.length ? 'No rows match this search.' : 'No rows yet. Add a row or import the template.' }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-foot\">\n <!-- Row count + visit-window hint removed (user, 11 Oct); the count shows only while rows are selected. -->\n <span class=\"se-foot-text\" *ngIf=\"selectedCount\">{{ selectionLabel }}</span>\n <span class=\"se-foot-actions\">\n <button type=\"button\" class=\"se-bulk\" [class.is-off]=\"!selectedCount\" (click)=\"duplicateSelected()\">Duplicate</button>\n <button type=\"button\" class=\"se-bulk se-bulk--danger\" [class.is-off]=\"!selectedCount\" (click)=\"deleteSelected()\">Delete</button>\n </span>\n </div>\n </div>\n</ng-container>\n\n<!-- New User found (as the v1 checklist upload): emails with no user yet, after an import or from a row's Invite user. -->\n<ng-container *ngIf=\"inviteOpen\">\n <div class=\"se-inv-backdrop\" (click)=\"closeInvite()\"></div>\n <div class=\"se-inv\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"se-inv-title\">\n <span class=\"se-inv-icon\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.3 3.9L1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z\"></path><path d=\"M12 9v4M12 17h.01\"></path></svg>\n </span>\n <div class=\"se-inv-title\" id=\"se-inv-title\">{{ inviteEmails.length === 1 ? 'New user found' : 'New users found' }}</div>\n <div class=\"se-inv-text\">\n {{ inviteEmails.length === 1 ? 'This email is not a user yet.' : 'These emails are not users yet.' }}\n Invite them to add them as users of this client, or add them in User Management under the Manage menu.\n </div>\n\n <div class=\"se-inv-list\">\n <div class=\"se-pickrow se-pickrow--all\" *ngIf=\"inviteEmails.length > 1\" (click)=\"toggleAllInvite()\">\n <span class=\"se-box\" [class.is-on]=\"allInvitePicked\">\n <svg *ngIf=\"allInvitePicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">Select all ({{ inviteEmails.length }})</span>\n </div>\n <div class=\"se-pickrow\" *ngFor=\"let e of inviteEmails\" [class.is-on]=\"invitePicked.has(e)\" (click)=\"toggleInvite(e)\">\n <span class=\"se-box\" [class.is-on]=\"invitePicked.has(e)\">\n <svg *ngIf=\"invitePicked.has(e)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\"><span class=\"se-ellipsis\">{{ e }}</span></span>\n </div>\n </div>\n\n <div class=\"se-inv-foot\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"inviting\" (click)=\"closeInvite()\">Skip</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"inviting || !invitePicked.size\" (click)=\"inviteSelected()\">\n {{ inviting ? 'Inviting\u2026' : 'Invite selected' + (invitePicked.size ? ' (' + invitePicked.size + ')' : '') }}\n </button>\n </div>\n </div>\n</ng-container>\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{display:flex;flex-direction:column;gap:20px}.se-hidden{display:none}.se-grow{flex:1;min-width:0}.se-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-sk-crumb{width:180px;height:12px;margin:4px 0}.se-sk-name{height:22px;margin:4px 0}.se-crumb{font-size:13px;line-height:20px;color:#667085}.se-crumb a{font-weight:600;color:#00a3ff;text-decoration:none;cursor:pointer}.se-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.se-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.se-fixed-audit{display:flex;flex-direction:column;gap:4px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0}.se-fixed-audit-name{font-size:14px;line-height:20px;font-weight:600;color:#101828}.se-create{display:flex;flex-wrap:wrap;gap:20px;max-width:1180px}.se-card{min-width:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;display:flex;flex-direction:column}.se-card--form{flex:1 1 420px;padding:28px;gap:20px}.se-card--side{flex:1 1 380px;padding:28px;gap:16px}.se-badge{width:44px;height:44px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.se-head{display:flex;flex-direction:column;gap:4px}.se-title{font-size:24px;line-height:32px;font-weight:700;color:#101828}.se-side-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.se-sub{font-size:14px;line-height:20px;color:#667085}.se-field{display:flex;flex-direction:column;gap:6px;margin:0}.se-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.se-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.se-count{font-size:12px;line-height:18px;color:#667085;white-space:nowrap}.se-input{height:44px;padding:0 14px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:14px;color:#101828;outline:none}.se-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #ccedff}.se-search{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;margin:0;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#667085}.se-search input{flex:1;min-width:0;height:38px;border:none;outline:none;background:transparent;font-size:14px;font-family:inherit;color:#101828}.se-search--sm{flex:0 1 240px;min-width:180px;height:36px}.se-search--sm input{height:34px;font-size:13px}.se-clear{display:flex;cursor:pointer;color:#98a2b3}.se-picklist{display:flex;flex-direction:column;gap:2px;max-height:220px;overflow-y:auto;padding:8px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.se-pickrow{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer}.se-pickrow:hover{background:#f9fafb}.se-pickrow.is-on{background:#f5fbff}.se-pickrow--all{border-bottom:1px solid #F2F4F7}.se-pickrow--fixed{cursor:default;background:#f9fafb}.se-pickrow--fixed:hover{background:#f9fafb}.se-pickall{font-size:14px;line-height:20px;font-weight:600;color:#344054}.se-pickname{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.se-pickname .se-ellipsis{font-size:14px;line-height:20px;font-weight:500;color:#101828}.se-meta{font-size:12px;line-height:18px;color:#667085}.se-empty-sm{padding:14px 10px;font-size:13px;line-height:20px;color:#667085}.se-box{width:16px;height:16px;flex-shrink:0;border-radius:4px;display:flex;align-items:center;justify-content:center;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#00a3ff}.se-box.is-on{background:#eaf8ff;box-shadow:inset 0 0 0 1px #00a3ff}.se-steps{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.se-steps a{font-weight:600;color:#00a3ff;cursor:pointer}.se-actions{display:flex;flex-direction:column;gap:12px}.se-or{text-align:center;font-size:14px;color:#98a2b3}.se-btn-lg{height:44px;border:none;border-radius:8px;font-family:inherit;font-size:15px;font-weight:600;cursor:pointer}.se-btn-lg--primary{background:#00a3ff;color:#fff}.se-btn-lg--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054}.se-btn-lg--ghost:hover{background:#f9fafb}.se-btn-lg.is-off{cursor:not-allowed}.se-btn-lg--primary.is-off{background:#f2f4f7;color:#98a2b3}.se-btn-lg--ghost.is-off{color:#98a2b3}.se-btn-lg--ghost.is-off:hover{background:#fff}.se-sample{display:flex;flex-direction:column;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden}.se-sample-row{display:grid;grid-template-columns:.8fr 1.4fr 1fr 1.3fr;gap:8px;padding:10px 12px;border-top:1px solid #EAECF0;font-size:12px;line-height:18px;color:#344054}.se-sample-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-sample-row--head{border-top:none;background:#f9fafb;font-weight:600;color:#475467}.se-note{font-size:12px;line-height:18px;color:#667085;text-wrap:pretty}.se-note--warn{color:#b54708}.se-sample-more{padding:10px 12px;border-top:1px solid #EAECF0;font-size:12px;line-height:18px;color:#667085}.se-titlebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.se-backbar+.se-titlebar{margin-top:-8px}.se-titletext{flex:1 1 240px;min-width:0;display:flex;flex-direction:column;gap:2px}.se-name{font-size:20px;line-height:30px;font-weight:700;color:#101828}.se-publish.is-off{background:#f2f4f7;color:#98a2b3;cursor:not-allowed;box-shadow:none}.se-ready{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px 20px;border-radius:8px;background:#fffcf5;box-shadow:inset 0 0 0 1px #fedf89;color:#b54708;font-size:14px;line-height:20px;font-weight:600}.se-ready svg{flex-shrink:0}.se-ready span{flex:1;min-width:0}.se-ready.is-ok{background:#f6fef9;box-shadow:inset 0 0 0 1px #a6f4c5;color:#027a48}.se-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.se-tablehead{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:20px 24px}.se-scroll{overflow-x:auto}.se-grid{min-width:1120px;display:grid;grid-template-columns:36px 1fr 1.5fr 1fr 1.5fr 1.6fr 40px;gap:12px;align-items:center;padding:10px 24px}.se-grid--head{background:#f9fafb;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;font-weight:600;color:#475467}.se-grid--row{border-bottom:1px solid #F2F4F7}.se-grid--row.is-selected{background:#f5fbff}.se-center{display:flex;justify-content:center;cursor:pointer}.se-grid--row.is-locked .se-cell{background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;color:#667085;-webkit-text-fill-color:#667085;opacity:1;cursor:not-allowed}.se-grid--row.is-locked .se-chev{display:none}.se-grid--row.is-locked .se-center.is-off{cursor:not-allowed}.se-grid--row.is-locked .se-center.is-off .se-box{background:#f2f4f7;box-shadow:inset 0 0 0 1px #eaecf0}.se-rowerr{grid-column:2/-1;margin-top:-4px;display:flex;align-items:flex-start;gap:6px;font-size:12px;line-height:18px;color:#d92d20}.se-rowerr svg{flex-shrink:0;margin-top:2px}.se-rowhint{color:#667085}.se-invite-link{flex-shrink:0;font-weight:600;color:#00a3ff;cursor:pointer;text-decoration:none}.se-invite-link:hover{text-decoration:underline}.se-inv-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.se-inv{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:480px;max-width:calc(100vw - 32px);max-height:90vh;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.se-inv-icon{width:48px;height:48px;border-radius:9999px;background:#fef0c7;box-shadow:0 0 0 8px #fffaeb;color:#dc6803;display:flex;align-items:center;justify-content:center;margin:4px 0 8px 4px}.se-inv-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.se-inv-text{font-size:14px;line-height:20px;color:#475467}.se-inv-list{max-height:260px;overflow-y:auto;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:4px}.se-inv-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:8px}.se-cell{width:100%;height:36px;min-width:0;padding:0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;color:#101828;outline:none}.se-cell:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.se-cell.is-bad{box-shadow:inset 0 0 0 1px #fda29b}.se-select{display:flex;align-items:center;justify-content:space-between;gap:6px;text-align:left;cursor:pointer}.se-select svg{flex-shrink:0;color:#667085}.se-placeholder{color:#98a2b3}.se-pick{position:relative;min-width:0}.se-cell--pick{padding-right:10px;text-overflow:ellipsis}.se-cell--tagged{padding-right:88px}.se-pick.is-open .se-cell{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.se-pick.is-open .se-chev{transform:rotate(180deg)}.se-chev{transition:transform .15s ease}.se-tag{position:absolute;top:50%;right:8px;transform:translateY(-50%);max-width:76px;padding:2px 8px;border-radius:9999px;background:#f2f4f7;color:#344054;font-size:11px;line-height:16px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none}.se-menu{position:fixed;z-index:1060;width:max-content;max-width:380px;max-height:288px;overflow-y:auto;padding:6px;border-radius:10px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.se-opt{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer}.se-opt.is-active{background:#f9fafb}.se-opt.is-on{background:#f5fbff}.se-opt.is-on.is-active{background:#eaf8ff}.se-opt-avatar{width:28px;height:28px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.se-opt-icon{width:28px;height:28px;flex-shrink:0;border-radius:8px;background:#f2f4f7;color:#475467;display:flex;align-items:center;justify-content:center}.se-opt-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.se-opt-main{font-size:13px;line-height:18px;font-weight:500;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-opt-sub{font-size:12px;line-height:16px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-opt-check{flex-shrink:0;color:#00a3ff}.se-menu-empty{padding:12px 10px;font-size:13px;color:#667085}.se-menu--multi{min-width:260px}.se-menu-search{position:sticky;top:-6px;z-index:1;margin:-6px -6px 4px;padding:8px 10px;display:flex;align-items:center;gap:8px;background:#fff;border-bottom:1px solid #F2F4F7;color:#667085;cursor:text}.se-menu-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;line-height:18px;color:#101828}.se-menu-note{margin:4px -6px -6px;padding:8px 16px;border-top:1px solid #F2F4F7;background:#fcfcfd;font-size:12px;line-height:16px;color:#667085;position:sticky;bottom:-6px}.se-window{display:flex;align-items:center;gap:6px;min-width:0}.se-window .se-cell{flex:1;padding:0 6px}.se-dash{color:#98a2b3;font-size:13px}.se-lock{width:28px;height:28px;display:flex;align-items:center;justify-content:center;color:#98a2b3;cursor:help}.se-del{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#667085;cursor:pointer}.se-del:hover{background:#fffbfa;color:#d92d20}.se-empty{padding:36px 24px;text-align:center;font-size:13px;color:#667085}.se-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;padding:16px 24px}.se-foot-text{display:flex;flex-direction:column;gap:2px;font-size:14px;line-height:20px;color:#667085}.se-foot-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.se-bulk{height:36px;padding:0 14px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:13px;font-weight:600;color:#344054;cursor:pointer}.se-bulk:hover{background:#f9fafb}.se-bulk--danger{color:#d92d20}.se-bulk--danger:hover{background:#fffbfa}.se-bulk.is-off{color:#98a2b3;cursor:not-allowed}.se-bulk.is-off:hover{background:transparent}.se-select .se-ellipsis{flex:0 1 auto;min-width:0}.se-select .se-chev{margin-left:auto}.se-more{flex-shrink:0;min-width:24px;height:20px;padding:0 7px;border-radius:9999px;background:#f2f4f7;color:#344054;font-size:12px;font-weight:600;line-height:20px;text-align:center}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i6.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }] });
|
|
1451
1459
|
}
|
|
1452
1460
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2ScheduleEditorComponent, decorators: [{
|
|
1453
1461
|
type: Component,
|
|
1454
|
-
args: [{ selector: 'lib-audit-v2-schedule-editor', template: "<input #csvInput type=\"file\" accept=\".xlsx,.csv,text/csv\" class=\"se-hidden\" (change)=\"onCsvPicked($event)\">\n\n<!-- Editing opens on the Rows step, so its skeleton mirrors that screen. -->\n<ng-container *ngIf=\"loadingEdit\">\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <span class=\"av2-sk se-sk-crumb\"></span>\n <span class=\"av2-sk av2-sk--title se-sk-name\"></span>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <lib-audit-v2-shimmer></lib-audit-v2-shimmer>\n </div>\n</ng-container>\n\n<!-- ============ Create schedule ============ -->\n<ng-container *ngIf=\"step === 'create' && !loadingEdit\">\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\"><a href=\"#\" (click)=\"back($event)\">Schedule</a> \u203A {{ scheduleId ? name || 'Schedule' : 'Create schedule' }}</div>\n </div>\n\n <div class=\"se-create\">\n <div class=\"se-card se-card--form\">\n <span class=\"se-badge\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8v8M8 12h8\"></path></svg>\n </span>\n <div class=\"se-head\">\n <div class=\"se-title\">{{ scheduleId ? 'Edit schedule' : 'Create schedule' }}</div>\n <div class=\"se-sub\">{{ scheduleId ? 'Rename the schedule, or add rows from the template.' : (locked ? 'Name the schedule, then add rows for this audit.' : 'Name the schedule, then add rows.') }}</div>\n </div>\n\n <!-- Opened from an audit's Configure page: that audit is the schedule's audit, named once here\n instead of an audit picker card (QA: the card is not needed when the audit is already chosen). -->\n <div class=\"se-fixed-audit\" *ngIf=\"locked\">\n <span class=\"se-label\">{{ pickedAudits.length > 1 ? 'Audits' : 'Audit' }}</span>\n <span class=\"se-fixed-audit-name\">{{ lockedAuditNames || 'Loading audit\u2026' }}</span>\n </div>\n\n <label class=\"se-field\">\n <span class=\"se-label\">Schedule name</span>\n <input type=\"text\" class=\"se-input\" [(ngModel)]=\"name\" placeholder=\"e.g. February hygiene round\">\n </label>\n\n <!-- Every audit, with the ones picked on the previous page (Not scheduled) already ticked.\n Create only: Edit schedule keeps the schedule's audits and does not ask for them (QA).\n Hidden for now on both (showAuditPicker). -->\n <div class=\"se-field\" *ngIf=\"showAuditPicker && !locked && !scheduleId\">\n <div class=\"se-row\">\n <span class=\"se-label se-grow\">Audits to schedule</span>\n <span class=\"se-count\">{{ pickCount }}</span>\n </div>\n <label class=\"se-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"pickQuery\" placeholder=\"Search audits\">\n <a class=\"se-clear\" *ngIf=\"pickQuery.trim()\" title=\"Clear search\" (click)=\"pickQuery = ''\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\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>\n </a>\n </label>\n <div class=\"se-picklist\">\n <div class=\"se-pickrow se-pickrow--all\" (click)=\"toggleAllPicks()\">\n <span class=\"se-box\" [class.is-on]=\"allPicked\">\n <svg *ngIf=\"allPicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">{{ allLabel }}</span>\n </div>\n <div class=\"se-empty-sm\" *ngIf=\"!pickables.length\">No audits match that search.</div>\n <div class=\"se-pickrow\" *ngFor=\"let a of pickables; trackBy: trackByAudit\" [class.is-on]=\"isPicked(a)\" (click)=\"togglePick(a)\">\n <span class=\"se-box\" [class.is-on]=\"isPicked(a)\">\n <svg *ngIf=\"isPicked(a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\">\n <span class=\"se-ellipsis\">{{ a.name }}</span>\n <span class=\"se-meta\">{{ a.meta }}{{ a.questions ? ' \u00B7 ' + a.questions + ' questions' : '' }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <ol class=\"se-steps\">\n <li>Use the template to schedule multiple users at once.</li>\n <li>Download the template here \u2014 <a href=\"#\" (click)=\"downloadTemplate($event)\">{{ templateLoading || templateWaiting ? 'Preparing\u2026' : 'Download template' }}</a></li>\n <li>Add your data, then upload it below.</li>\n </ol>\n\n <div class=\"se-actions\">\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--primary\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"importCsv()\">Import from CSV</button>\n <span class=\"se-or\">or</span>\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--ghost\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"addSingle()\">Add a single row</button>\n </div>\n </div>\n\n <!-- Hidden for now on both Create and Edit (showTemplatePreview). -->\n <div class=\"se-card se-card--side\" *ngIf=\"showTemplatePreview\">\n <div class=\"se-head\">\n <div class=\"se-side-title\">What the template expects</div>\n <div class=\"se-sub\">One row per user, store and date. These are the rows the downloaded template will hold for the selected\n {{ picks.length === 1 ? 'audit' : 'audits' }} \u2014 edit or add rows in the file, then import it.</div>\n </div>\n <div class=\"se-sample\">\n <div class=\"se-sample-row se-sample-row--head\">\n <span>Date</span><span>User email</span><span>Assign store</span><span>Assign audit</span>\n </div>\n <lib-audit-v2-shimmer *ngIf=\"templateLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\n <ng-container *ngIf=\"!templateLoading\">\n <!-- The selected audits' assigned stores / users: the same rows Download template writes. -->\n <div class=\"se-sample-row\" *ngFor=\"let r of previewRows\">\n <span [title]=\"r.date\">{{ r.date }}</span><span [title]=\"r.email\">{{ r.email }}</span>\n <span [title]=\"r.store\">{{ r.store }}</span><span [title]=\"r.audit\">{{ r.audit }}</span>\n </div>\n <div class=\"se-sample-more\" *ngIf=\"previewMore\">+ {{ previewMore }} more {{ previewMore === 1 ? 'row' : 'rows' }} in the file</div>\n <div class=\"se-sample-more\" *ngIf=\"!previewRows.length\">Pick an audit to see its template rows.</div>\n </ng-container>\n </div>\n <span class=\"se-note se-note--warn\" *ngIf=\"!templateLoading && unassignedAudits.length\">\n {{ unassignedAudits.join(', ') }} {{ unassignedAudits.length === 1 ? 'has' : 'have' }} no store assigned yet \u2014 fill in Date, User email\n and Store name for {{ unassignedAudits.length === 1 ? 'its row' : 'their rows' }}.</span>\n <span class=\"se-note\">Visit start and Visit end (HH:mm) are optional \u2014 leave them blank to use the store's open and close time (10:00 to 22:00 when the store has none).</span>\n <span class=\"se-note\">Rows with an unknown store, email or audit are reported before anything is saved. Draft audits\n are published when the schedule is published.</span>\n </div>\n </div>\n</ng-container>\n\n<!-- ============ Rows ============ -->\n<ng-container *ngIf=\"step === 'rows' && !loadingEdit\">\n <!-- Back + crumb on one line, as on the Create step; the name and actions below, left edges aligned.\n Edit has no \"Edit schedule\" step in the crumb (QA 9 Oct): it opens on, and stays on, the rows. -->\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\">\n <a href=\"#\" (click)=\"back($event)\">Schedule</a> \u203A\n <ng-container *ngIf=\"!scheduleId\"><a href=\"#\" (click)=\"backToCreate($event)\">Create schedule</a> \u203A</ng-container>\n Rows\n </div>\n </div>\n\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <div class=\"se-name\">{{ name.trim() || 'Untitled schedule' }}</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"saving\" (click)=\"saveDraft()\">Save as draft</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm se-publish\" [class.is-off]=\"!canPublish\" (click)=\"publish()\">\n {{ saving ? 'Saving\u2026' : (published ? 'Save & publish' : 'Publish schedule') }}\n </button>\n </div>\n\n <div class=\"se-ready\" [class.is-ok]=\"readyOk\">\n <svg *ngIf=\"readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\"></path><path d=\"M8 12.5l2.7 2.7L16 9.5\"></path></svg>\n <svg *ngIf=\"!readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 4l9 16H3z\"></path><path d=\"M12 10v4M12 17h.01\"></path></svg>\n <span>{{ readyLabel }}</span>\n </div>\n\n <div class=\"se-metrics\">\n <div class=\"av2-ocard\" *ngFor=\"let m of metrics\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count\">{{ m.value }}</div>\n <div class=\"av2-ocard-text\">{{ m.label }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <div class=\"se-tablehead\">\n <div class=\"se-titletext\">\n <div class=\"se-side-title\">Schedule rows</div>\n <div class=\"se-sub\">Every row is one user, at one store, on one date.</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"addRow()\">Add row</button>\n <label class=\"se-search se-search--sm\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"rowQuery\" placeholder=\"Search rows\">\n </label>\n </div>\n\n <div class=\"se-scroll\" (scroll)=\"onViewportChange()\">\n <div class=\"se-grid se-grid--head\">\n <div class=\"se-center\" (click)=\"toggleAllRows()\" title=\"Select all rows\">\n <span class=\"se-box\" [class.is-on]=\"allRowsSelected\">\n <svg *ngIf=\"allRowsSelected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n <div>Schedule date</div><div>User email</div><div>Assigned store</div><div>Audit assigned</div><div>Visit window</div><div></div>\n </div>\n\n <div class=\"se-grid se-grid--row\" *ngFor=\"let r of shownRows; trackBy: trackByRow\" [class.is-selected]=\"r.selected\">\n <div class=\"se-center\" (click)=\"toggleRow(r)\">\n <span class=\"se-box\" [class.is-on]=\"r.selected\">\n <svg *ngIf=\"r.selected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n\n <input type=\"date\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'date')\" [attr.title]=\"cellError(r, 'date') || null\" [attr.min]=\"today\"\n [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.date\" (ngModelChange)=\"touch(r, 'date')\">\n\n <!-- User: search by name or email -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'userEmail')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\" [class.is-bad]=\"cellError(r, 'userEmail')\" [attr.title]=\"cellError(r, 'userEmail') || null\"\n placeholder=\"Search user\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.userEmail\" (ngModelChange)=\"onPickerInput(r, 'userEmail')\"\n (focus)=\"openPicker(r, 'userEmail', $event)\" (click)=\"openPicker(r, 'userEmail', $event)\" (keydown)=\"onPickerKey(r, 'userEmail', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'userEmail')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let u of userSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"u.email === r.userEmail.trim().toLowerCase()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickUser(r, u, $event)\">\n <span class=\"se-opt-avatar\">{{ initials(u.name || u.email) }}</span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ u.name || u.email }}</span>\n <span class=\"se-opt-sub\">{{ u.email }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"u.email === r.userEmail.trim().toLowerCase()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!userSuggestions(r).length\">{{ users.length ? 'No user matches \u201C' + r.userEmail + '\u201D' : 'Loading users\u2026' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(userSuggestions(r).length, userMatches(r).length, 'users')\">\n {{ moreLabel(userSuggestions(r).length, userMatches(r).length, 'users') }}\n </div>\n </div>\n </div>\n\n <!-- Store: search and show by store name (or city); the store code is never shown or asked for -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'storeId')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\"\n [class.is-bad]=\"cellError(r, 'storeId')\" [attr.title]=\"cellError(r, 'storeId') || null\"\n placeholder=\"Search store\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [ngModel]=\"r.storeText\" (ngModelChange)=\"onStoreTyped(r, $event)\"\n (focus)=\"openPicker(r, 'storeId', $event)\" (click)=\"openPicker(r, 'storeId', $event)\" (keydown)=\"onPickerKey(r, 'storeId', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'storeId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let s of storeSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"s.storeId === r.storeId.trim()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickStore(r, s, $event)\">\n <span class=\"se-opt-icon\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1.5-5h15L21 9\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ s.storeName || s.storeId }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"s.city\">{{ s.city }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"s.storeId === r.storeId.trim()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!storeSuggestions(r).length\">{{ stores.length ? 'No store matches \u201C' + r.storeText + '\u201D' : 'Loading stores\u2026' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores')\">\n {{ moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores') }}\n </div>\n </div>\n </div>\n\n <!-- Audit assigned: multi-select with search over the published audits (rowAuditOptions). Ticking another audit\n adds a row for it with the same date, user, store and window; unticking removes that row. No column when\n the schedule has one fixed audit. -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'checkListId')\">\n <button type=\"button\" class=\"se-cell se-select\" [class.is-bad]=\"cellError(r, 'checkListId')\" [attr.title]=\"cellError(r, 'checkListId') || null\"\n [disabled]=\"isLocked(r)\" (click)=\"openPicker(r, 'checkListId', $event)\" (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n <span class=\"se-ellipsis\" [class.se-placeholder]=\"!groupAuditFirst(r)\" [attr.title]=\"groupAuditLabel(r) || null\">{{ groupAuditFirst(r) || 'Select audits' }}</span>\n <span class=\"se-more\" *ngIf=\"groupAuditMore(r)\" [attr.title]=\"groupAuditLabel(r)\">+{{ groupAuditMore(r) }}</span>\n <svg class=\"se-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\n </button>\n <div class=\"se-menu se-menu--multi\" *ngIf=\"isOpen(r, 'checkListId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <label class=\"se-menu-search\" (mousedown)=\"$event.stopPropagation()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" placeholder=\"Search audits\" autocomplete=\"off\" [(ngModel)]=\"auditQuery\" (ngModelChange)=\"activeIndex = 0\"\n (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n </label>\n <div class=\"se-opt\" *ngFor=\"let a of auditMatches(); let i = index; trackBy: trackByAudit\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"auditTicked(r, a)\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"toggleAudit(r, a, $event)\">\n <span class=\"se-box\" [class.is-on]=\"auditTicked(r, a)\">\n <svg *ngIf=\"auditTicked(r, a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ a.name }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"a.questions\">{{ a.questions }} {{ a.questions === 1 ? 'question' : 'questions' }}</span>\n </span>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!auditMatches().length\">{{ rowAuditOptions.length ? 'No audit matches \u201C' + auditQuery + '\u201D' : 'No published audits yet' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"auditTickCount(r) > 1\">{{ auditTickCount(r) }} audits on this row \u00B7 same user, store, date and window</div>\n </div>\n </div>\n\n <div class=\"se-window\" [attr.title]=\"cellError(r, 'window') || null\">\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.start\" (ngModelChange)=\"touch(r, 'window')\">\n <span class=\"se-dash\">\u2013</span>\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.end\" (ngModelChange)=\"touch(r, 'window')\">\n </div>\n\n <div class=\"se-center\">\n <span class=\"se-lock\" *ngIf=\"isLocked(r)\" title=\"Past visit: already raised, so it cannot be edited or deleted\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"11\" width=\"14\" height=\"10\" rx=\"2\"></rect><path d=\"M8 11V7a4 4 0 0 1 8 0v4\"></path></svg>\n </span>\n <a class=\"se-del\" *ngIf=\"!isLocked(r)\" title=\"Delete row\" (click)=\"deleteRow(r)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7h16\"></path><path d=\"M7 7l1 13h8l1-13M9 7V4h6v3\"></path></svg>\n </a>\n </div>\n\n <!-- Why the row is red, in words. -->\n <ng-container *ngIf=\"rowMessages(r) as msgs\">\n <div class=\"se-rowerr\" *ngIf=\"msgs.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\n <span>{{ msgs.join(' \u00B7 ') }}</span>\n <a class=\"se-invite-link\" *ngIf=\"inviteable(r)\" (click)=\"openInvite(newUserEmails(groupRows(r)))\">Invite user</a>\n </div>\n </ng-container>\n <!-- Hints: allowed (Publish is not blocked), e.g. the same visit in another schedule. -->\n <ng-container *ngIf=\"rowHints(r) as hints\">\n <div class=\"se-rowerr se-rowhint\" *ngIf=\"hints.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\n <span>{{ hints.join(' \u00B7 ') }}</span>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"!shownRows.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ rows.length ? 'No rows match this search.' : 'No rows yet. Add a row or import the template.' }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-foot\">\n <!-- Row count + visit-window hint removed (user, 11 Oct); the count shows only while rows are selected. -->\n <span class=\"se-foot-text\" *ngIf=\"selectedCount\">{{ selectionLabel }}</span>\n <span class=\"se-foot-actions\">\n <button type=\"button\" class=\"se-bulk\" [class.is-off]=\"!selectedCount\" (click)=\"duplicateSelected()\">Duplicate</button>\n <button type=\"button\" class=\"se-bulk se-bulk--danger\" [class.is-off]=\"!selectedCount\" (click)=\"deleteSelected()\">Delete</button>\n </span>\n </div>\n </div>\n</ng-container>\n\n<!-- New User found (as the v1 checklist upload): emails with no user yet, after an import or from a row's Invite user. -->\n<ng-container *ngIf=\"inviteOpen\">\n <div class=\"se-inv-backdrop\" (click)=\"closeInvite()\"></div>\n <div class=\"se-inv\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"se-inv-title\">\n <span class=\"se-inv-icon\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.3 3.9L1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z\"></path><path d=\"M12 9v4M12 17h.01\"></path></svg>\n </span>\n <div class=\"se-inv-title\" id=\"se-inv-title\">{{ inviteEmails.length === 1 ? 'New user found' : 'New users found' }}</div>\n <div class=\"se-inv-text\">\n {{ inviteEmails.length === 1 ? 'This email is not a user yet.' : 'These emails are not users yet.' }}\n Invite them to add them as users of this client, or add them in User Management under the Manage menu.\n </div>\n\n <div class=\"se-inv-list\">\n <div class=\"se-pickrow se-pickrow--all\" *ngIf=\"inviteEmails.length > 1\" (click)=\"toggleAllInvite()\">\n <span class=\"se-box\" [class.is-on]=\"allInvitePicked\">\n <svg *ngIf=\"allInvitePicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">Select all ({{ inviteEmails.length }})</span>\n </div>\n <div class=\"se-pickrow\" *ngFor=\"let e of inviteEmails\" [class.is-on]=\"invitePicked.has(e)\" (click)=\"toggleInvite(e)\">\n <span class=\"se-box\" [class.is-on]=\"invitePicked.has(e)\">\n <svg *ngIf=\"invitePicked.has(e)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\"><span class=\"se-ellipsis\">{{ e }}</span></span>\n </div>\n </div>\n\n <div class=\"se-inv-foot\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"inviting\" (click)=\"closeInvite()\">Skip</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"inviting || !invitePicked.size\" (click)=\"inviteSelected()\">\n {{ inviting ? 'Inviting\u2026' : 'Invite selected' + (invitePicked.size ? ' (' + invitePicked.size + ')' : '') }}\n </button>\n </div>\n </div>\n</ng-container>\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{display:flex;flex-direction:column;gap:20px}.se-hidden{display:none}.se-grow{flex:1;min-width:0}.se-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-sk-crumb{width:180px;height:12px;margin:4px 0}.se-sk-name{height:22px;margin:4px 0}.se-crumb{font-size:13px;line-height:20px;color:#667085}.se-crumb a{font-weight:600;color:#00a3ff;text-decoration:none;cursor:pointer}.se-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.se-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.se-fixed-audit{display:flex;flex-direction:column;gap:4px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0}.se-fixed-audit-name{font-size:14px;line-height:20px;font-weight:600;color:#101828}.se-create{display:flex;flex-wrap:wrap;gap:20px;max-width:1180px}.se-card{min-width:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;display:flex;flex-direction:column}.se-card--form{flex:1 1 420px;padding:28px;gap:20px}.se-card--side{flex:1 1 380px;padding:28px;gap:16px}.se-badge{width:44px;height:44px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.se-head{display:flex;flex-direction:column;gap:4px}.se-title{font-size:24px;line-height:32px;font-weight:700;color:#101828}.se-side-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.se-sub{font-size:14px;line-height:20px;color:#667085}.se-field{display:flex;flex-direction:column;gap:6px;margin:0}.se-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.se-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.se-count{font-size:12px;line-height:18px;color:#667085;white-space:nowrap}.se-input{height:44px;padding:0 14px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:14px;color:#101828;outline:none}.se-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #ccedff}.se-search{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;margin:0;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#667085}.se-search input{flex:1;min-width:0;height:38px;border:none;outline:none;background:transparent;font-size:14px;font-family:inherit;color:#101828}.se-search--sm{flex:0 1 240px;min-width:180px;height:36px}.se-search--sm input{height:34px;font-size:13px}.se-clear{display:flex;cursor:pointer;color:#98a2b3}.se-picklist{display:flex;flex-direction:column;gap:2px;max-height:220px;overflow-y:auto;padding:8px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.se-pickrow{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer}.se-pickrow:hover{background:#f9fafb}.se-pickrow.is-on{background:#f5fbff}.se-pickrow--all{border-bottom:1px solid #F2F4F7}.se-pickrow--fixed{cursor:default;background:#f9fafb}.se-pickrow--fixed:hover{background:#f9fafb}.se-pickall{font-size:14px;line-height:20px;font-weight:600;color:#344054}.se-pickname{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.se-pickname .se-ellipsis{font-size:14px;line-height:20px;font-weight:500;color:#101828}.se-meta{font-size:12px;line-height:18px;color:#667085}.se-empty-sm{padding:14px 10px;font-size:13px;line-height:20px;color:#667085}.se-box{width:16px;height:16px;flex-shrink:0;border-radius:4px;display:flex;align-items:center;justify-content:center;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#00a3ff}.se-box.is-on{background:#eaf8ff;box-shadow:inset 0 0 0 1px #00a3ff}.se-steps{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.se-steps a{font-weight:600;color:#00a3ff;cursor:pointer}.se-actions{display:flex;flex-direction:column;gap:12px}.se-or{text-align:center;font-size:14px;color:#98a2b3}.se-btn-lg{height:44px;border:none;border-radius:8px;font-family:inherit;font-size:15px;font-weight:600;cursor:pointer}.se-btn-lg--primary{background:#00a3ff;color:#fff}.se-btn-lg--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054}.se-btn-lg--ghost:hover{background:#f9fafb}.se-btn-lg.is-off{cursor:not-allowed}.se-btn-lg--primary.is-off{background:#f2f4f7;color:#98a2b3}.se-btn-lg--ghost.is-off{color:#98a2b3}.se-btn-lg--ghost.is-off:hover{background:#fff}.se-sample{display:flex;flex-direction:column;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden}.se-sample-row{display:grid;grid-template-columns:.8fr 1.4fr 1fr 1.3fr;gap:8px;padding:10px 12px;border-top:1px solid #EAECF0;font-size:12px;line-height:18px;color:#344054}.se-sample-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-sample-row--head{border-top:none;background:#f9fafb;font-weight:600;color:#475467}.se-note{font-size:12px;line-height:18px;color:#667085;text-wrap:pretty}.se-note--warn{color:#b54708}.se-sample-more{padding:10px 12px;border-top:1px solid #EAECF0;font-size:12px;line-height:18px;color:#667085}.se-titlebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.se-backbar+.se-titlebar{margin-top:-8px}.se-titletext{flex:1 1 240px;min-width:0;display:flex;flex-direction:column;gap:2px}.se-name{font-size:20px;line-height:30px;font-weight:700;color:#101828}.se-publish.is-off{background:#f2f4f7;color:#98a2b3;cursor:not-allowed;box-shadow:none}.se-ready{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px 20px;border-radius:8px;background:#fffcf5;box-shadow:inset 0 0 0 1px #fedf89;color:#b54708;font-size:14px;line-height:20px;font-weight:600}.se-ready svg{flex-shrink:0}.se-ready span{flex:1;min-width:0}.se-ready.is-ok{background:#f6fef9;box-shadow:inset 0 0 0 1px #a6f4c5;color:#027a48}.se-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.se-tablehead{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:20px 24px}.se-scroll{overflow-x:auto}.se-grid{min-width:1120px;display:grid;grid-template-columns:36px 1fr 1.5fr 1fr 1.5fr 1.6fr 40px;gap:12px;align-items:center;padding:10px 24px}.se-grid--head{background:#f9fafb;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;font-weight:600;color:#475467}.se-grid--row{border-bottom:1px solid #F2F4F7}.se-grid--row.is-selected{background:#f5fbff}.se-center{display:flex;justify-content:center;cursor:pointer}.se-rowerr{grid-column:2/-1;margin-top:-4px;display:flex;align-items:flex-start;gap:6px;font-size:12px;line-height:18px;color:#d92d20}.se-rowerr svg{flex-shrink:0;margin-top:2px}.se-rowhint{color:#667085}.se-invite-link{flex-shrink:0;font-weight:600;color:#00a3ff;cursor:pointer;text-decoration:none}.se-invite-link:hover{text-decoration:underline}.se-inv-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.se-inv{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:480px;max-width:calc(100vw - 32px);max-height:90vh;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.se-inv-icon{width:48px;height:48px;border-radius:9999px;background:#fef0c7;box-shadow:0 0 0 8px #fffaeb;color:#dc6803;display:flex;align-items:center;justify-content:center;margin:4px 0 8px 4px}.se-inv-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.se-inv-text{font-size:14px;line-height:20px;color:#475467}.se-inv-list{max-height:260px;overflow-y:auto;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:4px}.se-inv-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:8px}.se-cell{width:100%;height:36px;min-width:0;padding:0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;color:#101828;outline:none}.se-cell:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.se-cell.is-bad{box-shadow:inset 0 0 0 1px #fda29b}.se-select{display:flex;align-items:center;justify-content:space-between;gap:6px;text-align:left;cursor:pointer}.se-select svg{flex-shrink:0;color:#667085}.se-placeholder{color:#98a2b3}.se-pick{position:relative;min-width:0}.se-cell--pick{padding-right:10px;text-overflow:ellipsis}.se-cell--tagged{padding-right:88px}.se-pick.is-open .se-cell{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.se-pick.is-open .se-chev{transform:rotate(180deg)}.se-chev{transition:transform .15s ease}.se-tag{position:absolute;top:50%;right:8px;transform:translateY(-50%);max-width:76px;padding:2px 8px;border-radius:9999px;background:#f2f4f7;color:#344054;font-size:11px;line-height:16px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none}.se-menu{position:fixed;z-index:1060;width:max-content;max-width:380px;max-height:288px;overflow-y:auto;padding:6px;border-radius:10px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.se-opt{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer}.se-opt.is-active{background:#f9fafb}.se-opt.is-on{background:#f5fbff}.se-opt.is-on.is-active{background:#eaf8ff}.se-opt-avatar{width:28px;height:28px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.se-opt-icon{width:28px;height:28px;flex-shrink:0;border-radius:8px;background:#f2f4f7;color:#475467;display:flex;align-items:center;justify-content:center}.se-opt-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.se-opt-main{font-size:13px;line-height:18px;font-weight:500;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-opt-sub{font-size:12px;line-height:16px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-opt-check{flex-shrink:0;color:#00a3ff}.se-menu-empty{padding:12px 10px;font-size:13px;color:#667085}.se-menu--multi{min-width:260px}.se-menu-search{position:sticky;top:-6px;z-index:1;margin:-6px -6px 4px;padding:8px 10px;display:flex;align-items:center;gap:8px;background:#fff;border-bottom:1px solid #F2F4F7;color:#667085;cursor:text}.se-menu-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;line-height:18px;color:#101828}.se-menu-note{margin:4px -6px -6px;padding:8px 16px;border-top:1px solid #F2F4F7;background:#fcfcfd;font-size:12px;line-height:16px;color:#667085;position:sticky;bottom:-6px}.se-window{display:flex;align-items:center;gap:6px;min-width:0}.se-window .se-cell{flex:1;padding:0 6px}.se-dash{color:#98a2b3;font-size:13px}.se-lock{width:28px;height:28px;display:flex;align-items:center;justify-content:center;color:#98a2b3;cursor:help}.se-del{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#667085;cursor:pointer}.se-del:hover{background:#fffbfa;color:#d92d20}.se-empty{padding:36px 24px;text-align:center;font-size:13px;color:#667085}.se-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;padding:16px 24px}.se-foot-text{display:flex;flex-direction:column;gap:2px;font-size:14px;line-height:20px;color:#667085}.se-foot-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.se-bulk{height:36px;padding:0 14px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:13px;font-weight:600;color:#344054;cursor:pointer}.se-bulk:hover{background:#f9fafb}.se-bulk--danger{color:#d92d20}.se-bulk--danger:hover{background:#fffbfa}.se-bulk.is-off{color:#98a2b3;cursor:not-allowed}.se-bulk.is-off:hover{background:transparent}.se-select .se-ellipsis{flex:0 1 auto;min-width:0}.se-select .se-chev{margin-left:auto}.se-more{flex-shrink:0;min-width:24px;height:20px;padding:0 7px;border-radius:9999px;background:#f2f4f7;color:#344054;font-size:12px;font-weight:600;line-height:20px;text-align:center}\n"] }]
|
|
1462
|
+
args: [{ selector: 'lib-audit-v2-schedule-editor', template: "<input #csvInput type=\"file\" accept=\".xlsx,.csv,text/csv\" class=\"se-hidden\" (change)=\"onCsvPicked($event)\">\n\n<!-- Editing opens on the Rows step, so its skeleton mirrors that screen. -->\n<ng-container *ngIf=\"loadingEdit\">\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <span class=\"av2-sk se-sk-crumb\"></span>\n <span class=\"av2-sk av2-sk--title se-sk-name\"></span>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <lib-audit-v2-shimmer></lib-audit-v2-shimmer>\n </div>\n</ng-container>\n\n<!-- ============ Create schedule ============ -->\n<ng-container *ngIf=\"step === 'create' && !loadingEdit\">\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\"><a href=\"#\" (click)=\"back($event)\">Schedule</a> \u203A {{ scheduleId ? name || 'Schedule' : 'Create schedule' }}</div>\n </div>\n\n <div class=\"se-create\">\n <div class=\"se-card se-card--form\">\n <span class=\"se-badge\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8v8M8 12h8\"></path></svg>\n </span>\n <div class=\"se-head\">\n <div class=\"se-title\">{{ scheduleId ? 'Edit schedule' : 'Create schedule' }}</div>\n <div class=\"se-sub\">{{ scheduleId ? 'Rename the schedule, or add rows from the template.' : (locked ? 'Name the schedule, then add rows for this audit.' : 'Name the schedule, then add rows.') }}</div>\n </div>\n\n <!-- Opened from an audit's Configure page: that audit is the schedule's audit, named once here\n instead of an audit picker card (QA: the card is not needed when the audit is already chosen). -->\n <div class=\"se-fixed-audit\" *ngIf=\"locked\">\n <span class=\"se-label\">{{ pickedAudits.length > 1 ? 'Audits' : 'Audit' }}</span>\n <span class=\"se-fixed-audit-name\">{{ lockedAuditNames || 'Loading audit\u2026' }}</span>\n </div>\n\n <label class=\"se-field\">\n <span class=\"se-label\">Schedule name</span>\n <input type=\"text\" class=\"se-input\" [(ngModel)]=\"name\" placeholder=\"e.g. February hygiene round\">\n </label>\n\n <!-- Every audit, with the ones picked on the previous page (Not scheduled) already ticked.\n Create only: Edit schedule keeps the schedule's audits and does not ask for them (QA).\n Hidden for now on both (showAuditPicker). -->\n <div class=\"se-field\" *ngIf=\"showAuditPicker && !locked && !scheduleId\">\n <div class=\"se-row\">\n <span class=\"se-label se-grow\">Audits to schedule</span>\n <span class=\"se-count\">{{ pickCount }}</span>\n </div>\n <label class=\"se-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"pickQuery\" placeholder=\"Search audits\">\n <a class=\"se-clear\" *ngIf=\"pickQuery.trim()\" title=\"Clear search\" (click)=\"pickQuery = ''\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\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>\n </a>\n </label>\n <div class=\"se-picklist\">\n <div class=\"se-pickrow se-pickrow--all\" (click)=\"toggleAllPicks()\">\n <span class=\"se-box\" [class.is-on]=\"allPicked\">\n <svg *ngIf=\"allPicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">{{ allLabel }}</span>\n </div>\n <div class=\"se-empty-sm\" *ngIf=\"!pickables.length\">No audits match that search.</div>\n <div class=\"se-pickrow\" *ngFor=\"let a of pickables; trackBy: trackByAudit\" [class.is-on]=\"isPicked(a)\" (click)=\"togglePick(a)\">\n <span class=\"se-box\" [class.is-on]=\"isPicked(a)\">\n <svg *ngIf=\"isPicked(a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\">\n <span class=\"se-ellipsis\">{{ a.name }}</span>\n <span class=\"se-meta\">{{ a.meta }}{{ a.questions ? ' \u00B7 ' + a.questions + ' questions' : '' }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <ol class=\"se-steps\">\n <li>Use the template to schedule multiple users at once.</li>\n <li>Download the template here \u2014 <a href=\"#\" (click)=\"downloadTemplate($event)\">{{ templateLoading || templateWaiting ? 'Preparing\u2026' : 'Download template' }}</a></li>\n <li>Add your data, then upload it below.</li>\n </ol>\n\n <div class=\"se-actions\">\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--primary\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"importCsv()\">Import from CSV</button>\n <span class=\"se-or\">or</span>\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--ghost\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"addSingle()\">Add a single row</button>\n </div>\n </div>\n\n <!-- Hidden for now on both Create and Edit (showTemplatePreview). -->\n <div class=\"se-card se-card--side\" *ngIf=\"showTemplatePreview\">\n <div class=\"se-head\">\n <div class=\"se-side-title\">What the template expects</div>\n <div class=\"se-sub\">One row per user, store and date. These are the rows the downloaded template will hold for the selected\n {{ picks.length === 1 ? 'audit' : 'audits' }} \u2014 edit or add rows in the file, then import it.</div>\n </div>\n <div class=\"se-sample\">\n <div class=\"se-sample-row se-sample-row--head\">\n <span>Date</span><span>User email</span><span>Assign store</span><span>Assign audit</span>\n </div>\n <lib-audit-v2-shimmer *ngIf=\"templateLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\n <ng-container *ngIf=\"!templateLoading\">\n <!-- The selected audits' assigned stores / users: the same rows Download template writes. -->\n <div class=\"se-sample-row\" *ngFor=\"let r of previewRows\">\n <span [title]=\"r.date\">{{ r.date }}</span><span [title]=\"r.email\">{{ r.email }}</span>\n <span [title]=\"r.store\">{{ r.store }}</span><span [title]=\"r.audit\">{{ r.audit }}</span>\n </div>\n <div class=\"se-sample-more\" *ngIf=\"previewMore\">+ {{ previewMore }} more {{ previewMore === 1 ? 'row' : 'rows' }} in the file</div>\n <div class=\"se-sample-more\" *ngIf=\"!previewRows.length\">Pick an audit to see its template rows.</div>\n </ng-container>\n </div>\n <span class=\"se-note se-note--warn\" *ngIf=\"!templateLoading && unassignedAudits.length\">\n {{ unassignedAudits.join(', ') }} {{ unassignedAudits.length === 1 ? 'has' : 'have' }} no store assigned yet \u2014 fill in Date, User email\n and Store name for {{ unassignedAudits.length === 1 ? 'its row' : 'their rows' }}.</span>\n <span class=\"se-note\">Visit start and Visit end (HH:mm) are optional \u2014 leave them blank to use the store's open and close time (10:00 to 22:00 when the store has none).</span>\n <span class=\"se-note\">Rows with an unknown store, email or audit are reported before anything is saved. Draft audits\n are published when the schedule is published.</span>\n </div>\n </div>\n</ng-container>\n\n<!-- ============ Rows ============ -->\n<ng-container *ngIf=\"step === 'rows' && !loadingEdit\">\n <!-- Back + crumb on one line, as on the Create step; the name and actions below, left edges aligned.\n Edit has no \"Edit schedule\" step in the crumb (QA 9 Oct): it opens on, and stays on, the rows. -->\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\">\n <a href=\"#\" (click)=\"back($event)\">Schedule</a> \u203A\n <ng-container *ngIf=\"!scheduleId\"><a href=\"#\" (click)=\"backToCreate($event)\">Create schedule</a> \u203A</ng-container>\n Rows\n </div>\n </div>\n\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <div class=\"se-name\">{{ name.trim() || 'Untitled schedule' }}</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"saving\" (click)=\"saveDraft()\">Save as draft</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm se-publish\" [class.is-off]=\"!canPublish\" (click)=\"publish()\">\n {{ saving ? 'Saving\u2026' : (published ? 'Save & publish' : 'Publish schedule') }}\n </button>\n </div>\n\n <div class=\"se-ready\" [class.is-ok]=\"readyOk\">\n <svg *ngIf=\"readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\"></path><path d=\"M8 12.5l2.7 2.7L16 9.5\"></path></svg>\n <svg *ngIf=\"!readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 4l9 16H3z\"></path><path d=\"M12 10v4M12 17h.01\"></path></svg>\n <span>{{ readyLabel }}</span>\n </div>\n\n <div class=\"se-metrics\">\n <div class=\"av2-ocard\" *ngFor=\"let m of metrics\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count\">{{ m.value }}</div>\n <div class=\"av2-ocard-text\">{{ m.label }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <div class=\"se-tablehead\">\n <div class=\"se-titletext\">\n <div class=\"se-side-title\">Schedule rows</div>\n <div class=\"se-sub\">Every row is one user, at one store, on one date.</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"addRow()\">Add row</button>\n <label class=\"se-search se-search--sm\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"rowQuery\" placeholder=\"Search rows\">\n </label>\n </div>\n\n <div class=\"se-scroll\" (scroll)=\"onViewportChange()\">\n <div class=\"se-grid se-grid--head\">\n <div class=\"se-center\" (click)=\"toggleAllRows()\" title=\"Select all rows\">\n <span class=\"se-box\" [class.is-on]=\"allRowsSelected\">\n <svg *ngIf=\"allRowsSelected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n <div>Schedule date</div><div>User email</div><div>Assigned store</div><div>Audit assigned</div><div>Visit window</div><div></div>\n </div>\n\n <div class=\"se-grid se-grid--row\" *ngFor=\"let r of shownRows; trackBy: trackByRow\" [class.is-selected]=\"r.selected\" [class.is-locked]=\"isLocked(r)\">\n <div class=\"se-center\" [class.is-off]=\"isLocked(r)\" [attr.title]=\"isLocked(r) ? 'Past visit: already raised, so it cannot be selected' : null\" (click)=\"toggleRow(r)\">\n <span class=\"se-box\" [class.is-on]=\"r.selected\">\n <svg *ngIf=\"r.selected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n\n <input type=\"date\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'date')\" [attr.title]=\"cellError(r, 'date') || null\" [attr.min]=\"today\"\n [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.date\" (ngModelChange)=\"touch(r, 'date')\">\n\n <!-- User: search by name or email -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'userEmail')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\" [class.is-bad]=\"cellError(r, 'userEmail')\" [attr.title]=\"cellError(r, 'userEmail') || null\"\n placeholder=\"Search user\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.userEmail\" (ngModelChange)=\"onPickerInput(r, 'userEmail')\"\n (focus)=\"openPicker(r, 'userEmail', $event)\" (click)=\"openPicker(r, 'userEmail', $event)\" (keydown)=\"onPickerKey(r, 'userEmail', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'userEmail')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let u of userSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"u.email === r.userEmail.trim().toLowerCase()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickUser(r, u, $event)\">\n <span class=\"se-opt-avatar\">{{ initials(u.name || u.email) }}</span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ u.name || u.email }}</span>\n <span class=\"se-opt-sub\">{{ u.email }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"u.email === r.userEmail.trim().toLowerCase()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!userSuggestions(r).length\">{{ users.length ? 'No user matches \u201C' + r.userEmail + '\u201D' : 'Loading users\u2026' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(userSuggestions(r).length, userMatches(r).length, 'users')\">\n {{ moreLabel(userSuggestions(r).length, userMatches(r).length, 'users') }}\n </div>\n </div>\n </div>\n\n <!-- Store: search and show by store name (or city); the store code is never shown or asked for -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'storeId')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\"\n [class.is-bad]=\"cellError(r, 'storeId')\" [attr.title]=\"cellError(r, 'storeId') || null\"\n placeholder=\"Search store\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [ngModel]=\"r.storeText\" (ngModelChange)=\"onStoreTyped(r, $event)\"\n (focus)=\"openPicker(r, 'storeId', $event)\" (click)=\"openPicker(r, 'storeId', $event)\" (keydown)=\"onPickerKey(r, 'storeId', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'storeId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let s of storeSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"s.storeId === r.storeId.trim()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickStore(r, s, $event)\">\n <span class=\"se-opt-icon\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1.5-5h15L21 9\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ s.storeName || s.storeId }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"s.city\">{{ s.city }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"s.storeId === r.storeId.trim()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!storeSuggestions(r).length\">{{ stores.length ? 'No store matches \u201C' + r.storeText + '\u201D' : 'Loading stores\u2026' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores')\">\n {{ moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores') }}\n </div>\n </div>\n </div>\n\n <!-- Audit assigned: multi-select with search over the published audits (rowAuditOptions). Ticking another audit\n adds a row for it with the same date, user, store and window; unticking removes that row. No column when\n the schedule has one fixed audit. -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'checkListId')\">\n <button type=\"button\" class=\"se-cell se-select\" [class.is-bad]=\"cellError(r, 'checkListId')\" [attr.title]=\"cellError(r, 'checkListId') || null\"\n [disabled]=\"isLocked(r)\" (click)=\"openPicker(r, 'checkListId', $event)\" (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n <span class=\"se-ellipsis\" [class.se-placeholder]=\"!groupAuditFirst(r)\" [attr.title]=\"groupAuditLabel(r) || null\">{{ groupAuditFirst(r) || 'Select audits' }}</span>\n <span class=\"se-more\" *ngIf=\"groupAuditMore(r)\" [attr.title]=\"groupAuditLabel(r)\">+{{ groupAuditMore(r) }}</span>\n <svg class=\"se-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\n </button>\n <div class=\"se-menu se-menu--multi\" *ngIf=\"isOpen(r, 'checkListId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <label class=\"se-menu-search\" (mousedown)=\"$event.stopPropagation()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" placeholder=\"Search audits\" autocomplete=\"off\" [(ngModel)]=\"auditQuery\" (ngModelChange)=\"activeIndex = 0\"\n (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n </label>\n <div class=\"se-opt\" *ngFor=\"let a of auditMatches(); let i = index; trackBy: trackByAudit\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"auditTicked(r, a)\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"toggleAudit(r, a, $event)\">\n <span class=\"se-box\" [class.is-on]=\"auditTicked(r, a)\">\n <svg *ngIf=\"auditTicked(r, a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ a.name }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"a.questions\">{{ a.questions }} {{ a.questions === 1 ? 'question' : 'questions' }}</span>\n </span>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!auditMatches().length\">{{ rowAuditOptions.length ? 'No audit matches \u201C' + auditQuery + '\u201D' : 'No published audits yet' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"auditTickCount(r) > 1\">{{ auditTickCount(r) }} audits on this row \u00B7 same user, store, date and window</div>\n </div>\n </div>\n\n <div class=\"se-window\" [attr.title]=\"cellError(r, 'window') || null\">\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.start\" (ngModelChange)=\"touch(r, 'window')\">\n <span class=\"se-dash\">\u2013</span>\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.end\" (ngModelChange)=\"touch(r, 'window')\">\n </div>\n\n <div class=\"se-center\">\n <span class=\"se-lock\" *ngIf=\"isLocked(r)\" title=\"Past visit: already raised, so it cannot be edited or deleted\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"11\" width=\"14\" height=\"10\" rx=\"2\"></rect><path d=\"M8 11V7a4 4 0 0 1 8 0v4\"></path></svg>\n </span>\n <a class=\"se-del\" *ngIf=\"!isLocked(r)\" title=\"Delete row\" (click)=\"deleteRow(r)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7h16\"></path><path d=\"M7 7l1 13h8l1-13M9 7V4h6v3\"></path></svg>\n </a>\n </div>\n\n <!-- Why the row is red, in words. -->\n <ng-container *ngIf=\"rowMessages(r) as msgs\">\n <div class=\"se-rowerr\" *ngIf=\"msgs.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\n <span>{{ msgs.join(' \u00B7 ') }}</span>\n <a class=\"se-invite-link\" *ngIf=\"inviteable(r)\" (click)=\"openInvite(newUserEmails(groupRows(r)))\">Invite user</a>\n </div>\n </ng-container>\n <!-- Hints: allowed (Publish is not blocked), e.g. the same visit in another schedule. -->\n <ng-container *ngIf=\"rowHints(r) as hints\">\n <div class=\"se-rowerr se-rowhint\" *ngIf=\"hints.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\n <span>{{ hints.join(' \u00B7 ') }}</span>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"!shownRows.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ rows.length ? 'No rows match this search.' : 'No rows yet. Add a row or import the template.' }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-foot\">\n <!-- Row count + visit-window hint removed (user, 11 Oct); the count shows only while rows are selected. -->\n <span class=\"se-foot-text\" *ngIf=\"selectedCount\">{{ selectionLabel }}</span>\n <span class=\"se-foot-actions\">\n <button type=\"button\" class=\"se-bulk\" [class.is-off]=\"!selectedCount\" (click)=\"duplicateSelected()\">Duplicate</button>\n <button type=\"button\" class=\"se-bulk se-bulk--danger\" [class.is-off]=\"!selectedCount\" (click)=\"deleteSelected()\">Delete</button>\n </span>\n </div>\n </div>\n</ng-container>\n\n<!-- New User found (as the v1 checklist upload): emails with no user yet, after an import or from a row's Invite user. -->\n<ng-container *ngIf=\"inviteOpen\">\n <div class=\"se-inv-backdrop\" (click)=\"closeInvite()\"></div>\n <div class=\"se-inv\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"se-inv-title\">\n <span class=\"se-inv-icon\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.3 3.9L1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z\"></path><path d=\"M12 9v4M12 17h.01\"></path></svg>\n </span>\n <div class=\"se-inv-title\" id=\"se-inv-title\">{{ inviteEmails.length === 1 ? 'New user found' : 'New users found' }}</div>\n <div class=\"se-inv-text\">\n {{ inviteEmails.length === 1 ? 'This email is not a user yet.' : 'These emails are not users yet.' }}\n Invite them to add them as users of this client, or add them in User Management under the Manage menu.\n </div>\n\n <div class=\"se-inv-list\">\n <div class=\"se-pickrow se-pickrow--all\" *ngIf=\"inviteEmails.length > 1\" (click)=\"toggleAllInvite()\">\n <span class=\"se-box\" [class.is-on]=\"allInvitePicked\">\n <svg *ngIf=\"allInvitePicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">Select all ({{ inviteEmails.length }})</span>\n </div>\n <div class=\"se-pickrow\" *ngFor=\"let e of inviteEmails\" [class.is-on]=\"invitePicked.has(e)\" (click)=\"toggleInvite(e)\">\n <span class=\"se-box\" [class.is-on]=\"invitePicked.has(e)\">\n <svg *ngIf=\"invitePicked.has(e)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\"><span class=\"se-ellipsis\">{{ e }}</span></span>\n </div>\n </div>\n\n <div class=\"se-inv-foot\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"inviting\" (click)=\"closeInvite()\">Skip</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"inviting || !invitePicked.size\" (click)=\"inviteSelected()\">\n {{ inviting ? 'Inviting\u2026' : 'Invite selected' + (invitePicked.size ? ' (' + invitePicked.size + ')' : '') }}\n </button>\n </div>\n </div>\n</ng-container>\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{display:flex;flex-direction:column;gap:20px}.se-hidden{display:none}.se-grow{flex:1;min-width:0}.se-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-sk-crumb{width:180px;height:12px;margin:4px 0}.se-sk-name{height:22px;margin:4px 0}.se-crumb{font-size:13px;line-height:20px;color:#667085}.se-crumb a{font-weight:600;color:#00a3ff;text-decoration:none;cursor:pointer}.se-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.se-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.se-fixed-audit{display:flex;flex-direction:column;gap:4px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0}.se-fixed-audit-name{font-size:14px;line-height:20px;font-weight:600;color:#101828}.se-create{display:flex;flex-wrap:wrap;gap:20px;max-width:1180px}.se-card{min-width:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;display:flex;flex-direction:column}.se-card--form{flex:1 1 420px;padding:28px;gap:20px}.se-card--side{flex:1 1 380px;padding:28px;gap:16px}.se-badge{width:44px;height:44px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.se-head{display:flex;flex-direction:column;gap:4px}.se-title{font-size:24px;line-height:32px;font-weight:700;color:#101828}.se-side-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.se-sub{font-size:14px;line-height:20px;color:#667085}.se-field{display:flex;flex-direction:column;gap:6px;margin:0}.se-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.se-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.se-count{font-size:12px;line-height:18px;color:#667085;white-space:nowrap}.se-input{height:44px;padding:0 14px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:14px;color:#101828;outline:none}.se-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #ccedff}.se-search{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;margin:0;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;color:#667085}.se-search input{flex:1;min-width:0;height:38px;border:none;outline:none;background:transparent;font-size:14px;font-family:inherit;color:#101828}.se-search--sm{flex:0 1 240px;min-width:180px;height:36px}.se-search--sm input{height:34px;font-size:13px}.se-clear{display:flex;cursor:pointer;color:#98a2b3}.se-picklist{display:flex;flex-direction:column;gap:2px;max-height:220px;overflow-y:auto;padding:8px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.se-pickrow{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer}.se-pickrow:hover{background:#f9fafb}.se-pickrow.is-on{background:#f5fbff}.se-pickrow--all{border-bottom:1px solid #F2F4F7}.se-pickrow--fixed{cursor:default;background:#f9fafb}.se-pickrow--fixed:hover{background:#f9fafb}.se-pickall{font-size:14px;line-height:20px;font-weight:600;color:#344054}.se-pickname{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.se-pickname .se-ellipsis{font-size:14px;line-height:20px;font-weight:500;color:#101828}.se-meta{font-size:12px;line-height:18px;color:#667085}.se-empty-sm{padding:14px 10px;font-size:13px;line-height:20px;color:#667085}.se-box{width:16px;height:16px;flex-shrink:0;border-radius:4px;display:flex;align-items:center;justify-content:center;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#00a3ff}.se-box.is-on{background:#eaf8ff;box-shadow:inset 0 0 0 1px #00a3ff}.se-steps{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.se-steps a{font-weight:600;color:#00a3ff;cursor:pointer}.se-actions{display:flex;flex-direction:column;gap:12px}.se-or{text-align:center;font-size:14px;color:#98a2b3}.se-btn-lg{height:44px;border:none;border-radius:8px;font-family:inherit;font-size:15px;font-weight:600;cursor:pointer}.se-btn-lg--primary{background:#00a3ff;color:#fff}.se-btn-lg--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054}.se-btn-lg--ghost:hover{background:#f9fafb}.se-btn-lg.is-off{cursor:not-allowed}.se-btn-lg--primary.is-off{background:#f2f4f7;color:#98a2b3}.se-btn-lg--ghost.is-off{color:#98a2b3}.se-btn-lg--ghost.is-off:hover{background:#fff}.se-sample{display:flex;flex-direction:column;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden}.se-sample-row{display:grid;grid-template-columns:.8fr 1.4fr 1fr 1.3fr;gap:8px;padding:10px 12px;border-top:1px solid #EAECF0;font-size:12px;line-height:18px;color:#344054}.se-sample-row span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-sample-row--head{border-top:none;background:#f9fafb;font-weight:600;color:#475467}.se-note{font-size:12px;line-height:18px;color:#667085;text-wrap:pretty}.se-note--warn{color:#b54708}.se-sample-more{padding:10px 12px;border-top:1px solid #EAECF0;font-size:12px;line-height:18px;color:#667085}.se-titlebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.se-backbar+.se-titlebar{margin-top:-8px}.se-titletext{flex:1 1 240px;min-width:0;display:flex;flex-direction:column;gap:2px}.se-name{font-size:20px;line-height:30px;font-weight:700;color:#101828}.se-publish.is-off{background:#f2f4f7;color:#98a2b3;cursor:not-allowed;box-shadow:none}.se-ready{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:12px 20px;border-radius:8px;background:#fffcf5;box-shadow:inset 0 0 0 1px #fedf89;color:#b54708;font-size:14px;line-height:20px;font-weight:600}.se-ready svg{flex-shrink:0}.se-ready span{flex:1;min-width:0}.se-ready.is-ok{background:#f6fef9;box-shadow:inset 0 0 0 1px #a6f4c5;color:#027a48}.se-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.se-tablehead{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:20px 24px}.se-scroll{overflow-x:auto}.se-grid{min-width:1120px;display:grid;grid-template-columns:36px 1fr 1.5fr 1fr 1.5fr 1.6fr 40px;gap:12px;align-items:center;padding:10px 24px}.se-grid--head{background:#f9fafb;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;font-weight:600;color:#475467}.se-grid--row{border-bottom:1px solid #F2F4F7}.se-grid--row.is-selected{background:#f5fbff}.se-center{display:flex;justify-content:center;cursor:pointer}.se-grid--row.is-locked .se-cell{background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;color:#667085;-webkit-text-fill-color:#667085;opacity:1;cursor:not-allowed}.se-grid--row.is-locked .se-chev{display:none}.se-grid--row.is-locked .se-center.is-off{cursor:not-allowed}.se-grid--row.is-locked .se-center.is-off .se-box{background:#f2f4f7;box-shadow:inset 0 0 0 1px #eaecf0}.se-rowerr{grid-column:2/-1;margin-top:-4px;display:flex;align-items:flex-start;gap:6px;font-size:12px;line-height:18px;color:#d92d20}.se-rowerr svg{flex-shrink:0;margin-top:2px}.se-rowhint{color:#667085}.se-invite-link{flex-shrink:0;font-weight:600;color:#00a3ff;cursor:pointer;text-decoration:none}.se-invite-link:hover{text-decoration:underline}.se-inv-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.se-inv{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:480px;max-width:calc(100vw - 32px);max-height:90vh;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.se-inv-icon{width:48px;height:48px;border-radius:9999px;background:#fef0c7;box-shadow:0 0 0 8px #fffaeb;color:#dc6803;display:flex;align-items:center;justify-content:center;margin:4px 0 8px 4px}.se-inv-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.se-inv-text{font-size:14px;line-height:20px;color:#475467}.se-inv-list{max-height:260px;overflow-y:auto;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:4px}.se-inv-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:8px}.se-cell{width:100%;height:36px;min-width:0;padding:0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;color:#101828;outline:none}.se-cell:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.se-cell.is-bad{box-shadow:inset 0 0 0 1px #fda29b}.se-select{display:flex;align-items:center;justify-content:space-between;gap:6px;text-align:left;cursor:pointer}.se-select svg{flex-shrink:0;color:#667085}.se-placeholder{color:#98a2b3}.se-pick{position:relative;min-width:0}.se-cell--pick{padding-right:10px;text-overflow:ellipsis}.se-cell--tagged{padding-right:88px}.se-pick.is-open .se-cell{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 3px #ccedff}.se-pick.is-open .se-chev{transform:rotate(180deg)}.se-chev{transition:transform .15s ease}.se-tag{position:absolute;top:50%;right:8px;transform:translateY(-50%);max-width:76px;padding:2px 8px;border-radius:9999px;background:#f2f4f7;color:#344054;font-size:11px;line-height:16px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none}.se-menu{position:fixed;z-index:1060;width:max-content;max-width:380px;max-height:288px;overflow-y:auto;padding:6px;border-radius:10px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.se-opt{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:6px;cursor:pointer}.se-opt.is-active{background:#f9fafb}.se-opt.is-on{background:#f5fbff}.se-opt.is-on.is-active{background:#eaf8ff}.se-opt-avatar{width:28px;height:28px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.se-opt-icon{width:28px;height:28px;flex-shrink:0;border-radius:8px;background:#f2f4f7;color:#475467;display:flex;align-items:center;justify-content:center}.se-opt-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}.se-opt-main{font-size:13px;line-height:18px;font-weight:500;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-opt-sub{font-size:12px;line-height:16px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.se-opt-check{flex-shrink:0;color:#00a3ff}.se-menu-empty{padding:12px 10px;font-size:13px;color:#667085}.se-menu--multi{min-width:260px}.se-menu-search{position:sticky;top:-6px;z-index:1;margin:-6px -6px 4px;padding:8px 10px;display:flex;align-items:center;gap:8px;background:#fff;border-bottom:1px solid #F2F4F7;color:#667085;cursor:text}.se-menu-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:13px;line-height:18px;color:#101828}.se-menu-note{margin:4px -6px -6px;padding:8px 16px;border-top:1px solid #F2F4F7;background:#fcfcfd;font-size:12px;line-height:16px;color:#667085;position:sticky;bottom:-6px}.se-window{display:flex;align-items:center;gap:6px;min-width:0}.se-window .se-cell{flex:1;padding:0 6px}.se-dash{color:#98a2b3;font-size:13px}.se-lock{width:28px;height:28px;display:flex;align-items:center;justify-content:center;color:#98a2b3;cursor:help}.se-del{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#667085;cursor:pointer}.se-del:hover{background:#fffbfa;color:#d92d20}.se-empty{padding:36px 24px;text-align:center;font-size:13px;color:#667085}.se-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;padding:16px 24px}.se-foot-text{display:flex;flex-direction:column;gap:2px;font-size:14px;line-height:20px;color:#667085}.se-foot-actions{display:flex;align-items:center;gap:8px;margin-left:auto}.se-bulk{height:36px;padding:0 14px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:13px;font-weight:600;color:#344054;cursor:pointer}.se-bulk:hover{background:#f9fafb}.se-bulk--danger{color:#d92d20}.se-bulk--danger:hover{background:#fffbfa}.se-bulk.is-off{color:#98a2b3;cursor:not-allowed}.se-bulk.is-off:hover{background:transparent}.se-select .se-ellipsis{flex:0 1 auto;min-width:0}.se-select .se-chev{margin-left:auto}.se-more{flex-shrink:0;min-width:24px;height:20px;padding:0 7px;border-radius:9999px;background:#f2f4f7;color:#344054;font-size:12px;font-weight:600;line-height:20px;text-align:center}\n"] }]
|
|
1455
1463
|
}], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.ToastService }, { type: i0.ChangeDetectorRef }], propDecorators: { clientId: [{
|
|
1456
1464
|
type: Input
|
|
1457
1465
|
}], audits: [{
|
|
@@ -1627,4 +1635,4 @@ function toTime(v) {
|
|
|
1627
1635
|
const m = v.match(/^(\d{1,2}):(\d{2})$/);
|
|
1628
1636
|
return m && Number(m[1]) < 24 && Number(m[2]) < 60 ? m[1].padStart(2, '0') + ':' + m[2] : '';
|
|
1629
1637
|
}
|
|
1630
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItc2NoZWR1bGUtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvc2NoZWR1bGUvYXVkaXQtdjItc2NoZWR1bGUtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvc2NoZWR1bGUvYXVkaXQtdjItc2NoZWR1bGUtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUF1QixZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckwsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQXVDN0I7Ozs7Ozs7O0dBUUc7QUFNSCxNQUFNLE9BQU8sOEJBQThCO0lBd0cvQjtJQUNBO0lBQ0E7SUF6R0QsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUN2QixpQ0FBaUM7SUFDeEIsTUFBTSxHQUFvQixFQUFFLENBQUM7SUFDdEMsa0dBQWtHO0lBQ3pGLFNBQVMsR0FBYSxFQUFFLENBQUM7SUFDbEM7Ozs7T0FJRztJQUNNLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsK0RBQStEO0lBQ3RELFNB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QUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQU8sRUFBRSxFQUFFO1lBQ3JFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ2hFLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDekcsTUFBTSxDQUFDLENBQUMsQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUN2RCxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDaEcsTUFBTSxDQUFDLENBQUMsQ0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMs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QyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1NBQUU7UUFDcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFlLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEYsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FB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R0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hHLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO1FBQzlFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUMzRCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBRSxPQUFl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QUM1RixNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDNUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFNLEVBQUUsQ0FBUyxFQUFFLEVBQUU7UUFDakMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQUU7UUFDMUUsTUFBTSxDQUFDLEdBQUksSUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUFFLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQUU7UUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxH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QUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQy9GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBEb0NoZWNrLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QsIGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIG9mLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuXHJcbi8qKiBBbiBhdWRpdCB0aGUgc2NoZWR1bGUgY2FuIHJhaXNlLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlQXVkaXQge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIG1ldGE6IHN0cmluZztcclxuICBxdWVzdGlvbnM6IG51bWJlcjtcclxuICAvKiogUHVibGlzaGVkIGF1ZGl0OyB0aGUgcm93cycgQXVkaXQgYXNzaWduZWQgbGlzdCBvZmZlcnMgb25seSB0aGVzZSAocGx1cyB0aGUgc2NoZWR1bGUncyBvd24gYXVkaXRzKS4gKi9cclxuICBwdWJsaXNoPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIE9uZSBzY2hlZHVsZSByb3c6IGEgdXNlciwgYXQgYSBzdG9yZSwgb24gYSBkYXRlLCBmb3IgYW4gYXVkaXQuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRWRpdG9yUm93IHtcclxuICBrZXk6IG51bWJlcjtcclxuICBkYXRlOiBzdHJpbmc7XHJcbiAgdXNlckVtYWlsOiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBwaWNrZWQgc3RvcmUncyBpZCAoJycgdW50aWwgdGhlIHR5cGVkIHRleHQgbmFtZXMgYW4gYWN0aXZlIHN0b3JlKS4gTmV2ZXIgc2hvd24uICovXHJcbiAgc3RvcmVJZDogc3RyaW5nO1xyXG4gIC8qKiBXaGF0IHRoZSBzdG9yZSBjZWxsIHNob3dzOiB0aGUgc3RvcmUgbmFtZSAob3IgdGhlIHRleHQgYmVpbmcgdHlwZWQpLiAqL1xyXG4gIHN0b3JlVGV4dDogc3RyaW5nO1xyXG4gIGNoZWNrTGlzdElkOiBzdHJpbmc7XHJcbiAgc3RhcnQ6IHN0cmluZztcclxuICBlbmQ6IHN0cmluZztcclxuICBzZWxlY3RlZDogYm9vbGVhbjtcclxuICAvKipcclxuICAgKiBSb3dzIG9mIG9uZSB2aXNpdCAoc2FtZSBkYXRlLCB1c2VyLCBzdG9yZSBhbmQgd2luZG93KSBzaGFyZSBhIGdyb3VwOiB0aGUgdGFibGUgc2hvd3MgdGhlIGdyb3VwIGFzIG9uZSByb3cgd2l0aFxyXG4gICAqIGl0cyBhdWRpdHMgaW4gdGhlIEF1ZGl0IGFzc2lnbmVkIGRyb3Bkb3duIChRQSAxMCBPY3QpLCBhbmQgZWRpdHMgdG8gdGhhdCByb3cgYXBwbHkgdG8gZXZlcnkgYXVkaXQgb2YgaXQuIFRoZSBBUElcclxuICAgKiBzdGlsbCB0YWtlcyBvbmUgcm93IHBlciBhdWRpdC5cclxuICAgKi9cclxuICBncm91cDogbnVtYmVyO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUGlja1N0b3JlIHsgc3RvcmVJZDogc3RyaW5nOyBzdG9yZU5hbWU6IHN0cmluZzsgY2l0eTogc3RyaW5nOyB9XHJcbmludGVyZmFjZSBQaWNrVXNlciB7IGVtYWlsOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgfVxyXG50eXBlIFBpY2tDZWxsID0gJ3VzZXJFbWFpbCcgfCAnc3RvcmVJZCcgfCAnY2hlY2tMaXN0SWQnO1xyXG50eXBlIFJvd0ZpZWxkID0gJ2RhdGUnIHwgUGlja0NlbGwgfCAnd2luZG93JztcclxuXHJcbi8qKlxyXG4gKiBNYW5hZ2Ug4oC6IFNjaGVkdWxlIEluZm8g4oC6IENyZWF0ZSBzY2hlZHVsZSwgdGhlbiDigLogUm93cyAodGhlIHByb3RvdHlwZSdzIHR3byBzY2hlZHVsZSBwYWdlcykuXHJcbiAqIENyZWF0ZTogbmFtZSB0aGUgc2NoZWR1bGUgYW5kIHBpY2sgaXRzIGF1ZGl0cywgdGhlbiBpbXBvcnQgdGhlIENTViB0ZW1wbGF0ZSBvciBhZGQgYSByb3cuXHJcbiAqIFJvd3M6IG9uZSB1c2VyLCBzdG9yZSwgZGF0ZSBhbmQgYXVkaXQgcGVyIHJvdywgY2hlY2tlZCBhZ2FpbnN0IHRoZSBjbGllbnQncyBhY3RpdmUgc3RvcmVzXHJcbiAqIGFuZCB1c2VycyBiZWZvcmUgYW55dGhpbmcgaXMgc2F2ZWQuIFNhdmUgYXMgZHJhZnQga2VlcHMgaXQgdW5wdWJsaXNoZWQ7IFB1Ymxpc2ggc2NoZWR1bGVcclxuICogc2F2ZXMgaXQgYW5kIHB1Ymxpc2hlcyBpdCAoUE9TVC9QVVQgL3RyYXgvYXVkaXQvc2NoZWR1bGUvKiksIHdoaWNoIGFzc2lnbnMgdGhlIHJvd3MnIHN0b3Jlc1xyXG4gKiB0byB0aGVpciBhdWRpdHMgaW4gVHJheCBhbmQgcHVibGlzaGVzIGF1ZGl0cyB0aGF0IGFyZSBzdGlsbCBkcmFmdHMuXHJcbiAqIFdpdGggYHNjaGVkdWxlSWRgIGl0IG9wZW5zIGFuIGV4aXN0aW5nIHNjaGVkdWxlIHN0cmFpZ2h0IG9uIGl0cyByb3dzIChFZGl0IHJvd3MpLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYXVkaXQtdjItc2NoZWR1bGUtZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXVkaXQtdjItc2NoZWR1bGUtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXVkaXQtdjItc2NoZWR1bGUtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaXRWMlNjaGVkdWxlRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIERvQ2hlY2ssIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgY2xpZW50SWQgPSAnJztcclxuICAvKiogQXVkaXRzIHRoYXQgY2FuIGJlIHBpY2tlZC4gKi9cclxuICBASW5wdXQoKSBhdWRpdHM6IFNjaGVkdWxlQXVkaXRbXSA9IFtdO1xyXG4gIC8qKiBBdWRpdHMgdGlja2VkIHdoZW4gdGhlIHBhZ2Ugb3BlbnMgKE5vdCBzY2hlZHVsZWQg4oC6IFNjaGVkdWxlLCBTY2hlZHVsZSBzZWxlY3RlZCwgQ29uZmlndXJlKS4gKi9cclxuICBASW5wdXQoKSBwcmVzZWxlY3Q6IHN0cmluZ1tdID0gW107XHJcbiAgLyoqXHJcbiAgICogVGhlIHByZXNlbGVjdGVkIGF1ZGl0cyBhcmUgdGhlIHNjaGVkdWxlJ3MgYXVkaXRzIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCAob3BlbmVkIGZyb20gYW5cclxuICAgKiBhdWRpdCdzIENvbmZpZ3VyZSBwYWdlKTogdGhlIGF1ZGl0IHBpY2tlciBjYXJkIGlzIGhpZGRlbiBhbmQgdGhlIGF1ZGl0IGlzIG5hbWVkIG9uY2UuXHJcbiAgICogT3RoZXJ3aXNlIHRoZSBwaWNrZXIgbGlzdHMgZXZlcnkgYXVkaXQgd2l0aCB0aGUgcHJlc2VsZWN0ZWQgb25lcyB0aWNrZWQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgbG9ja0F1ZGl0cyA9IGZhbHNlO1xyXG4gIC8qKiBUZXh0IG9mIHRoZSBCYWNrIGJ1dHRvbiAoTWFuYWdlIHBhc3NlcyB3aGVyZSBCYWNrIGdvZXMpLiAqL1xyXG4gIEBJbnB1dCgpIGJhY2tMYWJlbCA9ICdCYWNrJztcclxuICAvKiogRWRpdCBhbiBleGlzdGluZyBzY2hlZHVsZSdzIHJvd3MgaW5zdGVhZCBvZiBjcmVhdGluZyBvbmUuICovXHJcbiAgQElucHV0KCkgc2NoZWR1bGVJZCA9ICcnO1xyXG4gIC8qKiBFbWl0cyB0cnVlIHdoZW4gdGhlIHNjaGVkdWxlIHdhcyBzYXZlZCwgZmFsc2Ugb24gYmFjayAvIGNhbmNlbC4gKi9cclxuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdjc3ZJbnB1dCcpIGNzdklucHV0PzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgc3RlcDogJ2NyZWF0ZScgfCAncm93cycgPSAnY3JlYXRlJztcclxuICBuYW1lID0gJyc7XHJcbiAgcGlja3M6IHN0cmluZ1tdID0gW107XHJcbiAgLyoqIE9wZW5lZCB3aXRoIGF1ZGl0cyBwaWNrZWQgb24gdGhlIHByZXZpb3VzIHBhZ2U6IHRob3NlIGFyZSB0aGUgc2NoZWR1bGUncyBhdWRpdHMgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIGhlcmUuICovXHJcbiAgbG9ja2VkID0gZmFsc2U7XHJcbiAgcGlja1F1ZXJ5ID0gJyc7XHJcbiAgLyoqIEhpZGRlbiBmb3Igbm93IG9uIGJvdGggQ3JlYXRlIGFuZCBFZGl0IChRQSk6IHRoZSBcIkF1ZGl0cyB0byBzY2hlZHVsZVwiIHBpY2tlciBhbmQgdGhlIFwiV2hhdCB0aGUgdGVtcGxhdGUgZXhwZWN0c1wiIHBhbmVsLiAqL1xyXG4gIHJlYWRvbmx5IHNob3dBdWRpdFBpY2tlciA9IGZhbHNlO1xyXG4gIHJlYWRvbmx5IHNob3dUZW1wbGF0ZVByZXZpZXcgPSBmYWxzZTtcclxuICByb3dzOiBFZGl0b3JSb3dbXSA9IFtdO1xyXG4gIHJvd1F1ZXJ5ID0gJyc7XHJcbiAgc2F2aW5nID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogVGVtcGxhdGUgcm93cyAobm8gaGVhZGVyKSBmb3IgdGhlIHBpY2tlZCBhdWRpdHMsIGFzIHRoZSBzYW1wbGUgcGFuZWwgc2hvd3MgdGhlbSBhbmQgRG93bmxvYWRcclxuICAgKiB0ZW1wbGF0ZSB3cml0ZXMgdGhlbTsgYHRlbXBsYXRlRm9yYCBpcyB0aGUgcGlja3MgdGhleSB3ZXJlIGJ1aWx0IGZvci5cclxuICAgKi9cclxuICB0ZW1wbGF0ZUxpbmVzOiBzdHJpbmdbXVtdID0gW107XHJcbiAgdGVtcGxhdGVMb2FkaW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0ZW1wbGF0ZUZvciA9ICcnO1xyXG4gIC8qKiBSb3dzIHRoZSBzYW1wbGUgcGFuZWwgbGlzdHMgYmVmb3JlIFwiKyBuIG1vcmVcIi4gKi9cclxuICByZWFkb25seSBwcmV2aWV3TGltaXQgPSA2O1xyXG4gIGxvYWRpbmdFZGl0ID0gZmFsc2U7XHJcbiAgcHVibGlzaGVkID0gZmFsc2U7XHJcblxyXG4gIHN0b3JlczogUGlja1N0b3JlW10gPSBbXTtcclxuICB1c2VyczogUGlja1VzZXJbXSA9IFtdO1xyXG4gIC8qKiBXaGljaCBwaWNrZXIgY2VsbCBpcyBvcGVuLiAqL1xyXG4gIG9wZW5DZWxsOiB7IGtleTogbnVtYmVyOyBmaWVsZDogUGlja0NlbGwgfSB8IG51bGwgPSBudWxsO1xyXG4gIC8qKiBQcm9ibGVtcyB0aGUgQVBJIHJlcG9ydGVkLCBrZXllZCBieSByb3cga2V5IGFuZCBmaWVsZC4gKi9cclxuICBwcml2YXRlIHNlcnZlckVycm9ycyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgLyoqXHJcbiAgICogV2hhdCB0aGUgQVBJJ3MgZHJ5IHJ1biAoUE9TVCAvc2NoZWR1bGUvY2hlY2spIHNheXMgYWJvdXQgdGhlIHJvd3MsIGtleWVkIGJ5IHJvdyBrZXkgYW5kIGZpZWxkOiBjaGllZmx5IGFcclxuICAgKiB1c2VyJ3Mgd2luZG93IG92ZXJsYXBwaW5nIHRoZWlyIHZpc2l0IGF0IGFub3RoZXIgc3RvcmUgaW4gYW5vdGhlciBwdWJsaXNoZWQgc2NoZWR1bGUsIHdoaWNoIG9ubHkgdGhlIEFQSVxyXG4gICAqIGNhbiBzZWUuIFJlZnJlc2hlZCBhIG1vbWVudCBhZnRlciB0aGUgcm93cyBjaGFuZ2U7IHNob3duIGFmdGVyIHRoZSBlZGl0b3IncyBvd24gY2hlY2tzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbGl2ZUVycm9ycyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgLyoqIFRoZSBkcnkgcnVuJ3MgaGludHMgKHJvdyBrZXkgLT4gbWVzc2FnZXMpOiB0aGUgc2FtZSBhdWRpdCwgZGF0ZSBhbmQgd2luZG93IGluIGFub3RoZXIgc2NoZWR1bGUuIFRoZXkgZG8gbm90IGJsb2NrIFB1Ymxpc2guICovXHJcbiAgcHJpdmF0ZSBsaXZlV2FybmluZ3MgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nW10+KCk7XHJcbiAgcHJpdmF0ZSBsYXN0Q2hlY2tlZCA9ICcnO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hlY2skID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAvKiogUm93cyByZXBlYXRpbmcgYW4gYXVkaXQgZm9yIHRoZSBzYW1lIHVzZXIgb3Igc3RvcmUgb24gdGhlIHNhbWUgZGF0ZSBhbmQgd2luZG93LCBrZXllZCBieSByb3cga2V5IGFuZCBmaWVsZCAocmVidWlsdCBldmVyeSBjaGVjaykuICovXHJcbiAgcHJpdmF0ZSBkdXBFcnJvcnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gIC8qKiBFYWNoIHBpY2tlZCBhdWRpdCdzIG93biB0aW1lIGZyYW1lICgnSEg6bW0nKSwgdGhlIHdpbmRvdyBvZiBhIHJvdyBsZWZ0IGJsYW5rIChmcm9tIHRoZSB0ZW1wbGF0ZSBjYWxsKS4gKi9cclxuICBwcml2YXRlIGF1ZGl0V2luZG93cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH0+KCk7XHJcbiAgLyoqXHJcbiAgICogUm93cyB0aGUgc2NoZWR1bGUgaGFkIGFscmVhZHkgcmFpc2VkIHdoZW4gaXQgd2FzIG9wZW5lZCBwdWJsaXNoZWQgKHNlZSB2aXNpdEtleSkuIFRoZXkgbWF5IGJlXHJcbiAgICogcGFzdCBieSBub3cgYW5kIHN0aWxsIHN0YXk7IG9ubHkgbmV3IG9yIGNoYW5nZWQgcm93cyBtdXN0IGJlIGRhdGVkIHRvZGF5IG9yIGxhdGVyIChhcyB0aGUgQVBJKS5cclxuICAgKi9cclxuICBwcml2YXRlIHJhaXNlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAvKiogUm93IGtleXMgb2YgYSBwdWJsaXNoZWQgc2NoZWR1bGUncyByb3dzIGRhdGVkIGJlZm9yZSB0b2RheTogdmlzaXRzIGFscmVhZHkgcmFpc2VkLCByZWFkLW9ubHkuICovXHJcbiAgbG9ja2VkS2V5cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG4gIC8qKiBXaHkgdGhlIGxhc3QgcHVibGlzaCBmYWlsZWQgd2hlbiB0aGUgQVBJIG5hbWVkIG5vIHJvdyAoY2xlYXJlZCBieSB0aGUgbmV4dCBlZGl0KS4gKi9cclxuICBwdWJsaXNoUHJvYmxlbSA9ICcnO1xyXG4gIHByaXZhdGUgc3RvcmVJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICBwcml2YXRlIHVzZXJFbWFpbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICBwcml2YXRlIHN0b3JlQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBQaWNrU3RvcmU+KCk7XHJcbiAgcHJpdmF0ZSB1c2VyQnlFbWFpbCA9IG5ldyBNYXA8c3RyaW5nLCBQaWNrVXNlcj4oKTtcclxuICAvKiogV2hlcmUgdGhlIG9wZW4gcGlja2VyIG1lbnUgc2l0cy4gSXQgaXMgZml4ZWQgdG8gdGhlIHZpZXdwb3J0IHNvIHRoZSB0YWJsZSdzIHNjcm9sbCBib3ggY2Fubm90IGNsaXAgaXQuICovXHJcbiAgbWVudVBvczogeyB0b3A6IG51bWJlciB8IG51bGw7IGJvdHRvbTogbnVtYmVyIHwgbnVsbDsgbGVmdDogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0gPSB7IHRvcDogbnVsbCwgYm90dG9tOiBudWxsLCBsZWZ0OiAwLCB3aWR0aDogMCB9O1xyXG4gIC8qKiBLZXlib2FyZC1oaWdobGlnaHRlZCBvcHRpb24gaW4gdGhlIG9wZW4gbWVudS4gKi9cclxuICBhY3RpdmVJbmRleCA9IDA7XHJcbiAgcHJpdmF0ZSBtZW51QW5jaG9yOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIC8qKiBPcHRpb25zIGEgcGlja2VyIGxpc3RzIGF0IG9uY2U7IHR5cGluZyBuYXJyb3dzIHRoZSByZXN0LiAqL1xyXG4gIHJlYWRvbmx5IHBpY2tMaW1pdCA9IDMwO1xyXG4gIC8qKiBBdWRpdHMgb2YgdGhlIGVkaXRlZCBzY2hlZHVsZSB0aGF0IGFyZSBub3QgaW4gYGF1ZGl0c2AgKGFscmVhZHkgc2NoZWR1bGVkIGVsc2V3aGVyZSkuICovXHJcbiAgcHJpdmF0ZSBvd25BdWRpdHM6IFNjaGVkdWxlQXVkaXRbXSA9IFtdO1xyXG4gIHByaXZhdGUgbmV4dEtleSA9IDE7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgLyoqIEVtaXRzIG9uY2UgdGhlIGNsaWVudCdzIHN0b3JlcyBhbmQgdXNlcnMgaGF2ZSBsb2FkZWQgKG9yIGZhaWxlZCk6IHRoZSB0ZW1wbGF0ZSB3YWl0cyBmb3IgaXRzIFN0b3JlIGRyb3Bkb3duLiAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVvcGxlUmVhZHkkID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XHJcbiAgLyoqIERvd25sb2FkIHRlbXBsYXRlIGNsaWNrZWQgd2hpbGUgdGhlIHN0b3JlIGxpc3QgaXMgc3RpbGwgbG9hZGluZy4gKi9cclxuICB0ZW1wbGF0ZVdhaXRpbmcgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogXCJOZXcgVXNlciBmb3VuZFwiIChhcyB0aGUgdjEgY2hlY2tsaXN0IHVwbG9hZCk6IHJvdyBlbWFpbHMgd2l0aCBubyBhY3RpdmUgdXNlciwgb2ZmZXJlZCBmb3IgaW52aXRlIGFmdGVyIGFuXHJcbiAgICogaW1wb3J0IG9yIGZyb20gYSByb3cncyBtZXNzYWdlLiBJbnZpdGUgU2VsZWN0ZWQgY3JlYXRlcyB0aGVtIGFzIHVzZXJzIG9mIHRoZSBjbGllbnQgKFBPU1QgL3NjaGVkdWxlL2ludml0ZSkuXHJcbiAgICovXHJcbiAgaW52aXRlRW1haWxzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGludml0ZVBpY2tlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIGludml0ZU9wZW4gPSBmYWxzZTtcclxuICBpbnZpdGluZyA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMub25PdXRzaWRlLCB0cnVlKTtcclxuICAgIHRoaXMucGlja3MgPSBbLi4udGhpcy5wcmVzZWxlY3RdO1xyXG4gICAgdGhpcy5sb2NrZWQgPSB0aGlzLmxvY2tBdWRpdHMgJiYgdGhpcy5waWNrcy5sZW5ndGggPiAwO1xyXG4gICAgdGhpcy5sb2FkVGVtcGxhdGUoKTtcclxuICAgIGNvbnN0IHNhZmUgPSAobzogYW55KSA9PiBvLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpO1xyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICBzdG9yZXM6IHNhZmUodGhpcy50cmF4U2VydmljZS5nZXRhc3NpZ25Ecm9wZG93bih7IGNsaWVudElkOiB0aGlzLmNsaWVudElkLCBjb3ZlcmFnZTogJ3N0b3JlJywgYXNzaWduVHlwZTogJ3N0b3JlJyB9KSksXHJcbiAgICAgIHVzZXJzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuZ2V0Q2xpZW50VXNlcih0aGlzLmNsaWVudElkLCB0cnVlKSlcclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHsgc3RvcmVzLCB1c2VycyB9OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zdG9yZXMgPSAoc3RvcmVzPy5jb2RlID09PSAyMDAgPyBzdG9yZXMuZGF0YT8uZGF0YSB8fCBbXSA6IFtdKVxyXG4gICAgICAgIC5tYXAoKHM6IGFueSkgPT4gKHsgc3RvcmVJZDogU3RyaW5nKHMuc3RvcmVJZCB8fCAnJyksIHN0b3JlTmFtZTogcy5zdG9yZU5hbWUgfHwgJycsIGNpdHk6IHMuY2l0eSB8fCAnJyB9KSlcclxuICAgICAgICAuZmlsdGVyKChzOiBQaWNrU3RvcmUpID0+IHMuc3RvcmVJZCk7XHJcbiAgICAgIHRoaXMudXNlcnMgPSAodXNlcnM/LmNvZGUgPT09IDIwMCA/IHVzZXJzLmRhdGEgfHwgW10gOiBbXSlcclxuICAgICAgICAubWFwKCh1OiBhbnkpID0+ICh7IGVtYWlsOiBTdHJpbmcodS5lbWFpbCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCksIG5hbWU6IHUudXNlck5hbWUgfHwgJycgfSkpXHJcbiAgICAgICAgLmZpbHRlcigodTogUGlja1VzZXIpID0+IHUuZW1haWwpO1xyXG4gICAgICB0aGlzLnN0b3JlSWRzID0gbmV3IFNldCh0aGlzLnN0b3Jlcy5tYXAocyA9PiBzLnN0b3JlSWQpKTtcclxuICAgICAgdGhpcy51c2VyRW1haWxzID0gbmV3IFNldCh0aGlzLnVzZXJzLm1hcCh1ID0+IHUuZW1haWwpKTtcclxuICAgICAgdGhpcy5zdG9yZUJ5SWQgPSBuZXcgTWFwKHRoaXMuc3RvcmVzLm1hcChzID0+IFtzLnN0b3JlSWQsIHNdKSk7XHJcbiAgICAgIHRoaXMudXNlckJ5RW1haWwgPSBuZXcgTWFwKHRoaXMudXNlcnMubWFwKHUgPT4gW3UuZW1haWwsIHVdKSk7XHJcbiAgICAgIC8vIFJvd3MgdHlwZWQgb3IgaW1wb3J0ZWQgYmVmb3JlIHRoZSBzdG9yZXMgYXJyaXZlZDogcGljayB0aGUgc3RvcmUgdGhlaXIgbmFtZSBzdGFuZHMgZm9yLlxyXG4gICAgICB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gIXIuc3RvcmVJZCAmJiByLnN0b3JlVGV4dCkuZm9yRWFjaChyID0+IHIuc3RvcmVJZCA9IHRoaXMuc3RvcmVJZEZvcihyLnN0b3JlVGV4dCkpO1xyXG4gICAgICB0aGlzLnBlb3BsZVJlYWR5JC5uZXh0KCk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5zY2hlZHVsZUlkKSB7IHRoaXMubG9hZFNjaGVkdWxlKCk7IH1cclxuICAgIHRoaXMuY2hlY2skLnBpcGUoZGVib3VuY2VUaW1lKDYwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucnVuTGl2ZUNoZWNrKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFuYWdlIGxvYWRzIGl0cyBhdWRpdCBsaXN0cyBhZnRlciB0aGUgZWRpdG9yIG9wZW5zIChzdHJhaWdodCBmcm9tIENvbmZpZ3VyZSwgb24gYSBmcmVzaFxyXG4gICAqIHBhZ2UpOiBvbmNlIHRoZXkgYXJyaXZlLCB0aGUgcGlja2VkIGF1ZGl0cyBoYXZlIG5hbWVzIGFuZCB0aGUgdGVtcGxhdGUgcm93cyBjYW4gbG9hZC5cclxuICAgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snYXVkaXRzJ10gJiYgIWNoYW5nZXNbJ2F1ZGl0cyddLmZpcnN0Q2hhbmdlXHJcbiAgICAgICYmIHRoaXMub2ZmZXJlZEF1ZGl0cy5tYXAoYSA9PiBhLmlkKS5qb2luKCcsJykgIT09IHRoaXMudGVtcGxhdGVGb3IpIHtcclxuICAgICAgdGhpcy5sb2FkVGVtcGxhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBEdXBsaWNhdGUgY2hlY2tzIG5lZWQgZXZlcnkgcm93LCBzbyB0aGV5IGFyZSB3b3JrZWQgb3V0IG9uY2UgcGVyIGNoZWNrIGluc3RlYWQgb2YgcGVyIGNlbGwuICovXHJcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kdXBFcnJvcnMgPSB0aGlzLmZpbmREdXBsaWNhdGVzKCk7XHJcbiAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLnJvd3MubWFwKHIgPT4gW3Iua2V5LCByLmRhdGUsIHIudXNlckVtYWlsLCByLnN0b3JlSWQsIHIuc3RvcmVUZXh0LCByLmNoZWNrTGlzdElkLCByLnN0YXJ0LCByLmVuZF0uam9pbignfCcpKS5qb2luKCdcXG4nKTtcclxuICAgIGlmIChzaWduYXR1cmUgIT09IHRoaXMubGFzdENoZWNrZWQpIHtcclxuICAgICAgdGhpcy5sYXN0Q2hlY2tlZCA9IHNpZ25hdHVyZTtcclxuICAgICAgdGhpcy5jaGVjayQubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBBUEkncyBkcnkgcnVuIG9mIHRoZSByb3dzIChkZWJvdW5jZWQpOiBrZWVwcyBsaXZlRXJyb3JzIGluIHN0ZXAgd2l0aCB3aGF0IFNhdmUgd291bGQgYW5zd2VyLiAqL1xyXG4gIHByaXZhdGUgcnVuTGl2ZUNoZWNrKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VudCA9IFsuLi50aGlzLnJvd3NdO1xyXG4gICAgY29uc3QgY2hlY2tsaXN0SWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi50aGlzLnBpY2tzLCAuLi5zZW50Lm1hcChyID0+IHIuY2hlY2tMaXN0SWQpXS5maWx0ZXIoQm9vbGVhbikpKTtcclxuICAgIGlmICghc2VudC5sZW5ndGggfHwgIWNoZWNrbGlzdElkcy5sZW5ndGgpIHsgdGhpcy5saXZlRXJyb3JzID0gbmV3IE1hcCgpOyB0aGlzLmxpdmVXYXJuaW5ncyA9IG5ldyBNYXAoKTsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U2NoZWR1bGVDaGVjayh7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAuLi4odGhpcy5zY2hlZHVsZUlkID8geyBzY2hlZHVsZUlkOiB0aGlzLnNjaGVkdWxlSWQgfSA6IHt9KSxcclxuICAgICAgY2hlY2tsaXN0SWRzLFxyXG4gICAgICByb3dzOiBzZW50Lm1hcChyID0+ICh7XHJcbiAgICAgICAgZGF0ZTogci5kYXRlLCB1c2VyRW1haWw6IHIudXNlckVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBzdG9yZUlkOiByLnN0b3JlSWQudHJpbSgpLCBzdG9yZU5hbWU6IHIuc3RvcmVUZXh0LnRyaW0oKSxcclxuICAgICAgICBjaGVja0xpc3RJZDogci5jaGVja0xpc3RJZCB8fCAnJywgc3RhcnQ6IHIuc3RhcnQsIGVuZDogci5lbmRcclxuICAgICAgfSkpXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgLy8gQW4gQVBJIHdpdGhvdXQgdGhlIGRyeSBydW4gKG9yIGEgZmFpbGVkIGNhbGwpIGxlYXZlcyB0aGVzZSBjaGVja3MgdG8gU2F2ZSwgYXMgYmVmb3JlLlxyXG4gICAgICBpZiAocmVzPy5jb2RlICE9PSAyMDApIHsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gICAgICAocmVzLmRhdGE/LnJvd0Vycm9ycyB8fCBbXSkuZm9yRWFjaCgoeDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gc2VudFtOdW1iZXIoeC5yb3cpIC0gMV07XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFN0cmluZyh4Lm1lc3NhZ2UgfHwgJycpO1xyXG4gICAgICAgIC8vIFRoZSBlZGl0b3Igc2F5cyB0aGVzZSBpdHNlbGYgKGJlZm9yZSB0aGUgc3RvcmUgLyB1c2VyIGxpc3RzIGxvYWQgdGhlIEFQSSB3b3VsZCBzYXkgdGhlbSBhYm91dCBuYW1lcykuXHJcbiAgICAgICAgaWYgKCFyb3cgfHwgL14oTm8gYWN0aXZlfFJlcXVpcmVkfEF1ZGl0IGlzIG5vdCBwYXJ0KS8udGVzdChtZXNzYWdlKSkgeyByZXR1cm47IH1cclxuICAgICAgICBjb25zdCBrZXkgPSByb3cua2V5ICsgJ3wnICsgU3RyaW5nKHguZmllbGQpO1xyXG4gICAgICAgIGlmICghbmV4dC5oYXMoa2V5KSkgeyBuZXh0LnNldChrZXksIG1lc3NhZ2UpOyB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmxpdmVFcnJvcnMgPSBuZXh0O1xyXG4gICAgICBjb25zdCBoaW50cyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmdbXT4oKTtcclxuICAgICAgKHJlcy5kYXRhPy5yb3dXYXJuaW5ncyB8fCBbXSkuZm9yRWFjaCgoeDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gc2VudFtOdW1iZXIoeC5yb3cpIC0gMV07XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFN0cmluZyh4Lm1lc3NhZ2UgfHwgJycpO1xyXG4gICAgICAgIGlmICghcm93IHx8ICFtZXNzYWdlKSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnN0IGxpc3QgPSBoaW50cy5nZXQocm93LmtleSkgfHwgW107XHJcbiAgICAgICAgaWYgKCFsaXN0LmluY2x1ZGVzKG1lc3NhZ2UpKSB7IGxpc3QucHVzaChtZXNzYWdlKTsgfVxyXG4gICAgICAgIGhpbnRzLnNldChyb3cua2V5LCBsaXN0KTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMubGl2ZVdhcm5pbmdzID0gaGludHM7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMub25PdXRzaWRlLCB0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBwcmVzcyBvciBmb2N1cyBhbnl3aGVyZSBvdXRzaWRlIHRoZSBvcGVuIHBpY2tlciBjbG9zZXMgaXQuIExpc3RlbmVkIHRvIGluIHRoZSBjYXB0dXJlXHJcbiAgICogcGhhc2UsIHNvIG5vIGVsZW1lbnQgdGhhdCBzdG9wcyBjbGljayBwcm9wYWdhdGlvbiBjYW4ga2VlcCBhIG1lbnUgb3Blbi5cclxuICAgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uT3V0c2lkZSA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgIGlmICghdGhpcy5vcGVuQ2VsbCkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuY2xvc2VzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXJnZXQuY2xvc2VzdCgnLnNlLXBpY2suaXMtb3BlbicpKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5jbG9zZVBpY2tlcigpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfTtcclxuXHJcbiAgLyoqIEtlZXAgdGhlIG9wZW4gbWVudSB1bmRlciBpdHMgY2VsbCB3aGlsZSB0aGUgcGFnZSBvciB0aGUgdGFibGUgc2Nyb2xscy4gKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICBvblZpZXdwb3J0Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3BlbkNlbGwpIHsgdGhpcy5wbGFjZU1lbnUoKTsgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkU2NoZWR1bGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmdFZGl0ID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRTY2hlZHVsZURldGFpbCh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkLCBzY2hlZHVsZUlkOiB0aGlzLnNjaGVkdWxlSWQgfSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZCA9IHJlcz8uY29kZSA9PT0gMjAwID8gcmVzLmRhdGEgOiBudWxsO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nRWRpdCA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKCFkKSB7IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQ291bGQgbm90IGxvYWQgdGhpcyBzY2hlZHVsZScpOyB0aGlzLmNsb3NlZC5lbWl0KGZhbHNlKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgICB0aGlzLm5hbWUgPSBkLnNjaGVkdWxlPy5uYW1lIHx8ICcnO1xyXG4gICAgICAgICAgdGhpcy5wdWJsaXNoZWQgPSAhIWQuc2NoZWR1bGU/LnB1Ymxpc2g7XHJcbiAgICAgICAgICBjb25zdCBsaXN0czogYW55W10gPSBkLnNjaGVkdWxlPy5jaGVja0xpc3RzIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5waWNrcyA9IGxpc3RzLm1hcChjID0+IFN0cmluZyhjLmNoZWNrTGlzdElkKSk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRUZW1wbGF0ZSgpO1xyXG4gICAgICAgICAgdGhpcy5vd25BdWRpdHMgPSBsaXN0c1xyXG4gICAgICAgICAgICAuZmlsdGVyKGMgPT4gIXRoaXMuYXVkaXRzLnNvbWUoYSA9PiBhLmlkID09PSBTdHJpbmcoYy5jaGVja0xpc3RJZCkpKVxyXG4gICAgICAgICAgICAubWFwKGMgPT4gKHsgaWQ6IFN0cmluZyhjLmNoZWNrTGlzdElkKSwgbmFtZTogYy5jaGVja0xpc3ROYW1lIHx8ICdBdWRpdCcsIG1ldGE6ICdJbiB0aGlzIHNjaGVkdWxlJywgcXVlc3Rpb25zOiAwIH0pKTtcclxuICAgICAgICAgIC8vIFNjaGVkdWxlcyBtYWRlIGJlZm9yZSByb3dzIGV4aXN0ZWQgbGlzdCB0aGVpciByYWlzZWQgdmlzaXRzOyB0aGUgc2FtZSB1c2VyLCBzdG9yZSxcclxuICAgICAgICAgIC8vIGRhdGUsIGF1ZGl0IGFuZCB3aW5kb3cgY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZSB0aGVyZSwgc28ga2VlcCBvbmUgcm93IHBlciBjb21iaW5hdGlvblxyXG4gICAgICAgICAgLy8gKHRoZSBzYW1lIHVzZXIgYW5kIHN0b3JlIGF0IGFub3RoZXIgdGltZSBpcyBhIHJvdyBvZiBpdHMgb3duKS5cclxuICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgICAgICAgIHRoaXMucm93cyA9IChkLnJvd3MgfHwgW10pLmZpbHRlcigocjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IFtyLmRhdGUsIFN0cmluZyhyLnVzZXJFbWFpbCB8fCAnJykudG9Mb3dlckNhc2UoKSwgci5zdG9yZUlkLCByLmNoZWNrTGlzdElkLCByLnN0YXJ0IHx8ICcnLCByLmVuZCB8fCAnJ10uam9pbignfCcpO1xyXG4gICAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgICAgICAgICAgc2Vlbi5hZGQoa2V5KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9KS5tYXAoKHI6IGFueSkgPT4gdGhpcy5yb3coe1xyXG4gICAgICAgICAgICBkYXRlOiByLmRhdGUgfHwgJycsIHVzZXJFbWFpbDogU3RyaW5nKHIudXNlckVtYWlsIHx8ICcnKS50b0xvd2VyQ2FzZSgpLCBzdG9yZUlkOiByLnN0b3JlSWQgfHwgJycsXHJcbiAgICAgICAgICAgIHN0b3JlVGV4dDogci5zdG9yZU5hbWUgfHwgdGhpcy5zdG9yZUxhYmVsKHIuc3RvcmVJZCkgfHwgci5zdG9yZUlkIHx8ICcnLFxyXG4gICAgICAgICAgICBjaGVja0xpc3RJZDogci5jaGVja0xpc3RJZCA/IFN0cmluZyhyLmNoZWNrTGlzdElkKSA6ICcnLCBzdGFydDogci5zdGFydCB8fCAnJywgZW5kOiByLmVuZCB8fCAnJ1xyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgdGhpcy5yZWdyb3VwKCk7XHJcbiAgICAgICAgICB0aGlzLnJhaXNlZEtleXMgPSBuZXcgU2V0KHRoaXMucHVibGlzaGVkID8gdGhpcy5yb3dzLm1hcChyID0+IHRoaXMudmlzaXRLZXkocikpIDogW10pO1xyXG4gICAgICAgICAgLy8gQSBwdWJsaXNoZWQgc2NoZWR1bGUncyByb3dzIGRhdGVkIGJlZm9yZSB0b2RheSBhcmUgdmlzaXRzIGFscmVhZHkgcmFpc2VkOiByZWFkLW9ubHkgKFFBIDExIE9jdCkuXHJcbiAgICAgICAgICB0aGlzLmxvY2tlZEtleXMgPSBuZXcgU2V0KHRoaXMucHVibGlzaGVkID8gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuZGF0ZSAmJiByLmRhdGUgPCB0aGlzLnRvZGF5KS5tYXAociA9PiByLmtleSkgOiBbXSk7XHJcbiAgICAgICAgICB0aGlzLnN0ZXAgPSAncm93cyc7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMubG9hZGluZ0VkaXQgPSBmYWxzZTsgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDb3VsZCBub3QgbG9hZCB0aGlzIHNjaGVkdWxlJyk7IHRoaXMuY2xvc2VkLmVtaXQoZmFsc2UpOyB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBjcmVhdGUgc3RlcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIGdldCBhbGxBdWRpdHMoKTogU2NoZWR1bGVBdWRpdFtdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5vd25BdWRpdHMsIC4uLnRoaXMuYXVkaXRzXTtcclxuICB9XHJcblxyXG4gIGdldCBwaWNrYWJsZXMoKTogU2NoZWR1bGVBdWRpdFtdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBpY2tRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLmFsbEF1ZGl0cy5maWx0ZXIoYSA9PiAhcSB8fCAoYS5uYW1lICsgJyAnICsgYS5tZXRhKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZml4ZWQgYXVkaXRzJyBuYW1lcywgZm9yIHRoZSBsaW5lIHRoYXQgcmVwbGFjZXMgdGhlIHBpY2tlciB3aGVuIHRoZSBhdWRpdHMgYXJlIGxvY2tlZC4gKi9cclxuICBnZXQgbG9ja2VkQXVkaXROYW1lcygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja2VkQXVkaXRzLm1hcChhID0+IGEubmFtZSkuam9pbignLCAnKTtcclxuICB9XHJcblxyXG4gIGdldCBwaWNrQ291bnQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnBpY2tzLmxlbmd0aCA/IHRoaXMucGlja3MubGVuZ3RoICsgJyBzZWxlY3RlZCcgOiAnTm9uZSBzZWxlY3RlZCc7XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsUGlja2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbGlzdCA9IHRoaXMucGlja2FibGVzO1xyXG4gICAgcmV0dXJuIGxpc3QubGVuZ3RoID4gMCAmJiBsaXN0LmV2ZXJ5KGEgPT4gdGhpcy5waWNrcy5pbmNsdWRlcyhhLmlkKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnBpY2tRdWVyeS50cmltKCkgPyAnU2VsZWN0IGFsbCBtYXRjaGVzJyA6ICdTZWxlY3QgYWxsIGF1ZGl0cyc7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVhZHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLm5hbWUudHJpbSgpICYmICh0aGlzLnBpY2tzLmxlbmd0aCA+IDAgfHwgdGhpcy5vcGVuQXVkaXRzKTtcclxuICB9XHJcblxyXG4gIGlzUGlja2VkKGE6IFNjaGVkdWxlQXVkaXQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBpY2tzLmluY2x1ZGVzKGEuaWQpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUGljayhhOiBTY2hlZHVsZUF1ZGl0KTogdm9pZCB7XHJcbiAgICB0aGlzLnBpY2tzID0gdGhpcy5pc1BpY2tlZChhKSA/IHRoaXMucGlja3MuZmlsdGVyKGlkID0+IGlkICE9PSBhLmlkKSA6IFsuLi50aGlzLnBpY2tzLCBhLmlkXTtcclxuICAgIHRoaXMubG9hZFRlbXBsYXRlKCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGxQaWNrcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkcyA9IHRoaXMucGlja2FibGVzLm1hcChhID0+IGEuaWQpO1xyXG4gICAgdGhpcy5waWNrcyA9IHRoaXMuYWxsUGlja2VkXHJcbiAgICAgID8gdGhpcy5waWNrcy5maWx0ZXIoaWQgPT4gIWlkcy5pbmNsdWRlcyhpZCkpXHJcbiAgICAgIDogQXJyYXkuZnJvbShuZXcgU2V0KFsuLi50aGlzLnBpY2tzLCAuLi5pZHNdKSk7XHJcbiAgICB0aGlzLmxvYWRUZW1wbGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2h5IEltcG9ydCBmcm9tIENTViAvIEFkZCBhIHNpbmdsZSByb3cgYXJlIG9mZjsgc2hvd24gYXMgdGhlaXIgdG9vbHRpcC4gVGhlIGJ1dHRvbnMgYXJlIG5vdFxyXG4gICAqIFtkaXNhYmxlZF0gKGEgZGlzYWJsZWQgYnV0dG9uIHNob3dzIG5vIHRvb2x0aXApLCBzbyB0aGVpciBoYW5kbGVycyBpZ25vcmUgY2xpY2tzIHVudGlsIHJlYWR5LlxyXG4gICAqL1xyXG4gIGdldCBub3RSZWFkeVJlYXNvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLm5hbWUudHJpbSgpKSB7IHJldHVybiAnRW50ZXIgYSBzY2hlZHVsZSBuYW1lIGZpcnN0JzsgfVxyXG4gICAgcmV0dXJuIHRoaXMucGlja3MubGVuZ3RoIHx8IHRoaXMub3BlbkF1ZGl0cyA/ICcnIDogJ1BpY2sgYXQgbGVhc3Qgb25lIGF1ZGl0IGZpcnN0JztcclxuICB9XHJcblxyXG4gIGFkZFNpbmdsZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZWFkeSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3MsIHRoaXMucm93KCldO1xyXG4gICAgdGhpcy5zdGVwID0gJ3Jvd3MnO1xyXG4gICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ1JvdyBhZGRlZCDigJQgZmlsbCBpbiB1c2VyLCBzdG9yZSBhbmQgZGF0ZScpO1xyXG4gIH1cclxuXHJcbiAgaW1wb3J0Q3N2KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlYWR5KSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5jc3ZJbnB1dD8ubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgb25Dc3ZQaWNrZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XHJcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xyXG4gICAgaWYgKCFmaWxlKSB7IHJldHVybjsgfVxyXG4gICAgLy8gVGhlIGRvd25sb2FkZWQgdGVtcGxhdGUgaXMgeGxzeCAoc3RvcmUgYW5kIGF1ZGl0IGRyb3Bkb3ducyk7IGEgQ1NWIHN0aWxsIGltcG9ydHMuXHJcbiAgICBjb25zdCBpc0V4Y2VsID0gLy54bHN4PyQvaS50ZXN0KGZpbGUubmFtZSk7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgbGV0IHRhYmxlOiBzdHJpbmdbXVtdO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRhYmxlID0gaXNFeGNlbCA/IHNoZWV0VGFibGUocmVhZGVyLnJlc3VsdCBhcyBBcnJheUJ1ZmZlcikgOiBwYXJzZUNzdihTdHJpbmcocmVhZGVyLnJlc3VsdCB8fCAnJykpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDb3VsZCBub3QgcmVhZCAnICsgZmlsZS5uYW1lICsgJy4gVXNlIHRoZSBkb3dubG9hZGVkIHRlbXBsYXRlICgueGxzeCkgb3IgYSBDU1YuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFkZGVkID0gdGhpcy5yb3dzRnJvbVRhYmxlKHRhYmxlKTtcclxuICAgICAgaWYgKCFhZGRlZC5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vIHJvd3MgZm91bmQuIFVzZSB0aGUgdGVtcGxhdGU6IERhdGUsIFVzZXIgZW1haWwsIFN0b3JlIG5hbWUsIEF1ZGl0LCBWaXNpdCBzdGFydCwgVmlzaXQgZW5kJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3MsIC4uLmFkZGVkXTtcclxuICAgICAgdGhpcy5yZWdyb3VwKCk7XHJcbiAgICAgIHRoaXMucHVibGlzaFByb2JsZW0gPSAnJztcclxuICAgICAgdGhpcy5zdGVwID0gJ3Jvd3MnO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChhZGRlZC5sZW5ndGggKyAoYWRkZWQubGVuZ3RoID09PSAxID8gJyByb3cgaW1wb3J0ZWQnIDogJyByb3dzIGltcG9ydGVkJykgKyAnIGZyb20gJyArIGZpbGUubmFtZSk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAvLyBBcyB0aGUgdjEgY2hlY2tsaXN0IHVwbG9hZDogZW1haWxzIGluIHRoZSBmaWxlIHdpdGggbm8gdXNlciB5ZXQgYXJlIG9mZmVyZWQgZm9yIGludml0ZSAob25jZSB1c2VycyBoYXZlIGxvYWRlZCkuXHJcbiAgICAgIHRoaXMucGVvcGxlUmVhZHkkLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZyZXNoID0gdGhpcy5uZXdVc2VyRW1haWxzKGFkZGVkKTtcclxuICAgICAgICBpZiAoZnJlc2gubGVuZ3RoKSB7IHRoaXMub3Blbkludml0ZShmcmVzaCk7IH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgaWYgKGlzRXhjZWwpIHsgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOyB9IGVsc2UgeyByZWFkZXIucmVhZEFzVGV4dChmaWxlKTsgfVxyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBpbnZpdGUgbmV3IHVzZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIFdlbGwtZm9ybWVkIGVtYWlscyBvZiB0aGVzZSByb3dzIHRoYXQgYXJlIG5vIGFjdGl2ZSB1c2VyIG9mIHRoZSBjbGllbnQgKG9uY2UgdGhlIHVzZXJzIGhhdmUgbG9hZGVkKS4gKi9cclxuICBuZXdVc2VyRW1haWxzKHJvd3M6IEVkaXRvclJvd1tdID0gdGhpcy5yb3dzKTogc3RyaW5nW10ge1xyXG4gICAgaWYgKCF0aGlzLnVzZXJzLmxlbmd0aCkgeyByZXR1cm4gW107IH1cclxuICAgIGNvbnN0IGVtYWlscyA9IHJvd3MubWFwKHIgPT4gci51c2VyRW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpLmZpbHRlcihlID0+IEVNQUlMLnRlc3QoZSkgJiYgIXRoaXMudXNlckVtYWlscy5oYXMoZSkpO1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChlbWFpbHMpKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgcm93J3MgdmlzaXQgaGFzIGFuIGVtYWlsIHRoYXQgY291bGQgYmUgaW52aXRlZCAoc2hvd24gYXMgSW52aXRlIHVzZXIgdW5kZXIgdGhlIHJvdykuICovXHJcbiAgaW52aXRlYWJsZShyb3c6IEVkaXRvclJvdyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmV3VXNlckVtYWlscyh0aGlzLmdyb3VwUm93cyhyb3cpKS5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgb3Blbkludml0ZShlbWFpbHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAoIWVtYWlscy5sZW5ndGgpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmNsb3NlUGlja2VyKCk7XHJcbiAgICB0aGlzLmludml0ZUVtYWlscyA9IGVtYWlscztcclxuICAgIHRoaXMuaW52aXRlUGlja2VkID0gbmV3IFNldChlbWFpbHMpO1xyXG4gICAgdGhpcy5pbnZpdGVPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VJbnZpdGUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbnZpdGluZykgeyByZXR1cm47IH1cclxuICAgIHRoaXMuaW52aXRlT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSW52aXRlKGVtYWlsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmludml0ZVBpY2tlZC5oYXMoZW1haWwpKSB7IHRoaXMuaW52aXRlUGlja2VkLmRlbGV0ZShlbWFpbCk7IH0gZWxzZSB7IHRoaXMuaW52aXRlUGlja2VkLmFkZChlbWFpbCk7IH1cclxuICB9XHJcblxyXG4gIGdldCBhbGxJbnZpdGVQaWNrZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pbnZpdGVFbWFpbHMubGVuZ3RoID4gMCAmJiB0aGlzLmludml0ZUVtYWlscy5ldmVyeShlID0+IHRoaXMuaW52aXRlUGlja2VkLmhhcyhlKSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGxJbnZpdGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmludml0ZVBpY2tlZCA9IHRoaXMuYWxsSW52aXRlUGlja2VkID8gbmV3IFNldCgpIDogbmV3IFNldCh0aGlzLmludml0ZUVtYWlscyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnZpdGUgU2VsZWN0ZWQ6IHRoZSBBUEkgY3JlYXRlcyBlYWNoIHBpY2tlZCBlbWFpbCBhcyBhIHVzZXIgb2YgdGhlIGNsaWVudCAocm9sZSB1c2VyLCBhcyB2MSBkb2VzKSwgbmFtZWQgYnkgdGhlXHJcbiAgICogcGFydCBiZWZvcmUgdGhlIEAuIEludml0ZWQgZW1haWxzIGpvaW4gdGhlIHVzZXIgbGlzdCwgc28gdGhlaXIgcm93cyBwYXNzOyB0aGUgcmVzdCBhcmUgbmFtZWQgaW4gYSB0b2FzdC5cclxuICAgKi9cclxuICBpbnZpdGVTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVtYWlscyA9IHRoaXMuaW52aXRlRW1haWxzLmZpbHRlcihlID0+IHRoaXMuaW52aXRlUGlja2VkLmhhcyhlKSk7XHJcbiAgICBpZiAoIWVtYWlscy5sZW5ndGggfHwgdGhpcy5pbnZpdGluZykgeyByZXR1cm47IH1cclxuICAgIHRoaXMuaW52aXRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgdXNlcnMgPSBlbWFpbHMubWFwKGVtYWlsID0+ICh7IGVtYWlsLCB1c2VyTmFtZTogZW1haWwuc3BsaXQoJ0AnKVswXSB9KSk7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U2NoZWR1bGVJbnZpdGUoeyBjbGllbnRJZDogdGhpcy5jbGllbnRJZCwgdXNlcnMgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW52aXRpbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAocmVzPy5jb2RlICE9PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQ291bGQgbm90IGludml0ZSB0aGUgdXNlcnMg4oCUIHRyeSBhZ2FpbicpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpbnZpdGVkOiBBcnJheTx7IGVtYWlsOiBzdHJpbmc7IHVzZXJOYW1lOiBzdHJpbmcgfT4gPSByZXMuZGF0YT8uaW52aXRlZCB8fCBbXTtcclxuICAgICAgICBjb25zdCBza2lwcGVkOiBBcnJheTx7IGVtYWlsOiBzdHJpbmc7IHJlYXNvbjogc3RyaW5nIH0+ID0gcmVzLmRhdGE/LnNraXBwZWQgfHwgW107XHJcbiAgICAgICAgLy8gQWxyZWFkeSBhY3RpdmUgaGVyZSAoZS5nLiBhZGRlZCBpbiBNYW5hZ2UgPiBVc2VycyBtZWFud2hpbGUpIGNvdW50cyBhcyB1c2FibGUgdG9vLlxyXG4gICAgICAgIGNvbnN0IHVzYWJsZSA9IFtcclxuICAgICAgICAgIC4uLmludml0ZWQubWFwKHUgPT4gKHsgZW1haWw6IHUuZW1haWwsIG5hbWU6IHUudXNlck5hbWUgfHwgJycgfSkpLFxyXG4gICAgICAgICAgLi4uc2tpcHBlZC5maWx0ZXIocyA9PiBzLnJlYXNvbiA9PT0gJ2FjdGl2ZScpLm1hcChzID0+ICh7IGVtYWlsOiBzLmVtYWlsLCBuYW1lOiAnJyB9KSlcclxuICAgICAgICBdO1xyXG4gICAgICAgIHVzYWJsZS5mb3JFYWNoKHUgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMudXNlckVtYWlscy5oYXModS5lbWFpbCkpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgICB0aGlzLnVzZXJzID0gWy4uLnRoaXMudXNlcnMsIHVdO1xyXG4gICAgICAgICAgdGhpcy51c2VyRW1haWxzLmFkZCh1LmVtYWlsKTtcclxuICAgICAgICAgIHRoaXMudXNlckJ5RW1haWwuc2V0KHUuZW1haWwsIHUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChpbnZpdGVkLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoaW52aXRlZC5sZW5ndGggKyAoaW52aXRlZC5sZW5ndGggPT09IDEgPyAnIHVzZXIgaW52aXRlZCcgOiAnIHVzZXJzIGludml0ZWQnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGJsb2NrZWQgPSBza2lwcGVkLmZpbHRlcihzID0+IHMucmVhc29uICE9PSAnYWN0aXZlJyk7XHJcbiAgICAgICAgaWYgKGJsb2NrZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoYmxvY2tlZC5tYXAocyA9PiBzLmVtYWlsICsgJyDigJQgJyArIChJTlZJVEVfUkVBU09OU1tzLnJlYXNvbl0gfHwgcy5yZWFzb24pKS5qb2luKCc7ICcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gV2hhdCBhIHJlZnVzZWQgcHVibGlzaCBzYWlkIGFib3V0IHRoZXNlIHVzZXJzIGlzIG91dCBvZiBkYXRlIG5vdy5cclxuICAgICAgICB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gdGhpcy51c2VyRW1haWxzLmhhcyhyLnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKSkpLmZvckVhY2gociA9PiB0aGlzLnNlcnZlckVycm9ycy5kZWxldGUoci5rZXkgKyAnfHVzZXJFbWFpbCcpKTtcclxuICAgICAgICB0aGlzLmludml0ZU9wZW4gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnB1Ymxpc2hQcm9ibGVtID0gJyc7XHJcbiAgICAgICAgdGhpcy5jaGVjayQubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW52aXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBpbnZpdGUgdGhlIHVzZXJzIOKAlCB0cnkgYWdhaW4nKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCdWlsZHMgdGhlIHRlbXBsYXRlIHJvd3MgZm9yIHRoZSBwaWNrZWQgYXVkaXRzIGZyb20gdGhlaXIgYXNzaWdubWVudHM6IG9uZSByb3cgcGVyIGFzc2lnbmVkXHJcbiAgICogc3RvcmUgKG9yIHVzZXIsIGZvciB1c2VyLWNvdmVyYWdlIGF1ZGl0cykgd2l0aCBpdHMgdXNlciBlbWFpbCwgZGF0ZWQgdG9tb3Jyb3cuIEFuIGF1ZGl0IHdpdGggbm9cclxuICAgKiBzaW5nbGUgc3RvcmUgLyB1c2VyIGFzc2lnbmVkIHlldCBnZXRzIG9uZSByb3cgd2l0aCBvbmx5IGl0cyBBdWRpdCBjZWxsIGZpbGxlZCAoc2tpcHBlZCBvbiBpbXBvcnRcclxuICAgKiBpZiBsZWZ0IHRoYXQgd2F5KS4gUmVidWlsdCB3aGVuZXZlciB0aGUgcGlja3MgY2hhbmdlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFRlbXBsYXRlKG9uUmVhZHk/OiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICBjb25zdCBhdWRpdHMgPSB0aGlzLm9mZmVyZWRBdWRpdHM7XHJcbiAgICBjb25zdCBrZXkgPSBhdWRpdHMubWFwKGEgPT4gYS5pZCkuam9pbignLCcpO1xyXG4gICAgaWYgKCFhdWRpdHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudGVtcGxhdGVGb3IgPSBrZXk7XHJcbiAgICAgIHRoaXMudGVtcGxhdGVMaW5lcyA9IFtdO1xyXG4gICAgICBvblJlYWR5Py4oKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGtleSA9PT0gdGhpcy50ZW1wbGF0ZUZvciAmJiAhdGhpcy50ZW1wbGF0ZUxvYWRpbmcpIHsgb25SZWFkeT8uKCk7IHJldHVybjsgfVxyXG4gICAgdGhpcy50ZW1wbGF0ZUZvciA9IGtleTtcclxuICAgIHRoaXMudGVtcGxhdGVMb2FkaW5nID0gdHJ1ZTtcclxuICAgIC8vIFRoZSBBUEkgdGFrZXMgdXAgdG8gNTAgYXVkaXRzIGEgY2FsbDsgd2l0aCBldmVyeSBhdWRpdCBvbiBvZmZlciB0aGVyZSBjYW4gYmUgbW9yZS5cclxuICAgIGNvbnN0IGlkcyA9IGF1ZGl0cy5tYXAoYSA9PiBhLmlkKTtcclxuICAgIGNvbnN0IGNodW5rcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGguY2VpbChpZHMubGVuZ3RoIC8gNTApIH0sIChfLCBpKSA9PiBpZHMuc2xpY2UoaSAqIDUwLCBpICogNTAgKyA1MCkpO1xyXG4gICAgZm9ya0pvaW4oY2h1bmtzLm1hcChjaGVja2xpc3RJZHMgPT4gdGhpcy50cmF4U2VydmljZS5hdWRpdFNjaGVkdWxlVGVtcGxhdGUoeyBjbGllbnRJZDogdGhpcy5jbGllbnRJZCwgY2hlY2tsaXN0SWRzIH0pXHJcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKSkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlc3VsdHM6IGFueVtdKSA9PiB7XHJcbiAgICAgIGlmIChrZXkgIT09IHRoaXMudGVtcGxhdGVGb3IpIHsgcmV0dXJuOyB9XHJcbiAgICAgIHRoaXMudGVtcGxhdGVMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbnN0IG9rID0gcmVzdWx0cy5ldmVyeShyZXMgPT4gcmVzPy5jb2RlID09PSAyMDApO1xyXG4gICAgICBpZiAoIW9rKSB7XHJcbiAgICAgICAgLy8gVHJ5IGFnYWluIG9uIHRoZSBuZXh0IHBpY2sgY2hhbmdlIC8gZG93bmxvYWQuXHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUZvciA9ICcnO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQ291bGQgbm90IGxvYWQgdGhlIGFzc2lnbmVkIHN0b3JlcyDigJQgdGhlIHRlbXBsYXRlIGxpc3RzIHRoZSBhdWRpdHMgb25seScpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbmNhdCBpbnN0ZWFkIG9mIGZsYXRNYXA6IHRoZSBsaWJyYXJ5IHRhcmdldHMgYSBsaWIgd2l0aG91dCBBcnJheSNmbGF0TWFwLlxyXG4gICAgICBjb25zdCByb3dzOiBhbnlbXSA9IG9rID8gKFtdIGFzIGFueVtdKS5jb25jYXQoLi4ucmVzdWx0cy5tYXAoKHJlczogYW55KSA9PiByZXMuZGF0YT8ucm93cyB8fCBbXSkpIDogW107XHJcbiAgICAgIChvayA/IChbXSBhcyBhbnlbXSkuY29uY2F0KC4uLnJlc3VsdHMubWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGE/LmF1ZGl0cyB8fCBbXSkpIDogW10pLmZvckVhY2goKGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChhPy5jaGVja0xpc3RJZCAmJiBhLnN0YXJ0ICYmIGEuZW5kKSB7IHRoaXMuYXVkaXRXaW5kb3dzLnNldChTdHJpbmcoYS5jaGVja0xpc3RJZCksIHsgc3RhcnQ6IGEuc3RhcnQsIGVuZDogYS5lbmQgfSk7IH1cclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBkYXlqcygpLmFkZCgxLCAnZGF5JykuZm9ybWF0KCdERC1NTS1ZWVlZJyk7XHJcbiAgICAgIHRoaXMudGVtcGxhdGVMaW5lcyA9IGF1ZGl0cy5yZWR1Y2UoKG91dDogc3RyaW5nW11bXSwgYSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1pbmUgPSByb3dzLmZpbHRlcihyID0+IFN0cmluZyhyLmNoZWNrTGlzdElkKSA9PT0gYS5pZCk7XHJcbiAgICAgICAgLy8gU3RvcmVzIGJ5IG5hbWU6IHRoZSBzdG9yZSBjb2RlIGlzIG5vdCBzaG93biBvciBhc2tlZCBmb3IgYW55d2hlcmUgaW4gdGhlIGVkaXRvci5cclxuICAgICAgICAvLyBWaXNpdCBzdGFydCAvIGVuZCBzdGF5IGJsYW5rOiB0aGUgd2luZG93IGlzIG9wdGlvbmFsLCBhbmQgYmxhbmsgbWVhbnMgdGhlIHN0b3JlJ3Mgb3BlbiAtIGNsb3NlIHRpbWUuXHJcbiAgICAgICAgcmV0dXJuIG91dC5jb25jYXQobWluZS5sZW5ndGhcclxuICAgICAgICAgID8gbWluZS5tYXAociA9PiBbZGF0ZSwgci51c2VyRW1haWwgfHwgJycsIHIuc3RvcmVOYW1lIHx8IHRoaXMuc3RvcmVMYWJlbChyLnN0b3JlSWQpIHx8IHIuc3RvcmVJZCB8fCAnJywgYS5uYW1lLCAnJywgJyddKVxyXG4gICAgICAgICAgOiBbWycnLCAnJywgJycsIGEubmFtZSwgJycsICcnXV0pO1xyXG4gICAgICB9LCBbXSk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICBvblJlYWR5Py4oKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBzYW1wbGUgcGFuZWw6IHRoZSBmaXJzdCB0ZW1wbGF0ZSByb3dzLCBleGFjdGx5IGFzIHRoZXkgd2lsbCBiZSBpbiB0aGUgZmlsZS4gKi9cclxuICBnZXQgcHJldmlld1Jvd3MoKTogeyBkYXRlOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IHN0b3JlOiBzdHJpbmc7IGF1ZGl0OiBzdHJpbmcgfVtdIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlTGluZXMuc2xpY2UoMCwgdGhpcy5wcmV2aWV3TGltaXQpXHJcbiAgICAgIC5tYXAobCA9PiAoeyBkYXRlOiBsWzBdIHx8ICfigJQnLCBlbWFpbDogbFsxXSB8fCAn4oCUJywgc3RvcmU6IGxbMl0gfHwgJ+KAlCcsIGF1ZGl0OiBsWzNdIHx8ICfigJQnIH0pKTtcclxuICB9XHJcblxyXG4gIGdldCBwcmV2aWV3TW9yZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMudGVtcGxhdGVMaW5lcy5sZW5ndGggLSB0aGlzLnByZXZpZXdMaW1pdCk7XHJcbiAgfVxyXG5cclxuICAvKiogUGlja2VkIGF1ZGl0cyB0aGF0IGhhdmUgbm8gc2luZ2xlIHN0b3JlIC8gdXNlciBhc3NpZ25lZCB5ZXQgKHRoZWlyIHJvdyBob2xkcyBvbmx5IHRoZSBhdWRpdCBuYW1lKS4gKi9cclxuICBnZXQgdW5hc3NpZ25lZEF1ZGl0cygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZUxpbmVzLmZpbHRlcihsID0+ICFsWzFdICYmICFsWzJdKS5tYXAobCA9PiBsWzNdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIHRlbXBsYXRlLiBBIGJsYW5rIENyZWF0ZSBzY2hlZHVsZSAoZXZlcnkgYXVkaXQgb24gb2ZmZXIsIG5vbmUgcGlja2VkKSBnZXRzIGFuIGVtcHR5IHNoZWV0OiBoZWFkZXJzIG9ubHksXHJcbiAgICogd2l0aCB0aGUgU3RvcmUgbmFtZSBhbmQgQXVkaXQgZHJvcGRvd25zIG9uIGV2ZXJ5IHJvdyAoUUEgMTAgT2N0OiBpdCBsaXN0ZWQgZXZlcnkgYXVkaXQncyBhc3NpZ25tZW50cykuIFdpdGggYXVkaXRzXHJcbiAgICogcGlja2VkLCB0aGUgcm93cyB0aGUgc2FtcGxlIHBhbmVsIHNob3dzOiB0aG9zZSBhdWRpdHMnIGFzc2lnbmVkIHN0b3JlcyAvIHVzZXJzIChmZXRjaGVkIGZpcnN0IGlmIHRoZSBwaWNrcyBjaGFuZ2VkKS5cclxuICAgKi9cclxuICBkb3dubG9hZFRlbXBsYXRlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGlmICh0aGlzLnRlbXBsYXRlTG9hZGluZyB8fCB0aGlzLnRlbXBsYXRlV2FpdGluZykgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IGhlYWQgPSBbJ0RhdGUnLCAnVXNlciBlbWFpbCcsICdTdG9yZSBuYW1lJywgJ0F1ZGl0JywgJ1Zpc2l0IHN0YXJ0JywgJ1Zpc2l0IGVuZCddO1xyXG4gICAgaWYgKHRoaXMub3BlbkF1ZGl0cykge1xyXG4gICAgICB0aGlzLmRvd25sb2FkWGxzeCgnc2NoZWR1bGUtdGVtcGxhdGUueGxzeCcsIFtoZWFkLCBURU1QTEFURV9ISU5UU10pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmxvYWRUZW1wbGF0ZSgoKSA9PiB7XHJcbiAgICAgIC8vIEEgcm93IGJ1aWx0IGJlZm9yZSB0aGUgc3RvcmUgbGlzdCBhcnJpdmVkIG1heSBob2xkIGEgc3RvcmUgaWQ7IHdyaXRlIGl0cyBuYW1lIG5vdy4gUm93cyB0aGF0IHdvdWxkIGhvbGQgb25seVxyXG4gICAgICAvLyBhbiBhdWRpdCBuYW1lIGFyZSBsZWZ0IG91dDogdGhlIEF1ZGl0IGNvbHVtbiBpcyBhIGRyb3Bkb3duLCBzbyBhbnkgYXVkaXQgY2FuIGJlIHBpY2tlZCBvbiBhbiBlbXB0eSByb3cuXHJcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy50ZW1wbGF0ZUxpbmVzLmZpbHRlcihsID0+IGxbMV0gfHwgbFsyXSkubWFwKGwgPT4gW2xbMF0sIGxbMV0sIHRoaXMuc3RvcmVMYWJlbChsWzJdKSB8fCBsWzJdLCAuLi5sLnNsaWNlKDMpXSk7XHJcbiAgICAgIHRoaXMuZG93bmxvYWRYbHN4KCdzY2hlZHVsZS10ZW1wbGF0ZS54bHN4JywgW2hlYWQsIFRFTVBMQVRFX0hJTlRTLCAuLi5saW5lc10pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIHJvd3Mgc3RlcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBwcml2YXRlIHJvdyhpbml0OiBQYXJ0aWFsPEVkaXRvclJvdz4gPSB7fSk6IEVkaXRvclJvdyB7XHJcbiAgICBjb25zdCBvbmx5QXVkaXQgPSB0aGlzLnBpY2tzLmxlbmd0aCA9PT0gMSA/IHRoaXMucGlja3NbMF0gOiAnJztcclxuICAgIGNvbnN0IGtleSA9IHRoaXMubmV4dEtleSsrO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAga2V5LCBkYXRlOiAnJywgdXNlckVtYWlsOiAnJywgc3RvcmVJZDogJycsIHN0b3JlVGV4dDogJycsIGNoZWNrTGlzdElkOiBvbmx5QXVkaXQsIHN0YXJ0OiAnJywgZW5kOiAnJywgc2VsZWN0ZWQ6IGZhbHNlLFxyXG4gICAgICBncm91cDoga2V5LFxyXG4gICAgICAuLi5pbml0XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFNhbWUgdmlzaXQgZXhjZXB0IHRoZSBhdWRpdDogZGF0ZSwgdXNlciwgc3RvcmUgYW5kIHdpbmRvdyAoYWxsIG9mIGRhdGUsIHVzZXIgYW5kIHN0b3JlIGdpdmVuKS4gKi9cclxuICBwcml2YXRlIHZpc2l0R3JvdXBLZXkocjogRWRpdG9yUm93KTogc3RyaW5nIHtcclxuICAgIGlmICghci5kYXRlIHx8ICFyLnVzZXJFbWFpbC50cmltKCkgfHwgIShyLnN0b3JlSWQudHJpbSgpIHx8IHIuc3RvcmVUZXh0LnRyaW0oKSkpIHsgcmV0dXJuICcnOyB9XHJcbiAgICByZXR1cm4gW3IuZGF0ZSwgci51c2VyRW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCksIHIuc3RvcmVJZC50cmltKCkgfHwgci5zdG9yZVRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCksIHIuc3RhcnQgfHwgJycsIHIuZW5kIHx8ICcnXS5qb2luKCd8Jyk7XHJcbiAgfVxyXG5cclxuICAvKiogTG9hZGVkIC8gaW1wb3J0ZWQgcm93cyBvZiBvbmUgdmlzaXQgam9pbiBvbmUgZ3JvdXAgKHRoZSBmaXJzdCBzdWNoIHJvdydzKSwgc28gdGhleSBzaG93IGFzIG9uZSByb3cuICovXHJcbiAgcHJpdmF0ZSByZWdyb3VwKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlyc3QgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG4gICAgLy8gQXVkaXRzIGFscmVhZHkgaW4gZWFjaCBncm91cDogYSByZXBlYXRlZCBhdWRpdCBzdGF5cyBpdHMgb3duIChyZWQpIHJvdyBpbnN0ZWFkIG9mIGhpZGluZyBpbiB0aGUgZ3JvdXAuXHJcbiAgICBjb25zdCBhdWRpdHMgPSBuZXcgTWFwPG51bWJlciwgU2V0PHN0cmluZz4+KCk7XHJcbiAgICB0aGlzLnJvd3MuZm9yRWFjaChyID0+IHtcclxuICAgICAgY29uc3QgayA9IHRoaXMudmlzaXRHcm91cEtleShyKTtcclxuICAgICAgaWYgKCFrKSB7IHJldHVybjsgfVxyXG4gICAgICBjb25zdCBnID0gZmlyc3QuZ2V0KGspO1xyXG4gICAgICBpZiAoZyAhPT0gdW5kZWZpbmVkICYmICEoci5jaGVja0xpc3RJZCAmJiBhdWRpdHMuZ2V0KGcpPy5oYXMoci5jaGVja0xpc3RJZCkpKSB7IHIuZ3JvdXAgPSBnOyB9XHJcbiAgICAgIGVsc2UgaWYgKGcgPT09IHVuZGVmaW5lZCkgeyBmaXJzdC5zZXQoaywgci5ncm91cCk7IH1cclxuICAgICAgY29uc3Qgc2V0ID0gYXVkaXRzLmdldChyLmdyb3VwKSB8fCBuZXcgU2V0PHN0cmluZz4oKTtcclxuICAgICAgaWYgKHIuY2hlY2tMaXN0SWQpIHsgc2V0LmFkZChyLmNoZWNrTGlzdElkKTsgfVxyXG4gICAgICBhdWRpdHMuc2V0KHIuZ3JvdXAsIHNldCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFmdGVyIGEgcGlja2VkIHVzZXIgLyBzdG9yZSBvciBhIGNoYW5nZWQgZGF0ZSAvIHdpbmRvdzogYSByb3cgdGhhdCBub3cgaXMgdGhlIHNhbWUgdmlzaXQgYXMgYW5vdGhlciByb3cgam9pbnNcclxuICAgKiB0aGF0IHJvdyAoUUEgMTAgT2N0OiBvbmUgcmVjb3JkIHBlciB2aXNpdCwgaXRzIGF1ZGl0cyBpbiB0aGUgZHJvcGRvd24pLCBhcyBsb2FkZWQgYW5kIGltcG9ydGVkIHJvd3MgZG8uIE9ubHkgb25cclxuICAgKiB0aG9zZSBmaW5pc2hlZCBjaG9pY2VzLCBuZXZlciB3aGlsZSB0eXBpbmcsIHNvIGEgY2VsbCBiZWluZyB0eXBlZCBpbiBuZXZlciBkaXNhcHBlYXJzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWVyZ2VWaXNpdChyb3c6IEVkaXRvclJvdyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy52aXNpdEdyb3VwS2V5KHJvdyk7XHJcbiAgICBpZiAoIWtleSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucm93cy5maW5kKHIgPT4gci5ncm91cCAhPT0gcm93Lmdyb3VwICYmIHRoaXMudmlzaXRHcm91cEtleShyKSA9PT0ga2V5KTtcclxuICAgIGlmICghdGFyZ2V0KSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgY29uc3QgbWluZSA9IHRoaXMuZ3JvdXBSb3dzKHJvdyk7XHJcbiAgICBjb25zdCB0aGVpcnMgPSB0aGlzLmdyb3VwUm93cyh0YXJnZXQpO1xyXG4gICAgLy8gQW4gYXVkaXQgdGhlIHZpc2l0IGFscmVhZHkgaGFzIHN0YXlzIGl0cyBvd24gKHJlZCkgcm93LCBzbyB0aGUgZHVwbGljYXRlIGlzIHNlZW4gYW5kIGNhbiBiZSBkZWxldGVkLlxyXG4gICAgaWYgKG1pbmUuc29tZShtID0+IG0uY2hlY2tMaXN0SWQgJiYgdGhlaXJzLnNvbWUodCA9PiB0LmNoZWNrTGlzdElkID09PSBtLmNoZWNrTGlzdElkKSkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICBtaW5lLmZvckVhY2gobSA9PiBtLmdyb3VwID0gdGFyZ2V0Lmdyb3VwKTtcclxuICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdBZGRlZCB0byB0aGUgZXhpc3Rpbmcgcm93IGZvciB0aGlzIHZpc2l0IChzYW1lIGRhdGUsIHVzZXIsIHN0b3JlIGFuZCB3aW5kb3cpJyk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBFdmVyeSByb3cgKGF1ZGl0KSBvZiB0aGlzIHJvdydzIHZpc2l0IGdyb3VwLiAqL1xyXG4gIGdyb3VwUm93cyhyb3c6IEVkaXRvclJvdyk6IEVkaXRvclJvd1tdIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5ncm91cCA9PT0gcm93Lmdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgQXVkaXQgYXNzaWduZWQgY2VsbDogZXZlcnkgYXVkaXQgb2YgdGhlIGdyb3VwLCBieSBuYW1lLiAqL1xyXG4gIGdyb3VwQXVkaXRMYWJlbChyb3c6IEVkaXRvclJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5ncm91cEF1ZGl0TmFtZXMocm93KS5qb2luKCcsICcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBncm91cCdzIGF1ZGl0IG5hbWVzLCBpbiByb3cgb3JkZXIgKGVhY2ggYXVkaXQgb25jZSkuICovXHJcbiAgcHJpdmF0ZSBncm91cEF1ZGl0TmFtZXMocm93OiBFZGl0b3JSb3cpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuZ3JvdXBSb3dzKHJvdykubWFwKHIgPT4gdGhpcy5hdWRpdE5hbWUoci5jaGVja0xpc3RJZCkpLmZpbHRlcihCb29sZWFuKSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjZWxsIHNob3dzIHRoZSBmaXJzdCBhdWRpdCBieSBuYW1lIGFuZCB0aGUgcmVzdCBhcyBhIFwiK05cIiBjaGlwIChwcm90b3R5cGUpLiAqL1xyXG4gIGdyb3VwQXVkaXRGaXJzdChyb3c6IEVkaXRvclJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5ncm91cEF1ZGl0TmFtZXMocm93KVswXSB8fCAnJztcclxuICB9XHJcblxyXG4gIGdyb3VwQXVkaXRNb3JlKHJvdzogRWRpdG9yUm93KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLmdyb3VwQXVkaXROYW1lcyhyb3cpLmxlbmd0aCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNob3duIHJvd3MgKHZpc2l0IGdyb3VwcyksIHdoYXRldmVyIG51bWJlciBvZiBhdWRpdHMgZWFjaCBob2xkcy4gKi9cclxuICBnZXQgZ3JvdXBDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIG5ldyBTZXQodGhpcy5yb3dzLm1hcChyID0+IHIuZ3JvdXApKS5zaXplO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSByb3cncyBkYXRlLCB1c2VyLCBzdG9yZSBhbmQgd2luZG93IGdvIHRvIHRoZSBvdGhlciBhdWRpdHMgb2YgaXRzIGdyb3VwICh0aGV5IGFyZSBvbmUgdmlzaXQpLiAqL1xyXG4gIHByaXZhdGUgc3luY0dyb3VwKHJvdzogRWRpdG9yUm93KTogdm9pZCB7XHJcbiAgICB0aGlzLnJvd3MuZm9yRWFjaChyID0+IHtcclxuICAgICAgaWYgKHIgPT09IHJvdyB8fCByLmdyb3VwICE9PSByb3cuZ3JvdXApIHsgcmV0dXJuOyB9XHJcbiAgICAgIHIuZGF0ZSA9IHJvdy5kYXRlO1xyXG4gICAgICByLnVzZXJFbWFpbCA9IHJvdy51c2VyRW1haWw7XHJcbiAgICAgIHIuc3RvcmVJZCA9IHJvdy5zdG9yZUlkO1xyXG4gICAgICByLnN0b3JlVGV4dCA9IHJvdy5zdG9yZVRleHQ7XHJcbiAgICAgIHIuc3RhcnQgPSByb3cuc3RhcnQ7XHJcbiAgICAgIHIuZW5kID0gcm93LmVuZDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBpY2tlZEF1ZGl0cygpOiBTY2hlZHVsZUF1ZGl0W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsQXVkaXRzLmZpbHRlcihhID0+IHRoaXMucGlja3MuaW5jbHVkZXMoYS5pZCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHNjaGVkdWxlIG9wZW5lZCBibGFuayAobm8gYXVkaXQgcGFzc2VkIGluKSB3aGlsZSB0aGUgYXVkaXQgcGlja2VyIGlzIGhpZGRlbjogbm90aGluZyBjYW4gYmVcclxuICAgKiBwaWNrZWQgdXAgZnJvbnQsIHNvIGV2ZXJ5IGF1ZGl0IGlzIG9uIG9mZmVyICh0ZW1wbGF0ZSwgcm93IHBpY2tlcikgYW5kIHRoZSByb3dzIGRlY2lkZSB0aGUgcGlja3MgKFFBIDkgT2N0KS5cclxuICAgKi9cclxuICBnZXQgb3BlbkF1ZGl0cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5zaG93QXVkaXRQaWNrZXIgJiYgIXRoaXMubG9ja2VkICYmICF0aGlzLnNjaGVkdWxlSWQgJiYgIXRoaXMucHJlc2VsZWN0Lmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBBdWRpdHMgdGhlIHRlbXBsYXRlIGxpc3RzIGFuZCBhIHJvdyBjYW4gcGljay4gKi9cclxuICBnZXQgb2ZmZXJlZEF1ZGl0cygpOiBTY2hlZHVsZUF1ZGl0W10ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlbkF1ZGl0cyA/IHRoaXMuYWxsQXVkaXRzIDogdGhpcy5waWNrZWRBdWRpdHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgQXVkaXQgYXNzaWduZWQgbGlzdCAoZXZlcnkgcm93LCBhbHdheXMgc2hvd24pOiBldmVyeSBwdWJsaXNoZWQgYXVkaXQgb2YgdGhlIGNsaWVudCwgcGx1cyBhbnkgdGhlIHNjaGVkdWxlXHJcbiAgICogYWxyZWFkeSB1c2VzIChwaWNrZWQgb3Igb24gYSByb3cpLCBzbyBhbiBleGlzdGluZyByb3cga2VlcHMgaXRzIG5hbWUgKFFBIDkgT2N0OiBsaXN0IGJ5IHB1Ymxpc2ggc3RhdGUpLiBBIHJvd1xyXG4gICAqIG1heSBuYW1lIGFuIGF1ZGl0IG91dHNpZGUgdGhlIHNjaGVkdWxlJ3MgcGlja3M7IHNhdmluZyBhZGRzIGl0IChzYXZlKCkpLlxyXG4gICAqL1xyXG4gIGdldCByb3dBdWRpdE9wdGlvbnMoKTogU2NoZWR1bGVBdWRpdFtdIHtcclxuICAgIGNvbnN0IHVzZWQgPSBuZXcgU2V0KFsuLi50aGlzLnBpY2tzLCAuLi50aGlzLnJvd3MubWFwKHIgPT4gci5jaGVja0xpc3RJZCldLmZpbHRlcihCb29sZWFuKSk7XHJcbiAgICByZXR1cm4gdGhpcy5hbGxBdWRpdHMuZmlsdGVyKGEgPT4gYS5wdWJsaXNoICE9PSBmYWxzZSB8fCB1c2VkLmhhcyhhLmlkKSk7XHJcbiAgfVxyXG5cclxuICAvKiogU2VhcmNoIHRleHQgb2YgdGhlIG9wZW4gQXVkaXQgYXNzaWduZWQgcGlja2VyLiAqL1xyXG4gIGF1ZGl0UXVlcnkgPSAnJztcclxuXHJcbiAgYXVkaXRNYXRjaGVzKCk6IFNjaGVkdWxlQXVkaXRbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5hdWRpdFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMucm93QXVkaXRPcHRpb25zLmZpbHRlcihhID0+ICFxIHx8IGEubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJvd3MgZm9yIHRoZSBzYW1lIHZpc2l0IGV4Y2VwdCB0aGUgYXVkaXQ6IGRhdGUsIHVzZXIsIHN0b3JlIGFuZCB3aW5kb3cuIFRoZSBBdWRpdCBhc3NpZ25lZCBwaWNrZXIgaXMgYVxyXG4gICAqIG11bHRpLXNlbGVjdCBvdmVyIHN1Y2ggYSBncm91cCwgb25lIHJvdyBwZXIgYXVkaXQsIHNvIGVhY2ggcm93IGlzIHN0aWxsIG9uZSB2aXNpdCAoYXMgdGhlIEFQSSB0YWtlcyBpdCkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhdWRpdEdyb3VwKHJvdzogRWRpdG9yUm93KTogRWRpdG9yUm93W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBSb3dzKHJvdyk7XHJcbiAgfVxyXG5cclxuICBhdWRpdFRpY2tlZChyb3c6IEVkaXRvclJvdywgYTogU2NoZWR1bGVBdWRpdCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXVkaXRHcm91cChyb3cpLnNvbWUociA9PiByLmNoZWNrTGlzdElkID09PSBhLmlkKTtcclxuICB9XHJcblxyXG4gIC8qKiBBdWRpdHMgcGlja2VkIGZvciB0aGlzIHJvdydzIHZpc2l0IChpdHMgZ3JvdXApLCBmb3IgdGhlIHBpY2tlcidzIGZvb3Rlci4gKi9cclxuICBhdWRpdFRpY2tDb3VudChyb3c6IEVkaXRvclJvdyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbmV3IFNldCh0aGlzLmF1ZGl0R3JvdXAocm93KS5tYXAociA9PiByLmNoZWNrTGlzdElkKS5maWx0ZXIoQm9vbGVhbikpLnNpemU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNdWx0aS1zZWxlY3Q6IHRpY2tpbmcgYW5vdGhlciBhdWRpdCBhZGRzIGEgcm93IGZvciBpdCByaWdodCBhZnRlciB0aGUgZ3JvdXAgKHNhbWUgZGF0ZSwgdXNlciwgc3RvcmUgYW5kXHJcbiAgICogd2luZG93KTsgdW50aWNraW5nIHJlbW92ZXMgdGhhdCBhdWRpdCdzIHJvdyAodGhlIGxhc3Qgb25lIGxlZnQgaXMgY2xlYXJlZCBpbnN0ZWFkKS4gVGhlIG1lbnUgc3RheXMgb3Blbi5cclxuICAgKi9cclxuICB0b2dnbGVBdWRpdChyb3c6IEVkaXRvclJvdywgYTogU2NoZWR1bGVBdWRpdCwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5hdWRpdEdyb3VwKHJvdyk7XHJcbiAgICBjb25zdCBvd25lciA9IGdyb3VwLmZpbmQociA9PiByLmNoZWNrTGlzdElkID09PSBhLmlkKTtcclxuICAgIGlmIChvd25lcikge1xyXG4gICAgICBpZiAoZ3JvdXAubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgb3duZXIuY2hlY2tMaXN0SWQgPSAnJztcclxuICAgICAgICB0aGlzLnRvdWNoKG93bmVyLCAnY2hlY2tMaXN0SWQnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAob3duZXIua2V5ID09PSB0aGlzLm9wZW5DZWxsPy5rZXkpIHsgdGhpcy5jbG9zZVBpY2tlcigpOyB9XHJcbiAgICAgICAgdGhpcy5yb3dzID0gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIgIT09IG93bmVyKTtcclxuICAgICAgICAvLyBVbnRpY2tpbmcgdGhlIGF1ZGl0IHRoYXQgY2xhc2hlZCB3aXRoIGFub3RoZXIgcm93IG9mIHRoZSBzYW1lIHZpc2l0OiB0aGUgcmVzdCBqb2lucyB0aGF0IHJvdyAoUUEgMTEgT2N0KS5cclxuICAgICAgICBjb25zdCByZXN0ID0gdGhpcy5yb3dzLmZpbmQociA9PiByLmdyb3VwID09PSBvd25lci5ncm91cCk7XHJcbiAgICAgICAgaWYgKHJlc3QgJiYgdGhpcy5tZXJnZVZpc2l0KHJlc3QpKSB7IHRoaXMuY2xvc2VQaWNrZXIoKTsgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5waWNrcy5pbmNsdWRlcyhhLmlkKSkgeyB0aGlzLnBpY2tzID0gWy4uLnRoaXMucGlja3MsIGEuaWRdOyB9XHJcbiAgICBpZiAoIXJvdy5jaGVja0xpc3RJZCkge1xyXG4gICAgICByb3cuY2hlY2tMaXN0SWQgPSBhLmlkO1xyXG4gICAgICB0aGlzLnRvdWNoKHJvdywgJ2NoZWNrTGlzdElkJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGFkZGVkID0gdGhpcy5yb3coeyBkYXRlOiByb3cuZGF0ZSwgdXNlckVtYWlsOiByb3cudXNlckVtYWlsLCBzdG9yZUlkOiByb3cuc3RvcmVJZCwgc3RvcmVUZXh0OiByb3cuc3RvcmVUZXh0LCBjaGVja0xpc3RJZDogYS5pZCwgc3RhcnQ6IHJvdy5zdGFydCwgZW5kOiByb3cuZW5kLCBncm91cDogcm93Lmdyb3VwIH0pO1xyXG4gICAgY29uc3QgYXQgPSBNYXRoLm1heCguLi5ncm91cC5tYXAociA9PiB0aGlzLnJvd3MuaW5kZXhPZihyKSkpICsgMTtcclxuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3Muc2xpY2UoMCwgYXQpLCBhZGRlZCwgLi4udGhpcy5yb3dzLnNsaWNlKGF0KV07XHJcbiAgICB0aGlzLnRvdWNoKGFkZGVkLCAnY2hlY2tMaXN0SWQnKTtcclxuICB9XHJcblxyXG4gIC8qKiBPbmUgcm93IHBlciB2aXNpdCBncm91cCAoaXRzIGZpcnN0IHJvdyk7IHRoZSBzZWFyY2ggcmVhZHMgZXZlcnkgYXVkaXQgb2YgdGhlIGdyb3VwLiAqL1xyXG4gIGdldCBzaG93blJvd3MoKTogRWRpdG9yUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucm93UXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHtcclxuICAgICAgaWYgKHNlZW4uaGFzKHIuZ3JvdXApKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICBzZWVuLmFkZChyLmdyb3VwKTtcclxuICAgICAgcmV0dXJuICFxIHx8IChyLmRhdGUgKyAnICcgKyByLnVzZXJFbWFpbCArICcgJyArIHIuc3RvcmVUZXh0ICsgJyAnICsgdGhpcy5ncm91cEF1ZGl0TGFiZWwocikpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBiYWRSb3dzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHRoaXMucm93SW52YWxpZChyKSkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhblB1Ymxpc2goKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmxlbmd0aCA+IDAgJiYgdGhpcy5iYWRSb3dzID09PSAwICYmICF0aGlzLnNhdmluZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBiYW5uZXIgYWJvdmUgdGhlIHJvd3MgaXMgZ3JlZW4gb25seSB3aGVuIHRoZSByb3dzIHBhc3MgZXZlcnkgY2hlY2sgaGVyZSAocGFzdCBkYXRlc1xyXG4gICAqIGluY2x1ZGVkKSBhbmQgdGhlIEFQSSBkaWQgbm90IGp1c3QgcmVmdXNlIHRvIHB1Ymxpc2ggdGhlbS5cclxuICAgKi9cclxuICBnZXQgcmVhZHlPaygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNhblB1Ymxpc2ggJiYgIXRoaXMucHVibGlzaFByb2JsZW07XHJcbiAgfVxyXG5cclxuICBnZXQgcmVhZHlMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuY2FuUHVibGlzaCAmJiB0aGlzLnB1Ymxpc2hQcm9ibGVtKSB7XHJcbiAgICAgIHJldHVybiAnTm90IHB1Ymxpc2hlZCDigJQgJyArIHRoaXMucHVibGlzaFByb2JsZW07XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jYW5QdWJsaXNoKSB7XHJcbiAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy5ncm91cENvdW50O1xyXG4gICAgICByZXR1cm4gJ1JlYWR5IHRvIHB1Ymxpc2gg4oCUICcgKyB0b3RhbCArICh0b3RhbCA9PT0gMSA/ICcgcm93JyA6ICcgcm93cycpICsgJyB3aWxsIHJhaXNlICcgKyB0aGlzLnJvd3MubGVuZ3RoXHJcbiAgICAgICAgKyAodGhpcy5yb3dzLmxlbmd0aCA9PT0gMSA/ICcgdmlzaXQnIDogJyB2aXNpdHMnKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5yb3dzLmxlbmd0aCkgeyByZXR1cm4gJ0FkZCBhdCBsZWFzdCBvbmUgcm93IGJlZm9yZSBwdWJsaXNoaW5nJzsgfVxyXG4gICAgY29uc3QgbiA9IHRoaXMuYmFkUm93cztcclxuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5maXJzdFByb2JsZW07XHJcbiAgICByZXR1cm4gbiArIChuID09PSAxID8gJyByb3cgbmVlZHMnIDogJyByb3dzIG5lZWQnKSArICcgYSBmaXggKG1pc3NpbmcsIHdyb25nIG9yIHBhc3QgdmFsdWUsIG9yIGEgcmVwZWF0ZWQgYXNzaWdubWVudCknXHJcbiAgICAgICsgKGZpcnN0ID8gJyDigJQgcm93ICcgKyBmaXJzdC5yb3cgKyAnOiAnICsgZmlyc3QubWVzc2FnZSA6ICcnKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZmlyc3QgcHJvYmxlbSBpbiB0aGUgcm93cyAoMS1iYXNlZCBwb3NpdGlvbiBpbiB0aGUgd2hvbGUgbGlzdCksIGZvciB0aGUgYmFubmVyIGFib3ZlIHRoZSB0YWJsZS4gKi9cclxuICBnZXQgZmlyc3RQcm9ibGVtKCk6IHsgcm93OiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBmaWVsZHM6IFJvd0ZpZWxkW10gPSBbJ2RhdGUnLCAndXNlckVtYWlsJywgJ3N0b3JlSWQnLCAnY2hlY2tMaXN0SWQnLCAnd2luZG93J107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmb3IgKGNvbnN0IGYgb2YgZmllbGRzKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuY2VsbEVycm9yKHRoaXMucm93c1tpXSwgZik7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UpIHsgcmV0dXJuIHsgcm93OiBpICsgMSwgbWVzc2FnZSB9OyB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1ldHJpY3MoKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH0+IHtcclxuICAgIGNvbnN0IHVuaXEgPSAobGlzdDogc3RyaW5nW10pID0+IG5ldyBTZXQobGlzdC5maWx0ZXIoQm9vbGVhbikpLnNpemU7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGxhYmVsOiAnUm93cycsIHZhbHVlOiB0aGlzLmdyb3VwQ291bnQgfSxcclxuICAgICAgeyBsYWJlbDogJ1VzZXJzJywgdmFsdWU6IHVuaXEodGhpcy5yb3dzLm1hcChyID0+IHIudXNlckVtYWlsKSkgfSxcclxuICAgICAgeyBsYWJlbDogJ1N0b3JlcycsIHZhbHVlOiB1bmlxKHRoaXMucm93cy5tYXAociA9PiByLnN0b3JlSWQpKSB9LFxyXG4gICAgICB7IGxhYmVsOiAnQXVkaXRzJywgdmFsdWU6IHVuaXEodGhpcy5yb3dzLm1hcChyID0+IHIuY2hlY2tMaXN0SWQpKSB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zZWxlY3RlZCkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNlbGVjdGVkIHNob3duIHJvd3MgKGEgcm93J3MgY2hlY2tib3ggc2VsZWN0cyBldmVyeSBhdWRpdCBvZiBpdHMgZ3JvdXApLiAqL1xyXG4gIGdldCBzZWxlY3RlZEdyb3VwcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIG5ldyBTZXQodGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc2VsZWN0ZWQpLm1hcChyID0+IHIuZ3JvdXApKS5zaXplO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGlvbkxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5zZWxlY3RlZEdyb3VwcztcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5ncm91cENvdW50O1xyXG4gICAgcmV0dXJuIG5cclxuICAgICAgPyBuICsgJyBvZiAnICsgdG90YWwgKyAnIHJvd3Mgc2VsZWN0ZWQnXHJcbiAgICAgIDogdG90YWwgKyAodG90YWwgPT09IDEgPyAnIHJvdycgOiAnIHJvd3MnKSArICcgaW4gdGhpcyBzY2hlZHVsZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsUm93c1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvd25Sb3dzLmxlbmd0aCA+IDAgJiYgdGhpcy5zaG93blJvd3MuZXZlcnkociA9PiByLnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUFsbFJvd3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvbiA9ICF0aGlzLmFsbFJvd3NTZWxlY3RlZDtcclxuICAgIHRoaXMuc2hvd25Sb3dzLmZvckVhY2gociA9PiB0aGlzLmdyb3VwUm93cyhyKS5mb3JFYWNoKG0gPT4gbS5zZWxlY3RlZCA9IG9uKSk7XHJcbiAgfVxyXG5cclxuICAvKiogQSBzaG93biByb3cncyBjaGVja2JveCBzZWxlY3RzIGV2ZXJ5IGF1ZGl0IG9mIGl0cyBncm91cC4gKi9cclxuICB0b2dnbGVSb3cocm93OiBFZGl0b3JSb3cpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9uID0gIXJvdy5zZWxlY3RlZDtcclxuICAgIHRoaXMuZ3JvdXBSb3dzKHJvdykuZm9yRWFjaChtID0+IG0uc2VsZWN0ZWQgPSBvbik7XHJcbiAgfVxyXG5cclxuICBhZGRSb3coKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvd3MgPSBbLi4udGhpcy5yb3dzLCB0aGlzLnJvdygpXTtcclxuICAgIHRoaXMucHVibGlzaFByb2JsZW0gPSAnJztcclxuICB9XHJcblxyXG4gIC8qKiBBIHJvdyAodmlzaXQpIHRoYXQgY2FuIG5vIGxvbmdlciBiZSBlZGl0ZWQgb3IgZGVsZXRlZCAoUUEgMTEgT2N0OiBubyBlZGl0aW5nIG9sZGVyIGRhdGVzKS4gKi9cclxuICBpc0xvY2tlZChyb3c6IEVkaXRvclJvdyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubG9ja2VkS2V5cy5oYXMocm93LmtleSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNob3duIHJvdyBpcyB0aGUgdmlzaXQ6IGV2ZXJ5IGF1ZGl0IG9mIGl0cyBncm91cCBnb2VzLiAqL1xyXG4gIGRlbGV0ZVJvdyhyb3c6IEVkaXRvclJvdyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNMb2NrZWQocm93KSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucm93cyA9IHRoaXMucm93cy5maWx0ZXIociA9PiByLmdyb3VwICE9PSByb3cuZ3JvdXApO1xyXG4gICAgdGhpcy5wdWJsaXNoUHJvYmxlbSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgZHVwbGljYXRlU2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICAvLyBBIGNvcGllZCBncm91cCBzdGF5cyBvbmUgZ3JvdXAgKGEgbmV3IG9uZSkuXHJcbiAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xyXG4gICAgY29uc3QgY29waWVzID0gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc2VsZWN0ZWQpLm1hcChyID0+IHtcclxuICAgICAgY29uc3QgY29weSA9IHRoaXMucm93KHtcclxuICAgICAgICBkYXRlOiByLmRhdGUsIHVzZXJFbWFpbDogci51c2VyRW1haWwsIHN0b3JlSWQ6IHIuc3RvcmVJZCwgc3RvcmVUZXh0OiByLnN0b3JlVGV4dCwgY2hlY2tMaXN0SWQ6IHIuY2hlY2tMaXN0SWQsIHN0YXJ0OiByLnN0YXJ0LCBlbmQ6IHIuZW5kXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoZ3JvdXBzLmhhcyhyLmdyb3VwKSkgeyBjb3B5Lmdyb3VwID0gZ3JvdXBzLmdldChyLmdyb3VwKSE7IH0gZWxzZSB7IGdyb3Vwcy5zZXQoci5ncm91cCwgY29weS5ncm91cCk7IH1cclxuICAgICAgcmV0dXJuIGNvcHk7XHJcbiAgICB9KTtcclxuICAgIGlmICghY29waWVzLmxlbmd0aCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucm93cy5mb3JFYWNoKHIgPT4gci5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3MsIC4uLmNvcGllc107XHJcbiAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChncm91cHMuc2l6ZSArIChncm91cHMuc2l6ZSA9PT0gMSA/ICcgcm93IGR1cGxpY2F0ZWQnIDogJyByb3dzIGR1cGxpY2F0ZWQnKSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLnNlbGVjdGVkR3JvdXBzO1xyXG4gICAgaWYgKCFuKSB7IHJldHVybjsgfVxyXG4gICAgLy8gUGFzdCByb3dzIG9mIGEgcHVibGlzaGVkIHNjaGVkdWxlIHN0YXkgKGlzTG9ja2VkKTsgdGhlIHJlc3Qgb2YgdGhlIHNlbGVjdGlvbiBnb2VzLlxyXG4gICAgY29uc3Qga2VwdCA9IG5ldyBTZXQodGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc2VsZWN0ZWQgJiYgdGhpcy5pc0xvY2tlZChyKSkubWFwKHIgPT4gci5ncm91cCkpLnNpemU7XHJcbiAgICB0aGlzLnJvd3MgPSB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gIXIuc2VsZWN0ZWQgfHwgdGhpcy5pc0xvY2tlZChyKSk7XHJcbiAgICB0aGlzLnJvd3MuZm9yRWFjaChyID0+IHIuc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICB0aGlzLnB1Ymxpc2hQcm9ibGVtID0gJyc7XHJcbiAgICBjb25zdCBnb25lID0gbiAtIGtlcHQ7XHJcbiAgICBpZiAoZ29uZSkgeyB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChnb25lICsgKGdvbmUgPT09IDEgPyAnIHJvdyBkZWxldGVkJyA6ICcgcm93cyBkZWxldGVkJykpOyB9XHJcbiAgICBpZiAoa2VwdCkgeyB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3Qoa2VwdCArIChrZXB0ID09PSAxID8gJyBwYXN0IHJvdyB3YXMnIDogJyBwYXN0IHJvd3Mgd2VyZScpICsgJyBrZXB0OiB2aXNpdHMgYWxyZWFkeSByYWlzZWQgY2Fubm90IGJlIGRlbGV0ZWQnKTsgfVxyXG4gIH1cclxuXHJcbiAgYmFja1RvQ3JlYXRlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuc3RlcCA9ICdjcmVhdGUnO1xyXG4gIH1cclxuXHJcbiAgYmFjayhldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuY2xvc2VkLmVtaXQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVkaXRpbmcgYSBjZWxsIGNsZWFycyB3aGF0IHRoZSBBUEkgc2FpZCBhYm91dCBpdC4gKi9cclxuICB0b3VjaChyb3c6IEVkaXRvclJvdywgZmllbGQ6IFJvd0ZpZWxkKTogdm9pZCB7XHJcbiAgICBpZiAoZmllbGQgIT09ICdjaGVja0xpc3RJZCcpIHsgdGhpcy5zeW5jR3JvdXAocm93KTsgfVxyXG4gICAgdGhpcy5zZXJ2ZXJFcnJvcnMuZGVsZXRlKHJvdy5rZXkgKyAnfCcgKyBmaWVsZCk7XHJcbiAgICAvLyBBIHJlcGVhdGVkIHVzZXIgLyBzdG9yZSBpcyBhIG1hdHRlciBvZiBkYXRlIGFuZCB3aW5kb3cgdG9vOiBjaGFuZ2luZyBlaXRoZXIgbWF5IGZpeCBpdC5cclxuICAgIGlmIChmaWVsZCA9PT0gJ2RhdGUnIHx8IGZpZWxkID09PSAnd2luZG93Jykge1xyXG4gICAgICB0aGlzLnNlcnZlckVycm9ycy5kZWxldGUocm93LmtleSArICd8dXNlckVtYWlsJyk7XHJcbiAgICAgIHRoaXMuc2VydmVyRXJyb3JzLmRlbGV0ZShyb3cua2V5ICsgJ3xzdG9yZUlkJyk7XHJcbiAgICAgIC8vIEEgd2luZG93IG1lcmdlcyBvbmx5IG9uY2UgYm90aCB0aW1lcyBhcmUgc2V0IChhIGhhbGYtdHlwZWQgdGltZSBpcyBub3QgYSB3aW5kb3cgeWV0KS5cclxuICAgICAgaWYgKGZpZWxkID09PSAnZGF0ZScgfHwgKHJvdy5zdGFydCAmJiByb3cuZW5kKSkgeyB0aGlzLm1lcmdlVmlzaXQocm93KTsgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5wdWJsaXNoUHJvYmxlbSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSB2YWxpZGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgY2VsbEVycm9yKHJvdzogRWRpdG9yUm93LCBmaWVsZDogUm93RmllbGQpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VydmVyID0gdGhpcy5zZXJ2ZXJFcnJvcnMuZ2V0KHJvdy5rZXkgKyAnfCcgKyBmaWVsZCk7XHJcbiAgICBpZiAoc2VydmVyKSB7IHJldHVybiBzZXJ2ZXI7IH1cclxuICAgIHN3aXRjaCAoZmllbGQpIHtcclxuICAgICAgY2FzZSAnZGF0ZSc6XHJcbiAgICAgICAgaWYgKCFyb3cuZGF0ZSkgeyByZXR1cm4gJ1BpY2sgYSBkYXRlJzsgfVxyXG4gICAgICAgIC8vIFBhc3QgZGF0ZXMgY2Fubm90IGJlIHB1Ymxpc2hlZCAoUUEpOyByb3dzIGEgcHVibGlzaGVkIHNjaGVkdWxlIGFscmVhZHkgcmFpc2VkIHN0YXkuXHJcbiAgICAgICAgcmV0dXJuIHJvdy5kYXRlIDwgdGhpcy50b2RheSAmJiAhdGhpcy5yYWlzZWRLZXlzLmhhcyh0aGlzLnZpc2l0S2V5KHJvdykpID8gJ0RhdGUgaXMgaW4gdGhlIHBhc3Qg4oCUIHBpY2sgdG9kYXkgb3IgYSBsYXRlciBkYXRlJyA6ICcnO1xyXG4gICAgICBjYXNlICd1c2VyRW1haWwnOlxyXG4gICAgICAgIGlmICghcm93LnVzZXJFbWFpbC50cmltKCkpIHsgcmV0dXJuICdQaWNrIGEgdXNlcic7IH1cclxuICAgICAgICBpZiAodGhpcy51c2Vycy5sZW5ndGggJiYgIXRoaXMudXNlckVtYWlscy5oYXMocm93LnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKSkpIHsgcmV0dXJuICdObyBhY3RpdmUgdXNlciB3aXRoIHRoaXMgZW1haWwnOyB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZHVwRXJyb3JzLmdldChyb3cua2V5ICsgJ3x1c2VyRW1haWwnKSB8fCB0aGlzLmxpdmVFcnJvcnMuZ2V0KHJvdy5rZXkgKyAnfHVzZXJFbWFpbCcpIHx8ICcnO1xyXG4gICAgICBjYXNlICdzdG9yZUlkJzpcclxuICAgICAgICAvLyBTdG9yZXMgYXJlIHBpY2tlZCBieSBuYW1lOyB0aGUgc3RvcmUgaWQgaXMgcmVzb2x2ZWQgYmVoaW5kIHRoZSBzY2VuZXMgYW5kIG5ldmVyIGFza2VkIGZvci5cclxuICAgICAgICBpZiAoIXJvdy5zdG9yZVRleHQudHJpbSgpICYmICFyb3cuc3RvcmVJZC50cmltKCkpIHsgcmV0dXJuICdQaWNrIGEgc3RvcmUnOyB9XHJcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVzLmxlbmd0aCAmJiAhdGhpcy5zdG9yZUlkcy5oYXMocm93LnN0b3JlSWQudHJpbSgpKSkgeyByZXR1cm4gJ05vIGFjdGl2ZSBzdG9yZSBuYW1lZCDigJwnICsgcm93LnN0b3JlVGV4dC50cmltKCkgKyAn4oCdJzsgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmR1cEVycm9ycy5nZXQocm93LmtleSArICd8c3RvcmVJZCcpIHx8IHRoaXMubGl2ZUVycm9ycy5nZXQocm93LmtleSArICd8c3RvcmVJZCcpIHx8ICcnO1xyXG4gICAgICBjYXNlICdjaGVja0xpc3RJZCc6XHJcbiAgICAgICAgLy8gQW55IGF1ZGl0IGEgcm93IHBpY2tzIGpvaW5zIHRoZSBzY2hlZHVsZSdzIGF1ZGl0cyBvbiBzYXZlIChRQSAxMCBPY3QpLCBzbyBvbmx5IGEgbWlzc2luZyBvbmUgaXMgZmxhZ2dlZC5cclxuICAgICAgICByZXR1cm4gIXJvdy5jaGVja0xpc3RJZCA/ICdQaWNrIGFuIGF1ZGl0JyA6ICcnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIC8vIFRoZSB2aXNpdCB3aW5kb3cgaXMgb3B0aW9uYWwgKFFBIDEwIE9jdCk6IGxlZnQgYmxhbmssIHRoZSBBUEkgcmFpc2VzIHRoZSB2aXNpdCB3aXRoIHRoZSBzdG9yZSdzIG9wZW4gLSBjbG9zZVxyXG4gICAgICAgIC8vIHRpbWUgKDEwOjAwIC0gMjI6MDAgd2hlbiB0aGUgc3RvcmUgaGFzIG5vbmUpLiBHaXZlbiwgaXQgbmVlZHMgYm90aCB0aW1lcywgZW5kaW5nIGFmdGVyIGl0IHN0YXJ0cy5cclxuICAgICAgICBpZiAoIXJvdy5zdGFydCAmJiAhcm93LmVuZCkgeyByZXR1cm4gJyc7IH1cclxuICAgICAgICBpZiAoIXJvdy5zdGFydCB8fCAhcm93LmVuZCkgeyByZXR1cm4gJ1BpY2sgYm90aCB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgdGltZSwgb3IgbGVhdmUgYm90aCBibGFuayc7IH1cclxuICAgICAgICBpZiAocm93LnN0YXJ0ICYmIHJvdy5lbmQgJiYgcm93LnN0YXJ0ID49IHJvdy5lbmQpIHsgcmV0dXJuICdXaW5kb3cgbXVzdCBlbmQgYWZ0ZXIgaXQgc3RhcnRzJzsgfVxyXG4gICAgICAgIC8vIEEgcm93IGZvciB0b2RheSB3aG9zZSBvd24gd2luZG93IGlzIGFscmVhZHkgb3ZlciBjb3VsZCBvbmx5IGJlIG1pc3NlZC4gKEEgYmxhbmsgd2luZG93XHJcbiAgICAgICAgLy8gdXNlcyB0aGUgYXVkaXQncyB0aW1lIGZyYW1lLCB3aGljaCB0aGUgQVBJIGNoZWNrcy4pXHJcbiAgICAgICAgaWYgKHJvdy5kYXRlID09PSB0aGlzLnRvZGF5ICYmIHJvdy5lbmQgJiYgcm93LmVuZCA8PSBkYXlqcygpLmZvcm1hdCgnSEg6bW0nKSAmJiAhdGhpcy5yYWlzZWRLZXlzLmhhcyh0aGlzLnZpc2l0S2V5KHJvdykpKSB7XHJcbiAgICAgICAgICByZXR1cm4gJ1RoaXMgd2luZG93IGVuZGVkIGF0ICcgKyByb3cuZW5kICsgJyB0b2RheSDigJQgcGljayBhIGxhdGVyIGVuZCB0aW1lIG9yIGRhdGUnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5kdXBFcnJvcnMuZ2V0KHJvdy5rZXkgKyAnfHdpbmRvdycpIHx8IHRoaXMubGl2ZUVycm9ycy5nZXQocm93LmtleSArICd8d2luZG93JykgfHwgJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogVG9kYXkgb24gdGhpcyBkZXZpY2UgKFlZWVktTU0tREQpOiB0aGUgZmlyc3QgZGF0ZSBhIG5ldyByb3cgbWF5IGhhdmUuICovXHJcbiAgZ2V0IHRvZGF5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZGF5anMoKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICB9XHJcblxyXG4gIC8qKiBBIHJvdyBhcyBhIHZpc2l0OiBhdWRpdCwgc3RvcmUsIGRhdGUsIHVzZXIgYW5kIHdpbmRvdyAodGhlIEFQSSdzIHJvd1Zpc2l0S2V5KS4gKi9cclxuICBwcml2YXRlIHZpc2l0S2V5KHI6IEVkaXRvclJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gW3IuY2hlY2tMaXN0SWQsIHIuc3RvcmVJZC50cmltKCksIHIuZGF0ZSwgci51c2VyRW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCksIHIuc3RhcnQgfHwgJycsIHIuZW5kIHx8ICcnXS5qb2luKCd8Jyk7XHJcbiAgfVxyXG5cclxuICAvKiogV2hhdCBpcyB3cm9uZyB3aXRoIGEgcm93LCBvbmUgbGluZSBwZXIgcHJvYmxlbTogc2hvd24gaW4gcmVkIHVuZGVyIHRoZSByb3cgKGEgcmVkIGNlbGwgYWxvbmUgZG9lcyBub3Qgc2F5IHdoeSkuICovXHJcbiAgcm93TWVzc2FnZXMocm93OiBFZGl0b3JSb3cpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBSb3dzKHJvdyk7XHJcbiAgICBncm91cC5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAoWydkYXRlJywgJ3VzZXJFbWFpbCcsICdzdG9yZUlkJywgJ2NoZWNrTGlzdElkJywgJ3dpbmRvdyddIGFzIFJvd0ZpZWxkW10pLmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgY29uc3QgbSA9IHRoaXMuY2VsbEVycm9yKHIsIGYpO1xyXG4gICAgICAgIC8vIEFuIGF1ZGl0J3Mgb3duIHByb2JsZW0gc2F5cyB3aGljaCBhdWRpdCwgd2hlbiB0aGUgcm93IGhvbGRzIHNldmVyYWwgKHVubGVzcyB0aGUgbWVzc2FnZSBuYW1lcyBpdCBhbHJlYWR5KS5cclxuICAgICAgICBjb25zdCBuYW1lID0gci5jaGVja0xpc3RJZCA/IHRoaXMuYXVkaXROYW1lKHIuY2hlY2tMaXN0SWQpIDogJyc7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IG0gJiYgZ3JvdXAubGVuZ3RoID4gMSAmJiAoZiA9PT0gJ2NoZWNrTGlzdElkJyB8fCBmID09PSAndXNlckVtYWlsJyB8fCBmID09PSAnc3RvcmVJZCcpICYmIG5hbWVcclxuICAgICAgICAgICYmICFtLmluY2x1ZGVzKCdcIicgKyBuYW1lICsgJ1wiJylcclxuICAgICAgICAgID8gbmFtZSArICc6ICcgKyBtIDogbTtcclxuICAgICAgICBpZiAodGV4dCAmJiAhb3V0LmluY2x1ZGVzKHRleHQpKSB7IG91dC5wdXNoKHRleHQpOyB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gb3V0O1xyXG4gIH1cclxuXHJcbiAgLyoqIEhpbnRzIHVuZGVyIHRoZSByb3cgKGdyZXkpOiBhbGxvd2VkLCBzaG93biBzbyB0aGUgdXNlciBrbm93cy4gRXZlcnkgYXVkaXQgb2YgdGhlIGdyb3VwLiAqL1xyXG4gIHJvd0hpbnRzKHJvdzogRWRpdG9yUm93KTogc3RyaW5nW10ge1xyXG4gICAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3VwUm93cyhyb3cpO1xyXG4gICAgZ3JvdXAuZm9yRWFjaChyID0+ICh0aGlzLmxpdmVXYXJuaW5ncy5nZXQoci5rZXkpIHx8IFtdKS5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICBjb25zdCB0ZXh0ID0gZ3JvdXAubGVuZ3RoID4gMSAmJiByLmNoZWNrTGlzdElkID8gdGhpcy5hdWRpdE5hbWUoci5jaGVja0xpc3RJZCkgKyAnOiAnICsgbSA6IG07XHJcbiAgICAgIGlmICghb3V0LmluY2x1ZGVzKHRleHQpKSB7IG91dC5wdXNoKHRleHQpOyB9XHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4gb3V0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByb3dJbnZhbGlkKHJvdzogRWRpdG9yUm93KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFsnZGF0ZScsICd1c2VyRW1haWwnLCAnc3RvcmVJZCcsICdjaGVja0xpc3RJZCcsICd3aW5kb3cnXSBhcyBSb3dGaWVsZFtdKS5zb21lKGYgPT4gISF0aGlzLmNlbGxFcnJvcihyb3csIGYpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB3aW5kb3cgYSByb3cncyB2aXNpdCBnZXRzOiBpdHMgb3duIHRpbWVzLCBvciB0aGUgYXVkaXQncyB0aW1lIGZyYW1lIHdoZW4gaXQgbGVhdmVzIHRoZW1cclxuICAgKiBibGFuayAodGhlIEFQSSByYWlzZXMgaXQgdGhlIHNhbWUgd2F5OyAxMDowMOKAkzIyOjAwIHdoZW4gdGhlIGF1ZGl0IGhhcyBub25lKS5cclxuICAgKi9cclxuICAvKiogQSByb3cncyB2aXNpdCB3aW5kb3c7IGJsYW5rID0gMTA6MDAgQU0gLSAxMDowMCBQTSwgYXMgdGhlIEFQSSByYWlzZXMgaXQgKFFBIDEwIE9jdCkuICovXHJcbiAgcHJpdmF0ZSByb3dXaW5kb3cocjogRWRpdG9yUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByLnN0YXJ0ICYmIHIuZW5kID8gci5zdGFydCArICctJyArIHIuZW5kIDogJzEwOjAwLTIyOjAwJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgc3RvcmUgZ2V0cyBvbmUgdmlzaXQgb2YgYW4gYXVkaXQgcGVyIGRhdGUgYW5kIHZpc2l0IHdpbmRvdzogYSBsYXRlciByb3cgcmVwZWF0aW5nIGl0IGlzIGZsYWdnZWQgb24gaXRzIHN0b3JlXHJcbiAgICogY2VsbC4gVGhlIHNhbWUgdXNlciBhdCBhbm90aGVyIHN0b3JlIChvciBiZWZvcmUgYSBzdG9yZSBpcyBwaWNrZWQpIGlzIG5vdCBhIGR1cGxpY2F0ZSAoUUEgMTEgT2N0KS4gQmxhbmsgd2luZG93c1xyXG4gICAqIGFyZSAxMDowMCBBTSAtIDEwOjAwIFBNLCBzbyBibGFuayByb3dzIG9mIG9uZSBzdG9yZSBjbGFzaC4gU2FtZSBtZXNzYWdlcyBhcyB0aGUgQVBJLCB3aGljaCBhbHNvIGNoZWNrcyB0aGVcclxuICAgKiBjbGllbnQncyBvdGhlciBwdWJsaXNoZWQgc2NoZWR1bGVzIChhcyBhIGhpbnQpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmluZER1cGxpY2F0ZXMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICBjb25zdCBvdXQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gICAgY29uc3QgZmlyc3RFbWFpbCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgICAvLyBWaXNpdCB3aW5kb3dzIGFyZSBub3QgY29tcGFyZWQgYWNyb3NzIHN0b3JlcyAoUUEgMTAgT2N0KTogb25seSBlYWNoIHJvdydzIG93biBzdGFydCAvIGVuZCBhcmUgY2hlY2tlZCAoY2VsbEVycm9yKS5cclxuICAgIHRoaXMucm93cy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICBjb25zdCBzdG9yZSA9IHIuc3RvcmVJZC50cmltKCk7XHJcbiAgICAgIGlmICghci5kYXRlIHx8ICFyLmNoZWNrTGlzdElkIHx8ICFzdG9yZSkgeyByZXR1cm47IH1cclxuICAgICAgLy8gQSBoYWxmLWZpbGxlZCBvciByZXZlcnNlZCB3aW5kb3cgaGFzIGl0cyBvd24gZXJyb3I7IGl0IGlzIG5vdCBjb21wYXJlZCB1bnRpbCBmaXhlZC5cclxuICAgICAgaWYgKCEhci5zdGFydCAhPT0gISFyLmVuZCB8fCAoci5zdGFydCAmJiByLmVuZCAmJiByLnN0YXJ0ID49IHIuZW5kKSkgeyByZXR1cm47IH1cclxuICAgICAgY29uc3QgZW1haWwgPSByLnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgY29uc3Qgc2xvdCA9IHIuY2hlY2tMaXN0SWQgKyAnfCcgKyByLmRhdGUgKyAnfCcgKyB0aGlzLnJvd1dpbmRvdyhyKSArICd8JyArIHN0b3JlO1xyXG4gICAgICBpZiAoZmlyc3RFbWFpbC5oYXMoc2xvdCkpIHtcclxuICAgICAgICAvLyBOYW1lcyB0aGUgYXVkaXQgKFFBIDExIE9jdCksIGFzIHRoZSBBUEkncyBtZXNzYWdlIGRvZXMuXHJcbiAgICAgICAgY29uc3QgYXVkaXQgPSB0aGlzLmF1ZGl0TmFtZShyLmNoZWNrTGlzdElkKTtcclxuICAgICAgICBjb25zdCB3aG8gPSBlbWFpbCAmJiBmaXJzdEVtYWlsLmdldChzbG90KSA9PT0gZW1haWwgPyAnVGhpcyB1c2VyIGFuZCBzdG9yZSBhbHJlYWR5IGhhdmUgdGhlICcgOiAnVGhpcyBzdG9yZSBhbHJlYWR5IGhhcyB0aGUgJztcclxuICAgICAgICBvdXQuc2V0KHIua2V5ICsgJ3xzdG9yZUlkJywgd2hvICsgKGF1ZGl0ID8gJ1wiJyArIGF1ZGl0ICsgJ1wiJyA6ICd0aGlzJykgKyAnIGF1ZGl0IHNjaGVkdWxlZCBmb3IgdGhpcyBkYXRlIGFuZCB2aXNpdCB3aW5kb3cgaW4gYW5vdGhlciByb3cnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmaXJzdEVtYWlsLnNldChzbG90LCBlbWFpbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG91dDtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gcGlja2VycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIG9wZW5QaWNrZXIocm93OiBFZGl0b3JSb3csIGZpZWxkOiBQaWNrQ2VsbCwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGNvbnN0IGFuY2hvciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5pc09wZW4ocm93LCBmaWVsZCkgJiYgZXZlbnQudHlwZSA9PT0gJ2NsaWNrJyAmJiBmaWVsZCA9PT0gJ2NoZWNrTGlzdElkJykge1xyXG4gICAgICB0aGlzLmNsb3NlUGlja2VyKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlb3BlbiA9ICF0aGlzLmlzT3Blbihyb3csIGZpZWxkKTtcclxuICAgIHRoaXMub3BlbkNlbGwgPSB7IGtleTogcm93LmtleSwgZmllbGQgfTtcclxuICAgIHRoaXMubWVudUFuY2hvciA9IGFuY2hvcjtcclxuICAgIGlmIChyZW9wZW4gJiYgZmllbGQgPT09ICdjaGVja0xpc3RJZCcpIHtcclxuICAgICAgdGhpcy5hdWRpdFF1ZXJ5ID0gJyc7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZS1tZW51IC5zZS1tZW51LXNlYXJjaCBpbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsKT8uZm9jdXMoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAocmVvcGVuKSB7IHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLnNlbGVjdGVkSW5kZXgocm93LCBmaWVsZCk7IH1cclxuICAgIHRoaXMucGxhY2VNZW51KCk7XHJcbiAgfVxyXG5cclxuICBjbG9zZVBpY2tlcigpOiB2b2lkIHtcclxuICAgIHRoaXMub3BlbkNlbGwgPSBudWxsO1xyXG4gICAgdGhpcy5tZW51QW5jaG9yID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBCZWxvdyB0aGUgY2VsbCwgb3IgYWJvdmUgaXQgd2hlbiB0aGUgdmlld3BvcnQgaGFzIG5vIHJvb20gdW5kZXJuZWF0aC4gKi9cclxuICBwbGFjZU1lbnUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubWVudUFuY2hvcikgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IHIgPSB0aGlzLm1lbnVBbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCByb29tID0gd2luZG93LmlubmVySGVpZ2h0IC0gci5ib3R0b207XHJcbiAgICBjb25zdCB1cCA9IHJvb20gPCAzMDAgJiYgci50b3AgPiByb29tO1xyXG4gICAgdGhpcy5tZW51UG9zID0ge1xyXG4gICAgICB0b3A6IHVwID8gbnVsbCA6IE1hdGgucm91bmQoci5ib3R0b20gKyA0KSxcclxuICAgICAgYm90dG9tOiB1cCA/IE1hdGgucm91bmQod2luZG93LmlubmVySGVpZ2h0IC0gci50b3AgKyA0KSA6IG51bGwsXHJcbiAgICAgIGxlZnQ6IE1hdGgucm91bmQoci5sZWZ0KSxcclxuICAgICAgd2lkdGg6IE1hdGgucm91bmQoci53aWR0aClcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBpc09wZW4ocm93OiBFZGl0b3JSb3csIGZpZWxkOiBQaWNrQ2VsbCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlbkNlbGw/LmtleSA9PT0gcm93LmtleSAmJiB0aGlzLm9wZW5DZWxsPy5maWVsZCA9PT0gZmllbGQ7XHJcbiAgfVxyXG5cclxuICB1c2VyTWF0Y2hlcyhyb3c6IEVkaXRvclJvdyk6IFBpY2tVc2VyW10ge1xyXG4gICAgY29uc3QgcSA9IHJvdy51c2VyRW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy51c2Vycy5maWx0ZXIodSA9PiAhcSB8fCB1LmVtYWlsLmluY2x1ZGVzKHEpIHx8IHUubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcclxuICB9XHJcblxyXG4gIHVzZXJTdWdnZXN0aW9ucyhyb3c6IEVkaXRvclJvdyk6IFBpY2tVc2VyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlck1hdGNoZXMocm93KS5zbGljZSgwLCB0aGlzLnBpY2tMaW1pdCk7XHJcbiAgfVxyXG5cclxuICBzdG9yZU1hdGNoZXMocm93OiBFZGl0b3JSb3cpOiBQaWNrU3RvcmVbXSB7XHJcbiAgICBjb25zdCBxID0gcm93LnN0b3JlVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnN0b3Jlcy5maWx0ZXIocyA9PiAhcSB8fCBzLnN0b3JlSWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBzLnN0b3JlTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8IHMuY2l0eS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcclxuICB9XHJcblxyXG4gIHN0b3JlU3VnZ2VzdGlvbnMocm93OiBFZGl0b3JSb3cpOiBQaWNrU3RvcmVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZU1hdGNoZXMocm93KS5zbGljZSgwLCB0aGlzLnBpY2tMaW1pdCk7XHJcbiAgfVxyXG5cclxuICAvKiogXCJTaG93aW5nIDMwIG9mIDMsMzkwIHN0b3Jlc1wiIHdoZW4gdGhlIGxpc3QgaXMgY3V0OyBlbXB0eSB3aGVuIGV2ZXJ5dGhpbmcgZml0cy4gKi9cclxuICBtb3JlTGFiZWwoc2hvd246IG51bWJlciwgdG90YWw6IG51bWJlciwgbm91bjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0b3RhbCA+IHNob3duID8gJ1Nob3dpbmcgJyArIHNob3duICsgJyBvZiAnICsgdG90YWwudG9Mb2NhbGVTdHJpbmcoKSArICcgJyArIG5vdW4gKyAnIMK3IHR5cGUgdG8gbmFycm93JyA6ICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvcHRpb25Db3VudChyb3c6IEVkaXRvclJvdywgZmllbGQ6IFBpY2tDZWxsKTogbnVtYmVyIHtcclxuICAgIGlmIChmaWVsZCA9PT0gJ3VzZXJFbWFpbCcpIHsgcmV0dXJuIHRoaXMudXNlclN1Z2dlc3Rpb25zKHJvdykubGVuZ3RoOyB9XHJcbiAgICBpZiAoZmllbGQgPT09ICdzdG9yZUlkJykgeyByZXR1cm4gdGhpcy5zdG9yZVN1Z2dlc3Rpb25zKHJvdykubGVuZ3RoOyB9XHJcbiAgICByZXR1cm4gdGhpcy5hdWRpdE1hdGNoZXMoKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdGVkSW5kZXgocm93OiBFZGl0b3JSb3csIGZpZWxkOiBQaWNrQ2VsbCk6IG51bWJlciB7XHJcbiAgICBsZXQgaSA9IC0xO1xyXG4gICAgaWYgKGZpZWxkID09PSAndXNlckVtYWlsJykgeyBpID0gdGhpcy51c2VyU3VnZ2VzdGlvbnMocm93KS5maW5kSW5kZXgodSA9PiB1LmVtYWlsID09PSByb3cudXNlckVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTsgfVxyXG4gICAgaWYgKGZpZWxkID09PSAnc3RvcmVJZCcpIHsgaSA9IHRoaXMuc3RvcmVTdWdnZXN0aW9ucyhyb3cpLmZpbmRJbmRleChzID0+IHMuc3RvcmVJZCA9PT0gcm93LnN0b3JlSWQudHJpbSgpKTsgfVxyXG4gICAgaWYgKGZpZWxkID09PSAnY2hlY2tMaXN0SWQnKSB7IGkgPSB0aGlzLmF1ZGl0TWF0Y2hlcygpLmZpbmRJbmRleChhID0+IGEuaWQgPT09IHJvdy5jaGVja0xpc3RJZCk7IH1cclxuICAgIHJldHVybiBNYXRoLm1heChpLCAwKTtcclxuICB9XHJcblxyXG4gIC8qKiBBcnJvdyBrZXlzIG1vdmUgdGhyb3VnaCB0aGUgb3B0aW9ucywgRW50ZXIgcGlja3MsIEVzY2FwZSBjbG9zZXMuICovXHJcbiAgb25QaWNrZXJLZXkocm93OiBFZGl0b3JSb3csIGZpZWxkOiBQaWNrQ2VsbCwgZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7IHRoaXMuY2xvc2VQaWNrZXIoKTsgcmV0dXJuOyB9XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKHJvdywgZmllbGQpKSB7XHJcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7IHRoaXMub3BlblBpY2tlcihyb3csIGZpZWxkLCBldmVudCk7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY291bnQgPSB0aGlzLm9wdGlvbkNvdW50KHJvdywgZmllbGQpO1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgaWYgKCFjb3VudCkgeyByZXR1cm47IH1cclxuICAgICAgdGhpcy5hY3RpdmVJbmRleCA9ICh0aGlzLmFjdGl2ZUluZGV4ICsgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicgPyAxIDogLTEpICsgY291bnQpICUgY291bnQ7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlLW1lbnUgLnNlLW9wdC5pcy1hY3RpdmUnKT8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pKTtcclxuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGlmICghY291bnQpIHsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IGkgPSBNYXRoLm1pbih0aGlzLmFjdGl2ZUluZGV4LCBjb3VudCAtIDEpO1xyXG4gICAgICBpZiAoZmllbGQgPT09ICd1c2VyRW1haWwnKSB7IHRoaXMucGlja1VzZXIocm93LCB0aGlzLnVzZXJTdWdnZXN0aW9ucyhyb3cpW2ldLCBldmVudCk7IH1cclxuICAgICAgZWxzZSBpZiAoZmllbGQgPT09ICdzdG9yZUlkJykgeyB0aGlzLnBpY2tTdG9yZShyb3csIHRoaXMuc3RvcmVTdWdnZXN0aW9ucyhyb3cpW2ldLCBldmVudCk7IH1cclxuICAgICAgZWxzZSB7IHRoaXMudG9nZ2xlQXVkaXQocm93LCB0aGlzLmF1ZGl0TWF0Y2hlcygpW2ldLCBldmVudCk7IH1cclxuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xyXG4gICAgICB0aGlzLmNsb3NlUGlja2VyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogVHlwaW5nIGluIGEgcGlja2VyIGNlbGwgc3RhcnRzIHRoZSBoaWdobGlnaHQgb3ZlciBhdCB0aGUgZmlyc3QgbWF0Y2guICovXHJcbiAgb25QaWNrZXJJbnB1dChyb3c6IEVkaXRvclJvdywgZmllbGQ6IFBpY2tDZWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLnRvdWNoKHJvdywgZmllbGQpO1xyXG4gICAgdGhpcy5hY3RpdmVJbmRleCA9IDA7XHJcbiAgICAvLyBUeXBpbmcgYWZ0ZXIgRXNjYXBlIGJyaW5ncyB0aGUgbGlzdCBiYWNrIHVuZGVyIHRoZSBmb2N1c2VkIGNlbGwuXHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKHJvdywgZmllbGQpICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICB0aGlzLm9wZW5DZWxsID0geyBrZXk6IHJvdy5rZXksIGZpZWxkIH07XHJcbiAgICAgIHRoaXMubWVudUFuY2hvciA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIHRoaXMucGxhY2VNZW51KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwaWNrVXNlcihyb3c6IEVkaXRvclJvdywgdTogUGlja1VzZXIsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICByb3cudXNlckVtYWlsID0gdS5lbWFpbDtcclxuICAgIHRoaXMudG91Y2gocm93LCAndXNlckVtYWlsJyk7XHJcbiAgICB0aGlzLmNsb3NlUGlja2VyKCk7XHJcbiAgICB0aGlzLm1lcmdlVmlzaXQocm93KTtcclxuICB9XHJcblxyXG4gIHBpY2tTdG9yZShyb3c6IEVkaXRvclJvdywgczogUGlja1N0b3JlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgcm93LnN0b3JlSWQgPSBzLnN0b3JlSWQ7XHJcbiAgICByb3cuc3RvcmVUZXh0ID0gcy5zdG9yZU5hbWUgfHwgcy5zdG9yZUlkO1xyXG4gICAgdGhpcy50b3VjaChyb3csICdzdG9yZUlkJyk7XHJcbiAgICB0aGlzLmNsb3NlUGlja2VyKCk7XHJcbiAgICB0aGlzLm1lcmdlVmlzaXQocm93KTtcclxuICB9XHJcblxyXG4gIC8qKiBUeXBpbmcgaW4gdGhlIHN0b3JlIGNlbGw6IHRoZSB0ZXh0IGlzIHRoZSBzdG9yZSBuYW1lOyBpdCBwaWNrcyB0aGUgc3RvcmUgb25jZSBpdCBuYW1lcyBvbmUgZXhhY3RseS4gKi9cclxuICBvblN0b3JlVHlwZWQocm93OiBFZGl0b3JSb3csIHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgcm93LnN0b3JlVGV4dCA9IHRleHQ7XHJcbiAgICByb3cuc3RvcmVJZCA9IHRoaXMuc3RvcmVJZEZvcih0ZXh0KTtcclxuICAgIHRoaXMub25QaWNrZXJJbnB1dChyb3csICdzdG9yZUlkJyk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGFjdGl2ZSBzdG9yZSBhIG5hbWUgKG9yLCBmcm9tIGFuIG9sZCB0ZW1wbGF0ZSwgYW4gaWQpIHN0YW5kcyBmb3I7ICcnIHdoZW4gbm9uZSBvciBub3QgbG9hZGVkLiAqL1xyXG4gIHByaXZhdGUgc3RvcmVJZEZvcih0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdCA9IFN0cmluZyh0ZXh0IHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmICghdCkgeyByZXR1cm4gJyc7IH1cclxuICAgIGNvbnN0IG5hbWVkID0gdGhpcy5zdG9yZXMuZmlsdGVyKHMgPT4gcy5zdG9yZU5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IHQpO1xyXG4gICAgaWYgKG5hbWVkLmxlbmd0aCA9PT0gMSkgeyByZXR1cm4gbmFtZWRbMF0uc3RvcmVJZDsgfVxyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVzLmZpbmQocyA9PiBzLnN0b3JlSWQudG9Mb3dlckNhc2UoKSA9PT0gdCk/LnN0b3JlSWQgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBzdG9yZUxhYmVsKHN0b3JlSWQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZUJ5SWQuZ2V0KFN0cmluZyhzdG9yZUlkIHx8ICcnKS50cmltKCkpPy5zdG9yZU5hbWUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICB1c2VyTGFiZWwoZW1haWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyQnlFbWFpbC5nZXQoU3RyaW5nKGVtYWlsIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSk/Lm5hbWUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBpbml0aWFscyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFydHMgPSBTdHJpbmcodGV4dCB8fCAnJykudHJpbSgpLnNwbGl0KC9bXFxzLl9ALV0rLykuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgcmV0dXJuICgocGFydHNbMF0/LlswXSB8fCAnJykgKyAocGFydHNbMV0/LlswXSB8fCBwYXJ0c1swXT8uWzFdIHx8ICcnKSkudG9VcHBlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIGF1ZGl0TmFtZShpZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmFsbEF1ZGl0cy5maW5kKGEgPT4gYS5pZCA9PT0gaWQpPy5uYW1lIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVJvdyhfOiBudW1iZXIsIHJvdzogRWRpdG9yUm93KTogbnVtYmVyIHtcclxuICAgIHJldHVybiByb3cua2V5O1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeUF1ZGl0KF86IG51bWJlciwgYTogU2NoZWR1bGVBdWRpdCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYS5pZDtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gc2F2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHNhdmVEcmFmdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2ZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhblB1Ymxpc2gpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHRoaXMucm93cy5sZW5ndGggPyAnQ29tcGxldGUgdGhlIGhpZ2hsaWdodGVkIHJvd3MgZmlyc3QnIDogJ0FkZCBhdCBsZWFzdCBvbmUgcm93Jyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZShwdWJsaXNoOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zYXZpbmcpIHsgcmV0dXJuOyB9XHJcbiAgICBpZiAoIXRoaXMubmFtZS50cmltKCkpIHsgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdOYW1lIHRoZSBzY2hlZHVsZSBmaXJzdCcpOyB0aGlzLnN0ZXAgPSAnY3JlYXRlJzsgcmV0dXJuOyB9XHJcbiAgICAvLyBFdmVyeSBhdWRpdCBvbiBvZmZlcjogdGhlIHNjaGVkdWxlJ3MgYXVkaXRzIGFyZSB0aGUgb25lcyBpdHMgcm93cyBuYW1lLiBPdGhlcndpc2UgdGhlIHBpY2tzIHBsdXMgYW55IGF1ZGl0IGFcclxuICAgIC8vIHJvdyBjaG9zZSBpbiB0aGUgQXVkaXQgYXNzaWduZWQgY29sdW1uICh0aGUgQVBJIGNoZWNrcyBlYWNoIHJvdydzIGF1ZGl0IGFnYWluc3QgdGhlIHNjaGVkdWxlJ3MgbGlzdCkuXHJcbiAgICBjb25zdCByb3dBdWRpdHMgPSB0aGlzLnJvd3MubWFwKHIgPT4gci5jaGVja0xpc3RJZCkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgdGhpcy5waWNrcyA9IEFycmF5LmZyb20obmV3IFNldCh0aGlzLm9wZW5BdWRpdHMgPyByb3dBdWRpdHMgOiBbLi4udGhpcy5waWNrcywgLi4ucm93QXVkaXRzXSkpO1xyXG4gICAgaWYgKCF0aGlzLnBpY2tzLmxlbmd0aCkgeyB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1BpY2sgYXQgbGVhc3Qgb25lIGF1ZGl0Jyk7IHRoaXMuc3RlcCA9ICdjcmVhdGUnOyByZXR1cm47IH1cclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VydmVyRXJyb3JzLmNsZWFyKCk7XHJcbiAgICB0aGlzLnB1Ymxpc2hQcm9ibGVtID0gJyc7XHJcbiAgICBjb25zdCBzZW50ID0gWy4uLnRoaXMucm93c107XHJcbiAgICBjb25zdCBib2R5OiBhbnkgPSB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBuYW1lOiB0aGlzLm5hbWUudHJpbSgpLFxyXG4gICAgICBjaGVja2xpc3RJZHM6IHRoaXMucGlja3MsXHJcbiAgICAgIC8vIHN0b3JlTmFtZSBsZXRzIHRoZSBBUEkgZmluZCB0aGUgc3RvcmUgd2hlbiB0aGUgaWQgaXMgbm90IHJlc29sdmVkIGhlcmUgKHN0b3JlcyBub3QgbG9hZGVkKS5cclxuICAgICAgcm93czogc2VudC5tYXAociA9PiAoe1xyXG4gICAgICAgIGRhdGU6IHIuZGF0ZSwgdXNlckVtYWlsOiByLnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKSwgc3RvcmVJZDogci5zdG9yZUlkLnRyaW0oKSwgc3RvcmVOYW1lOiByLnN0b3JlVGV4dC50cmltKCksXHJcbiAgICAgICAgY2hlY2tMaXN0SWQ6IHIuY2hlY2tMaXN0SWQgfHwgJycsIHN0YXJ0OiByLnN0YXJ0LCBlbmQ6IHIuZW5kXHJcbiAgICAgIH0pKSxcclxuICAgICAgcHVibGlzaFxyXG4gICAgfTtcclxuICAgIGNvbnN0IGNhbGwgPSB0aGlzLnNjaGVkdWxlSWRcclxuICAgICAgPyB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U2NoZWR1bGVVcGRhdGUoeyAuLi5ib2R5LCBzY2hlZHVsZUlkOiB0aGlzLnNjaGVkdWxlSWQgfSlcclxuICAgICAgOiB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U2NoZWR1bGVDcmVhdGUoYm9keSk7XHJcbiAgICBjYWxsLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgIT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5wdWJsaXNoUHJvYmxlbSA9IHB1Ymxpc2ggPyByZXM/Lm1lc3NhZ2UgfHwgJ0NvdWxkIG5vdCBwdWJsaXNoIHRoZSBzY2hlZHVsZScgOiAnJztcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChyZXM/Lm1lc3NhZ2UgfHwgJ0NvdWxkIG5vdCBzYXZlIHRoZSBzY2hlZHVsZScpO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWUudHJpbSgpO1xyXG4gICAgICAgIGlmIChwdWJsaXNoKSB7XHJcbiAgICAgICAgICBjb25zdCBhdWRpdHM6IGFueVtdID0gcmVzPy5kYXRhPy5hdWRpdHMgfHwgW107XHJcbiAgICAgICAgICBjb25zdCBub3dMaXZlID0gYXVkaXRzLmZpbHRlcihhID0+IGEucHVibGlzaGVkTm93KS5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnXCInICsgbmFtZSArICdcIiBwdWJsaXNoZWQgwrcgJyArIHNlbnQubGVuZ3RoICsgKHNlbnQubGVuZ3RoID09PSAxID8gJyB2aXNpdCcgOiAnIHZpc2l0cycpICsgJyBzY2hlZHVsZWQnXHJcbiAgICAgICAgICAgICsgKG5vd0xpdmUgPyAnIMK3ICcgKyBub3dMaXZlICsgKG5vd0xpdmUgPT09IDEgPyAnIGF1ZGl0JyA6ICcgYXVkaXRzJykgKyAnIHB1Ymxpc2hlZCcgOiAnJykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnXCInICsgbmFtZSArICdcIiBzYXZlZCBhcyBhIGRyYWZ0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQodHJ1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcclxuICAgICAgICAvLyBQcm9kdWN0aW9uIHNlbmRzIHRoZSBlcnJvciBvYmplY3QgYXMgYGVycm9yYDsgdGhlIGxvY2FsIGRldiBoZWxwZXIgc2VuZHMgdGV4dCBwbHVzIGBkZXRhaWxzYC5cclxuICAgICAgICBjb25zdCBib2R5ID0gZT8uZXJyb3IgfHwge307XHJcbiAgICAgICAgY29uc3QgZXJyID0gYm9keS5lcnJvciAmJiB0eXBlb2YgYm9keS5lcnJvciA9PT0gJ29iamVjdCdcclxuICAgICAgICAgID8gYm9keS5lcnJvclxyXG4gICAgICAgICAgOiB7IC4uLihib2R5LmRldGFpbHMgfHwge30pLCBtZXNzYWdlOiBib2R5LmRldGFpbHM/Lm1lc3NhZ2UgfHwgKHR5cGVvZiBib2R5LmVycm9yID09PSAnc3RyaW5nJyA/IGJvZHkuZXJyb3IgOiAnJykgfTtcclxuICAgICAgICAvLyBBIG5ldyBzY2hlZHVsZSBpcyBrZXB0IGFzIGEgZHJhZnQgd2hlbiBwdWJsaXNoaW5nIGl0IGZhaWxzOyB1cGRhdGUgaXQgZnJvbSBub3cgb24uXHJcbiAgICAgICAgaWYgKGVycj8uc2NoZWR1bGVJZCAmJiAhdGhpcy5zY2hlZHVsZUlkKSB7IHRoaXMuc2NoZWR1bGVJZCA9IFN0cmluZyhlcnIuc2NoZWR1bGVJZCk7IH1cclxuICAgICAgICBsZXQgbWFya2VkID0gMDtcclxuICAgICAgICAoQXJyYXkuaXNBcnJheShlcnI/LnJvd0Vycm9ycykgPyBlcnIucm93RXJyb3JzIDogW10pLmZvckVhY2goKHg6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgcm93ID0gc2VudFtOdW1iZXIoeC5yb3cpIC0gMV07XHJcbiAgICAgICAgICBpZiAocm93KSB7IHRoaXMuc2VydmVyRXJyb3JzLnNldChyb3cua2V5ICsgJ3wnICsgU3RyaW5nKHguZmllbGQpLCBTdHJpbmcoeC5tZXNzYWdlIHx8ICdDaGVjayB0aGlzIHZhbHVlJykpOyBtYXJrZWQrKzsgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnI/Lm1lc3NhZ2UgfHwgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnID8gZXJyIDogJycpIHx8ICdDb3VsZCBub3Qgc2F2ZSB0aGUgc2NoZWR1bGUnO1xyXG4gICAgICAgIC8vIEEgcmVmdXNhbCB0aGF0IG5hbWVzIG5vIHJvdyAoYXVkaXQgbm90IHJlYWR5LCBhIHZpc2l0IHRoYXQgY2Fubm90IGJlIHJhaXNlZCkgc3RpbGwgdHVybnNcclxuICAgICAgICAvLyB0aGUgYmFubmVyIGZyb20gXCJSZWFkeSB0byBwdWJsaXNoXCIgdG8gdGhlIHJlYXNvbiwgdW50aWwgdGhlIHJvd3MgYXJlIGVkaXRlZC5cclxuICAgICAgICB0aGlzLnB1Ymxpc2hQcm9ibGVtID0gcHVibGlzaCAmJiAhbWFya2VkID8gbWVzc2FnZSA6ICcnO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIENTViAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBwcml2YXRlIHJvd3NGcm9tVGFibGUocm93czogc3RyaW5nW11bXSk6IEVkaXRvclJvd1tdIHtcclxuICAgIGNvbnN0IHRhYmxlID0gcm93cy5maWx0ZXIociA9PiByLnNvbWUoYyA9PiBTdHJpbmcoYyA/PyAnJykudHJpbSgpKSk7XHJcbiAgICBpZiAodGFibGUubGVuZ3RoIDwgMikgeyByZXR1cm4gW107IH1cclxuICAgIGNvbnN0IGhlYWQgPSB0YWJsZVswXS5tYXAoaCA9PiBoLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcclxuICAgIGNvbnN0IGNvbCA9ICguLi5uYW1lczogc3RyaW5nW10pID0+IGhlYWQuZmluZEluZGV4KGggPT4gbmFtZXMuc29tZShuID0+IGguaW5jbHVkZXMobikpKTtcclxuICAgIGNvbnN0IGNEYXRlID0gY29sKCdkYXRlJyk7XHJcbiAgICBjb25zdCBjRW1haWwgPSBjb2woJ2VtYWlsJywgJ3VzZXInKTtcclxuICAgIGNvbnN0IGNTdG9yZSA9IGNvbCgnc3RvcmUnKTtcclxuICAgIGNvbnN0IGNBdWRpdCA9IGNvbCgnYXVkaXQnLCAnY2hlY2tsaXN0Jyk7XHJcbiAgICBjb25zdCBjU3RhcnQgPSBjb2woJ3N0YXJ0Jyk7XHJcbiAgICBjb25zdCBjRW5kID0gY29sKCdlbmQnKTtcclxuICAgIGNvbnN0IGJ5TmFtZSA9IG5ldyBNYXAodGhpcy5hbGxBdWRpdHMubWFwKGEgPT4gW2EubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKSwgYS5pZF0pKTtcclxuICAgIGNvbnN0IGNlbGwgPSAocjogc3RyaW5nW10sIGk6IG51bWJlcikgPT4gKGkgPj0gMCA/IFN0cmluZyhyW2ldIHx8ICcnKS50cmltKCkgOiAnJyk7XHJcbiAgICAvLyBUZW1wbGF0ZSByb3dzIHN0aWxsIGhvbGRpbmcgb25seSB0aGVpciBBdWRpdCBuYW1lIHdlcmUgbmV2ZXIgZmlsbGVkIGluLCBhbmQgdGhlIGd1aWRhbmNlIHJvd1xyXG4gICAgLy8gKFRFTVBMQVRFX0hJTlRTKSBpcyBub3QgYSByb3c6IHNraXAgdGhlbS5cclxuICAgIGNvbnN0IGZpbGxlZCA9IChyOiBzdHJpbmdbXSkgPT4gW2NEYXRlLCBjRW1haWwsIGNTdG9yZSwgY1N0YXJ0LCBjRW5kXS5zb21lKGkgPT4gY2VsbChyLCBpKSk7XHJcbiAgICBjb25zdCBoaW50ID0gKHI6IHN0cmluZ1tdKSA9PiByLnNvbWUoYyA9PiBISU5UX1RFWFRTLmhhcyhTdHJpbmcoYyA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkpKTtcclxuICAgIHJldHVybiB0YWJsZS5zbGljZSgxKS5maWx0ZXIociA9PiBmaWxsZWQocikgJiYgIWhpbnQocikpLm1hcChyID0+IHtcclxuICAgICAgY29uc3QgYXVkaXRJZCA9IGJ5TmFtZS5nZXQoY2VsbChyLCBjQXVkaXQpLnRvTG93ZXJDYXNlKCkpIHx8ICcnO1xyXG4gICAgICAvLyBBIHJvdyBuYW1pbmcgYW5vdGhlciBhdWRpdCBhZGRzIGl0IHRvIHRoZSBzY2hlZHVsZSdzIGF1ZGl0cyAoc2F2ZSgpIGRvZXMgdGhlIHNhbWUpLlxyXG4gICAgICBpZiAoYXVkaXRJZCAmJiAhdGhpcy5waWNrcy5pbmNsdWRlcyhhdWRpdElkKSkgeyB0aGlzLnBpY2tzID0gWy4uLnRoaXMucGlja3MsIGF1ZGl0SWRdOyB9XHJcbiAgICAgIC8vIFRoZSBTdG9yZSBjb2x1bW4gaG9sZHMgdGhlIHN0b3JlIG5hbWUgKG9sZGVyIHRlbXBsYXRlczogdGhlIHN0b3JlIGlkKTsgZWl0aGVyIHBpY2tzIHRoZSBzdG9yZS5cclxuICAgICAgY29uc3Qgc3RvcmUgPSBjZWxsKHIsIGNTdG9yZSk7XHJcbiAgICAgIGNvbnN0IHN0b3JlSWQgPSB0aGlzLnN0b3JlSWRGb3Ioc3RvcmUpO1xyXG4gICAgICByZXR1cm4gdGhpcy5yb3coe1xyXG4gICAgICAgIGRhdGU6IHRvSXNvRGF0ZShjZWxsKHIsIGNEYXRlKSksXHJcbiAgICAgICAgdXNlckVtYWlsOiBjZWxsKHIsIGNFbWFpbCkudG9Mb3dlckNhc2UoKSxcclxuICAgICAgICBzdG9yZUlkLFxyXG4gICAgICAgIHN0b3JlVGV4dDogc3RvcmVJZCA/ICh0aGlzLnN0b3JlTGFiZWwoc3RvcmVJZCkgfHwgc3RvcmUpIDogc3RvcmUsXHJcbiAgICAgICAgY2hlY2tMaXN0SWQ6IGF1ZGl0SWQgfHwgKHRoaXMucGlja3MubGVuZ3RoID09PSAxID8gdGhpcy5waWNrc1swXSA6ICcnKSxcclxuICAgICAgICBzdGFydDogdG9UaW1lKGNlbGwociwgY1N0YXJ0KSksXHJcbiAgICAgICAgZW5kOiB0b1RpbWUoY2VsbChyLCBjRW5kKSlcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0ZW1wbGF0ZSBhcyB4bHN4OiBTdG9yZSBuYW1lIGFuZCBBdWRpdCBhcmUgZHJvcGRvd25zIG9mIHRoZSBjbGllbnQncyBzdG9yZXMgYW5kIHRoZSBhdWRpdHMgb24gb2ZmZXIuIFdhaXRzIGZvclxyXG4gICAqIHRoZSBzdG9yZSBsaXN0IChsb2FkZWQgd2hlbiB0aGUgZWRpdG9yIG9wZW5zKSwgc28gYSBxdWljayBjbGljayBzdGlsbCBnZXRzIHRoZSBTdG9yZSBuYW1lIGRyb3Bkb3duLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZG93bmxvYWRYbHN4KGZpbGVOYW1lOiBzdHJpbmcsIGxpbmVzOiBzdHJpbmdbXVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnRlbXBsYXRlV2FpdGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnBlb3BsZVJlYWR5JC5waXBlKHRha2UoMSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy50ZW1wbGF0ZVdhaXRpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKCF0aGlzLnN0b3Jlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBsb2FkIHRoZSBzdG9yZSBsaXN0IOKAlCBTdG9yZSBuYW1lIGhhcyBubyBkcm9wZG93biBpbiB0aGlzIHRlbXBsYXRlJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy53cml0ZVhsc3goZmlsZU5hbWUsIGxpbmVzKTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd3JpdGVYbHN4KGZpbGVOYW1lOiBzdHJpbmcsIGxpbmVzOiBzdHJpbmdbXVtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBzdG9yZXMgPSBbLi4ubmV3IFNldCh0aGlzLnN0b3Jlcy5tYXAocyA9PiBzLnN0b3JlTmFtZSB8fCBzLnN0b3JlSWQpLmZpbHRlcihCb29sZWFuKSldLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XHJcbiAgICBjb25zdCBhdWRpdHMgPSBbLi4ubmV3IFNldCh0aGlzLnJvd0F1ZGl0T3B0aW9ucy5tYXAoYSA9PiBhLm5hbWUpLmZpbHRlcihCb29sZWFuKSldO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtzY2hlZHVsZVRlbXBsYXRlWGxzeChsaW5lcywgc3RvcmVzLCBhdWRpdHMpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pO1xyXG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBhLmhyZWYgPSB1cmw7XHJcbiAgICBhLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBhLmNsaWNrKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IFVSTC5yZXZva2VPYmplY3RVUkwodXJsKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRvd25sb2FkKGZpbGVOYW1lOiBzdHJpbmcsIGxpbmVzOiBzdHJpbmdbXVtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBjc3YgPSBsaW5lcy5tYXAobCA9PiBsLm1hcChjc3ZDZWxsKS5qb2luKCcsJykpLmpvaW4oJ1xcclxcbicpO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjc3ZdLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04JyB9KTtcclxuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gdXJsO1xyXG4gICAgYS5kb3dubG9hZCA9IGZpbGVOYW1lO1xyXG4gICAgYS5jbGljaygpO1xyXG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqIEEgd2VsbC1mb3JtZWQgZW1haWwgKGFuIGVtYWlsIHRoZSBpbnZpdGUgY2FuIGNyZWF0ZSBhIHVzZXIgZm9yKS4gKi9cclxuY29uc3QgRU1BSUwgPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcclxuXHJcbi8qKiBXaHkgL3NjaGVkdWxlL2ludml0ZSBsZWZ0IGFuIGVtYWlsIG91dCAoaXRzIGBza2lwcGVkW10ucmVhc29uYCkuICovXHJcbmNvbnN0IElOVklURV9SRUFTT05TOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xyXG4gIGluYWN0aXZlOiAnaW5hY3RpdmUgdXNlciwgYWN0aXZhdGUgaXQgaW4gTWFuYWdlID4gVXNlcnMnLFxyXG4gIG90aGVyQ2xpZW50OiAnYmVsb25ncyB0byBhbm90aGVyIGNsaWVudCcsXHJcbiAgZmFpbGVkOiAnY291bGQgbm90IGJlIGNyZWF0ZWQnXHJcbn07XHJcblxyXG4vKipcclxuICogUm93IDIgb2YgdGhlIGRvd25sb2FkZWQgdGVtcGxhdGU6IHdoYXQgZWFjaCBjb2x1bW4gdGFrZXMgKFFBOiBzaG93IHBsYWNlaG9sZGVycykuIEltcG9ydCBza2lwcyBhIHJvdyBob2xkaW5nXHJcbiAqIGFueSBvZiB0aGVzZSB0ZXh0cywgc28gaXQgY2FuIGJlIGxlZnQgaW4gdGhlIGZpbGUuXHJcbiAqL1xyXG5jb25zdCBURU1QTEFURV9ISU5UUyA9IFtcclxuICAnUGxlYXNlIGVudGVyIGRhdGUgKERELU1NLVlZWVkpJyxcclxuICAnUGxlYXNlIGVudGVyIHZhbGlkIHVzZXIgZW1haWwnLFxyXG4gICdQaWNrIGEgc3RvcmUgZnJvbSB0aGUgZHJvcGRvd24nLFxyXG4gICdQaWNrIGFuIGF1ZGl0IGZyb20gdGhlIGRyb3Bkb3duJyxcclxuICAnT3B0aW9uYWw6IEhIOk1NLCBlLmcuIDEwOjAwJyxcclxuICAnT3B0aW9uYWw6IEhIOk1NLCBlLmcuIDE4OjAwJ1xyXG5dO1xyXG5jb25zdCBISU5UX1RFWFRTID0gbmV3IFNldChURU1QTEFURV9ISU5UUy5tYXAoaCA9PiBoLnRvTG93ZXJDYXNlKCkpKTtcclxuXHJcbi8qKiBMYXN0IHJvdyB0aGUgdGVtcGxhdGUgZHJvcGRvd25zIGNvdmVyLiAqL1xyXG5jb25zdCBURU1QTEFURV9ST1dTID0gNTAwMDtcclxuXHJcbi8qKlxyXG4gKiBTY2hlZHVsZSB0ZW1wbGF0ZSB3b3JrYm9vay4gU2hlZXQgU2NoZWR1bGUgaG9sZHMgdGhlIHJvd3M7IFN0b3JlIG5hbWUgKEMpIGFuZCBBdWRpdCAoRCkgYXJlIGxpc3RcclxuICogZHJvcGRvd25zIG92ZXIgYSBoaWRkZW4gTGlzdHMgc2hlZXQgKGEgY2xpZW50J3MgdGhvdXNhbmRzIG9mIHN0b3JlIG5hbWVzIGRvIG5vdCBmaXQgRXhjZWwncyAyNTUtY2hhcmFjdGVyXHJcbiAqIGlubGluZSBsaXN0KS4gVGhlIGNvbW11bml0eSB4bHN4IGJ1aWxkIGNhbm5vdCB3cml0ZSBkYXRhIHZhbGlkYXRpb24sIHNvIGl0IGlzIGFkZGVkIHRvIHRoZSBzaGVldCBYTUxcclxuICogKENUX1dvcmtzaGVldCBvcmRlcjogZGF0YVZhbGlkYXRpb25zIGZvbGxvd3Mgc2hlZXREYXRhKSwgYXMgdGhlIHF1ZXN0aW9uIHRlbXBsYXRlIGRvZXMgKGJ1bGstdXBsb2FkKS5cclxuICovXHJcbmZ1bmN0aW9uIHNjaGVkdWxlVGVtcGxhdGVYbHN4KGxpbmVzOiBzdHJpbmdbXVtdLCBzdG9yZXM6IHN0cmluZ1tdLCBhdWRpdHM6IHN0cmluZ1tdKTogVWludDhBcnJheSB7XHJcbiAgY29uc3QgYm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcclxuICBjb25zdCBzaGVldCA9IFhMU1gudXRpbHMuYW9hX3RvX3NoZWV0KGxpbmVzKTtcclxuICBzaGVldFsnIWNvbHMnXSA9IFt7IHdjaDogMTIgfSwgeyB3Y2g6IDMyIH0sIHsgd2NoOiAyNiB9LCB7IHdjaDogMzQgfSwgeyB3Y2g6IDExIH0sIHsgd2NoOiAxMSB9XTtcclxuICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KGJvb2ssIHNoZWV0LCAnU2NoZWR1bGUnKTtcclxuICBjb25zdCBjb3VudCA9IE1hdGgubWF4KHN0b3Jlcy5sZW5ndGgsIGF1ZGl0cy5sZW5ndGgpO1xyXG4gIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQoYm9vaywgWExTWC51dGlscy5hb2FfdG9fc2hlZXQoW1snU3RvcmVzJywgJ0F1ZGl0cyddLFxyXG4gICAgLi4uQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGkpID0+IFtzdG9yZXNbaV0gPz8gJycsIGF1ZGl0c1tpXSA/PyAnJ10pXSksICdMaXN0cycpO1xyXG4gIGJvb2suV29ya2Jvb2sgPSB7IFNoZWV0czogW3sgSGlkZGVuOiAwIH0sIHsgSGlkZGVuOiAxIH1dIH07XHJcbiAgY29uc3QgbGlzdCA9IChjb2w6IHN0cmluZywgbGlzdENvbDogc3RyaW5nLCBuOiBudW1iZXIpID0+IChuID8gJzxkYXRhVmFsaWRhdGlvbiB0eXBlPVwibGlzdFwiIGFsbG93Qmxhbms9XCIxXCIgc2hvd0Vycm9yTWVzc2FnZT1cIjFcIiAnXHJcbiAgICArICdlcnJvclRpdGxlPVwiTm90IGluIHRoZSBsaXN0XCIgZXJyb3I9XCJQaWNrIGEgdmFsdWUgZnJvbSB0aGUgZHJvcGRvd24uXCIgc3FyZWY9XCInICsgY29sICsgJzI6JyArIGNvbCArIFRFTVBMQVRFX1JPV1MgKyAnXCI+J1xyXG4gICAgKyAnPGZvcm11bGExPkxpc3RzISQnICsgbGlzdENvbCArICckMjokJyArIGxpc3RDb2wgKyAnJCcgKyAobiArIDEpICsgJzwvZm9ybXVsYTE+PC9kYXRhVmFsaWRhdGlvbj4nIDogJycpO1xyXG4gIGNvbnN0IHJ1bGVzID0gbGlzdCgnQycsICdBJywgc3RvcmVzLmxlbmd0aCkgKyBsaXN0KCdEJywgJ0InLCBhdWRpdHMubGVuZ3RoKTtcclxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KFhMU1gud3JpdGUoYm9vaywgeyBib29rVHlwZTogJ3hsc3gnLCB0eXBlOiAnYXJyYXknIH0pKTtcclxuICBpZiAoIXJ1bGVzKSB7IHJldHVybiBieXRlczsgfVxyXG4gIGNvbnN0IENGQiA9IChYTFNYIGFzIGFueSkuQ0ZCO1xyXG4gIGNvbnN0IHppcCA9IENGQi5yZWFkKGJ5dGVzLCB7IHR5cGU6ICdhcnJheScgfSk7XHJcbiAgY29uc3QgZW50cnkgPSB6aXAuRmlsZUluZGV4W3ppcC5GdWxsUGF0aHMuZmluZEluZGV4KChwOiBzdHJpbmcpID0+IHAuZW5kc1dpdGgoJ3hsL3dvcmtzaGVldHMvc2hlZXQxLnhtbCcpKV07XHJcbiAgaWYgKCFlbnRyeT8uY29udGVudCkgeyByZXR1cm4gYnl0ZXM7IH1cclxuICBjb25zdCB4bWw6IHN0cmluZyA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlbnRyeS5jb250ZW50KTtcclxuICBjb25zdCBuID0gKHJ1bGVzLm1hdGNoKC88ZGF0YVZhbGlkYXRpb24gL2cpIHx8IFtdKS5sZW5ndGg7XHJcbiAgZW50cnkuY29udGVudCA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh4bWwucmVwbGFjZSgnPC9zaGVldERhdGE+JywgJzwvc2hlZXREYXRhPjxkYXRhVmFsaWRhdGlvbnMgY291bnQ9XCInICsgbiArICdcIj4nICsgcnVsZXMgKyAnPC9kYXRhVmFsaWRhdGlvbnM+JykpO1xyXG4gIGVudHJ5LnNpemUgPSBlbnRyeS5jb250ZW50Lmxlbmd0aDtcclxuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQ0ZCLndyaXRlKHppcCwgeyBmaWxlVHlwZTogJ3ppcCcsIHR5cGU6ICdhcnJheScgfSkpO1xyXG59XHJcblxyXG4vKipcclxuICogVGhlIGZpcnN0IHNoZWV0IG9mIGFuIHVwbG9hZGVkIHhsc3ggYXMgdGV4dCByb3dzLiBBIGRhdGUgb3IgdGltZSB0eXBlZCBpbiBFeGNlbCBpcyBzdG9yZWQgYXMgYSBzZXJpYWwgbnVtYmVyOyBpblxyXG4gKiB0aGUgRGF0ZSAvIFZpc2l0IHN0YXJ0IC8gVmlzaXQgZW5kIGNvbHVtbnMgaXQgaXMgZGVjb2RlZCB3aXRoIHRoZSBzaGVldCdzIG93biBjYWxlbmRhciAoU1NGKSwgbm90IGEgSlMgRGF0ZSAodGhhdFxyXG4gKiBzaGlmdHMgdGhlIGRheSBieSB0aGUgYnJvd3NlcidzIHRpbWUgem9uZSksIGFuZCB3cml0dGVuIGFzIFlZWVktTU0tREQgLyBISDptbSBzbyBpdCByZWFkcyBsaWtlIHRoZSBDU1YgdGV4dC5cclxuICovXHJcbmZ1bmN0aW9uIHNoZWV0VGFibGUoZGF0YTogQXJyYXlCdWZmZXIpOiBzdHJpbmdbXVtdIHtcclxuICBjb25zdCBib29rID0gWExTWC5yZWFkKGRhdGEsIHsgdHlwZTogJ2FycmF5JyB9KTtcclxuICBjb25zdCBzaGVldCA9IGJvb2suU2hlZXRzW2Jvb2suU2hlZXROYW1lcy5pbmNsdWRlcygnU2NoZWR1bGUnKSA/ICdTY2hlZHVsZScgOiBib29rLlNoZWV0TmFtZXNbMF1dO1xyXG4gIGNvbnN0IHJvd3M6IGFueVtdW10gPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oc2hlZXQsIHsgaGVhZGVyOiAxLCByYXc6IHRydWUsIGRlZnZhbDogJycgfSk7XHJcbiAgY29uc3QgaGVhZCA9IChyb3dzWzBdIHx8IFtdKS5tYXAoaCA9PiBTdHJpbmcoaCA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xyXG4gIGNvbnN0IHRpbWVDb2xzID0gbmV3IFNldChoZWFkLm1hcCgoaCwgaSkgPT4gKC9kYXRlfHN0YXJ0fGVuZC8udGVzdChoKSA/IGkgOiAtMSkpLmZpbHRlcihpID0+IGkgPj0gMCkpO1xyXG4gIGNvbnN0IHBhZCA9IChuOiBudW1iZXIpID0+IFN0cmluZyhuKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gIGNvbnN0IHRleHQgPSAodjogYW55LCBpOiBudW1iZXIpID0+IHtcclxuICAgIGlmICh0eXBlb2YgdiAhPT0gJ251bWJlcicgfHwgIXRpbWVDb2xzLmhhcyhpKSkgeyByZXR1cm4gU3RyaW5nKHYgPz8gJycpOyB9XHJcbiAgICBjb25zdCBkID0gKFhMU1ggYXMgYW55KS5TU0YucGFyc2VfZGF0ZV9jb2RlKHYpO1xyXG4gICAgaWYgKCFkKSB7IHJldHVybiBTdHJpbmcodik7IH1cclxuICAgIHJldHVybiB2IDwgMSA/IHBhZChkLkgpICsgJzonICsgcGFkKGQuTSkgOiBkLnkgKyAnLScgKyBwYWQoZC5tKSArICctJyArIHBhZChkLmQpO1xyXG4gIH07XHJcbiAgcmV0dXJuIHJvd3MubWFwKChyLCByaSkgPT4gci5tYXAoKHYsIGkpID0+IChyaSA9PT0gMCA/IFN0cmluZyh2ID8/ICcnKSA6IHRleHQodiwgaSkpKSk7XHJcbn1cclxuXHJcbi8qKiBRdW90ZSBhIENTViBjZWxsIHdoZW4gaXQgbmVlZHMgaXQuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjc3ZDZWxsKHY6IGFueSk6IHN0cmluZyB7XHJcbiAgY29uc3QgcyA9IFN0cmluZyh2ID8/ICcnKTtcclxuICByZXR1cm4gL1tcIixcXHJcXG5dLy50ZXN0KHMpID8gJ1wiJyArIHMucmVwbGFjZSgvXCIvZywgJ1wiXCInKSArICdcIicgOiBzO1xyXG59XHJcblxyXG4vKiogTWluaW1hbCBSRkMgNDE4MCByZWFkZXI6IHF1b3RlZCBjZWxscywgZXNjYXBlZCBxdW90ZXMsIENSTEYgb3IgTEYuICovXHJcbmZ1bmN0aW9uIHBhcnNlQ3N2KHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdW10ge1xyXG4gIGNvbnN0IG91dDogc3RyaW5nW11bXSA9IFtdO1xyXG4gIGxldCByb3c6IHN0cmluZ1tdID0gW107XHJcbiAgbGV0IGNlbGwgPSAnJztcclxuICBsZXQgcXVvdGVkID0gZmFsc2U7XHJcbiAgY29uc3Qgc3JjID0gdGV4dC5yZXBsYWNlKC9e77u/LywgJycpO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBjaCA9IHNyY1tpXTtcclxuICAgIGlmIChxdW90ZWQpIHtcclxuICAgICAgaWYgKGNoID09PSAnXCInICYmIHNyY1tpICsgMV0gPT09ICdcIicpIHsgY2VsbCArPSAnXCInOyBpKys7IH1cclxuICAgICAgZWxzZSBpZiAoY2ggPT09ICdcIicpIHsgcXVvdGVkID0gZmFsc2U7IH1cclxuICAgICAgZWxzZSB7IGNlbGwgKz0gY2g7IH1cclxuICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcIicpIHtcclxuICAgICAgcXVvdGVkID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAoY2ggPT09ICcsJykge1xyXG4gICAgICByb3cucHVzaChjZWxsKTsgY2VsbCA9ICcnO1xyXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcbicgfHwgY2ggPT09ICdcXHInKSB7XHJcbiAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgc3JjW2kgKyAxXSA9PT0gJ1xcbicpIHsgaSsrOyB9XHJcbiAgICAgIHJvdy5wdXNoKGNlbGwpOyBvdXQucHVzaChyb3cpOyByb3cgPSBbXTsgY2VsbCA9ICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2VsbCArPSBjaDtcclxuICAgIH1cclxuICB9XHJcbiAgaWYgKGNlbGwgfHwgcm93Lmxlbmd0aCkgeyByb3cucHVzaChjZWxsKTsgb3V0LnB1c2gocm93KTsgfVxyXG4gIHJldHVybiBvdXQ7XHJcbn1cclxuXHJcbi8qKiBERC1NTS1ZWVlZLCBERC9NTS9ZWVlZIG9yIFlZWVktTU0tREQgdG8gWVlZWS1NTS1ERDsgYW55dGhpbmcgZWxzZSBzdGF5cyBibGFuay4gKi9cclxuZnVuY3Rpb24gdG9Jc29EYXRlKHY6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgbGV0IG0gPSB2Lm1hdGNoKC9eKFxcZHs0fSktKFxcZHsxLDJ9KS0oXFxkezEsMn0pJC8pO1xyXG4gIGlmIChtKSB7IHJldHVybiBtWzFdICsgJy0nICsgbVsyXS5wYWRTdGFydCgyLCAnMCcpICsgJy0nICsgbVszXS5wYWRTdGFydCgyLCAnMCcpOyB9XHJcbiAgbSA9IHYubWF0Y2goL14oXFxkezEsMn0pWy0vLl0oXFxkezEsMn0pWy0vLl0oXFxkezR9KSQvKTtcclxuICBpZiAobSkgeyByZXR1cm4gbVszXSArICctJyArIG1bMl0ucGFkU3RhcnQoMiwgJzAnKSArICctJyArIG1bMV0ucGFkU3RhcnQoMiwgJzAnKTsgfVxyXG4gIHJldHVybiAnJztcclxufVxyXG5cclxuLyoqIEg6bW0gb3IgSEg6bW0gKDI0aCkgdG8gSEg6bW07IFwiYmxhbmtcIiBhbmQgYW55dGhpbmcgZWxzZSBzdGF5IGJsYW5rLiAqL1xyXG5mdW5jdGlvbiB0b1RpbWUodjogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBtID0gdi5tYXRjaCgvXihcXGR7MSwyfSk6KFxcZHsyfSkkLyk7XHJcbiAgcmV0dXJuIG0gJiYgTnVtYmVyKG1bMV0pIDwgMjQgJiYgTnVtYmVyKG1bMl0pIDwgNjAgPyBtWzFdLnBhZFN0YXJ0KDIsICcwJykgKyAnOicgKyBtWzJdIDogJyc7XHJcbn1cclxuIiwiPGlucHV0ICNjc3ZJbnB1dCB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIi54bHN4LC5jc3YsdGV4dC9jc3ZcIiBjbGFzcz1cInNlLWhpZGRlblwiIChjaGFuZ2UpPVwib25Dc3ZQaWNrZWQoJGV2ZW50KVwiPlxuXG48IS0tIEVkaXRpbmcgb3BlbnMgb24gdGhlIFJvd3Mgc3RlcCwgc28gaXRzIHNrZWxldG9uIG1pcnJvcnMgdGhhdCBzY3JlZW4uIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdFZGl0XCI+XG4gIDxkaXYgY2xhc3M9XCJzZS10aXRsZWJhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZS10aXRsZXRleHRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLXNrIHNlLXNrLWNydW1iXCI+PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgYXYyLXNrLS10aXRsZSBzZS1zay1uYW1lXCI+PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic2UtY2FyZCBzZS1jYXJkLS10YWJsZVwiPlxuICAgIDxsaWItYXVkaXQtdjItc2hpbW1lcj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tID09PT09PT09PT09PSBDcmVhdGUgc2NoZWR1bGUgPT09PT09PT09PT09IC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0ZXAgPT09ICdjcmVhdGUnICYmICFsb2FkaW5nRWRpdFwiPlxuICA8ZGl2IGNsYXNzPVwic2UtYmFja2JhclwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbSBzZS1iYWNrXCIgKGNsaWNrKT1cImJhY2soKVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDYgOSAxMiAxNSAxOFwiPjwvcG9seWxpbmU+PC9zdmc+XG4gICAgICB7eyBiYWNrTGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwic2UtY3J1bWJcIj48YSBocmVmPVwiI1wiIChjbGljayk9XCJiYWNrKCRldmVudClcIj5TY2hlZHVsZTwvYT4g4oC6IHt7IHNjaGVkdWxlSWQgPyBuYW1lIHx8ICdTY2hlZHVsZScgOiAnQ3JlYXRlIHNjaGVkdWxlJyB9fTwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic2UtY3JlYXRlXCI+XG4gICAgPGRpdiBjbGFzcz1cInNlLWNhcmQgc2UtY2FyZC0tZm9ybVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzZS1iYWRnZVwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCI5XCI+PC9jaXJjbGU+PHBhdGggZD1cIk0xMiA4djhNOCAxMmg4XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cInNlLWhlYWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXRpdGxlXCI+e3sgc2NoZWR1bGVJZCA/ICdFZGl0IHNjaGVkdWxlJyA6ICdDcmVhdGUgc2NoZWR1bGUnIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS1zdWJcIj57eyBzY2hlZHVsZUlkID8gJ1JlbmFtZSB0aGUgc2NoZWR1bGUsIG9yIGFkZCByb3dzIGZyb20gdGhlIHRlbXBsYXRlLicgOiAobG9ja2VkID8gJ05hbWUgdGhlIHNjaGVkdWxlLCB0aGVuIGFkZCByb3dzIGZvciB0aGlzIGF1ZGl0LicgOiAnTmFtZSB0aGUgc2NoZWR1bGUsIHRoZW4gYWRkIHJvd3MuJykgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIE9wZW5lZCBmcm9tIGFuIGF1ZGl0J3MgQ29uZmlndXJlIHBhZ2U6IHRoYXQgYXVkaXQgaXMgdGhlIHNjaGVkdWxlJ3MgYXVkaXQsIG5hbWVkIG9uY2UgaGVyZVxuICAgICAgICAgICBpbnN0ZWFkIG9mIGFuIGF1ZGl0IHBpY2tlciBjYXJkIChRQTogdGhlIGNhcmQgaXMgbm90IG5lZWRlZCB3aGVuIHRoZSBhdWRpdCBpcyBhbHJlYWR5IGNob3NlbikuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNlLWZpeGVkLWF1ZGl0XCIgKm5nSWY9XCJsb2NrZWRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1sYWJlbFwiPnt7IHBpY2tlZEF1ZGl0cy5sZW5ndGggPiAxID8gJ0F1ZGl0cycgOiAnQXVkaXQnIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWZpeGVkLWF1ZGl0LW5hbWVcIj57eyBsb2NrZWRBdWRpdE5hbWVzIHx8ICdMb2FkaW5nIGF1ZGl04oCmJyB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bGFiZWwgY2xhc3M9XCJzZS1maWVsZFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWxhYmVsXCI+U2NoZWR1bGUgbmFtZTwvc3Bhbj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJzZS1pbnB1dFwiIFsobmdNb2RlbCldPVwibmFtZVwiIHBsYWNlaG9sZGVyPVwiZS5nLiBGZWJydWFyeSBoeWdpZW5lIHJvdW5kXCI+XG4gICAgICA8L2xhYmVsPlxuXG4gICAgICA8IS0tIEV2ZXJ5IGF1ZGl0LCB3aXRoIHRoZSBvbmVzIHBpY2tlZCBvbiB0aGUgcHJldmlvdXMgcGFnZSAoTm90IHNjaGVkdWxlZCkgYWxyZWFkeSB0aWNrZWQuXG4gICAgICAgICAgIENyZWF0ZSBvbmx5OiBFZGl0IHNjaGVkdWxlIGtlZXBzIHRoZSBzY2hlZHVsZSdzIGF1ZGl0cyBhbmQgZG9lcyBub3QgYXNrIGZvciB0aGVtIChRQSkuXG4gICAgICAgICAgIEhpZGRlbiBmb3Igbm93IG9uIGJvdGggKHNob3dBdWRpdFBpY2tlcikuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNlLWZpZWxkXCIgKm5nSWY9XCJzaG93QXVkaXRQaWNrZXIgJiYgIWxvY2tlZCAmJiAhc2NoZWR1bGVJZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Utcm93XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1sYWJlbCBzZS1ncm93XCI+QXVkaXRzIHRvIHNjaGVkdWxlPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2UtY291bnRcIj57eyBwaWNrQ291bnQgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZS1zZWFyY2hcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTYuNVwiIHkxPVwiMTYuNVwiIHgyPVwiMjFcIiB5Mj1cIjIxXCI+PC9saW5lPjwvc3ZnPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicGlja1F1ZXJ5XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYXVkaXRzXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJzZS1jbGVhclwiICpuZ0lmPVwicGlja1F1ZXJ5LnRyaW0oKVwiIHRpdGxlPVwiQ2xlYXIgc2VhcmNoXCIgKGNsaWNrKT1cInBpY2tRdWVyeSA9ICcnXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48bGluZSB4MT1cIjZcIiB5MT1cIjZcIiB4Mj1cIjE4XCIgeTI9XCIxOFwiPjwvbGluZT48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiPjwvbGluZT48L3N2Zz5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS1waWNrbGlzdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1waWNrcm93IHNlLXBpY2tyb3ctLWFsbFwiIChjbGljayk9XCJ0b2dnbGVBbGxQaWNrcygpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWJveFwiIFtjbGFzcy5pcy1vbl09XCJhbGxQaWNrZWRcIj5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImFsbFBpY2tlZFwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLXBpY2thbGxcIj57eyBhbGxMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2UtZW1wdHktc21cIiAqbmdJZj1cIiFwaWNrYWJsZXMubGVuZ3RoXCI+Tm8gYXVkaXRzIG1hdGNoIHRoYXQgc2VhcmNoLjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1waWNrcm93XCIgKm5nRm9yPVwibGV0IGEgb2YgcGlja2FibGVzOyB0cmFja0J5OiB0cmFja0J5QXVkaXRcIiBbY2xhc3MuaXMtb25dPVwiaXNQaWNrZWQoYSlcIiAoY2xpY2spPVwidG9nZ2xlUGljayhhKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1ib3hcIiBbY2xhc3MuaXMtb25dPVwiaXNQaWNrZWQoYSlcIj5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUGlja2VkKGEpXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2UtcGlja25hbWVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1lbGxpcHNpc1wiPnt7IGEubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1tZXRhXCI+e3sgYS5tZXRhIH19e3sgYS5xdWVzdGlvbnMgPyAnIMK3ICcgKyBhLnF1ZXN0aW9ucyArICcgcXVlc3Rpb25zJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8b2wgY2xhc3M9XCJzZS1zdGVwc1wiPlxuICAgICAgICA8bGk+VXNlIHRoZSB0ZW1wbGF0ZSB0byBzY2hlZHVsZSBtdWx0aXBsZSB1c2VycyBhdCBvbmNlLjwvbGk+XG4gICAgICAgIDxsaT5Eb3dubG9hZCB0aGUgdGVtcGxhdGUgaGVyZSDigJQgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwiZG93bmxvYWRUZW1wbGF0ZSgkZXZlbnQpXCI+e3sgdGVtcGxhdGVMb2FkaW5nIHx8IHRlbXBsYXRlV2FpdGluZyA/ICdQcmVwYXJpbmfigKYnIDogJ0Rvd25sb2FkIHRlbXBsYXRlJyB9fTwvYT48L2xpPlxuICAgICAgICA8bGk+QWRkIHlvdXIgZGF0YSwgdGhlbiB1cGxvYWQgaXQgYmVsb3cuPC9saT5cbiAgICAgIDwvb2w+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZS1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnRuLWxnIHNlLWJ0bi1sZy0tcHJpbWFyeVwiIFtjbGFzcy5pcy1vZmZdPVwiIXJlYWR5XCIgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhcmVhZHlcIlxuICAgICAgICAgIFtuZ2JUb29sdGlwXT1cIm5vdFJlYWR5UmVhc29uXCIgW2Rpc2FibGVUb29sdGlwXT1cInJlYWR5XCIgcGxhY2VtZW50PVwidG9wXCIgKGNsaWNrKT1cImltcG9ydENzdigpXCI+SW1wb3J0IGZyb20gQ1NWPC9idXR0b24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3JcIj5vcjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGcgc2UtYnRuLWxnLS1naG9zdFwiIFtjbGFzcy5pcy1vZmZdPVwiIXJlYWR5XCIgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCIhcmVhZHlcIlxuICAgICAgICAgIFtuZ2JUb29sdGlwXT1cIm5vdFJlYWR5UmVhc29uXCIgW2Rpc2FibGVUb29sdGlwXT1cInJlYWR5XCIgcGxhY2VtZW50PVwidG9wXCIgKGNsaWNrKT1cImFkZFNpbmdsZSgpXCI+QWRkIGEgc2luZ2xlIHJvdzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEhpZGRlbiBmb3Igbm93IG9uIGJvdGggQ3JlYXRlIGFuZCBFZGl0IChzaG93VGVtcGxhdGVQcmV2aWV3KS4gLS0+XG4gICAgPGRpdiBjbGFzcz1cInNlLWNhcmQgc2UtY2FyZC0tc2lkZVwiICpuZ0lmPVwic2hvd1RlbXBsYXRlUHJldmlld1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlLWhlYWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXNpZGUtdGl0bGVcIj5XaGF0IHRoZSB0ZW1wbGF0ZSBleHBlY3RzPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS1zdWJcIj5PbmUgcm93IHBlciB1c2VyLCBzdG9yZSBhbmQgZGF0ZS4gVGhlc2UgYXJlIHRoZSByb3dzIHRoZSBkb3dubG9hZGVkIHRlbXBsYXRlIHdpbGwgaG9sZCBmb3IgdGhlIHNlbGVjdGVkXG4gICAgICAgICAge3sgcGlja3MubGVuZ3RoID09PSAxID8gJ2F1ZGl0JyA6ICdhdWRpdHMnIH19IOKAlCBlZGl0IG9yIGFkZCByb3dzIGluIHRoZSBmaWxlLCB0aGVuIGltcG9ydCBpdC48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNlLXNhbXBsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Utc2FtcGxlLXJvdyBzZS1zYW1wbGUtcm93LS1oZWFkXCI+XG4gICAgICAgICAgPHNwYW4+RGF0ZTwvc3Bhbj48c3Bhbj5Vc2VyIGVtYWlsPC9zcGFuPjxzcGFuPkFzc2lnbiBzdG9yZTwvc3Bhbj48c3Bhbj5Bc3NpZ24gYXVkaXQ8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJ0ZW1wbGF0ZUxvYWRpbmdcIiBbcm93c109XCIzXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0ZW1wbGF0ZUxvYWRpbmdcIj5cbiAgICAgICAgICA8IS0tIFRoZSBzZWxlY3RlZCBhdWRpdHMnIGFzc2lnbmVkIHN0b3JlcyAvIHVzZXJzOiB0aGUgc2FtZSByb3dzIERvd25sb2FkIHRlbXBsYXRlIHdyaXRlcy4gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlLXNhbXBsZS1yb3dcIiAqbmdGb3I9XCJsZXQgciBvZiBwcmV2aWV3Um93c1wiPlxuICAgICAgICAgICAgPHNwYW4gW3RpdGxlXT1cInIuZGF0ZVwiPnt7IHIuZGF0ZSB9fTwvc3Bhbj48c3BhbiBbdGl0bGVdPVwici5lbWFpbFwiPnt7IHIuZW1haWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBbdGl0bGVdPVwici5zdG9yZVwiPnt7IHIuc3RvcmUgfX08L3NwYW4+PHNwYW4gW3RpdGxlXT1cInIuYXVkaXRcIj57eyByLmF1ZGl0IH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1zYW1wbGUtbW9yZVwiICpuZ0lmPVwicHJldmlld01vcmVcIj4rIHt7IHByZXZpZXdNb3JlIH19IG1vcmUge3sgcHJldmlld01vcmUgPT09IDEgPyAncm93JyA6ICdyb3dzJyB9fSBpbiB0aGUgZmlsZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1zYW1wbGUtbW9yZVwiICpuZ0lmPVwiIXByZXZpZXdSb3dzLmxlbmd0aFwiPlBpY2sgYW4gYXVkaXQgdG8gc2VlIGl0cyB0ZW1wbGF0ZSByb3dzLjwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJzZS1ub3RlIHNlLW5vdGUtLXdhcm5cIiAqbmdJZj1cIiF0ZW1wbGF0ZUxvYWRpbmcgJiYgdW5hc3NpZ25lZEF1ZGl0cy5sZW5ndGhcIj5cbiAgICAgICAge3sgdW5hc3NpZ25lZEF1ZGl0cy5qb2luKCcsICcpIH19IHt7IHVuYXNzaWduZWRBdWRpdHMubGVuZ3RoID09PSAxID8gJ2hhcycgOiAnaGF2ZScgfX0gbm8gc3RvcmUgYXNzaWduZWQgeWV0IOKAlCBmaWxsIGluIERhdGUsIFVzZXIgZW1haWxcbiAgICAgICAgYW5kIFN0b3JlIG5hbWUgZm9yIHt7IHVuYXNzaWduZWRBdWRpdHMubGVuZ3RoID09PSAxID8gJ2l0cyByb3cnIDogJ3RoZWlyIHJvd3MnIH19Ljwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2Utbm90ZVwiPlZpc2l0IHN0YXJ0IGFuZCBWaXNpdCBlbmQgKEhIOm1tKSBhcmUgb3B0aW9uYWwg4oCUIGxlYXZlIHRoZW0gYmxhbmsgdG8gdXNlIHRoZSBzdG9yZSdzIG9wZW4gYW5kIGNsb3NlIHRpbWUgKDEwOjAwIHRvIDIyOjAwIHdoZW4gdGhlIHN0b3JlIGhhcyBub25lKS48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNlLW5vdGVcIj5Sb3dzIHdpdGggYW4gdW5rbm93biBzdG9yZSwgZW1haWwgb3IgYXVkaXQgYXJlIHJlcG9ydGVkIGJlZm9yZSBhbnl0aGluZyBpcyBzYXZlZC4gRHJhZnQgYXVkaXRzXG4gICAgICAgIGFyZSBwdWJsaXNoZWQgd2hlbiB0aGUgc2NoZWR1bGUgaXMgcHVibGlzaGVkLjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPCEtLSA9PT09PT09PT09PT0gUm93cyA9PT09PT09PT09PT0gLS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwic3RlcCA9PT0gJ3Jvd3MnICYmICFsb2FkaW5nRWRpdFwiPlxuICA8IS0tIEJhY2sgKyBjcnVtYiBvbiBvbmUgbGluZSwgYXMgb24gdGhlIENyZWF0ZSBzdGVwOyB0aGUgbmFtZSBhbmQgYWN0aW9ucyBiZWxvdywgbGVmdCBlZGdlcyBhbGlnbmVkLlxuICAgICAgIEVkaXQgaGFzIG5vIFwiRWRpdCBzY2hlZHVsZVwiIHN0ZXAgaW4gdGhlIGNydW1iIChRQSA5IE9jdCk6IGl0IG9wZW5zIG9uLCBhbmQgc3RheXMgb24sIHRoZSByb3dzLiAtLT5cbiAgPGRpdiBjbGFzcz1cInNlLWJhY2tiYXJcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc20gc2UtYmFja1wiIChjbGljayk9XCJiYWNrKClcIj5cbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIxNSA2IDkgMTIgMTUgMThcIj48L3BvbHlsaW5lPjwvc3ZnPlxuICAgICAge3sgYmFja0xhYmVsIH19XG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBjbGFzcz1cInNlLWNydW1iXCI+XG4gICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJiYWNrKCRldmVudClcIj5TY2hlZHVsZTwvYT4g4oC6XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNjaGVkdWxlSWRcIj48YSBocmVmPVwiI1wiIChjbGljayk9XCJiYWNrVG9DcmVhdGUoJGV2ZW50KVwiPkNyZWF0ZSBzY2hlZHVsZTwvYT4g4oC6PC9uZy1jb250YWluZXI+XG4gICAgICBSb3dzXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzZS10aXRsZWJhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZS10aXRsZXRleHRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZS1uYW1lXCI+e3sgbmFtZS50cmltKCkgfHwgJ1VudGl0bGVkIHNjaGVkdWxlJyB9fTwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIFtkaXNhYmxlZF09XCJzYXZpbmdcIiAoY2xpY2spPVwic2F2ZURyYWZ0KClcIj5TYXZlIGFzIGRyYWZ0PC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLXByaW1hcnkgYXYyLWJ0bi0tc20gc2UtcHVibGlzaFwiIFtjbGFzcy5pcy1vZmZdPVwiIWNhblB1Ymxpc2hcIiAoY2xpY2spPVwicHVibGlzaCgpXCI+XG4gICAgICB7eyBzYXZpbmcgPyAnU2F2aW5n4oCmJyA6IChwdWJsaXNoZWQgPyAnU2F2ZSAmIHB1Ymxpc2gnIDogJ1B1Ymxpc2ggc2NoZWR1bGUnKSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic2UtcmVhZHlcIiBbY2xhc3MuaXMtb2tdPVwicmVhZHlPa1wiPlxuICAgIDxzdmcgKm5nSWY9XCJyZWFkeU9rXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTIgM2E5IDkgMCAxIDAgMCAxOCA5IDkgMCAwIDAgMC0xOHpcIj48L3BhdGg+PHBhdGggZD1cIk04IDEyLjVsMi43IDIuN0wxNiA5LjVcIj48L3BhdGg+PC9zdmc+XG4gICAgPHN2ZyAqbmdJZj1cIiFyZWFkeU9rXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTIgNGw5IDE2SDN6XCI+PC9wYXRoPjxwYXRoIGQ9XCJNMTIgMTB2NE0xMiAxN2guMDFcIj48L3BhdGg+PC9zdmc+XG4gICAgPHNwYW4+e3sgcmVhZHlMYWJlbCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInNlLW1ldHJpY3NcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkXCIgKm5nRm9yPVwibGV0IG0gb2YgbWV0cmljc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1oZWFkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtY291bnRcIj57eyBtLnZhbHVlIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtdGV4dFwiPnt7IG0ubGFiZWwgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic2UtY2FyZCBzZS1jYXJkLS10YWJsZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZS10YWJsZWhlYWRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZS10aXRsZXRleHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXNpZGUtdGl0bGVcIj5TY2hlZHVsZSByb3dzPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS1zdWJcIj5FdmVyeSByb3cgaXMgb25lIHVzZXIsIGF0IG9uZSBzdG9yZSwgb24gb25lIGRhdGUuPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIChjbGljayk9XCJhZGRSb3coKVwiPkFkZCByb3c8L2J1dHRvbj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInNlLXNlYXJjaCBzZS1zZWFyY2gtLXNtXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTYuNVwiIHkxPVwiMTYuNVwiIHgyPVwiMjFcIiB5Mj1cIjIxXCI+PC9saW5lPjwvc3ZnPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInJvd1F1ZXJ5XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggcm93c1wiPlxuICAgICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzZS1zY3JvbGxcIiAoc2Nyb2xsKT1cIm9uVmlld3BvcnRDaGFuZ2UoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlLWdyaWQgc2UtZ3JpZC0taGVhZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2UtY2VudGVyXCIgKGNsaWNrKT1cInRvZ2dsZUFsbFJvd3MoKVwiIHRpdGxlPVwiU2VsZWN0IGFsbCByb3dzXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1ib3hcIiBbY2xhc3MuaXMtb25dPVwiYWxsUm93c1NlbGVjdGVkXCI+XG4gICAgICAgICAgICA8c3ZnICpuZ0lmPVwiYWxsUm93c1NlbGVjdGVkXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5TY2hlZHVsZSBkYXRlPC9kaXY+PGRpdj5Vc2VyIGVtYWlsPC9kaXY+PGRpdj5Bc3NpZ25lZCBzdG9yZTwvZGl2PjxkaXY+QXVkaXQgYXNzaWduZWQ8L2Rpdj48ZGl2PlZpc2l0IHdpbmRvdzwvZGl2PjxkaXY+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInNlLWdyaWQgc2UtZ3JpZC0tcm93XCIgKm5nRm9yPVwibGV0IHIgb2Ygc2hvd25Sb3dzOyB0cmFja0J5OiB0cmFja0J5Um93XCIgW2NsYXNzLmlzLXNlbGVjdGVkXT1cInIuc2VsZWN0ZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLWNlbnRlclwiIChjbGljayk9XCJ0b2dnbGVSb3cocilcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWJveFwiIFtjbGFzcy5pcy1vbl09XCJyLnNlbGVjdGVkXCI+XG4gICAgICAgICAgICA8c3ZnICpuZ0lmPVwici5zZWxlY3RlZFwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJzZS1jZWxsXCIgW2NsYXNzLmlzLWJhZF09XCJjZWxsRXJyb3IociwgJ2RhdGUnKVwiIFthdHRyLnRpdGxlXT1cImNlbGxFcnJvcihyLCAnZGF0ZScpIHx8IG51bGxcIiBbYXR0ci5taW5dPVwidG9kYXlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0xvY2tlZChyKVwiIFsobmdNb2RlbCldPVwici5kYXRlXCIgKG5nTW9kZWxDaGFuZ2UpPVwidG91Y2gociwgJ2RhdGUnKVwiPlxuXG4gICAgICAgIDwhLS0gVXNlcjogc2VhcmNoIGJ5IG5hbWUgb3IgZW1haWwgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS1waWNrXCIgW2NsYXNzLmlzLW9wZW5dPVwiaXNPcGVuKHIsICd1c2VyRW1haWwnKVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2UtY2VsbCBzZS1jZWxsLS1waWNrXCIgW2NsYXNzLmlzLWJhZF09XCJjZWxsRXJyb3IociwgJ3VzZXJFbWFpbCcpXCIgW2F0dHIudGl0bGVdPVwiY2VsbEVycm9yKHIsICd1c2VyRW1haWwnKSB8fCBudWxsXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHVzZXJcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBbZGlzYWJsZWRdPVwiaXNMb2NrZWQocilcIiBbKG5nTW9kZWwpXT1cInIudXNlckVtYWlsXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25QaWNrZXJJbnB1dChyLCAndXNlckVtYWlsJylcIlxuICAgICAgICAgICAgKGZvY3VzKT1cIm9wZW5QaWNrZXIociwgJ3VzZXJFbWFpbCcsICRldmVudClcIiAoY2xpY2spPVwib3BlblBpY2tlcihyLCAndXNlckVtYWlsJywgJGV2ZW50KVwiIChrZXlkb3duKT1cIm9uUGlja2VyS2V5KHIsICd1c2VyRW1haWwnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlLW1lbnVcIiAqbmdJZj1cImlzT3BlbihyLCAndXNlckVtYWlsJylcIiBbc3R5bGUudG9wLnB4XT1cIm1lbnVQb3MudG9wXCIgW3N0eWxlLmJvdHRvbS5weF09XCJtZW51UG9zLmJvdHRvbVwiXG4gICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJtZW51UG9zLmxlZnRcIiBbc3R5bGUubWluLXdpZHRoLnB4XT1cIm1lbnVQb3Mud2lkdGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1vcHRcIiAqbmdGb3I9XCJsZXQgdSBvZiB1c2VyU3VnZ2VzdGlvbnMocik7IGxldCBpID0gaW5kZXhcIiBbY2xhc3MuaXMtYWN0aXZlXT1cImkgPT09IGFjdGl2ZUluZGV4XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLW9uXT1cInUuZW1haWwgPT09IHIudXNlckVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpXCIgKG1vdXNlZW50ZXIpPVwiYWN0aXZlSW5kZXggPSBpXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJwaWNrVXNlcihyLCB1LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3B0LWF2YXRhclwiPnt7IGluaXRpYWxzKHUubmFtZSB8fCB1LmVtYWlsKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1vcHQtdGV4dFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3B0LW1haW5cIj57eyB1Lm5hbWUgfHwgdS5lbWFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLW9wdC1zdWJcIj57eyB1LmVtYWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzZS1vcHQtY2hlY2tcIiAqbmdJZj1cInUuZW1haWwgPT09IHIudXNlckVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjRcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2UtbWVudS1lbXB0eVwiICpuZ0lmPVwiIXVzZXJTdWdnZXN0aW9ucyhyKS5sZW5ndGhcIj57eyB1c2Vycy5sZW5ndGggPyAnTm8gdXNlciBtYXRjaGVzIOKAnCcgKyByLnVzZXJFbWFpbCArICfigJ0nIDogJ0xvYWRpbmcgdXNlcnPigKYnIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2UtbWVudS1ub3RlXCIgKm5nSWY9XCJtb3JlTGFiZWwodXNlclN1Z2dlc3Rpb25zKHIpLmxlbmd0aCwgdXNlck1hdGNoZXMocikubGVuZ3RoLCAndXNlcnMnKVwiPlxuICAgICAgICAgICAgICB7eyBtb3JlTGFiZWwodXNlclN1Z2dlc3Rpb25zKHIpLmxlbmd0aCwgdXNlck1hdGNoZXMocikubGVuZ3RoLCAndXNlcnMnKSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU3RvcmU6IHNlYXJjaCBhbmQgc2hvdyBieSBzdG9yZSBuYW1lIChvciBjaXR5KTsgdGhlIHN0b3JlIGNvZGUgaXMgbmV2ZXIgc2hvd24gb3IgYXNrZWQgZm9yIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2UtcGlja1wiIFtjbGFzcy5pcy1vcGVuXT1cImlzT3BlbihyLCAnc3RvcmVJZCcpXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJzZS1jZWxsIHNlLWNlbGwtLXBpY2tcIlxuICAgICAgICAgICAgW2NsYXNzLmlzLWJhZF09XCJjZWxsRXJyb3IociwgJ3N0b3JlSWQnKVwiIFthdHRyLnRpdGxlXT1cImNlbGxFcnJvcihyLCAnc3RvcmVJZCcpIHx8IG51bGxcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RvcmVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBbZGlzYWJsZWRdPVwiaXNMb2NrZWQocilcIiBbbmdNb2RlbF09XCJyLnN0b3JlVGV4dFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVUeXBlZChyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvcGVuUGlja2VyKHIsICdzdG9yZUlkJywgJGV2ZW50KVwiIChjbGljayk9XCJvcGVuUGlja2VyKHIsICdzdG9yZUlkJywgJGV2ZW50KVwiIChrZXlkb3duKT1cIm9uUGlja2VyS2V5KHIsICdzdG9yZUlkJywgJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1tZW51XCIgKm5nSWY9XCJpc09wZW4ociwgJ3N0b3JlSWQnKVwiIFtzdHlsZS50b3AucHhdPVwibWVudVBvcy50b3BcIiBbc3R5bGUuYm90dG9tLnB4XT1cIm1lbnVQb3MuYm90dG9tXCJcbiAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIm1lbnVQb3MubGVmdFwiIFtzdHlsZS5taW4td2lkdGgucHhdPVwibWVudVBvcy53aWR0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlLW9wdFwiICpuZ0Zvcj1cImxldCBzIG9mIHN0b3JlU3VnZ2VzdGlvbnMocik7IGxldCBpID0gaW5kZXhcIiBbY2xhc3MuaXMtYWN0aXZlXT1cImkgPT09IGFjdGl2ZUluZGV4XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLW9uXT1cInMuc3RvcmVJZCA9PT0gci5zdG9yZUlkLnRyaW0oKVwiIChtb3VzZWVudGVyKT1cImFjdGl2ZUluZGV4ID0gaVwiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwicGlja1N0b3JlKHIsIHMsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1vcHQtaWNvblwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMyA5bDEuNS01aDE1TDIxIDlcIj48L3BhdGg+PHBhdGggZD1cIk00IDl2MTFoMTZWOVwiPjwvcGF0aD48cGF0aCBkPVwiTTkgMjB2LTZoNnY2XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3B0LXRleHRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLW9wdC1tYWluXCI+e3sgcy5zdG9yZU5hbWUgfHwgcy5zdG9yZUlkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3B0LXN1YlwiICpuZ0lmPVwicy5jaXR5XCI+e3sgcy5jaXR5IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzZS1vcHQtY2hlY2tcIiAqbmdJZj1cInMuc3RvcmVJZCA9PT0gci5zdG9yZUlkLnRyaW0oKVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi40XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlLW1lbnUtZW1wdHlcIiAqbmdJZj1cIiFzdG9yZVN1Z2dlc3Rpb25zKHIpLmxlbmd0aFwiPnt7IHN0b3Jlcy5sZW5ndGggPyAnTm8gc3RvcmUgbWF0Y2hlcyDigJwnICsgci5zdG9yZVRleHQgKyAn4oCdJyA6ICdMb2FkaW5nIHN0b3Jlc+KApicgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1tZW51LW5vdGVcIiAqbmdJZj1cIm1vcmVMYWJlbChzdG9yZVN1Z2dlc3Rpb25zKHIpLmxlbmd0aCwgc3RvcmVNYXRjaGVzKHIpLmxlbmd0aCwgJ3N0b3JlcycpXCI+XG4gICAgICAgICAgICAgIHt7IG1vcmVMYWJlbChzdG9yZVN1Z2dlc3Rpb25zKHIpLmxlbmd0aCwgc3RvcmVNYXRjaGVzKHIpLmxlbmd0aCwgJ3N0b3JlcycpIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBdWRpdCBhc3NpZ25lZDogbXVsdGktc2VsZWN0IHdpdGggc2VhcmNoIG92ZXIgdGhlIHB1Ymxpc2hlZCBhdWRpdHMgKHJvd0F1ZGl0T3B0aW9ucykuIFRpY2tpbmcgYW5vdGhlciBhdWRpdFxuICAgICAgICAgICAgIGFkZHMgYSByb3cgZm9yIGl0IHdpdGggdGhlIHNhbWUgZGF0ZSwgdXNlciwgc3RvcmUgYW5kIHdpbmRvdzsgdW50aWNraW5nIHJlbW92ZXMgdGhhdCByb3cuIE5vIGNvbHVtbiB3aGVuXG4gICAgICAgICAgICAgdGhlIHNjaGVkdWxlIGhhcyBvbmUgZml4ZWQgYXVkaXQuIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2UtcGlja1wiIFtjbGFzcy5pcy1vcGVuXT1cImlzT3BlbihyLCAnY2hlY2tMaXN0SWQnKVwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtY2VsbCBzZS1zZWxlY3RcIiBbY2xhc3MuaXMtYmFkXT1cImNlbGxFcnJvcihyLCAnY2hlY2tMaXN0SWQnKVwiIFthdHRyLnRpdGxlXT1cImNlbGxFcnJvcihyLCAnY2hlY2tMaXN0SWQnKSB8fCBudWxsXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0xvY2tlZChyKVwiIChjbGljayk9XCJvcGVuUGlja2VyKHIsICdjaGVja0xpc3RJZCcsICRldmVudClcIiAoa2V5ZG93bik9XCJvblBpY2tlcktleShyLCAnY2hlY2tMaXN0SWQnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWVsbGlwc2lzXCIgW2NsYXNzLnNlLXBsYWNlaG9sZGVyXT1cIiFncm91cEF1ZGl0Rmlyc3QocilcIiBbYXR0ci50aXRsZV09XCJncm91cEF1ZGl0TGFiZWwocikgfHwgbnVsbFwiPnt7IGdyb3VwQXVkaXRGaXJzdChyKSB8fCAnU2VsZWN0IGF1ZGl0cycgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLW1vcmVcIiAqbmdJZj1cImdyb3VwQXVkaXRNb3JlKHIpXCIgW2F0dHIudGl0bGVdPVwiZ3JvdXBBdWRpdExhYmVsKHIpXCI+K3t7IGdyb3VwQXVkaXRNb3JlKHIpIH19PC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInNlLWNoZXZcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2UtbWVudSBzZS1tZW51LS1tdWx0aVwiICpuZ0lmPVwiaXNPcGVuKHIsICdjaGVja0xpc3RJZCcpXCIgW3N0eWxlLnRvcC5weF09XCJtZW51UG9zLnRvcFwiIFtzdHlsZS5ib3R0b20ucHhdPVwibWVudVBvcy5ib3R0b21cIlxuICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwibWVudVBvcy5sZWZ0XCIgW3N0eWxlLm1pbi13aWR0aC5weF09XCJtZW51UG9zLndpZHRoXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZS1tZW51LXNlYXJjaFwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTYuNVwiIHkxPVwiMTYuNVwiIHgyPVwiMjFcIiB5Mj1cIjIxXCI+PC9saW5lPjwvc3ZnPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhdWRpdHNcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBbKG5nTW9kZWwpXT1cImF1ZGl0UXVlcnlcIiAobmdNb2RlbENoYW5nZSk9XCJhY3RpdmVJbmRleCA9IDBcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUGlja2VyS2V5KHIsICdjaGVja0xpc3RJZCcsICRldmVudClcIj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Utb3B0XCIgKm5nRm9yPVwibGV0IGEgb2YgYXVkaXRNYXRjaGVzKCk7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlBdWRpdFwiIFtjbGFzcy5pcy1hY3RpdmVdPVwiaSA9PT0gYWN0aXZlSW5kZXhcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXMtb25dPVwiYXVkaXRUaWNrZWQociwgYSlcIiAobW91c2VlbnRlcik9XCJhY3RpdmVJbmRleCA9IGlcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKGNsaWNrKT1cInRvZ2dsZUF1ZGl0KHIsIGEsICRldmVudClcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1ib3hcIiBbY2xhc3MuaXMtb25dPVwiYXVkaXRUaWNrZWQociwgYSlcIj5cbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiYXVkaXRUaWNrZWQociwgYSlcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1vcHQtdGV4dFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3B0LW1haW5cIj57eyBhLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1vcHQtc3ViXCIgKm5nSWY9XCJhLnF1ZXN0aW9uc1wiPnt7IGEucXVlc3Rpb25zIH19IHt7IGEucXVlc3Rpb25zID09PSAxID8gJ3F1ZXN0aW9uJyA6ICdxdWVzdGlvbnMnIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1tZW51LWVtcHR5XCIgKm5nSWY9XCIhYXVkaXRNYXRjaGVzKCkubGVuZ3RoXCI+e3sgcm93QXVkaXRPcHRpb25zLmxlbmd0aCA/ICdObyBhdWRpdCBtYXRjaGVzIOKAnCcgKyBhdWRpdFF1ZXJ5ICsgJ+KAnScgOiAnTm8gcHVibGlzaGVkIGF1ZGl0cyB5ZXQnIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2UtbWVudS1ub3RlXCIgKm5nSWY9XCJhdWRpdFRpY2tDb3VudChyKSA+IDFcIj57eyBhdWRpdFRpY2tDb3VudChyKSB9fSBhdWRpdHMgb24gdGhpcyByb3cgwrcgc2FtZSB1c2VyLCBzdG9yZSwgZGF0ZSBhbmQgd2luZG93PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS13aW5kb3dcIiBbYXR0ci50aXRsZV09XCJjZWxsRXJyb3IociwgJ3dpbmRvdycpIHx8IG51bGxcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRpbWVcIiBjbGFzcz1cInNlLWNlbGxcIiBbY2xhc3MuaXMtYmFkXT1cImNlbGxFcnJvcihyLCAnd2luZG93JylcIiBbZGlzYWJsZWRdPVwiaXNMb2NrZWQocilcIiBbKG5nTW9kZWwpXT1cInIuc3RhcnRcIiAobmdNb2RlbENoYW5nZSk9XCJ0b3VjaChyLCAnd2luZG93JylcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWRhc2hcIj7igJM8L3NwYW4+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0aW1lXCIgY2xhc3M9XCJzZS1jZWxsXCIgW2NsYXNzLmlzLWJhZF09XCJjZWxsRXJyb3IociwgJ3dpbmRvdycpXCIgW2Rpc2FibGVkXT1cImlzTG9ja2VkKHIpXCIgWyhuZ01vZGVsKV09XCJyLmVuZFwiIChuZ01vZGVsQ2hhbmdlKT1cInRvdWNoKHIsICd3aW5kb3cnKVwiPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2UtY2VudGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1sb2NrXCIgKm5nSWY9XCJpc0xvY2tlZChyKVwiIHRpdGxlPVwiUGFzdCB2aXNpdDogYWxyZWFkeSByYWlzZWQsIHNvIGl0IGNhbm5vdCBiZSBlZGl0ZWQgb3IgZGVsZXRlZFwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cmVjdCB4PVwiNVwiIHk9XCIxMVwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxMFwiIHJ4PVwiMlwiPjwvcmVjdD48cGF0aCBkPVwiTTggMTFWN2E0IDQgMCAwIDEgOCAwdjRcIj48L3BhdGg+PC9zdmc+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxhIGNsYXNzPVwic2UtZGVsXCIgKm5nSWY9XCIhaXNMb2NrZWQocilcIiB0aXRsZT1cIkRlbGV0ZSByb3dcIiAoY2xpY2spPVwiZGVsZXRlUm93KHIpXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNNCA3aDE2XCI+PC9wYXRoPjxwYXRoIGQ9XCJNNyA3bDEgMTNoOGwxLTEzTTkgN1Y0aDZ2M1wiPjwvcGF0aD48L3N2Zz5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gV2h5IHRoZSByb3cgaXMgcmVkLCBpbiB3b3Jkcy4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dNZXNzYWdlcyhyKSBhcyBtc2dzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS1yb3dlcnJcIiAqbmdJZj1cIm1zZ3MubGVuZ3RoXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxuICAgICAgICAgIDxzcGFuPnt7IG1zZ3Muam9pbignIMK3ICcpIH19PC9zcGFuPlxuICAgICAgICAgIDxhIGNsYXNzPVwic2UtaW52aXRlLWxpbmtcIiAqbmdJZj1cImludml0ZWFibGUocilcIiAoY2xpY2spPVwib3Blbkludml0ZShuZXdVc2VyRW1haWxzKGdyb3VwUm93cyhyKSkpXCI+SW52aXRlIHVzZXI8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSBIaW50czogYWxsb3dlZCAoUHVibGlzaCBpcyBub3QgYmxvY2tlZCksIGUuZy4gdGhlIHNhbWUgdmlzaXQgaW4gYW5vdGhlciBzY2hlZHVsZS4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dIaW50cyhyKSBhcyBoaW50c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Utcm93ZXJyIHNlLXJvd2hpbnRcIiAqbmdJZj1cImhpbnRzLmxlbmd0aFwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxuICAgICAgICAgIDxzcGFuPnt7IGhpbnRzLmpvaW4oJyDCtyAnKSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd25Sb3dzLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHJvd3MubGVuZ3RoID8gJ05vIHJvd3MgbWF0Y2ggdGhpcyBzZWFyY2guJyA6ICdObyByb3dzIHlldC4gQWRkIGEgcm93IG9yIGltcG9ydCB0aGUgdGVtcGxhdGUuJyB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInNlLWZvb3RcIj5cbiAgICAgIDwhLS0gUm93IGNvdW50ICsgdmlzaXQtd2luZG93IGhpbnQgcmVtb3ZlZCAodXNlciwgMTEgT2N0KTsgdGhlIGNvdW50IHNob3dzIG9ubHkgd2hpbGUgcm93cyBhcmUgc2VsZWN0ZWQuIC0tPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzZS1mb290LXRleHRcIiAqbmdJZj1cInNlbGVjdGVkQ291bnRcIj57eyBzZWxlY3Rpb25MYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2UtZm9vdC1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2UtYnVsa1wiIFtjbGFzcy5pcy1vZmZdPVwiIXNlbGVjdGVkQ291bnRcIiAoY2xpY2spPVwiZHVwbGljYXRlU2VsZWN0ZWQoKVwiPkR1cGxpY2F0ZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ1bGsgc2UtYnVsay0tZGFuZ2VyXCIgW2NsYXNzLmlzLW9mZl09XCIhc2VsZWN0ZWRDb3VudFwiIChjbGljayk9XCJkZWxldGVTZWxlY3RlZCgpXCI+RGVsZXRlPC9idXR0b24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gTmV3IFVzZXIgZm91bmQgKGFzIHRoZSB2MSBjaGVja2xpc3QgdXBsb2FkKTogZW1haWxzIHdpdGggbm8gdXNlciB5ZXQsIGFmdGVyIGFuIGltcG9ydCBvciBmcm9tIGEgcm93J3MgSW52aXRlIHVzZXIuIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImludml0ZU9wZW5cIj5cbiAgPGRpdiBjbGFzcz1cInNlLWludi1iYWNrZHJvcFwiIChjbGljayk9XCJjbG9zZUludml0ZSgpXCI+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzZS1pbnZcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJzZS1pbnYtdGl0bGVcIj5cbiAgICA8c3BhbiBjbGFzcz1cInNlLWludi1pY29uXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMjJcIiBoZWlnaHQ9XCIyMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTEwLjMgMy45TDEuOCAxOGEyIDIgMCAwIDAgMS43IDNoMTdhMiAyIDAgMCAwIDEuNy0zTDEzLjcgMy45YTIgMiAwIDAgMC0zLjQgMHpcIj48L3BhdGg+PHBhdGggZD1cIk0xMiA5djRNMTIgMTdoLjAxXCI+PC9wYXRoPjwvc3ZnPlxuICAgIDwvc3Bhbj5cbiAgICA8ZGl2IGNsYXNzPVwic2UtaW52LXRpdGxlXCIgaWQ9XCJzZS1pbnYtdGl0bGVcIj57eyBpbnZpdGVFbWFpbHMubGVuZ3RoID09PSAxID8gJ05ldyB1c2VyIGZvdW5kJyA6ICdOZXcgdXNlcnMgZm91bmQnIH19PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlLWludi10ZXh0XCI+XG4gICAgICB7eyBpbnZpdGVFbWFpbHMubGVuZ3RoID09PSAxID8gJ1RoaXMgZW1haWwgaXMgbm90IGEgdXNlciB5ZXQuJyA6ICdUaGVzZSBlbWFpbHMgYXJlIG5vdCB1c2VycyB5ZXQuJyB9fVxuICAgICAgSW52aXRlIHRoZW0gdG8gYWRkIHRoZW0gYXMgdXNlcnMgb2YgdGhpcyBjbGllbnQsIG9yIGFkZCB0aGVtIGluIFVzZXIgTWFuYWdlbWVudCB1bmRlciB0aGUgTWFuYWdlIG1lbnUuXG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwic2UtaW52LWxpc3RcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZS1waWNrcm93IHNlLXBpY2tyb3ctLWFsbFwiICpuZ0lmPVwiaW52aXRlRW1haWxzLmxlbmd0aCA+IDFcIiAoY2xpY2spPVwidG9nZ2xlQWxsSW52aXRlKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1ib3hcIiBbY2xhc3MuaXMtb25dPVwiYWxsSW52aXRlUGlja2VkXCI+XG4gICAgICAgICAgPHN2ZyAqbmdJZj1cImFsbEludml0ZVBpY2tlZFwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlLXBpY2thbGxcIj5TZWxlY3QgYWxsICh7eyBpbnZpdGVFbWFpbHMubGVuZ3RoIH19KTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNlLXBpY2tyb3dcIiAqbmdGb3I9XCJsZXQgZSBvZiBpbnZpdGVFbWFpbHNcIiBbY2xhc3MuaXMtb25dPVwiaW52aXRlUGlja2VkLmhhcyhlKVwiIChjbGljayk9XCJ0b2dnbGVJbnZpdGUoZSlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1ib3hcIiBbY2xhc3MuaXMtb25dPVwiaW52aXRlUGlja2VkLmhhcyhlKVwiPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJpbnZpdGVQaWNrZWQuaGFzKGUpXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2UtcGlja25hbWVcIj48c3BhbiBjbGFzcz1cInNlLWVsbGlwc2lzXCI+e3sgZSB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzZS1pbnYtZm9vdFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgW2Rpc2FibGVkXT1cImludml0aW5nXCIgKGNsaWNrKT1cImNsb3NlSW52aXRlKClcIj5Ta2lwPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS1zbVwiIFtkaXNhYmxlZF09XCJpbnZpdGluZyB8fCAhaW52aXRlUGlja2VkLnNpemVcIiAoY2xpY2spPVwiaW52aXRlU2VsZWN0ZWQoKVwiPlxuICAgICAgICB7eyBpbnZpdGluZyA/ICdJbnZpdGluZ+KApicgOiAnSW52aXRlIHNlbGVjdGVkJyArIChpbnZpdGVQaWNrZWQuc2l6ZSA/ICcgKCcgKyBpbnZpdGVQaWNrZWQuc2l6ZSArICcpJyA6ICcnKSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=
|
|
1638
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItc2NoZWR1bGUtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvc2NoZWR1bGUvYXVkaXQtdjItc2NoZWR1bGUtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvc2NoZWR1bGUvYXVkaXQtdjItc2NoZWR1bGUtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUF1QixZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckwsT0FBTyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQXVDN0I7Ozs7Ozs7O0dBUUc7QUFNSCxNQUFNLE9BQU8sOEJBQThCO0lBd0cvQjtJQUNBO0lBQ0E7SUF6R0QsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUN2QixpQ0FBaUM7SUFDeEIsTUFBTSxHQUFvQixFQUFFLENBQUM7SUFDdEMsa0dBQWtHO0lBQ3pGLFNBQVMsR0FBYSxFQUFFLENBQUM7SUFDbEM7Ozs7T0FJRztJQUNNLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsK0RBQStEO0lBQ3RELFNB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QUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQU8sRUFBRSxFQUFFO1lBQ3JFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ2hFLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDekcsTUFBTSxDQUFDLENBQUMsQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUN2RCxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDaEcsTUFBTSxDQUFDLENBQUMsQ0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMs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QyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FBRTtJQUNuRixPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsU0FBUyxNQUFNLENBQUMsQ0FBUztJQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDekMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDL0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIERvQ2hlY2ssIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgZGVib3VuY2VUaW1lLCBmb3JrSm9pbiwgb2YsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcclxuaW1wb3J0IHsgVHJheFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90cmF4LnNlcnZpY2UnO1xyXG5cclxuLyoqIEFuIGF1ZGl0IHRoZSBzY2hlZHVsZSBjYW4gcmFpc2UuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVBdWRpdCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbWV0YTogc3RyaW5nO1xyXG4gIHF1ZXN0aW9uczogbnVtYmVyO1xyXG4gIC8qKiBQdWJsaXNoZWQgYXVkaXQ7IHRoZSByb3dzJyBBdWRpdCBhc3NpZ25lZCBsaXN0IG9mZmVycyBvbmx5IHRoZXNlIChwbHVzIHRoZSBzY2hlZHVsZSdzIG93biBhdWRpdHMpLiAqL1xyXG4gIHB1Ymxpc2g/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogT25lIHNjaGVkdWxlIHJvdzogYSB1c2VyLCBhdCBhIHN0b3JlLCBvbiBhIGRhdGUsIGZvciBhbiBhdWRpdC4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBFZGl0b3JSb3cge1xyXG4gIGtleTogbnVtYmVyO1xyXG4gIGRhdGU6IHN0cmluZztcclxuICB1c2VyRW1haWw6IHN0cmluZztcclxuICAvKiogVGhlIHBpY2tlZCBzdG9yZSdzIGlkICgnJyB1bnRpbCB0aGUgdHlwZWQgdGV4dCBuYW1lcyBhbiBhY3RpdmUgc3RvcmUpLiBOZXZlciBzaG93bi4gKi9cclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgLyoqIFdoYXQgdGhlIHN0b3JlIGNlbGwgc2hvd3M6IHRoZSBzdG9yZSBuYW1lIChvciB0aGUgdGV4dCBiZWluZyB0eXBlZCkuICovXHJcbiAgc3RvcmVUZXh0OiBzdHJpbmc7XHJcbiAgY2hlY2tMaXN0SWQ6IHN0cmluZztcclxuICBzdGFydDogc3RyaW5nO1xyXG4gIGVuZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkOiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFJvd3Mgb2Ygb25lIHZpc2l0IChzYW1lIGRhdGUsIHVzZXIsIHN0b3JlIGFuZCB3aW5kb3cpIHNoYXJlIGEgZ3JvdXA6IHRoZSB0YWJsZSBzaG93cyB0aGUgZ3JvdXAgYXMgb25lIHJvdyB3aXRoXHJcbiAgICogaXRzIGF1ZGl0cyBpbiB0aGUgQXVkaXQgYXNzaWduZWQgZHJvcGRvd24gKFFBIDEwIE9jdCksIGFuZCBlZGl0cyB0byB0aGF0IHJvdyBhcHBseSB0byBldmVyeSBhdWRpdCBvZiBpdC4gVGhlIEFQSVxyXG4gICAqIHN0aWxsIHRha2VzIG9uZSByb3cgcGVyIGF1ZGl0LlxyXG4gICAqL1xyXG4gIGdyb3VwOiBudW1iZXI7XHJcbn1cclxuXHJcbmludGVyZmFjZSBQaWNrU3RvcmUgeyBzdG9yZUlkOiBzdHJpbmc7IHN0b3JlTmFtZTogc3RyaW5nOyBjaXR5OiBzdHJpbmc7IH1cclxuaW50ZXJmYWNlIFBpY2tVc2VyIHsgZW1haWw6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB9XHJcbnR5cGUgUGlja0NlbGwgPSAndXNlckVtYWlsJyB8ICdzdG9yZUlkJyB8ICdjaGVja0xpc3RJZCc7XHJcbnR5cGUgUm93RmllbGQgPSAnZGF0ZScgfCBQaWNrQ2VsbCB8ICd3aW5kb3cnO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZSDigLogU2NoZWR1bGUgSW5mbyDigLogQ3JlYXRlIHNjaGVkdWxlLCB0aGVuIOKAuiBSb3dzICh0aGUgcHJvdG90eXBlJ3MgdHdvIHNjaGVkdWxlIHBhZ2VzKS5cclxuICogQ3JlYXRlOiBuYW1lIHRoZSBzY2hlZHVsZSBhbmQgcGljayBpdHMgYXVkaXRzLCB0aGVuIGltcG9ydCB0aGUgQ1NWIHRlbXBsYXRlIG9yIGFkZCBhIHJvdy5cclxuICogUm93czogb25lIHVzZXIsIHN0b3JlLCBkYXRlIGFuZCBhdWRpdCBwZXIgcm93LCBjaGVja2VkIGFnYWluc3QgdGhlIGNsaWVudCdzIGFjdGl2ZSBzdG9yZXNcclxuICogYW5kIHVzZXJzIGJlZm9yZSBhbnl0aGluZyBpcyBzYXZlZC4gU2F2ZSBhcyBkcmFmdCBrZWVwcyBpdCB1bnB1Ymxpc2hlZDsgUHVibGlzaCBzY2hlZHVsZVxyXG4gKiBzYXZlcyBpdCBhbmQgcHVibGlzaGVzIGl0IChQT1NUL1BVVCAvdHJheC9hdWRpdC9zY2hlZHVsZS8qKSwgd2hpY2ggYXNzaWducyB0aGUgcm93cycgc3RvcmVzXHJcbiAqIHRvIHRoZWlyIGF1ZGl0cyBpbiBUcmF4IGFuZCBwdWJsaXNoZXMgYXVkaXRzIHRoYXQgYXJlIHN0aWxsIGRyYWZ0cy5cclxuICogV2l0aCBgc2NoZWR1bGVJZGAgaXQgb3BlbnMgYW4gZXhpc3Rpbmcgc2NoZWR1bGUgc3RyYWlnaHQgb24gaXRzIHJvd3MgKEVkaXQgcm93cykuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1zY2hlZHVsZS1lZGl0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1zY2hlZHVsZS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1zY2hlZHVsZS1lZGl0b3IuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyU2NoZWR1bGVFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgRG9DaGVjaywgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBjbGllbnRJZCA9ICcnO1xyXG4gIC8qKiBBdWRpdHMgdGhhdCBjYW4gYmUgcGlja2VkLiAqL1xyXG4gIEBJbnB1dCgpIGF1ZGl0czogU2NoZWR1bGVBdWRpdFtdID0gW107XHJcbiAgLyoqIEF1ZGl0cyB0aWNrZWQgd2hlbiB0aGUgcGFnZSBvcGVucyAoTm90IHNjaGVkdWxlZCDigLogU2NoZWR1bGUsIFNjaGVkdWxlIHNlbGVjdGVkLCBDb25maWd1cmUpLiAqL1xyXG4gIEBJbnB1dCgpIHByZXNlbGVjdDogc3RyaW5nW10gPSBbXTtcclxuICAvKipcclxuICAgKiBUaGUgcHJlc2VsZWN0ZWQgYXVkaXRzIGFyZSB0aGUgc2NoZWR1bGUncyBhdWRpdHMgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIChvcGVuZWQgZnJvbSBhblxyXG4gICAqIGF1ZGl0J3MgQ29uZmlndXJlIHBhZ2UpOiB0aGUgYXVkaXQgcGlja2VyIGNhcmQgaXMgaGlkZGVuIGFuZCB0aGUgYXVkaXQgaXMgbmFtZWQgb25jZS5cclxuICAgKiBPdGhlcndpc2UgdGhlIHBpY2tlciBsaXN0cyBldmVyeSBhdWRpdCB3aXRoIHRoZSBwcmVzZWxlY3RlZCBvbmVzIHRpY2tlZC5cclxuICAgKi9cclxuICBASW5wdXQoKSBsb2NrQXVkaXRzID0gZmFsc2U7XHJcbiAgLyoqIFRleHQgb2YgdGhlIEJhY2sgYnV0dG9uIChNYW5hZ2UgcGFzc2VzIHdoZXJlIEJhY2sgZ29lcykuICovXHJcbiAgQElucHV0KCkgYmFja0xhYmVsID0gJ0JhY2snO1xyXG4gIC8qKiBFZGl0IGFuIGV4aXN0aW5nIHNjaGVkdWxlJ3Mgcm93cyBpbnN0ZWFkIG9mIGNyZWF0aW5nIG9uZS4gKi9cclxuICBASW5wdXQoKSBzY2hlZHVsZUlkID0gJyc7XHJcbiAgLyoqIEVtaXRzIHRydWUgd2hlbiB0aGUgc2NoZWR1bGUgd2FzIHNhdmVkLCBmYWxzZSBvbiBiYWNrIC8gY2FuY2VsLiAqL1xyXG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2NzdklucHV0JykgY3N2SW5wdXQ/OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBzdGVwOiAnY3JlYXRlJyB8ICdyb3dzJyA9ICdjcmVhdGUnO1xyXG4gIG5hbWUgPSAnJztcclxuICBwaWNrczogc3RyaW5nW10gPSBbXTtcclxuICAvKiogT3BlbmVkIHdpdGggYXVkaXRzIHBpY2tlZCBvbiB0aGUgcHJldmlvdXMgcGFnZTogdGhvc2UgYXJlIHRoZSBzY2hlZHVsZSdzIGF1ZGl0cyBhbmQgY2Fubm90IGJlIGNoYW5nZWQgaGVyZS4gKi9cclxuICBsb2NrZWQgPSBmYWxzZTtcclxuICBwaWNrUXVlcnkgPSAnJztcclxuICAvKiogSGlkZGVuIGZvciBub3cgb24gYm90aCBDcmVhdGUgYW5kIEVkaXQgKFFBKTogdGhlIFwiQXVkaXRzIHRvIHNjaGVkdWxlXCIgcGlja2VyIGFuZCB0aGUgXCJXaGF0IHRoZSB0ZW1wbGF0ZSBleHBlY3RzXCIgcGFuZWwuICovXHJcbiAgcmVhZG9ubHkgc2hvd0F1ZGl0UGlja2VyID0gZmFsc2U7XHJcbiAgcmVhZG9ubHkgc2hvd1RlbXBsYXRlUHJldmlldyA9IGZhbHNlO1xyXG4gIHJvd3M6IEVkaXRvclJvd1tdID0gW107XHJcbiAgcm93UXVlcnkgPSAnJztcclxuICBzYXZpbmcgPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBUZW1wbGF0ZSByb3dzIChubyBoZWFkZXIpIGZvciB0aGUgcGlja2VkIGF1ZGl0cywgYXMgdGhlIHNhbXBsZSBwYW5lbCBzaG93cyB0aGVtIGFuZCBEb3dubG9hZFxyXG4gICAqIHRlbXBsYXRlIHdyaXRlcyB0aGVtOyBgdGVtcGxhdGVGb3JgIGlzIHRoZSBwaWNrcyB0aGV5IHdlcmUgYnVpbHQgZm9yLlxyXG4gICAqL1xyXG4gIHRlbXBsYXRlTGluZXM6IHN0cmluZ1tdW10gPSBbXTtcclxuICB0ZW1wbGF0ZUxvYWRpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHRlbXBsYXRlRm9yID0gJyc7XHJcbiAgLyoqIFJvd3MgdGhlIHNhbXBsZSBwYW5lbCBsaXN0cyBiZWZvcmUgXCIrIG4gbW9yZVwiLiAqL1xyXG4gIHJlYWRvbmx5IHByZXZpZXdMaW1pdCA9IDY7XHJcbiAgbG9hZGluZ0VkaXQgPSBmYWxzZTtcclxuICBwdWJsaXNoZWQgPSBmYWxzZTtcclxuXHJcbiAgc3RvcmVzOiBQaWNrU3RvcmVbXSA9IFtdO1xyXG4gIHVzZXJzOiBQaWNrVXNlcltdID0gW107XHJcbiAgLyoqIFdoaWNoIHBpY2tlciBjZWxsIGlzIG9wZW4uICovXHJcbiAgb3BlbkNlbGw6IHsga2V5OiBudW1iZXI7IGZpZWxkOiBQaWNrQ2VsbCB9IHwgbnVsbCA9IG51bGw7XHJcbiAgLyoqIFByb2JsZW1zIHRoZSBBUEkgcmVwb3J0ZWQsIGtleWVkIGJ5IHJvdyBrZXkgYW5kIGZpZWxkLiAqL1xyXG4gIHByaXZhdGUgc2VydmVyRXJyb3JzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICAvKipcclxuICAgKiBXaGF0IHRoZSBBUEkncyBkcnkgcnVuIChQT1NUIC9zY2hlZHVsZS9jaGVjaykgc2F5cyBhYm91dCB0aGUgcm93cywga2V5ZWQgYnkgcm93IGtleSBhbmQgZmllbGQ6IGNoaWVmbHkgYVxyXG4gICAqIHVzZXIncyB3aW5kb3cgb3ZlcmxhcHBpbmcgdGhlaXIgdmlzaXQgYXQgYW5vdGhlciBzdG9yZSBpbiBhbm90aGVyIHB1Ymxpc2hlZCBzY2hlZHVsZSwgd2hpY2ggb25seSB0aGUgQVBJXHJcbiAgICogY2FuIHNlZS4gUmVmcmVzaGVkIGEgbW9tZW50IGFmdGVyIHRoZSByb3dzIGNoYW5nZTsgc2hvd24gYWZ0ZXIgdGhlIGVkaXRvcidzIG93biBjaGVja3MuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsaXZlRXJyb3JzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICAvKiogVGhlIGRyeSBydW4ncyBoaW50cyAocm93IGtleSAtPiBtZXNzYWdlcyk6IHRoZSBzYW1lIGF1ZGl0LCBkYXRlIGFuZCB3aW5kb3cgaW4gYW5vdGhlciBzY2hlZHVsZS4gVGhleSBkbyBub3QgYmxvY2sgUHVibGlzaC4gKi9cclxuICBwcml2YXRlIGxpdmVXYXJuaW5ncyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmdbXT4oKTtcclxuICBwcml2YXRlIGxhc3RDaGVja2VkID0gJyc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjaGVjayQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIC8qKiBSb3dzIHJlcGVhdGluZyBhbiBhdWRpdCBmb3IgdGhlIHNhbWUgdXNlciBvciBzdG9yZSBvbiB0aGUgc2FtZSBkYXRlIGFuZCB3aW5kb3csIGtleWVkIGJ5IHJvdyBrZXkgYW5kIGZpZWxkIChyZWJ1aWx0IGV2ZXJ5IGNoZWNrKS4gKi9cclxuICBwcml2YXRlIGR1cEVycm9ycyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgLyoqIEVhY2ggcGlja2VkIGF1ZGl0J3Mgb3duIHRpbWUgZnJhbWUgKCdISDptbScpLCB0aGUgd2luZG93IG9mIGEgcm93IGxlZnQgYmxhbmsgKGZyb20gdGhlIHRlbXBsYXRlIGNhbGwpLiAqL1xyXG4gIHByaXZhdGUgYXVkaXRXaW5kb3dzID0gbmV3IE1hcDxzdHJpbmcsIHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfT4oKTtcclxuICAvKipcclxuICAgKiBSb3dzIHRoZSBzY2hlZHVsZSBoYWQgYWxyZWFkeSByYWlzZWQgd2hlbiBpdCB3YXMgb3BlbmVkIHB1Ymxpc2hlZCAoc2VlIHZpc2l0S2V5KS4gVGhleSBtYXkgYmVcclxuICAgKiBwYXN0IGJ5IG5vdyBhbmQgc3RpbGwgc3RheTsgb25seSBuZXcgb3IgY2hhbmdlZCByb3dzIG11c3QgYmUgZGF0ZWQgdG9kYXkgb3IgbGF0ZXIgKGFzIHRoZSBBUEkpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmFpc2VkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIC8qKiBSb3cga2V5cyBvZiBhIHB1Ymxpc2hlZCBzY2hlZHVsZSdzIHJvd3MgZGF0ZWQgYmVmb3JlIHRvZGF5OiB2aXNpdHMgYWxyZWFkeSByYWlzZWQsIHJlYWQtb25seS4gKi9cclxuICBsb2NrZWRLZXlzID0gbmV3IFNldDxudW1iZXI+KCk7XHJcbiAgLyoqIFdoeSB0aGUgbGFzdCBwdWJsaXNoIGZhaWxlZCB3aGVuIHRoZSBBUEkgbmFtZWQgbm8gcm93IChjbGVhcmVkIGJ5IHRoZSBuZXh0IGVkaXQpLiAqL1xyXG4gIHB1Ymxpc2hQcm9ibGVtID0gJyc7XHJcbiAgcHJpdmF0ZSBzdG9yZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIHByaXZhdGUgdXNlckVtYWlscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIHByaXZhdGUgc3RvcmVCeUlkID0gbmV3IE1hcDxzdHJpbmcsIFBpY2tTdG9yZT4oKTtcclxuICBwcml2YXRlIHVzZXJCeUVtYWlsID0gbmV3IE1hcDxzdHJpbmcsIFBpY2tVc2VyPigpO1xyXG4gIC8qKiBXaGVyZSB0aGUgb3BlbiBwaWNrZXIgbWVudSBzaXRzLiBJdCBpcyBmaXhlZCB0byB0aGUgdmlld3BvcnQgc28gdGhlIHRhYmxlJ3Mgc2Nyb2xsIGJveCBjYW5ub3QgY2xpcCBpdC4gKi9cclxuICBtZW51UG9zOiB7IHRvcDogbnVtYmVyIHwgbnVsbDsgYm90dG9tOiBudW1iZXIgfCBudWxsOyBsZWZ0OiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfSA9IHsgdG9wOiBudWxsLCBib3R0b206IG51bGwsIGxlZnQ6IDAsIHdpZHRoOiAwIH07XHJcbiAgLyoqIEtleWJvYXJkLWhpZ2hsaWdodGVkIG9wdGlvbiBpbiB0aGUgb3BlbiBtZW51LiAqL1xyXG4gIGFjdGl2ZUluZGV4ID0gMDtcclxuICBwcml2YXRlIG1lbnVBbmNob3I6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgLyoqIE9wdGlvbnMgYSBwaWNrZXIgbGlzdHMgYXQgb25jZTsgdHlwaW5nIG5hcnJvd3MgdGhlIHJlc3QuICovXHJcbiAgcmVhZG9ubHkgcGlja0xpbWl0ID0gMzA7XHJcbiAgLyoqIEF1ZGl0cyBvZiB0aGUgZWRpdGVkIHNjaGVkdWxlIHRoYXQgYXJlIG5vdCBpbiBgYXVkaXRzYCAoYWxyZWFkeSBzY2hlZHVsZWQgZWxzZXdoZXJlKS4gKi9cclxuICBwcml2YXRlIG93bkF1ZGl0czogU2NoZWR1bGVBdWRpdFtdID0gW107XHJcbiAgcHJpdmF0ZSBuZXh0S2V5ID0gMTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAvKiogRW1pdHMgb25jZSB0aGUgY2xpZW50J3Mgc3RvcmVzIGFuZCB1c2VycyBoYXZlIGxvYWRlZCAob3IgZmFpbGVkKTogdGhlIHRlbXBsYXRlIHdhaXRzIGZvciBpdHMgU3RvcmUgZHJvcGRvd24uICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZW9wbGVSZWFkeSQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcclxuICAvKiogRG93bmxvYWQgdGVtcGxhdGUgY2xpY2tlZCB3aGlsZSB0aGUgc3RvcmUgbGlzdCBpcyBzdGlsbCBsb2FkaW5nLiAqL1xyXG4gIHRlbXBsYXRlV2FpdGluZyA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBcIk5ldyBVc2VyIGZvdW5kXCIgKGFzIHRoZSB2MSBjaGVja2xpc3QgdXBsb2FkKTogcm93IGVtYWlscyB3aXRoIG5vIGFjdGl2ZSB1c2VyLCBvZmZlcmVkIGZvciBpbnZpdGUgYWZ0ZXIgYW5cclxuICAgKiBpbXBvcnQgb3IgZnJvbSBhIHJvdydzIG1lc3NhZ2UuIEludml0ZSBTZWxlY3RlZCBjcmVhdGVzIHRoZW0gYXMgdXNlcnMgb2YgdGhlIGNsaWVudCAoUE9TVCAvc2NoZWR1bGUvaW52aXRlKS5cclxuICAgKi9cclxuICBpbnZpdGVFbWFpbHM6IHN0cmluZ1tdID0gW107XHJcbiAgaW52aXRlUGlja2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgaW52aXRlT3BlbiA9IGZhbHNlO1xyXG4gIGludml0aW5nID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0cmF4U2VydmljZTogVHJheFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgdGhpcy5waWNrcyA9IFsuLi50aGlzLnByZXNlbGVjdF07XHJcbiAgICB0aGlzLmxvY2tlZCA9IHRoaXMubG9ja0F1ZGl0cyAmJiB0aGlzLnBpY2tzLmxlbmd0aCA+IDA7XHJcbiAgICB0aGlzLmxvYWRUZW1wbGF0ZSgpO1xyXG4gICAgY29uc3Qgc2FmZSA9IChvOiBhbnkpID0+IG8ucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSk7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIHN0b3Jlczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmdldGFzc2lnbkRyb3Bkb3duKHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIGNvdmVyYWdlOiAnc3RvcmUnLCBhc3NpZ25UeXBlOiAnc3RvcmUnIH0pKSxcclxuICAgICAgdXNlcnM6IHNhZmUodGhpcy50cmF4U2VydmljZS5nZXRDbGllbnRVc2VyKHRoaXMuY2xpZW50SWQsIHRydWUpKVxyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoeyBzdG9yZXMsIHVzZXJzIH06IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnN0b3JlcyA9IChzdG9yZXM/LmNvZGUgPT09IDIwMCA/IHN0b3Jlcy5kYXRhPy5kYXRhIHx8IFtdIDogW10pXHJcbiAgICAgICAgLm1hcCgoczogYW55KSA9PiAoeyBzdG9yZUlkOiBTdHJpbmcocy5zdG9yZUlkIHx8ICcnKSwgc3RvcmVOYW1lOiBzLnN0b3JlTmFtZSB8fCAnJywgY2l0eTogcy5jaXR5IHx8ICcnIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoKHM6IFBpY2tTdG9yZSkgPT4gcy5zdG9yZUlkKTtcclxuICAgICAgdGhpcy51c2VycyA9ICh1c2Vycz8uY29kZSA9PT0gMjAwID8gdXNlcnMuZGF0YSB8fCBbXSA6IFtdKVxyXG4gICAgICAgIC5tYXAoKHU6IGFueSkgPT4gKHsgZW1haWw6IFN0cmluZyh1LmVtYWlsIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSwgbmFtZTogdS51c2VyTmFtZSB8fCAnJyB9KSlcclxuICAgICAgICAuZmlsdGVyKCh1OiBQaWNrVXNlcikgPT4gdS5lbWFpbCk7XHJcbiAgICAgIHRoaXMuc3RvcmVJZHMgPSBuZXcgU2V0KHRoaXMuc3RvcmVzLm1hcChzID0+IHMuc3RvcmVJZCkpO1xyXG4gICAgICB0aGlzLnVzZXJFbWFpbHMgPSBuZXcgU2V0KHRoaXMudXNlcnMubWFwKHUgPT4gdS5lbWFpbCkpO1xyXG4gICAgICB0aGlzLnN0b3JlQnlJZCA9IG5ldyBNYXAodGhpcy5zdG9yZXMubWFwKHMgPT4gW3Muc3RvcmVJZCwgc10pKTtcclxuICAgICAgdGhpcy51c2VyQnlFbWFpbCA9IG5ldyBNYXAodGhpcy51c2Vycy5tYXAodSA9PiBbdS5lbWFpbCwgdV0pKTtcclxuICAgICAgLy8gUm93cyB0eXBlZCBvciBpbXBvcnRlZCBiZWZvcmUgdGhlIHN0b3JlcyBhcnJpdmVkOiBwaWNrIHRoZSBzdG9yZSB0aGVpciBuYW1lIHN0YW5kcyBmb3IuXHJcbiAgICAgIHRoaXMucm93cy5maWx0ZXIociA9PiAhci5zdG9yZUlkICYmIHIuc3RvcmVUZXh0KS5mb3JFYWNoKHIgPT4gci5zdG9yZUlkID0gdGhpcy5zdG9yZUlkRm9yKHIuc3RvcmVUZXh0KSk7XHJcbiAgICAgIHRoaXMucGVvcGxlUmVhZHkkLm5leHQoKTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLnNjaGVkdWxlSWQpIHsgdGhpcy5sb2FkU2NoZWR1bGUoKTsgfVxyXG4gICAgdGhpcy5jaGVjayQucGlwZShkZWJvdW5jZVRpbWUoNjAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ydW5MaXZlQ2hlY2soKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYW5hZ2UgbG9hZHMgaXRzIGF1ZGl0IGxpc3RzIGFmdGVyIHRoZSBlZGl0b3Igb3BlbnMgKHN0cmFpZ2h0IGZyb20gQ29uZmlndXJlLCBvbiBhIGZyZXNoXHJcbiAgICogcGFnZSk6IG9uY2UgdGhleSBhcnJpdmUsIHRoZSBwaWNrZWQgYXVkaXRzIGhhdmUgbmFtZXMgYW5kIHRoZSB0ZW1wbGF0ZSByb3dzIGNhbiBsb2FkLlxyXG4gICAqL1xyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydhdWRpdHMnXSAmJiAhY2hhbmdlc1snYXVkaXRzJ10uZmlyc3RDaGFuZ2VcclxuICAgICAgJiYgdGhpcy5vZmZlcmVkQXVkaXRzLm1hcChhID0+IGEuaWQpLmpvaW4oJywnKSAhPT0gdGhpcy50ZW1wbGF0ZUZvcikge1xyXG4gICAgICB0aGlzLmxvYWRUZW1wbGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIER1cGxpY2F0ZSBjaGVja3MgbmVlZCBldmVyeSByb3csIHNvIHRoZXkgYXJlIHdvcmtlZCBvdXQgb25jZSBwZXIgY2hlY2sgaW5zdGVhZCBvZiBwZXIgY2VsbC4gKi9cclxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLmR1cEVycm9ycyA9IHRoaXMuZmluZER1cGxpY2F0ZXMoKTtcclxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMucm93cy5tYXAociA9PiBbci5rZXksIHIuZGF0ZSwgci51c2VyRW1haWwsIHIuc3RvcmVJZCwgci5zdG9yZVRleHQsIHIuY2hlY2tMaXN0SWQsIHIuc3RhcnQsIHIuZW5kXS5qb2luKCd8JykpLmpvaW4oJ1xcbicpO1xyXG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gdGhpcy5sYXN0Q2hlY2tlZCkge1xyXG4gICAgICB0aGlzLmxhc3RDaGVja2VkID0gc2lnbmF0dXJlO1xyXG4gICAgICB0aGlzLmNoZWNrJC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIEFQSSdzIGRyeSBydW4gb2YgdGhlIHJvd3MgKGRlYm91bmNlZCk6IGtlZXBzIGxpdmVFcnJvcnMgaW4gc3RlcCB3aXRoIHdoYXQgU2F2ZSB3b3VsZCBhbnN3ZXIuICovXHJcbiAgcHJpdmF0ZSBydW5MaXZlQ2hlY2soKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZW50ID0gWy4uLnRoaXMucm93c107XHJcbiAgICBjb25zdCBjaGVja2xpc3RJZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLnRoaXMucGlja3MsIC4uLnNlbnQubWFwKHIgPT4gci5jaGVja0xpc3RJZCldLmZpbHRlcihCb29sZWFuKSkpO1xyXG4gICAgaWYgKCFzZW50Lmxlbmd0aCB8fCAhY2hlY2tsaXN0SWRzLmxlbmd0aCkgeyB0aGlzLmxpdmVFcnJvcnMgPSBuZXcgTWFwKCk7IHRoaXMubGl2ZVdhcm5pbmdzID0gbmV3IE1hcCgpOyByZXR1cm47IH1cclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRTY2hlZHVsZUNoZWNrKHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIC4uLih0aGlzLnNjaGVkdWxlSWQgPyB7IHNjaGVkdWxlSWQ6IHRoaXMuc2NoZWR1bGVJZCB9IDoge30pLFxyXG4gICAgICBjaGVja2xpc3RJZHMsXHJcbiAgICAgIHJvd3M6IHNlbnQubWFwKHIgPT4gKHtcclxuICAgICAgICBkYXRlOiByLmRhdGUsIHVzZXJFbWFpbDogci51c2VyRW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCksIHN0b3JlSWQ6IHIuc3RvcmVJZC50cmltKCksIHN0b3JlTmFtZTogci5zdG9yZVRleHQudHJpbSgpLFxyXG4gICAgICAgIGNoZWNrTGlzdElkOiByLmNoZWNrTGlzdElkIHx8ICcnLCBzdGFydDogci5zdGFydCwgZW5kOiByLmVuZFxyXG4gICAgICB9KSlcclxuICAgIH0pLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAvLyBBbiBBUEkgd2l0aG91dCB0aGUgZHJ5IHJ1biAob3IgYSBmYWlsZWQgY2FsbCkgbGVhdmVzIHRoZXNlIGNoZWNrcyB0byBTYXZlLCBhcyBiZWZvcmUuXHJcbiAgICAgIGlmIChyZXM/LmNvZGUgIT09IDIwMCkgeyByZXR1cm47IH1cclxuICAgICAgY29uc3QgbmV4dCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgICAgIChyZXMuZGF0YT8ucm93RXJyb3JzIHx8IFtdKS5mb3JFYWNoKCh4OiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCByb3cgPSBzZW50W051bWJlcih4LnJvdykgLSAxXTtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gU3RyaW5nKHgubWVzc2FnZSB8fCAnJyk7XHJcbiAgICAgICAgLy8gVGhlIGVkaXRvciBzYXlzIHRoZXNlIGl0c2VsZiAoYmVmb3JlIHRoZSBzdG9yZSAvIHVzZXIgbGlzdHMgbG9hZCB0aGUgQVBJIHdvdWxkIHNheSB0aGVtIGFib3V0IG5hbWVzKS5cclxuICAgICAgICBpZiAoIXJvdyB8fCAvXihObyBhY3RpdmV8UmVxdWlyZWR8QXVkaXQgaXMgbm90IHBhcnQpLy50ZXN0KG1lc3NhZ2UpKSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnN0IGtleSA9IHJvdy5rZXkgKyAnfCcgKyBTdHJpbmcoeC5maWVsZCk7XHJcbiAgICAgICAgaWYgKCFuZXh0LmhhcyhrZXkpKSB7IG5leHQuc2V0KGtleSwgbWVzc2FnZSk7IH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMubGl2ZUVycm9ycyA9IG5leHQ7XHJcbiAgICAgIGNvbnN0IGhpbnRzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZ1tdPigpO1xyXG4gICAgICAocmVzLmRhdGE/LnJvd1dhcm5pbmdzIHx8IFtdKS5mb3JFYWNoKCh4OiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCByb3cgPSBzZW50W051bWJlcih4LnJvdykgLSAxXTtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gU3RyaW5nKHgubWVzc2FnZSB8fCAnJyk7XHJcbiAgICAgICAgaWYgKCFyb3cgfHwgIW1lc3NhZ2UpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IGhpbnRzLmdldChyb3cua2V5KSB8fCBbXTtcclxuICAgICAgICBpZiAoIWxpc3QuaW5jbHVkZXMobWVzc2FnZSkpIHsgbGlzdC5wdXNoKG1lc3NhZ2UpOyB9XHJcbiAgICAgICAgaGludHMuc2V0KHJvdy5rZXksIGxpc3QpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5saXZlV2FybmluZ3MgPSBoaW50cztcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHByZXNzIG9yIGZvY3VzIGFueXdoZXJlIG91dHNpZGUgdGhlIG9wZW4gcGlja2VyIGNsb3NlcyBpdC4gTGlzdGVuZWQgdG8gaW4gdGhlIGNhcHR1cmVcclxuICAgKiBwaGFzZSwgc28gbm8gZWxlbWVudCB0aGF0IHN0b3BzIGNsaWNrIHByb3BhZ2F0aW9uIGNhbiBrZWVwIGEgbWVudSBvcGVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25PdXRzaWRlID0gKGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgaWYgKCF0aGlzLm9wZW5DZWxsKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC5jbG9zZXN0ID09PSAnZnVuY3Rpb24nICYmIHRhcmdldC5jbG9zZXN0KCcuc2UtcGljay5pcy1vcGVuJykpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmNsb3NlUGlja2VyKCk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9O1xyXG5cclxuICAvKiogS2VlcCB0aGUgb3BlbiBtZW51IHVuZGVyIGl0cyBjZWxsIHdoaWxlIHRoZSBwYWdlIG9yIHRoZSB0YWJsZSBzY3JvbGxzLiAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxyXG4gIG9uVmlld3BvcnRDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vcGVuQ2VsbCkgeyB0aGlzLnBsYWNlTWVudSgpOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRTY2hlZHVsZSgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZ0VkaXQgPSB0cnVlO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdFNjaGVkdWxlRGV0YWlsKHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIHNjaGVkdWxlSWQ6IHRoaXMuc2NoZWR1bGVJZCB9KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkID0gcmVzPy5jb2RlID09PSAyMDAgPyByZXMuZGF0YSA6IG51bGw7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoIWQpIHsgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDb3VsZCBub3QgbG9hZCB0aGlzIHNjaGVkdWxlJyk7IHRoaXMuY2xvc2VkLmVtaXQoZmFsc2UpOyByZXR1cm47IH1cclxuICAgICAgICAgIHRoaXMubmFtZSA9IGQuc2NoZWR1bGU/Lm5hbWUgfHwgJyc7XHJcbiAgICAgICAgICB0aGlzLnB1Ymxpc2hlZCA9ICEhZC5zY2hlZHVsZT8ucHVibGlzaDtcclxuICAgICAgICAgIGNvbnN0IGxpc3RzOiBhbnlbXSA9IGQuc2NoZWR1bGU/LmNoZWNrTGlzdHMgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnBpY2tzID0gbGlzdHMubWFwKGMgPT4gU3RyaW5nKGMuY2hlY2tMaXN0SWQpKTtcclxuICAgICAgICAgIHRoaXMubG9hZFRlbXBsYXRlKCk7XHJcbiAgICAgICAgICB0aGlzLm93bkF1ZGl0cyA9IGxpc3RzXHJcbiAgICAgICAgICAgIC5maWx0ZXIoYyA9PiAhdGhpcy5hdWRpdHMuc29tZShhID0+IGEuaWQgPT09IFN0cmluZyhjLmNoZWNrTGlzdElkKSkpXHJcbiAgICAgICAgICAgIC5tYXAoYyA9PiAoeyBpZDogU3RyaW5nKGMuY2hlY2tMaXN0SWQpLCBuYW1lOiBjLmNoZWNrTGlzdE5hbWUgfHwgJ0F1ZGl0JywgbWV0YTogJ0luIHRoaXMgc2NoZWR1bGUnLCBxdWVzdGlvbnM6IDAgfSkpO1xyXG4gICAgICAgICAgLy8gU2NoZWR1bGVzIG1hZGUgYmVmb3JlIHJvd3MgZXhpc3RlZCBsaXN0IHRoZWlyIHJhaXNlZCB2aXNpdHM7IHRoZSBzYW1lIHVzZXIsIHN0b3JlLFxyXG4gICAgICAgICAgLy8gZGF0ZSwgYXVkaXQgYW5kIHdpbmRvdyBjYW4gYXBwZWFyIG1vcmUgdGhhbiBvbmNlIHRoZXJlLCBzbyBrZWVwIG9uZSByb3cgcGVyIGNvbWJpbmF0aW9uXHJcbiAgICAgICAgICAvLyAodGhlIHNhbWUgdXNlciBhbmQgc3RvcmUgYXQgYW5vdGhlciB0aW1lIGlzIGEgcm93IG9mIGl0cyBvd24pLlxyXG4gICAgICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgICAgICAgdGhpcy5yb3dzID0gKGQucm93cyB8fCBbXSkuZmlsdGVyKChyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gW3IuZGF0ZSwgU3RyaW5nKHIudXNlckVtYWlsIHx8ICcnKS50b0xvd2VyQ2FzZSgpLCByLnN0b3JlSWQsIHIuY2hlY2tMaXN0SWQsIHIuc3RhcnQgfHwgJycsIHIuZW5kIHx8ICcnXS5qb2luKCd8Jyk7XHJcbiAgICAgICAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgICAgICAgICBzZWVuLmFkZChrZXkpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH0pLm1hcCgocjogYW55KSA9PiB0aGlzLnJvdyh7XHJcbiAgICAgICAgICAgIGRhdGU6IHIuZGF0ZSB8fCAnJywgdXNlckVtYWlsOiBTdHJpbmcoci51c2VyRW1haWwgfHwgJycpLnRvTG93ZXJDYXNlKCksIHN0b3JlSWQ6IHIuc3RvcmVJZCB8fCAnJyxcclxuICAgICAgICAgICAgc3RvcmVUZXh0OiByLnN0b3JlTmFtZSB8fCB0aGlzLnN0b3JlTGFiZWwoci5zdG9yZUlkKSB8fCByLnN0b3JlSWQgfHwgJycsXHJcbiAgICAgICAgICAgIGNoZWNrTGlzdElkOiByLmNoZWNrTGlzdElkID8gU3RyaW5nKHIuY2hlY2tMaXN0SWQpIDogJycsIHN0YXJ0OiByLnN0YXJ0IHx8ICcnLCBlbmQ6IHIuZW5kIHx8ICcnXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICB0aGlzLnJlZ3JvdXAoKTtcclxuICAgICAgICAgIHRoaXMucmFpc2VkS2V5cyA9IG5ldyBTZXQodGhpcy5wdWJsaXNoZWQgPyB0aGlzLnJvd3MubWFwKHIgPT4gdGhpcy52aXNpdEtleShyKSkgOiBbXSk7XHJcbiAgICAgICAgICAvLyBBIHB1Ymxpc2hlZCBzY2hlZHVsZSdzIHJvd3MgZGF0ZWQgYmVmb3JlIHRvZGF5IGFyZSB2aXNpdHMgYWxyZWFkeSByYWlzZWQ6IHJlYWQtb25seSAoUUEgMTEgT2N0KS5cclxuICAgICAgICAgIHRoaXMubG9ja2VkS2V5cyA9IG5ldyBTZXQodGhpcy5wdWJsaXNoZWQgPyB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5kYXRlICYmIHIuZGF0ZSA8IHRoaXMudG9kYXkpLm1hcChyID0+IHIua2V5KSA6IFtdKTtcclxuICAgICAgICAgIHRoaXMuc3RlcCA9ICdyb3dzJztcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5sb2FkaW5nRWRpdCA9IGZhbHNlOyB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBsb2FkIHRoaXMgc2NoZWR1bGUnKTsgdGhpcy5jbG9zZWQuZW1pdChmYWxzZSk7IH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIGNyZWF0ZSBzdGVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgZ2V0IGFsbEF1ZGl0cygpOiBTY2hlZHVsZUF1ZGl0W10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLm93bkF1ZGl0cywgLi4udGhpcy5hdWRpdHNdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBpY2thYmxlcygpOiBTY2hlZHVsZUF1ZGl0W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGlja1F1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsQXVkaXRzLmZpbHRlcihhID0+ICFxIHx8IChhLm5hbWUgKyAnICcgKyBhLm1ldGEpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBmaXhlZCBhdWRpdHMnIG5hbWVzLCBmb3IgdGhlIGxpbmUgdGhhdCByZXBsYWNlcyB0aGUgcGlja2VyIHdoZW4gdGhlIGF1ZGl0cyBhcmUgbG9ja2VkLiAqL1xyXG4gIGdldCBsb2NrZWRBdWRpdE5hbWVzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5waWNrZWRBdWRpdHMubWFwKGEgPT4gYS5uYW1lKS5qb2luKCcsICcpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBpY2tDb3VudCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja3MubGVuZ3RoID8gdGhpcy5waWNrcy5sZW5ndGggKyAnIHNlbGVjdGVkJyA6ICdOb25lIHNlbGVjdGVkJztcclxuICB9XHJcblxyXG4gIGdldCBhbGxQaWNrZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5waWNrYWJsZXM7XHJcbiAgICByZXR1cm4gbGlzdC5sZW5ndGggPiAwICYmIGxpc3QuZXZlcnkoYSA9PiB0aGlzLnBpY2tzLmluY2x1ZGVzKGEuaWQpKTtcclxuICB9XHJcblxyXG4gIGdldCBhbGxMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja1F1ZXJ5LnRyaW0oKSA/ICdTZWxlY3QgYWxsIG1hdGNoZXMnIDogJ1NlbGVjdCBhbGwgYXVkaXRzJztcclxuICB9XHJcblxyXG4gIGdldCByZWFkeSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMubmFtZS50cmltKCkgJiYgKHRoaXMucGlja3MubGVuZ3RoID4gMCB8fCB0aGlzLm9wZW5BdWRpdHMpO1xyXG4gIH1cclxuXHJcbiAgaXNQaWNrZWQoYTogU2NoZWR1bGVBdWRpdCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja3MuaW5jbHVkZXMoYS5pZCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQaWNrKGE6IFNjaGVkdWxlQXVkaXQpOiB2b2lkIHtcclxuICAgIHRoaXMucGlja3MgPSB0aGlzLmlzUGlja2VkKGEpID8gdGhpcy5waWNrcy5maWx0ZXIoaWQgPT4gaWQgIT09IGEuaWQpIDogWy4uLnRoaXMucGlja3MsIGEuaWRdO1xyXG4gICAgdGhpcy5sb2FkVGVtcGxhdGUoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUFsbFBpY2tzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWRzID0gdGhpcy5waWNrYWJsZXMubWFwKGEgPT4gYS5pZCk7XHJcbiAgICB0aGlzLnBpY2tzID0gdGhpcy5hbGxQaWNrZWRcclxuICAgICAgPyB0aGlzLnBpY2tzLmZpbHRlcihpZCA9PiAhaWRzLmluY2x1ZGVzKGlkKSlcclxuICAgICAgOiBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLnRoaXMucGlja3MsIC4uLmlkc10pKTtcclxuICAgIHRoaXMubG9hZFRlbXBsYXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaHkgSW1wb3J0IGZyb20gQ1NWIC8gQWRkIGEgc2luZ2xlIHJvdyBhcmUgb2ZmOyBzaG93biBhcyB0aGVpciB0b29sdGlwLiBUaGUgYnV0dG9ucyBhcmUgbm90XHJcbiAgICogW2Rpc2FibGVkXSAoYSBkaXNhYmxlZCBidXR0b24gc2hvd3Mgbm8gdG9vbHRpcCksIHNvIHRoZWlyIGhhbmRsZXJzIGlnbm9yZSBjbGlja3MgdW50aWwgcmVhZHkuXHJcbiAgICovXHJcbiAgZ2V0IG5vdFJlYWR5UmVhc29uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMubmFtZS50cmltKCkpIHsgcmV0dXJuICdFbnRlciBhIHNjaGVkdWxlIG5hbWUgZmlyc3QnOyB9XHJcbiAgICByZXR1cm4gdGhpcy5waWNrcy5sZW5ndGggfHwgdGhpcy5vcGVuQXVkaXRzID8gJycgOiAnUGljayBhdCBsZWFzdCBvbmUgYXVkaXQgZmlyc3QnO1xyXG4gIH1cclxuXHJcbiAgYWRkU2luZ2xlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlYWR5KSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5yb3dzID0gWy4uLnRoaXMucm93cywgdGhpcy5yb3coKV07XHJcbiAgICB0aGlzLnN0ZXAgPSAncm93cyc7XHJcbiAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnUm93IGFkZGVkIOKAlCBmaWxsIGluIHVzZXIsIHN0b3JlIGFuZCBkYXRlJyk7XHJcbiAgfVxyXG5cclxuICBpbXBvcnRDc3YoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucmVhZHkpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmNzdklucHV0Py5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBvbkNzdlBpY2tlZChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcclxuICAgIGlucHV0LnZhbHVlID0gJyc7XHJcbiAgICBpZiAoIWZpbGUpIHsgcmV0dXJuOyB9XHJcbiAgICAvLyBUaGUgZG93bmxvYWRlZCB0ZW1wbGF0ZSBpcyB4bHN4IChzdG9yZSBhbmQgYXVkaXQgZHJvcGRvd25zKTsgYSBDU1Ygc3RpbGwgaW1wb3J0cy5cclxuICAgIGNvbnN0IGlzRXhjZWwgPSAvLnhsc3g/JC9pLnRlc3QoZmlsZS5uYW1lKTtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICBsZXQgdGFibGU6IHN0cmluZ1tdW107XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGFibGUgPSBpc0V4Y2VsID8gc2hlZXRUYWJsZShyZWFkZXIucmVzdWx0IGFzIEFycmF5QnVmZmVyKSA6IHBhcnNlQ3N2KFN0cmluZyhyZWFkZXIucmVzdWx0IHx8ICcnKSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCByZWFkICcgKyBmaWxlLm5hbWUgKyAnLiBVc2UgdGhlIGRvd25sb2FkZWQgdGVtcGxhdGUgKC54bHN4KSBvciBhIENTVi4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYWRkZWQgPSB0aGlzLnJvd3NGcm9tVGFibGUodGFibGUpO1xyXG4gICAgICBpZiAoIWFkZGVkLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gcm93cyBmb3VuZC4gVXNlIHRoZSB0ZW1wbGF0ZTogRGF0ZSwgVXNlciBlbWFpbCwgU3RvcmUgbmFtZSwgQXVkaXQsIFZpc2l0IHN0YXJ0LCBWaXNpdCBlbmQnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yb3dzID0gWy4uLnRoaXMucm93cywgLi4uYWRkZWRdO1xyXG4gICAgICB0aGlzLnJlZ3JvdXAoKTtcclxuICAgICAgdGhpcy5wdWJsaXNoUHJvYmxlbSA9ICcnO1xyXG4gICAgICB0aGlzLnN0ZXAgPSAncm93cyc7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KGFkZGVkLmxlbmd0aCArIChhZGRlZC5sZW5ndGggPT09IDEgPyAnIHJvdyBpbXBvcnRlZCcgOiAnIHJvd3MgaW1wb3J0ZWQnKSArICcgZnJvbSAnICsgZmlsZS5uYW1lKTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIC8vIEFzIHRoZSB2MSBjaGVja2xpc3QgdXBsb2FkOiBlbWFpbHMgaW4gdGhlIGZpbGUgd2l0aCBubyB1c2VyIHlldCBhcmUgb2ZmZXJlZCBmb3IgaW52aXRlIChvbmNlIHVzZXJzIGhhdmUgbG9hZGVkKS5cclxuICAgICAgdGhpcy5wZW9wbGVSZWFkeSQucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZnJlc2ggPSB0aGlzLm5ld1VzZXJFbWFpbHMoYWRkZWQpO1xyXG4gICAgICAgIGlmIChmcmVzaC5sZW5ndGgpIHsgdGhpcy5vcGVuSW52aXRlKGZyZXNoKTsgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICBpZiAoaXNFeGNlbCkgeyByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7IH0gZWxzZSB7IHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpOyB9XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIGludml0ZSBuZXcgdXNlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogV2VsbC1mb3JtZWQgZW1haWxzIG9mIHRoZXNlIHJvd3MgdGhhdCBhcmUgbm8gYWN0aXZlIHVzZXIgb2YgdGhlIGNsaWVudCAob25jZSB0aGUgdXNlcnMgaGF2ZSBsb2FkZWQpLiAqL1xyXG4gIG5ld1VzZXJFbWFpbHMocm93czogRWRpdG9yUm93W10gPSB0aGlzLnJvd3MpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIXRoaXMudXNlcnMubGVuZ3RoKSB7IHJldHVybiBbXTsgfVxyXG4gICAgY29uc3QgZW1haWxzID0gcm93cy5tYXAociA9PiByLnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKSkuZmlsdGVyKGUgPT4gRU1BSUwudGVzdChlKSAmJiAhdGhpcy51c2VyRW1haWxzLmhhcyhlKSk7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGVtYWlscykpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSByb3cncyB2aXNpdCBoYXMgYW4gZW1haWwgdGhhdCBjb3VsZCBiZSBpbnZpdGVkIChzaG93biBhcyBJbnZpdGUgdXNlciB1bmRlciB0aGUgcm93KS4gKi9cclxuICBpbnZpdGVhYmxlKHJvdzogRWRpdG9yUm93KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5uZXdVc2VyRW1haWxzKHRoaXMuZ3JvdXBSb3dzKHJvdykpLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBvcGVuSW52aXRlKGVtYWlsczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGlmICghZW1haWxzLmxlbmd0aCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuY2xvc2VQaWNrZXIoKTtcclxuICAgIHRoaXMuaW52aXRlRW1haWxzID0gZW1haWxzO1xyXG4gICAgdGhpcy5pbnZpdGVQaWNrZWQgPSBuZXcgU2V0KGVtYWlscyk7XHJcbiAgICB0aGlzLmludml0ZU9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBjbG9zZUludml0ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmludml0aW5nKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5pbnZpdGVPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVJbnZpdGUoZW1haWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaW52aXRlUGlja2VkLmhhcyhlbWFpbCkpIHsgdGhpcy5pbnZpdGVQaWNrZWQuZGVsZXRlKGVtYWlsKTsgfSBlbHNlIHsgdGhpcy5pbnZpdGVQaWNrZWQuYWRkKGVtYWlsKTsgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGFsbEludml0ZVBpY2tlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmludml0ZUVtYWlscy5sZW5ndGggPiAwICYmIHRoaXMuaW52aXRlRW1haWxzLmV2ZXJ5KGUgPT4gdGhpcy5pbnZpdGVQaWNrZWQuaGFzKGUpKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUFsbEludml0ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW52aXRlUGlja2VkID0gdGhpcy5hbGxJbnZpdGVQaWNrZWQgPyBuZXcgU2V0KCkgOiBuZXcgU2V0KHRoaXMuaW52aXRlRW1haWxzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludml0ZSBTZWxlY3RlZDogdGhlIEFQSSBjcmVhdGVzIGVhY2ggcGlja2VkIGVtYWlsIGFzIGEgdXNlciBvZiB0aGUgY2xpZW50IChyb2xlIHVzZXIsIGFzIHYxIGRvZXMpLCBuYW1lZCBieSB0aGVcclxuICAgKiBwYXJ0IGJlZm9yZSB0aGUgQC4gSW52aXRlZCBlbWFpbHMgam9pbiB0aGUgdXNlciBsaXN0LCBzbyB0aGVpciByb3dzIHBhc3M7IHRoZSByZXN0IGFyZSBuYW1lZCBpbiBhIHRvYXN0LlxyXG4gICAqL1xyXG4gIGludml0ZVNlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZW1haWxzID0gdGhpcy5pbnZpdGVFbWFpbHMuZmlsdGVyKGUgPT4gdGhpcy5pbnZpdGVQaWNrZWQuaGFzKGUpKTtcclxuICAgIGlmICghZW1haWxzLmxlbmd0aCB8fCB0aGlzLmludml0aW5nKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5pbnZpdGluZyA9IHRydWU7XHJcbiAgICBjb25zdCB1c2VycyA9IGVtYWlscy5tYXAoZW1haWwgPT4gKHsgZW1haWwsIHVzZXJOYW1lOiBlbWFpbC5zcGxpdCgnQCcpWzBdIH0pKTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRTY2hlZHVsZUludml0ZSh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkLCB1c2VycyB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbnZpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgIT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDb3VsZCBub3QgaW52aXRlIHRoZSB1c2VycyDigJQgdHJ5IGFnYWluJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGludml0ZWQ6IEFycmF5PHsgZW1haWw6IHN0cmluZzsgdXNlck5hbWU6IHN0cmluZyB9PiA9IHJlcy5kYXRhPy5pbnZpdGVkIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IHNraXBwZWQ6IEFycmF5PHsgZW1haWw6IHN0cmluZzsgcmVhc29uOiBzdHJpbmcgfT4gPSByZXMuZGF0YT8uc2tpcHBlZCB8fCBbXTtcclxuICAgICAgICAvLyBBbHJlYWR5IGFjdGl2ZSBoZXJlIChlLmcuIGFkZGVkIGluIE1hbmFnZSA+IFVzZXJzIG1lYW53aGlsZSkgY291bnRzIGFzIHVzYWJsZSB0b28uXHJcbiAgICAgICAgY29uc3QgdXNhYmxlID0gW1xyXG4gICAgICAgICAgLi4uaW52aXRlZC5tYXAodSA9PiAoeyBlbWFpbDogdS5lbWFpbCwgbmFtZTogdS51c2VyTmFtZSB8fCAnJyB9KSksXHJcbiAgICAgICAgICAuLi5za2lwcGVkLmZpbHRlcihzID0+IHMucmVhc29uID09PSAnYWN0aXZlJykubWFwKHMgPT4gKHsgZW1haWw6IHMuZW1haWwsIG5hbWU6ICcnIH0pKVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdXNhYmxlLmZvckVhY2godSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy51c2VyRW1haWxzLmhhcyh1LmVtYWlsKSkgeyByZXR1cm47IH1cclxuICAgICAgICAgIHRoaXMudXNlcnMgPSBbLi4udGhpcy51c2VycywgdV07XHJcbiAgICAgICAgICB0aGlzLnVzZXJFbWFpbHMuYWRkKHUuZW1haWwpO1xyXG4gICAgICAgICAgdGhpcy51c2VyQnlFbWFpbC5zZXQodS5lbWFpbCwgdSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGludml0ZWQubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChpbnZpdGVkLmxlbmd0aCArIChpbnZpdGVkLmxlbmd0aCA9PT0gMSA/ICcgdXNlciBpbnZpdGVkJyA6ICcgdXNlcnMgaW52aXRlZCcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHNraXBwZWQuZmlsdGVyKHMgPT4gcy5yZWFzb24gIT09ICdhY3RpdmUnKTtcclxuICAgICAgICBpZiAoYmxvY2tlZC5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChibG9ja2VkLm1hcChzID0+IHMuZW1haWwgKyAnIOKAlCAnICsgKElOVklURV9SRUFTT05TW3MucmVhc29uXSB8fCBzLnJlYXNvbikpLmpvaW4oJzsgJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBXaGF0IGEgcmVmdXNlZCBwdWJsaXNoIHNhaWQgYWJvdXQgdGhlc2UgdXNlcnMgaXMgb3V0IG9mIGRhdGUgbm93LlxyXG4gICAgICAgIHRoaXMucm93cy5maWx0ZXIociA9PiB0aGlzLnVzZXJFbWFpbHMuaGFzKHIudXNlckVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSkuZm9yRWFjaChyID0+IHRoaXMuc2VydmVyRXJyb3JzLmRlbGV0ZShyLmtleSArICd8dXNlckVtYWlsJykpO1xyXG4gICAgICAgIHRoaXMuaW52aXRlT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucHVibGlzaFByb2JsZW0gPSAnJztcclxuICAgICAgICB0aGlzLmNoZWNrJC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbnZpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQ291bGQgbm90IGludml0ZSB0aGUgdXNlcnMg4oCUIHRyeSBhZ2FpbicpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkcyB0aGUgdGVtcGxhdGUgcm93cyBmb3IgdGhlIHBpY2tlZCBhdWRpdHMgZnJvbSB0aGVpciBhc3NpZ25tZW50czogb25lIHJvdyBwZXIgYXNzaWduZWRcclxuICAgKiBzdG9yZSAob3IgdXNlciwgZm9yIHVzZXItY292ZXJhZ2UgYXVkaXRzKSB3aXRoIGl0cyB1c2VyIGVtYWlsLCBkYXRlZCB0b21vcnJvdy4gQW4gYXVkaXQgd2l0aCBub1xyXG4gICAqIHNpbmdsZSBzdG9yZSAvIHVzZXIgYXNzaWduZWQgeWV0IGdldHMgb25lIHJvdyB3aXRoIG9ubHkgaXRzIEF1ZGl0IGNlbGwgZmlsbGVkIChza2lwcGVkIG9uIGltcG9ydFxyXG4gICAqIGlmIGxlZnQgdGhhdCB3YXkpLiBSZWJ1aWx0IHdoZW5ldmVyIHRoZSBwaWNrcyBjaGFuZ2UuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkVGVtcGxhdGUob25SZWFkeT86ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGF1ZGl0cyA9IHRoaXMub2ZmZXJlZEF1ZGl0cztcclxuICAgIGNvbnN0IGtleSA9IGF1ZGl0cy5tYXAoYSA9PiBhLmlkKS5qb2luKCcsJyk7XHJcbiAgICBpZiAoIWF1ZGl0cy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy50ZW1wbGF0ZUZvciA9IGtleTtcclxuICAgICAgdGhpcy50ZW1wbGF0ZUxpbmVzID0gW107XHJcbiAgICAgIG9uUmVhZHk/LigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoa2V5ID09PSB0aGlzLnRlbXBsYXRlRm9yICYmICF0aGlzLnRlbXBsYXRlTG9hZGluZykgeyBvblJlYWR5Py4oKTsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnRlbXBsYXRlRm9yID0ga2V5O1xyXG4gICAgdGhpcy50ZW1wbGF0ZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgLy8gVGhlIEFQSSB0YWtlcyB1cCB0byA1MCBhdWRpdHMgYSBjYWxsOyB3aXRoIGV2ZXJ5IGF1ZGl0IG9uIG9mZmVyIHRoZXJlIGNhbiBiZSBtb3JlLlxyXG4gICAgY29uc3QgaWRzID0gYXVkaXRzLm1hcChhID0+IGEuaWQpO1xyXG4gICAgY29uc3QgY2h1bmtzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTWF0aC5jZWlsKGlkcy5sZW5ndGggLyA1MCkgfSwgKF8sIGkpID0+IGlkcy5zbGljZShpICogNTAsIGkgKiA1MCArIDUwKSk7XHJcbiAgICBmb3JrSm9pbihjaHVua3MubWFwKGNoZWNrbGlzdElkcyA9PiB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U2NoZWR1bGVUZW1wbGF0ZSh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkLCBjaGVja2xpc3RJZHMgfSlcclxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpKSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzdWx0czogYW55W10pID0+IHtcclxuICAgICAgaWYgKGtleSAhPT0gdGhpcy50ZW1wbGF0ZUZvcikgeyByZXR1cm47IH1cclxuICAgICAgdGhpcy50ZW1wbGF0ZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgY29uc3Qgb2sgPSByZXN1bHRzLmV2ZXJ5KHJlcyA9PiByZXM/LmNvZGUgPT09IDIwMCk7XHJcbiAgICAgIGlmICghb2spIHtcclxuICAgICAgICAvLyBUcnkgYWdhaW4gb24gdGhlIG5leHQgcGljayBjaGFuZ2UgLyBkb3dubG9hZC5cclxuICAgICAgICB0aGlzLnRlbXBsYXRlRm9yID0gJyc7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDb3VsZCBub3QgbG9hZCB0aGUgYXNzaWduZWQgc3RvcmVzIOKAlCB0aGUgdGVtcGxhdGUgbGlzdHMgdGhlIGF1ZGl0cyBvbmx5Jyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gY29uY2F0IGluc3RlYWQgb2YgZmxhdE1hcDogdGhlIGxpYnJhcnkgdGFyZ2V0cyBhIGxpYiB3aXRob3V0IEFycmF5I2ZsYXRNYXAuXHJcbiAgICAgIGNvbnN0IHJvd3M6IGFueVtdID0gb2sgPyAoW10gYXMgYW55W10pLmNvbmNhdCguLi5yZXN1bHRzLm1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhPy5yb3dzIHx8IFtdKSkgOiBbXTtcclxuICAgICAgKG9rID8gKFtdIGFzIGFueVtdKS5jb25jYXQoLi4ucmVzdWx0cy5tYXAoKHJlczogYW55KSA9PiByZXMuZGF0YT8uYXVkaXRzIHx8IFtdKSkgOiBbXSkuZm9yRWFjaCgoYTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGE/LmNoZWNrTGlzdElkICYmIGEuc3RhcnQgJiYgYS5lbmQpIHsgdGhpcy5hdWRpdFdpbmRvd3Muc2V0KFN0cmluZyhhLmNoZWNrTGlzdElkKSwgeyBzdGFydDogYS5zdGFydCwgZW5kOiBhLmVuZCB9KTsgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgZGF0ZSA9IGRheWpzKCkuYWRkKDEsICdkYXknKS5mb3JtYXQoJ0RELU1NLVlZWVknKTtcclxuICAgICAgdGhpcy50ZW1wbGF0ZUxpbmVzID0gYXVkaXRzLnJlZHVjZSgob3V0OiBzdHJpbmdbXVtdLCBhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWluZSA9IHJvd3MuZmlsdGVyKHIgPT4gU3RyaW5nKHIuY2hlY2tMaXN0SWQpID09PSBhLmlkKTtcclxuICAgICAgICAvLyBTdG9yZXMgYnkgbmFtZTogdGhlIHN0b3JlIGNvZGUgaXMgbm90IHNob3duIG9yIGFza2VkIGZvciBhbnl3aGVyZSBpbiB0aGUgZWRpdG9yLlxyXG4gICAgICAgIC8vIFZpc2l0IHN0YXJ0IC8gZW5kIHN0YXkgYmxhbms6IHRoZSB3aW5kb3cgaXMgb3B0aW9uYWwsIGFuZCBibGFuayBtZWFucyB0aGUgc3RvcmUncyBvcGVuIC0gY2xvc2UgdGltZS5cclxuICAgICAgICByZXR1cm4gb3V0LmNvbmNhdChtaW5lLmxlbmd0aFxyXG4gICAgICAgICAgPyBtaW5lLm1hcChyID0+IFtkYXRlLCByLnVzZXJFbWFpbCB8fCAnJywgci5zdG9yZU5hbWUgfHwgdGhpcy5zdG9yZUxhYmVsKHIuc3RvcmVJZCkgfHwgci5zdG9yZUlkIHx8ICcnLCBhLm5hbWUsICcnLCAnJ10pXHJcbiAgICAgICAgICA6IFtbJycsICcnLCAnJywgYS5uYW1lLCAnJywgJyddXSk7XHJcbiAgICAgIH0sIFtdKTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIG9uUmVhZHk/LigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNhbXBsZSBwYW5lbDogdGhlIGZpcnN0IHRlbXBsYXRlIHJvd3MsIGV4YWN0bHkgYXMgdGhleSB3aWxsIGJlIGluIHRoZSBmaWxlLiAqL1xyXG4gIGdldCBwcmV2aWV3Um93cygpOiB7IGRhdGU6IHN0cmluZzsgZW1haWw6IHN0cmluZzsgc3RvcmU6IHN0cmluZzsgYXVkaXQ6IHN0cmluZyB9W10ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVMaW5lcy5zbGljZSgwLCB0aGlzLnByZXZpZXdMaW1pdClcclxuICAgICAgLm1hcChsID0+ICh7IGRhdGU6IGxbMF0gfHwgJ+KAlCcsIGVtYWlsOiBsWzFdIHx8ICfigJQnLCBzdG9yZTogbFsyXSB8fCAn4oCUJywgYXVkaXQ6IGxbM10gfHwgJ+KAlCcgfSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByZXZpZXdNb3JlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy50ZW1wbGF0ZUxpbmVzLmxlbmd0aCAtIHRoaXMucHJldmlld0xpbWl0KTtcclxuICB9XHJcblxyXG4gIC8qKiBQaWNrZWQgYXVkaXRzIHRoYXQgaGF2ZSBubyBzaW5nbGUgc3RvcmUgLyB1c2VyIGFzc2lnbmVkIHlldCAodGhlaXIgcm93IGhvbGRzIG9ubHkgdGhlIGF1ZGl0IG5hbWUpLiAqL1xyXG4gIGdldCB1bmFzc2lnbmVkQXVkaXRzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlTGluZXMuZmlsdGVyKGwgPT4gIWxbMV0gJiYgIWxbMl0pLm1hcChsID0+IGxbM10pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWQgdGVtcGxhdGUuIEEgYmxhbmsgQ3JlYXRlIHNjaGVkdWxlIChldmVyeSBhdWRpdCBvbiBvZmZlciwgbm9uZSBwaWNrZWQpIGdldHMgYW4gZW1wdHkgc2hlZXQ6IGhlYWRlcnMgb25seSxcclxuICAgKiB3aXRoIHRoZSBTdG9yZSBuYW1lIGFuZCBBdWRpdCBkcm9wZG93bnMgb24gZXZlcnkgcm93IChRQSAxMCBPY3Q6IGl0IGxpc3RlZCBldmVyeSBhdWRpdCdzIGFzc2lnbm1lbnRzKS4gV2l0aCBhdWRpdHNcclxuICAgKiBwaWNrZWQsIHRoZSByb3dzIHRoZSBzYW1wbGUgcGFuZWwgc2hvd3M6IHRob3NlIGF1ZGl0cycgYXNzaWduZWQgc3RvcmVzIC8gdXNlcnMgKGZldGNoZWQgZmlyc3QgaWYgdGhlIHBpY2tzIGNoYW5nZWQpLlxyXG4gICAqL1xyXG4gIGRvd25sb2FkVGVtcGxhdGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYgKHRoaXMudGVtcGxhdGVMb2FkaW5nIHx8IHRoaXMudGVtcGxhdGVXYWl0aW5nKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgaGVhZCA9IFsnRGF0ZScsICdVc2VyIGVtYWlsJywgJ1N0b3JlIG5hbWUnLCAnQXVkaXQnLCAnVmlzaXQgc3RhcnQnLCAnVmlzaXQgZW5kJ107XHJcbiAgICBpZiAodGhpcy5vcGVuQXVkaXRzKSB7XHJcbiAgICAgIHRoaXMuZG93bmxvYWRYbHN4KCdzY2hlZHVsZS10ZW1wbGF0ZS54bHN4JywgW2hlYWQsIFRFTVBMQVRFX0hJTlRTXSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubG9hZFRlbXBsYXRlKCgpID0+IHtcclxuICAgICAgLy8gQSByb3cgYnVpbHQgYmVmb3JlIHRoZSBzdG9yZSBsaXN0IGFycml2ZWQgbWF5IGhvbGQgYSBzdG9yZSBpZDsgd3JpdGUgaXRzIG5hbWUgbm93LiBSb3dzIHRoYXQgd291bGQgaG9sZCBvbmx5XHJcbiAgICAgIC8vIGFuIGF1ZGl0IG5hbWUgYXJlIGxlZnQgb3V0OiB0aGUgQXVkaXQgY29sdW1uIGlzIGEgZHJvcGRvd24sIHNvIGFueSBhdWRpdCBjYW4gYmUgcGlja2VkIG9uIGFuIGVtcHR5IHJvdy5cclxuICAgICAgY29uc3QgbGluZXMgPSB0aGlzLnRlbXBsYXRlTGluZXMuZmlsdGVyKGwgPT4gbFsxXSB8fCBsWzJdKS5tYXAobCA9PiBbbFswXSwgbFsxXSwgdGhpcy5zdG9yZUxhYmVsKGxbMl0pIHx8IGxbMl0sIC4uLmwuc2xpY2UoMyldKTtcclxuICAgICAgdGhpcy5kb3dubG9hZFhsc3goJ3NjaGVkdWxlLXRlbXBsYXRlLnhsc3gnLCBbaGVhZCwgVEVNUExBVEVfSElOVFMsIC4uLmxpbmVzXSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gcm93cyBzdGVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHByaXZhdGUgcm93KGluaXQ6IFBhcnRpYWw8RWRpdG9yUm93PiA9IHt9KTogRWRpdG9yUm93IHtcclxuICAgIGNvbnN0IG9ubHlBdWRpdCA9IHRoaXMucGlja3MubGVuZ3RoID09PSAxID8gdGhpcy5waWNrc1swXSA6ICcnO1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5uZXh0S2V5Kys7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBrZXksIGRhdGU6ICcnLCB1c2VyRW1haWw6ICcnLCBzdG9yZUlkOiAnJywgc3RvcmVUZXh0OiAnJywgY2hlY2tMaXN0SWQ6IG9ubHlBdWRpdCwgc3RhcnQ6ICcnLCBlbmQ6ICcnLCBzZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgIGdyb3VwOiBrZXksXHJcbiAgICAgIC4uLmluaXRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogU2FtZSB2aXNpdCBleGNlcHQgdGhlIGF1ZGl0OiBkYXRlLCB1c2VyLCBzdG9yZSBhbmQgd2luZG93IChhbGwgb2YgZGF0ZSwgdXNlciBhbmQgc3RvcmUgZ2l2ZW4pLiAqL1xyXG4gIHByaXZhdGUgdmlzaXRHcm91cEtleShyOiBFZGl0b3JSb3cpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFyLmRhdGUgfHwgIXIudXNlckVtYWlsLnRyaW0oKSB8fCAhKHIuc3RvcmVJZC50cmltKCkgfHwgci5zdG9yZVRleHQudHJpbSgpKSkgeyByZXR1cm4gJyc7IH1cclxuICAgIHJldHVybiBbci5kYXRlLCByLnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKSwgci5zdG9yZUlkLnRyaW0oKSB8fCByLnN0b3JlVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKSwgci5zdGFydCB8fCAnJywgci5lbmQgfHwgJyddLmpvaW4oJ3wnKTtcclxuICB9XHJcblxyXG4gIC8qKiBMb2FkZWQgLyBpbXBvcnRlZCByb3dzIG9mIG9uZSB2aXNpdCBqb2luIG9uZSBncm91cCAodGhlIGZpcnN0IHN1Y2ggcm93J3MpLCBzbyB0aGV5IHNob3cgYXMgb25lIHJvdy4gKi9cclxuICBwcml2YXRlIHJlZ3JvdXAoKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaXJzdCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XHJcbiAgICAvLyBBdWRpdHMgYWxyZWFkeSBpbiBlYWNoIGdyb3VwOiBhIHJlcGVhdGVkIGF1ZGl0IHN0YXlzIGl0cyBvd24gKHJlZCkgcm93IGluc3RlYWQgb2YgaGlkaW5nIGluIHRoZSBncm91cC5cclxuICAgIGNvbnN0IGF1ZGl0cyA9IG5ldyBNYXA8bnVtYmVyLCBTZXQ8c3RyaW5nPj4oKTtcclxuICAgIHRoaXMucm93cy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICBjb25zdCBrID0gdGhpcy52aXNpdEdyb3VwS2V5KHIpO1xyXG4gICAgICBpZiAoIWspIHsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IGcgPSBmaXJzdC5nZXQoayk7XHJcbiAgICAgIGlmIChnICE9PSB1bmRlZmluZWQgJiYgIShyLmNoZWNrTGlzdElkICYmIGF1ZGl0cy5nZXQoZyk/LmhhcyhyLmNoZWNrTGlzdElkKSkpIHsgci5ncm91cCA9IGc7IH1cclxuICAgICAgZWxzZSBpZiAoZyA9PT0gdW5kZWZpbmVkKSB7IGZpcnN0LnNldChrLCByLmdyb3VwKTsgfVxyXG4gICAgICBjb25zdCBzZXQgPSBhdWRpdHMuZ2V0KHIuZ3JvdXApIHx8IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gICAgICBpZiAoci5jaGVja0xpc3RJZCkgeyBzZXQuYWRkKHIuY2hlY2tMaXN0SWQpOyB9XHJcbiAgICAgIGF1ZGl0cy5zZXQoci5ncm91cCwgc2V0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWZ0ZXIgYSBwaWNrZWQgdXNlciAvIHN0b3JlIG9yIGEgY2hhbmdlZCBkYXRlIC8gd2luZG93OiBhIHJvdyB0aGF0IG5vdyBpcyB0aGUgc2FtZSB2aXNpdCBhcyBhbm90aGVyIHJvdyBqb2luc1xyXG4gICAqIHRoYXQgcm93IChRQSAxMCBPY3Q6IG9uZSByZWNvcmQgcGVyIHZpc2l0LCBpdHMgYXVkaXRzIGluIHRoZSBkcm9wZG93biksIGFzIGxvYWRlZCBhbmQgaW1wb3J0ZWQgcm93cyBkby4gT25seSBvblxyXG4gICAqIHRob3NlIGZpbmlzaGVkIGNob2ljZXMsIG5ldmVyIHdoaWxlIHR5cGluZywgc28gYSBjZWxsIGJlaW5nIHR5cGVkIGluIG5ldmVyIGRpc2FwcGVhcnMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZXJnZVZpc2l0KHJvdzogRWRpdG9yUm93KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLnZpc2l0R3JvdXBLZXkocm93KTtcclxuICAgIGlmICgha2V5KSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yb3dzLmZpbmQociA9PiByLmdyb3VwICE9PSByb3cuZ3JvdXAgJiYgdGhpcy52aXNpdEdyb3VwS2V5KHIpID09PSBrZXkpO1xyXG4gICAgaWYgKCF0YXJnZXQpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICBjb25zdCBtaW5lID0gdGhpcy5ncm91cFJvd3Mocm93KTtcclxuICAgIGNvbnN0IHRoZWlycyA9IHRoaXMuZ3JvdXBSb3dzKHRhcmdldCk7XHJcbiAgICAvLyBBbiBhdWRpdCB0aGUgdmlzaXQgYWxyZWFkeSBoYXMgc3RheXMgaXRzIG93biAocmVkKSByb3csIHNvIHRoZSBkdXBsaWNhdGUgaXMgc2VlbiBhbmQgY2FuIGJlIGRlbGV0ZWQuXHJcbiAgICBpZiAobWluZS5zb21lKG0gPT4gbS5jaGVja0xpc3RJZCAmJiB0aGVpcnMuc29tZSh0ID0+IHQuY2hlY2tMaXN0SWQgPT09IG0uY2hlY2tMaXN0SWQpKSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIG1pbmUuZm9yRWFjaChtID0+IG0uZ3JvdXAgPSB0YXJnZXQuZ3JvdXApO1xyXG4gICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ0FkZGVkIHRvIHRoZSBleGlzdGluZyByb3cgZm9yIHRoaXMgdmlzaXQgKHNhbWUgZGF0ZSwgdXNlciwgc3RvcmUgYW5kIHdpbmRvdyknKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV2ZXJ5IHJvdyAoYXVkaXQpIG9mIHRoaXMgcm93J3MgdmlzaXQgZ3JvdXAuICovXHJcbiAgZ3JvdXBSb3dzKHJvdzogRWRpdG9yUm93KTogRWRpdG9yUm93W10ge1xyXG4gICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIociA9PiByLmdyb3VwID09PSByb3cuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBBdWRpdCBhc3NpZ25lZCBjZWxsOiBldmVyeSBhdWRpdCBvZiB0aGUgZ3JvdXAsIGJ5IG5hbWUuICovXHJcbiAgZ3JvdXBBdWRpdExhYmVsKHJvdzogRWRpdG9yUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdyb3VwQXVkaXROYW1lcyhyb3cpLmpvaW4oJywgJyk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGdyb3VwJ3MgYXVkaXQgbmFtZXMsIGluIHJvdyBvcmRlciAoZWFjaCBhdWRpdCBvbmNlKS4gKi9cclxuICBwcml2YXRlIGdyb3VwQXVkaXROYW1lcyhyb3c6IEVkaXRvclJvdyk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5ncm91cFJvd3Mocm93KS5tYXAociA9PiB0aGlzLmF1ZGl0TmFtZShyLmNoZWNrTGlzdElkKSkuZmlsdGVyKEJvb2xlYW4pKSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGNlbGwgc2hvd3MgdGhlIGZpcnN0IGF1ZGl0IGJ5IG5hbWUgYW5kIHRoZSByZXN0IGFzIGEgXCIrTlwiIGNoaXAgKHByb3RvdHlwZSkuICovXHJcbiAgZ3JvdXBBdWRpdEZpcnN0KHJvdzogRWRpdG9yUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdyb3VwQXVkaXROYW1lcyhyb3cpWzBdIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ3JvdXBBdWRpdE1vcmUocm93OiBFZGl0b3JSb3cpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMuZ3JvdXBBdWRpdE5hbWVzKHJvdykubGVuZ3RoIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogU2hvd24gcm93cyAodmlzaXQgZ3JvdXBzKSwgd2hhdGV2ZXIgbnVtYmVyIG9mIGF1ZGl0cyBlYWNoIGhvbGRzLiAqL1xyXG4gIGdldCBncm91cENvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbmV3IFNldCh0aGlzLnJvd3MubWFwKHIgPT4gci5ncm91cCkpLnNpemU7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHJvdydzIGRhdGUsIHVzZXIsIHN0b3JlIGFuZCB3aW5kb3cgZ28gdG8gdGhlIG90aGVyIGF1ZGl0cyBvZiBpdHMgZ3JvdXAgKHRoZXkgYXJlIG9uZSB2aXNpdCkuICovXHJcbiAgcHJpdmF0ZSBzeW5jR3JvdXAocm93OiBFZGl0b3JSb3cpOiB2b2lkIHtcclxuICAgIHRoaXMucm93cy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICBpZiAociA9PT0gcm93IHx8IHIuZ3JvdXAgIT09IHJvdy5ncm91cCkgeyByZXR1cm47IH1cclxuICAgICAgci5kYXRlID0gcm93LmRhdGU7XHJcbiAgICAgIHIudXNlckVtYWlsID0gcm93LnVzZXJFbWFpbDtcclxuICAgICAgci5zdG9yZUlkID0gcm93LnN0b3JlSWQ7XHJcbiAgICAgIHIuc3RvcmVUZXh0ID0gcm93LnN0b3JlVGV4dDtcclxuICAgICAgci5zdGFydCA9IHJvdy5zdGFydDtcclxuICAgICAgci5lbmQgPSByb3cuZW5kO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGlja2VkQXVkaXRzKCk6IFNjaGVkdWxlQXVkaXRbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGxBdWRpdHMuZmlsdGVyKGEgPT4gdGhpcy5waWNrcy5pbmNsdWRlcyhhLmlkKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgc2NoZWR1bGUgb3BlbmVkIGJsYW5rIChubyBhdWRpdCBwYXNzZWQgaW4pIHdoaWxlIHRoZSBhdWRpdCBwaWNrZXIgaXMgaGlkZGVuOiBub3RoaW5nIGNhbiBiZVxyXG4gICAqIHBpY2tlZCB1cCBmcm9udCwgc28gZXZlcnkgYXVkaXQgaXMgb24gb2ZmZXIgKHRlbXBsYXRlLCByb3cgcGlja2VyKSBhbmQgdGhlIHJvd3MgZGVjaWRlIHRoZSBwaWNrcyAoUUEgOSBPY3QpLlxyXG4gICAqL1xyXG4gIGdldCBvcGVuQXVkaXRzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLnNob3dBdWRpdFBpY2tlciAmJiAhdGhpcy5sb2NrZWQgJiYgIXRoaXMuc2NoZWR1bGVJZCAmJiAhdGhpcy5wcmVzZWxlY3QubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqIEF1ZGl0cyB0aGUgdGVtcGxhdGUgbGlzdHMgYW5kIGEgcm93IGNhbiBwaWNrLiAqL1xyXG4gIGdldCBvZmZlcmVkQXVkaXRzKCk6IFNjaGVkdWxlQXVkaXRbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVuQXVkaXRzID8gdGhpcy5hbGxBdWRpdHMgOiB0aGlzLnBpY2tlZEF1ZGl0cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBBdWRpdCBhc3NpZ25lZCBsaXN0IChldmVyeSByb3csIGFsd2F5cyBzaG93bik6IGV2ZXJ5IHB1Ymxpc2hlZCBhdWRpdCBvZiB0aGUgY2xpZW50LCBwbHVzIGFueSB0aGUgc2NoZWR1bGVcclxuICAgKiBhbHJlYWR5IHVzZXMgKHBpY2tlZCBvciBvbiBhIHJvdyksIHNvIGFuIGV4aXN0aW5nIHJvdyBrZWVwcyBpdHMgbmFtZSAoUUEgOSBPY3Q6IGxpc3QgYnkgcHVibGlzaCBzdGF0ZSkuIEEgcm93XHJcbiAgICogbWF5IG5hbWUgYW4gYXVkaXQgb3V0c2lkZSB0aGUgc2NoZWR1bGUncyBwaWNrczsgc2F2aW5nIGFkZHMgaXQgKHNhdmUoKSkuXHJcbiAgICovXHJcbiAgZ2V0IHJvd0F1ZGl0T3B0aW9ucygpOiBTY2hlZHVsZUF1ZGl0W10ge1xyXG4gICAgY29uc3QgdXNlZCA9IG5ldyBTZXQoWy4uLnRoaXMucGlja3MsIC4uLnRoaXMucm93cy5tYXAociA9PiByLmNoZWNrTGlzdElkKV0uZmlsdGVyKEJvb2xlYW4pKTtcclxuICAgIHJldHVybiB0aGlzLmFsbEF1ZGl0cy5maWx0ZXIoYSA9PiBhLnB1Ymxpc2ggIT09IGZhbHNlIHx8IHVzZWQuaGFzKGEuaWQpKTtcclxuICB9XHJcblxyXG4gIC8qKiBTZWFyY2ggdGV4dCBvZiB0aGUgb3BlbiBBdWRpdCBhc3NpZ25lZCBwaWNrZXIuICovXHJcbiAgYXVkaXRRdWVyeSA9ICcnO1xyXG5cclxuICBhdWRpdE1hdGNoZXMoKTogU2NoZWR1bGVBdWRpdFtdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLmF1ZGl0UXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dBdWRpdE9wdGlvbnMuZmlsdGVyKGEgPT4gIXEgfHwgYS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUm93cyBmb3IgdGhlIHNhbWUgdmlzaXQgZXhjZXB0IHRoZSBhdWRpdDogZGF0ZSwgdXNlciwgc3RvcmUgYW5kIHdpbmRvdy4gVGhlIEF1ZGl0IGFzc2lnbmVkIHBpY2tlciBpcyBhXHJcbiAgICogbXVsdGktc2VsZWN0IG92ZXIgc3VjaCBhIGdyb3VwLCBvbmUgcm93IHBlciBhdWRpdCwgc28gZWFjaCByb3cgaXMgc3RpbGwgb25lIHZpc2l0IChhcyB0aGUgQVBJIHRha2VzIGl0KS5cclxuICAgKi9cclxuICBwcml2YXRlIGF1ZGl0R3JvdXAocm93OiBFZGl0b3JSb3cpOiBFZGl0b3JSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncm91cFJvd3Mocm93KTtcclxuICB9XHJcblxyXG4gIGF1ZGl0VGlja2VkKHJvdzogRWRpdG9yUm93LCBhOiBTY2hlZHVsZUF1ZGl0KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hdWRpdEdyb3VwKHJvdykuc29tZShyID0+IHIuY2hlY2tMaXN0SWQgPT09IGEuaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEF1ZGl0cyBwaWNrZWQgZm9yIHRoaXMgcm93J3MgdmlzaXQgKGl0cyBncm91cCksIGZvciB0aGUgcGlja2VyJ3MgZm9vdGVyLiAqL1xyXG4gIGF1ZGl0VGlja0NvdW50KHJvdzogRWRpdG9yUm93KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBuZXcgU2V0KHRoaXMuYXVkaXRHcm91cChyb3cpLm1hcChyID0+IHIuY2hlY2tMaXN0SWQpLmZpbHRlcihCb29sZWFuKSkuc2l6ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE11bHRpLXNlbGVjdDogdGlja2luZyBhbm90aGVyIGF1ZGl0IGFkZHMgYSByb3cgZm9yIGl0IHJpZ2h0IGFmdGVyIHRoZSBncm91cCAoc2FtZSBkYXRlLCB1c2VyLCBzdG9yZSBhbmRcclxuICAgKiB3aW5kb3cpOyB1bnRpY2tpbmcgcmVtb3ZlcyB0aGF0IGF1ZGl0J3Mgcm93ICh0aGUgbGFzdCBvbmUgbGVmdCBpcyBjbGVhcmVkIGluc3RlYWQpLiBUaGUgbWVudSBzdGF5cyBvcGVuLlxyXG4gICAqL1xyXG4gIHRvZ2dsZUF1ZGl0KHJvdzogRWRpdG9yUm93LCBhOiBTY2hlZHVsZUF1ZGl0LCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmF1ZGl0R3JvdXAocm93KTtcclxuICAgIGNvbnN0IG93bmVyID0gZ3JvdXAuZmluZChyID0+IHIuY2hlY2tMaXN0SWQgPT09IGEuaWQpO1xyXG4gICAgaWYgKG93bmVyKSB7XHJcbiAgICAgIGlmIChncm91cC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICBvd25lci5jaGVja0xpc3RJZCA9ICcnO1xyXG4gICAgICAgIHRoaXMudG91Y2gob3duZXIsICdjaGVja0xpc3RJZCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChvd25lci5rZXkgPT09IHRoaXMub3BlbkNlbGw/LmtleSkgeyB0aGlzLmNsb3NlUGlja2VyKCk7IH1cclxuICAgICAgICB0aGlzLnJvd3MgPSB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gciAhPT0gb3duZXIpO1xyXG4gICAgICAgIC8vIFVudGlja2luZyB0aGUgYXVkaXQgdGhhdCBjbGFzaGVkIHdpdGggYW5vdGhlciByb3cgb2YgdGhlIHNhbWUgdmlzaXQ6IHRoZSByZXN0IGpvaW5zIHRoYXQgcm93IChRQSAxMSBPY3QpLlxyXG4gICAgICAgIGNvbnN0IHJlc3QgPSB0aGlzLnJvd3MuZmluZChyID0+IHIuZ3JvdXAgPT09IG93bmVyLmdyb3VwKTtcclxuICAgICAgICBpZiAocmVzdCAmJiB0aGlzLm1lcmdlVmlzaXQocmVzdCkpIHsgdGhpcy5jbG9zZVBpY2tlcigpOyB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBpY2tzLmluY2x1ZGVzKGEuaWQpKSB7IHRoaXMucGlja3MgPSBbLi4udGhpcy5waWNrcywgYS5pZF07IH1cclxuICAgIGlmICghcm93LmNoZWNrTGlzdElkKSB7XHJcbiAgICAgIHJvdy5jaGVja0xpc3RJZCA9IGEuaWQ7XHJcbiAgICAgIHRoaXMudG91Y2gocm93LCAnY2hlY2tMaXN0SWQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYWRkZWQgPSB0aGlzLnJvdyh7IGRhdGU6IHJvdy5kYXRlLCB1c2VyRW1haWw6IHJvdy51c2VyRW1haWwsIHN0b3JlSWQ6IHJvdy5zdG9yZUlkLCBzdG9yZVRleHQ6IHJvdy5zdG9yZVRleHQsIGNoZWNrTGlzdElkOiBhLmlkLCBzdGFydDogcm93LnN0YXJ0LCBlbmQ6IHJvdy5lbmQsIGdyb3VwOiByb3cuZ3JvdXAgfSk7XHJcbiAgICBjb25zdCBhdCA9IE1hdGgubWF4KC4uLmdyb3VwLm1hcChyID0+IHRoaXMucm93cy5pbmRleE9mKHIpKSkgKyAxO1xyXG4gICAgdGhpcy5yb3dzID0gWy4uLnRoaXMucm93cy5zbGljZSgwLCBhdCksIGFkZGVkLCAuLi50aGlzLnJvd3Muc2xpY2UoYXQpXTtcclxuICAgIHRoaXMudG91Y2goYWRkZWQsICdjaGVja0xpc3RJZCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9uZSByb3cgcGVyIHZpc2l0IGdyb3VwIChpdHMgZmlyc3Qgcm93KTsgdGhlIHNlYXJjaCByZWFkcyBldmVyeSBhdWRpdCBvZiB0aGUgZ3JvdXAuICovXHJcbiAgZ2V0IHNob3duUm93cygpOiBFZGl0b3JSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5yb3dRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4ge1xyXG4gICAgICBpZiAoc2Vlbi5oYXMoci5ncm91cCkpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAgIHNlZW4uYWRkKHIuZ3JvdXApO1xyXG4gICAgICByZXR1cm4gIXEgfHwgKHIuZGF0ZSArICcgJyArIHIudXNlckVtYWlsICsgJyAnICsgci5zdG9yZVRleHQgKyAnICcgKyB0aGlzLmdyb3VwQXVkaXRMYWJlbChyKSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhZFJvd3MoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gdGhpcy5yb3dJbnZhbGlkKHIpKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuUHVibGlzaCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoID4gMCAmJiB0aGlzLmJhZFJvd3MgPT09IDAgJiYgIXRoaXMuc2F2aW5nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGJhbm5lciBhYm92ZSB0aGUgcm93cyBpcyBncmVlbiBvbmx5IHdoZW4gdGhlIHJvd3MgcGFzcyBldmVyeSBjaGVjayBoZXJlIChwYXN0IGRhdGVzXHJcbiAgICogaW5jbHVkZWQpIGFuZCB0aGUgQVBJIGRpZCBub3QganVzdCByZWZ1c2UgdG8gcHVibGlzaCB0aGVtLlxyXG4gICAqL1xyXG4gIGdldCByZWFkeU9rKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2FuUHVibGlzaCAmJiAhdGhpcy5wdWJsaXNoUHJvYmxlbTtcclxuICB9XHJcblxyXG4gIGdldCByZWFkeUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5jYW5QdWJsaXNoICYmIHRoaXMucHVibGlzaFByb2JsZW0pIHtcclxuICAgICAgcmV0dXJuICdOb3QgcHVibGlzaGVkIOKAlCAnICsgdGhpcy5wdWJsaXNoUHJvYmxlbTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNhblB1Ymxpc2gpIHtcclxuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLmdyb3VwQ291bnQ7XHJcbiAgICAgIHJldHVybiAnUmVhZHkgdG8gcHVibGlzaCDigJQgJyArIHRvdGFsICsgKHRvdGFsID09PSAxID8gJyByb3cnIDogJyByb3dzJykgKyAnIHdpbGwgcmFpc2UgJyArIHRoaXMucm93cy5sZW5ndGhcclxuICAgICAgICArICh0aGlzLnJvd3MubGVuZ3RoID09PSAxID8gJyB2aXNpdCcgOiAnIHZpc2l0cycpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnJvd3MubGVuZ3RoKSB7IHJldHVybiAnQWRkIGF0IGxlYXN0IG9uZSByb3cgYmVmb3JlIHB1Ymxpc2hpbmcnOyB9XHJcbiAgICBjb25zdCBuID0gdGhpcy5iYWRSb3dzO1xyXG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLmZpcnN0UHJvYmxlbTtcclxuICAgIHJldHVybiBuICsgKG4gPT09IDEgPyAnIHJvdyBuZWVkcycgOiAnIHJvd3MgbmVlZCcpICsgJyBhIGZpeCAobWlzc2luZywgd3Jvbmcgb3IgcGFzdCB2YWx1ZSwgb3IgYSByZXBlYXRlZCBhc3NpZ25tZW50KSdcclxuICAgICAgKyAoZmlyc3QgPyAnIOKAlCByb3cgJyArIGZpcnN0LnJvdyArICc6ICcgKyBmaXJzdC5tZXNzYWdlIDogJycpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBmaXJzdCBwcm9ibGVtIGluIHRoZSByb3dzICgxLWJhc2VkIHBvc2l0aW9uIGluIHRoZSB3aG9sZSBsaXN0KSwgZm9yIHRoZSBiYW5uZXIgYWJvdmUgdGhlIHRhYmxlLiAqL1xyXG4gIGdldCBmaXJzdFByb2JsZW0oKTogeyByb3c6IG51bWJlcjsgbWVzc2FnZTogc3RyaW5nIH0gfCBudWxsIHtcclxuICAgIGNvbnN0IGZpZWxkczogUm93RmllbGRbXSA9IFsnZGF0ZScsICd1c2VyRW1haWwnLCAnc3RvcmVJZCcsICdjaGVja0xpc3RJZCcsICd3aW5kb3cnXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHMpIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5jZWxsRXJyb3IodGhpcy5yb3dzW2ldLCBmKTtcclxuICAgICAgICBpZiAobWVzc2FnZSkgeyByZXR1cm4geyByb3c6IGkgKyAxLCBtZXNzYWdlIH07IH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgbWV0cmljcygpOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfT4ge1xyXG4gICAgY29uc3QgdW5pcSA9IChsaXN0OiBzdHJpbmdbXSkgPT4gbmV3IFNldChsaXN0LmZpbHRlcihCb29sZWFuKSkuc2l6ZTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsgbGFiZWw6ICdSb3dzJywgdmFsdWU6IHRoaXMuZ3JvdXBDb3VudCB9LFxyXG4gICAgICB7IGxhYmVsOiAnVXNlcnMnLCB2YWx1ZTogdW5pcSh0aGlzLnJvd3MubWFwKHIgPT4gci51c2VyRW1haWwpKSB9LFxyXG4gICAgICB7IGxhYmVsOiAnU3RvcmVzJywgdmFsdWU6IHVuaXEodGhpcy5yb3dzLm1hcChyID0+IHIuc3RvcmVJZCkpIH0sXHJcbiAgICAgIHsgbGFiZWw6ICdBdWRpdHMnLCB2YWx1ZTogdW5pcSh0aGlzLnJvd3MubWFwKHIgPT4gci5jaGVja0xpc3RJZCkpIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIociA9PiByLnNlbGVjdGVkKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogU2VsZWN0ZWQgc2hvd24gcm93cyAoYSByb3cncyBjaGVja2JveCBzZWxlY3RzIGV2ZXJ5IGF1ZGl0IG9mIGl0cyBncm91cCkuICovXHJcbiAgZ2V0IHNlbGVjdGVkR3JvdXBzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gbmV3IFNldCh0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zZWxlY3RlZCkubWFwKHIgPT4gci5ncm91cCkpLnNpemU7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0aW9uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLnNlbGVjdGVkR3JvdXBzO1xyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmdyb3VwQ291bnQ7XHJcbiAgICByZXR1cm4gblxyXG4gICAgICA/IG4gKyAnIG9mICcgKyB0b3RhbCArICcgcm93cyBzZWxlY3RlZCdcclxuICAgICAgOiB0b3RhbCArICh0b3RhbCA9PT0gMSA/ICcgcm93JyA6ICcgcm93cycpICsgJyBpbiB0aGlzIHNjaGVkdWxlJztcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIHRoZSBoZWFkZXIgY2hlY2tib3ggYWN0cyBvbjogcGFzdCAobG9ja2VkKSByb3dzIGNhbm5vdCBiZSBzZWxlY3RlZC4gKi9cclxuICBwcml2YXRlIGdldCBzZWxlY3RhYmxlUm93cygpOiBFZGl0b3JSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93blJvd3MuZmlsdGVyKHIgPT4gIXRoaXMuaXNMb2NrZWQocikpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFsbFJvd3NTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnNlbGVjdGFibGVSb3dzO1xyXG4gICAgcmV0dXJuIHJvd3MubGVuZ3RoID4gMCAmJiByb3dzLmV2ZXJ5KHIgPT4gci5zZWxlY3RlZCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGxSb3dzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb24gPSAhdGhpcy5hbGxSb3dzU2VsZWN0ZWQ7XHJcbiAgICB0aGlzLnNlbGVjdGFibGVSb3dzLmZvckVhY2gociA9PiB0aGlzLmdyb3VwUm93cyhyKS5mb3JFYWNoKG0gPT4gbS5zZWxlY3RlZCA9IG9uKSk7XHJcbiAgfVxyXG5cclxuICAvKiogQSBzaG93biByb3cncyBjaGVja2JveCBzZWxlY3RzIGV2ZXJ5IGF1ZGl0IG9mIGl0cyBncm91cDsgYSBwYXN0IChsb2NrZWQpIHJvdyBjYW5ub3QgYmUgc2VsZWN0ZWQuICovXHJcbiAgdG9nZ2xlUm93KHJvdzogRWRpdG9yUm93KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc0xvY2tlZChyb3cpKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3Qgb24gPSAhcm93LnNlbGVjdGVkO1xyXG4gICAgdGhpcy5ncm91cFJvd3Mocm93KS5mb3JFYWNoKG0gPT4gbS5zZWxlY3RlZCA9IG9uKTtcclxuICB9XHJcblxyXG4gIGFkZFJvdygpOiB2b2lkIHtcclxuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3MsIHRoaXMucm93KCldO1xyXG4gICAgdGhpcy5wdWJsaXNoUHJvYmxlbSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgcm93ICh2aXNpdCkgdGhhdCBjYW4gbm8gbG9uZ2VyIGJlIGVkaXRlZCBvciBkZWxldGVkIChRQSAxMSBPY3Q6IG5vIGVkaXRpbmcgb2xkZXIgZGF0ZXMpLiAqL1xyXG4gIGlzTG9ja2VkKHJvdzogRWRpdG9yUm93KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2NrZWRLZXlzLmhhcyhyb3cua2V5KTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgc2hvd24gcm93IGlzIHRoZSB2aXNpdDogZXZlcnkgYXVkaXQgb2YgaXRzIGdyb3VwIGdvZXMuICovXHJcbiAgZGVsZXRlUm93KHJvdzogRWRpdG9yUm93KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc0xvY2tlZChyb3cpKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5yb3dzID0gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuZ3JvdXAgIT09IHJvdy5ncm91cCk7XHJcbiAgICB0aGlzLnB1Ymxpc2hQcm9ibGVtID0gJyc7XHJcbiAgfVxyXG5cclxuICBkdXBsaWNhdGVTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgIC8vIEEgY29waWVkIGdyb3VwIHN0YXlzIG9uZSBncm91cCAoYSBuZXcgb25lKS5cclxuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XHJcbiAgICBjb25zdCBjb3BpZXMgPSB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zZWxlY3RlZCkubWFwKHIgPT4ge1xyXG4gICAgICBjb25zdCBjb3B5ID0gdGhpcy5yb3coe1xyXG4gICAgICAgIGRhdGU6IHIuZGF0ZSwgdXNlckVtYWlsOiByLnVzZXJFbWFpbCwgc3RvcmVJZDogci5zdG9yZUlkLCBzdG9yZVRleHQ6IHIuc3RvcmVUZXh0LCBjaGVja0xpc3RJZDogci5jaGVja0xpc3RJZCwgc3RhcnQ6IHIuc3RhcnQsIGVuZDogci5lbmRcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChncm91cHMuaGFzKHIuZ3JvdXApKSB7IGNvcHkuZ3JvdXAgPSBncm91cHMuZ2V0KHIuZ3JvdXApITsgfSBlbHNlIHsgZ3JvdXBzLnNldChyLmdyb3VwLCBjb3B5Lmdyb3VwKTsgfVxyXG4gICAgICByZXR1cm4gY29weTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCFjb3BpZXMubGVuZ3RoKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5yb3dzLmZvckVhY2gociA9PiByLnNlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgdGhpcy5yb3dzID0gWy4uLnRoaXMucm93cywgLi4uY29waWVzXTtcclxuICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KGdyb3Vwcy5zaXplICsgKGdyb3Vwcy5zaXplID09PSAxID8gJyByb3cgZHVwbGljYXRlZCcgOiAnIHJvd3MgZHVwbGljYXRlZCcpKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZVNlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbiA9IHRoaXMuc2VsZWN0ZWRHcm91cHM7XHJcbiAgICBpZiAoIW4pIHsgcmV0dXJuOyB9XHJcbiAgICAvLyBQYXN0IHJvd3Mgb2YgYSBwdWJsaXNoZWQgc2NoZWR1bGUgc3RheSAoaXNMb2NrZWQpOyB0aGUgcmVzdCBvZiB0aGUgc2VsZWN0aW9uIGdvZXMuXHJcbiAgICBjb25zdCBrZXB0ID0gbmV3IFNldCh0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zZWxlY3RlZCAmJiB0aGlzLmlzTG9ja2VkKHIpKS5tYXAociA9PiByLmdyb3VwKSkuc2l6ZTtcclxuICAgIHRoaXMucm93cyA9IHRoaXMucm93cy5maWx0ZXIociA9PiAhci5zZWxlY3RlZCB8fCB0aGlzLmlzTG9ja2VkKHIpKTtcclxuICAgIHRoaXMucm93cy5mb3JFYWNoKHIgPT4gci5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgIHRoaXMucHVibGlzaFByb2JsZW0gPSAnJztcclxuICAgIGNvbnN0IGdvbmUgPSBuIC0ga2VwdDtcclxuICAgIGlmIChnb25lKSB7IHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KGdvbmUgKyAoZ29uZSA9PT0gMSA/ICcgcm93IGRlbGV0ZWQnIDogJyByb3dzIGRlbGV0ZWQnKSk7IH1cclxuICAgIGlmIChrZXB0KSB7IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChrZXB0ICsgKGtlcHQgPT09IDEgPyAnIHBhc3Qgcm93IHdhcycgOiAnIHBhc3Qgcm93cyB3ZXJlJykgKyAnIGtlcHQ6IHZpc2l0cyBhbHJlYWR5IHJhaXNlZCBjYW5ub3QgYmUgZGVsZXRlZCcpOyB9XHJcbiAgfVxyXG5cclxuICBiYWNrVG9DcmVhdGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5zdGVwID0gJ2NyZWF0ZSc7XHJcbiAgfVxyXG5cclxuICBiYWNrKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5jbG9zZWQuZW1pdChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKiogRWRpdGluZyBhIGNlbGwgY2xlYXJzIHdoYXQgdGhlIEFQSSBzYWlkIGFib3V0IGl0LiAqL1xyXG4gIHRvdWNoKHJvdzogRWRpdG9yUm93LCBmaWVsZDogUm93RmllbGQpOiB2b2lkIHtcclxuICAgIGlmIChmaWVsZCAhPT0gJ2NoZWNrTGlzdElkJykgeyB0aGlzLnN5bmNHcm91cChyb3cpOyB9XHJcbiAgICB0aGlzLnNlcnZlckVycm9ycy5kZWxldGUocm93LmtleSArICd8JyArIGZpZWxkKTtcclxuICAgIC8vIEEgcmVwZWF0ZWQgdXNlciAvIHN0b3JlIGlzIGEgbWF0dGVyIG9mIGRhdGUgYW5kIHdpbmRvdyB0b286IGNoYW5naW5nIGVpdGhlciBtYXkgZml4IGl0LlxyXG4gICAgaWYgKGZpZWxkID09PSAnZGF0ZScgfHwgZmllbGQgPT09ICd3aW5kb3cnKSB7XHJcbiAgICAgIHRoaXMuc2VydmVyRXJyb3JzLmRlbGV0ZShyb3cua2V5ICsgJ3x1c2VyRW1haWwnKTtcclxuICAgICAgdGhpcy5zZXJ2ZXJFcnJvcnMuZGVsZXRlKHJvdy5rZXkgKyAnfHN0b3JlSWQnKTtcclxuICAgICAgLy8gQSB3aW5kb3cgbWVyZ2VzIG9ubHkgb25jZSBib3RoIHRpbWVzIGFyZSBzZXQgKGEgaGFsZi10eXBlZCB0aW1lIGlzIG5vdCBhIHdpbmRvdyB5ZXQpLlxyXG4gICAgICBpZiAoZmllbGQgPT09ICdkYXRlJyB8fCAocm93LnN0YXJ0ICYmIHJvdy5lbmQpKSB7IHRoaXMubWVyZ2VWaXNpdChyb3cpOyB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnB1Ymxpc2hQcm9ibGVtID0gJyc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIHZhbGlkYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBjZWxsRXJyb3Iocm93OiBFZGl0b3JSb3csIGZpZWxkOiBSb3dGaWVsZCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnNlcnZlckVycm9ycy5nZXQocm93LmtleSArICd8JyArIGZpZWxkKTtcclxuICAgIGlmIChzZXJ2ZXIpIHsgcmV0dXJuIHNlcnZlcjsgfVxyXG4gICAgc3dpdGNoIChmaWVsZCkge1xyXG4gICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICBpZiAoIXJvdy5kYXRlKSB7IHJldHVybiAnUGljayBhIGRhdGUnOyB9XHJcbiAgICAgICAgLy8gUGFzdCBkYXRlcyBjYW5ub3QgYmUgcHVibGlzaGVkIChRQSk7IHJvd3MgYSBwdWJsaXNoZWQgc2NoZWR1bGUgYWxyZWFkeSByYWlzZWQgc3RheS5cclxuICAgICAgICByZXR1cm4gcm93LmRhdGUgPCB0aGlzLnRvZGF5ICYmICF0aGlzLnJhaXNlZEtleXMuaGFzKHRoaXMudmlzaXRLZXkocm93KSkgPyAnRGF0ZSBpcyBpbiB0aGUgcGFzdCDigJQgcGljayB0b2RheSBvciBhIGxhdGVyIGRhdGUnIDogJyc7XHJcbiAgICAgIGNhc2UgJ3VzZXJFbWFpbCc6XHJcbiAgICAgICAgaWYgKCFyb3cudXNlckVtYWlsLnRyaW0oKSkgeyByZXR1cm4gJ1BpY2sgYSB1c2VyJzsgfVxyXG4gICAgICAgIGlmICh0aGlzLnVzZXJzLmxlbmd0aCAmJiAhdGhpcy51c2VyRW1haWxzLmhhcyhyb3cudXNlckVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSkgeyByZXR1cm4gJ05vIGFjdGl2ZSB1c2VyIHdpdGggdGhpcyBlbWFpbCc7IH1cclxuICAgICAgICByZXR1cm4gdGhpcy5kdXBFcnJvcnMuZ2V0KHJvdy5rZXkgKyAnfHVzZXJFbWFpbCcpIHx8IHRoaXMubGl2ZUVycm9ycy5nZXQocm93LmtleSArICd8dXNlckVtYWlsJykgfHwgJyc7XHJcbiAgICAgIGNhc2UgJ3N0b3JlSWQnOlxyXG4gICAgICAgIC8vIFN0b3JlcyBhcmUgcGlja2VkIGJ5IG5hbWU7IHRoZSBzdG9yZSBpZCBpcyByZXNvbHZlZCBiZWhpbmQgdGhlIHNjZW5lcyBhbmQgbmV2ZXIgYXNrZWQgZm9yLlxyXG4gICAgICAgIGlmICghcm93LnN0b3JlVGV4dC50cmltKCkgJiYgIXJvdy5zdG9yZUlkLnRyaW0oKSkgeyByZXR1cm4gJ1BpY2sgYSBzdG9yZSc7IH1cclxuICAgICAgICBpZiAodGhpcy5zdG9yZXMubGVuZ3RoICYmICF0aGlzLnN0b3JlSWRzLmhhcyhyb3cuc3RvcmVJZC50cmltKCkpKSB7IHJldHVybiAnTm8gYWN0aXZlIHN0b3JlIG5hbWVkIOKAnCcgKyByb3cuc3RvcmVUZXh0LnRyaW0oKSArICfigJ0nOyB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZHVwRXJyb3JzLmdldChyb3cua2V5ICsgJ3xzdG9yZUlkJykgfHwgdGhpcy5saXZlRXJyb3JzLmdldChyb3cua2V5ICsgJ3xzdG9yZUlkJykgfHwgJyc7XHJcbiAgICAgIGNhc2UgJ2NoZWNrTGlzdElkJzpcclxuICAgICAgICAvLyBBbnkgYXVkaXQgYSByb3cgcGlja3Mgam9pbnMgdGhlIHNjaGVkdWxlJ3MgYXVkaXRzIG9uIHNhdmUgKFFBIDEwIE9jdCksIHNvIG9ubHkgYSBtaXNzaW5nIG9uZSBpcyBmbGFnZ2VkLlxyXG4gICAgICAgIHJldHVybiAhcm93LmNoZWNrTGlzdElkID8gJ1BpY2sgYW4gYXVkaXQnIDogJyc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgLy8gVGhlIHZpc2l0IHdpbmRvdyBpcyBvcHRpb25hbCAoUUEgMTAgT2N0KTogbGVmdCBibGFuaywgdGhlIEFQSSByYWlzZXMgdGhlIHZpc2l0IHdpdGggdGhlIHN0b3JlJ3Mgb3BlbiAtIGNsb3NlXHJcbiAgICAgICAgLy8gdGltZSAoMTA6MDAgLSAyMjowMCB3aGVuIHRoZSBzdG9yZSBoYXMgbm9uZSkuIEdpdmVuLCBpdCBuZWVkcyBib3RoIHRpbWVzLCBlbmRpbmcgYWZ0ZXIgaXQgc3RhcnRzLlxyXG4gICAgICAgIGlmICghcm93LnN0YXJ0ICYmICFyb3cuZW5kKSB7IHJldHVybiAnJzsgfVxyXG4gICAgICAgIGlmICghcm93LnN0YXJ0IHx8ICFyb3cuZW5kKSB7IHJldHVybiAnUGljayBib3RoIHRoZSBzdGFydCBhbmQgdGhlIGVuZCB0aW1lLCBvciBsZWF2ZSBib3RoIGJsYW5rJzsgfVxyXG4gICAgICAgIGlmIChyb3cuc3RhcnQgJiYgcm93LmVuZCAmJiByb3cuc3RhcnQgPj0gcm93LmVuZCkgeyByZXR1cm4gJ1dpbmRvdyBtdXN0IGVuZCBhZnRlciBpdCBzdGFydHMnOyB9XHJcbiAgICAgICAgLy8gQSByb3cgZm9yIHRvZGF5IHdob3NlIG93biB3aW5kb3cgaXMgYWxyZWFkeSBvdmVyIGNvdWxkIG9ubHkgYmUgbWlzc2VkLiAoQSBibGFuayB3aW5kb3dcclxuICAgICAgICAvLyB1c2VzIHRoZSBhdWRpdCdzIHRpbWUgZnJhbWUsIHdoaWNoIHRoZSBBUEkgY2hlY2tzLilcclxuICAgICAgICBpZiAocm93LmRhdGUgPT09IHRoaXMudG9kYXkgJiYgcm93LmVuZCAmJiByb3cuZW5kIDw9IGRheWpzKCkuZm9ybWF0KCdISDptbScpICYmICF0aGlzLnJhaXNlZEtleXMuaGFzKHRoaXMudmlzaXRLZXkocm93KSkpIHtcclxuICAgICAgICAgIHJldHVybiAnVGhpcyB3aW5kb3cgZW5kZWQgYXQgJyArIHJvdy5lbmQgKyAnIHRvZGF5IOKAlCBwaWNrIGEgbGF0ZXIgZW5kIHRpbWUgb3IgZGF0ZSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmR1cEVycm9ycy5nZXQocm93LmtleSArICd8d2luZG93JykgfHwgdGhpcy5saXZlRXJyb3JzLmdldChyb3cua2V5ICsgJ3x3aW5kb3cnKSB8fCAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBUb2RheSBvbiB0aGlzIGRldmljZSAoWVlZWS1NTS1ERCk6IHRoZSBmaXJzdCBkYXRlIGEgbmV3IHJvdyBtYXkgaGF2ZS4gKi9cclxuICBnZXQgdG9kYXkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBkYXlqcygpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgcm93IGFzIGEgdmlzaXQ6IGF1ZGl0LCBzdG9yZSwgZGF0ZSwgdXNlciBhbmQgd2luZG93ICh0aGUgQVBJJ3Mgcm93VmlzaXRLZXkpLiAqL1xyXG4gIHByaXZhdGUgdmlzaXRLZXkocjogRWRpdG9yUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBbci5jaGVja0xpc3RJZCwgci5zdG9yZUlkLnRyaW0oKSwgci5kYXRlLCByLnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKSwgci5zdGFydCB8fCAnJywgci5lbmQgfHwgJyddLmpvaW4oJ3wnKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGF0IGlzIHdyb25nIHdpdGggYSByb3csIG9uZSBsaW5lIHBlciBwcm9ibGVtOiBzaG93biBpbiByZWQgdW5kZXIgdGhlIHJvdyAoYSByZWQgY2VsbCBhbG9uZSBkb2VzIG5vdCBzYXkgd2h5KS4gKi9cclxuICByb3dNZXNzYWdlcyhyb3c6IEVkaXRvclJvdyk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcclxuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cFJvd3Mocm93KTtcclxuICAgIGdyb3VwLmZvckVhY2gociA9PiB7XHJcbiAgICAgIChbJ2RhdGUnLCAndXNlckVtYWlsJywgJ3N0b3JlSWQnLCAnY2hlY2tMaXN0SWQnLCAnd2luZG93J10gYXMgUm93RmllbGRbXSkuZm9yRWFjaChmID0+IHtcclxuICAgICAgICBjb25zdCBtID0gdGhpcy5jZWxsRXJyb3IociwgZik7XHJcbiAgICAgICAgLy8gQW4gYXVkaXQncyBvd24gcHJvYmxlbSBzYXlzIHdoaWNoIGF1ZGl0LCB3aGVuIHRoZSByb3cgaG9sZHMgc2V2ZXJhbCAodW5sZXNzIHRoZSBtZXNzYWdlIG5hbWVzIGl0IGFscmVhZHkpLlxyXG4gICAgICAgIGNvbnN0IG5hbWUgPSByLmNoZWNrTGlzdElkID8gdGhpcy5hdWRpdE5hbWUoci5jaGVja0xpc3RJZCkgOiAnJztcclxuICAgICAgICBjb25zdCB0ZXh0ID0gbSAmJiBncm91cC5sZW5ndGggPiAxICYmIChmID09PSAnY2hlY2tMaXN0SWQnIHx8IGYgPT09ICd1c2VyRW1haWwnIHx8IGYgPT09ICdzdG9yZUlkJykgJiYgbmFtZVxyXG4gICAgICAgICAgJiYgIW0uaW5jbHVkZXMoJ1wiJyArIG5hbWUgKyAnXCInKVxyXG4gICAgICAgICAgPyBuYW1lICsgJzogJyArIG0gOiBtO1xyXG4gICAgICAgIGlmICh0ZXh0ICYmICFvdXQuaW5jbHVkZXModGV4dCkpIHsgb3V0LnB1c2godGV4dCk7IH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvdXQ7XHJcbiAgfVxyXG5cclxuICAvKiogSGludHMgdW5kZXIgdGhlIHJvdyAoZ3JleSk6IGFsbG93ZWQsIHNob3duIHNvIHRoZSB1c2VyIGtub3dzLiBFdmVyeSBhdWRpdCBvZiB0aGUgZ3JvdXAuICovXHJcbiAgcm93SGludHMocm93OiBFZGl0b3JSb3cpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBSb3dzKHJvdyk7XHJcbiAgICBncm91cC5mb3JFYWNoKHIgPT4gKHRoaXMubGl2ZVdhcm5pbmdzLmdldChyLmtleSkgfHwgW10pLmZvckVhY2gobSA9PiB7XHJcbiAgICAgIGNvbnN0IHRleHQgPSBncm91cC5sZW5ndGggPiAxICYmIHIuY2hlY2tMaXN0SWQgPyB0aGlzLmF1ZGl0TmFtZShyLmNoZWNrTGlzdElkKSArICc6ICcgKyBtIDogbTtcclxuICAgICAgaWYgKCFvdXQuaW5jbHVkZXModGV4dCkpIHsgb3V0LnB1c2godGV4dCk7IH1cclxuICAgIH0pKTtcclxuICAgIHJldHVybiBvdXQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJvd0ludmFsaWQocm93OiBFZGl0b3JSb3cpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoWydkYXRlJywgJ3VzZXJFbWFpbCcsICdzdG9yZUlkJywgJ2NoZWNrTGlzdElkJywgJ3dpbmRvdyddIGFzIFJvd0ZpZWxkW10pLnNvbWUoZiA9PiAhIXRoaXMuY2VsbEVycm9yKHJvdywgZikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHdpbmRvdyBhIHJvdydzIHZpc2l0IGdldHM6IGl0cyBvd24gdGltZXMsIG9yIHRoZSBhdWRpdCdzIHRpbWUgZnJhbWUgd2hlbiBpdCBsZWF2ZXMgdGhlbVxyXG4gICAqIGJsYW5rICh0aGUgQVBJIHJhaXNlcyBpdCB0aGUgc2FtZSB3YXk7IDEwOjAw4oCTMjI6MDAgd2hlbiB0aGUgYXVkaXQgaGFzIG5vbmUpLlxyXG4gICAqL1xyXG4gIC8qKiBBIHJvdydzIHZpc2l0IHdpbmRvdzsgYmxhbmsgPSAxMDowMCBBTSAtIDEwOjAwIFBNLCBhcyB0aGUgQVBJIHJhaXNlcyBpdCAoUUEgMTAgT2N0KS4gKi9cclxuICBwcml2YXRlIHJvd1dpbmRvdyhyOiBFZGl0b3JSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHIuc3RhcnQgJiYgci5lbmQgPyByLnN0YXJ0ICsgJy0nICsgci5lbmQgOiAnMTA6MDAtMjI6MDAnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBzdG9yZSBnZXRzIG9uZSB2aXNpdCBvZiBhbiBhdWRpdCBwZXIgZGF0ZSBhbmQgdmlzaXQgd2luZG93OiBhIGxhdGVyIHJvdyByZXBlYXRpbmcgaXQgaXMgZmxhZ2dlZCBvbiBpdHMgc3RvcmVcclxuICAgKiBjZWxsLiBUaGUgc2FtZSB1c2VyIGF0IGFub3RoZXIgc3RvcmUgKG9yIGJlZm9yZSBhIHN0b3JlIGlzIHBpY2tlZCkgaXMgbm90IGEgZHVwbGljYXRlIChRQSAxMSBPY3QpLiBCbGFuayB3aW5kb3dzXHJcbiAgICogYXJlIDEwOjAwIEFNIC0gMTA6MDAgUE0sIHNvIGJsYW5rIHJvd3Mgb2Ygb25lIHN0b3JlIGNsYXNoLiBTYW1lIG1lc3NhZ2VzIGFzIHRoZSBBUEksIHdoaWNoIGFsc28gY2hlY2tzIHRoZVxyXG4gICAqIGNsaWVudCdzIG90aGVyIHB1Ymxpc2hlZCBzY2hlZHVsZXMgKGFzIGEgaGludCkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmaW5kRHVwbGljYXRlcygpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIGNvbnN0IG91dCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgICBjb25zdCBmaXJzdEVtYWlsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICAgIC8vIFZpc2l0IHdpbmRvd3MgYXJlIG5vdCBjb21wYXJlZCBhY3Jvc3Mgc3RvcmVzIChRQSAxMCBPY3QpOiBvbmx5IGVhY2ggcm93J3Mgb3duIHN0YXJ0IC8gZW5kIGFyZSBjaGVja2VkIChjZWxsRXJyb3IpLlxyXG4gICAgdGhpcy5yb3dzLmZvckVhY2gociA9PiB7XHJcbiAgICAgIGNvbnN0IHN0b3JlID0gci5zdG9yZUlkLnRyaW0oKTtcclxuICAgICAgaWYgKCFyLmRhdGUgfHwgIXIuY2hlY2tMaXN0SWQgfHwgIXN0b3JlKSB7IHJldHVybjsgfVxyXG4gICAgICAvLyBBIGhhbGYtZmlsbGVkIG9yIHJldmVyc2VkIHdpbmRvdyBoYXMgaXRzIG93biBlcnJvcjsgaXQgaXMgbm90IGNvbXBhcmVkIHVudGlsIGZpeGVkLlxyXG4gICAgICBpZiAoISFyLnN0YXJ0ICE9PSAhIXIuZW5kIHx8IChyLnN0YXJ0ICYmIHIuZW5kICYmIHIuc3RhcnQgPj0gci5lbmQpKSB7IHJldHVybjsgfVxyXG4gICAgICBjb25zdCBlbWFpbCA9IHIudXNlckVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCBzbG90ID0gci5jaGVja0xpc3RJZCArICd8JyArIHIuZGF0ZSArICd8JyArIHRoaXMucm93V2luZG93KHIpICsgJ3wnICsgc3RvcmU7XHJcbiAgICAgIGlmIChmaXJzdEVtYWlsLmhhcyhzbG90KSkge1xyXG4gICAgICAgIC8vIE5hbWVzIHRoZSBhdWRpdCAoUUEgMTEgT2N0KSwgYXMgdGhlIEFQSSdzIG1lc3NhZ2UgZG9lcy5cclxuICAgICAgICBjb25zdCBhdWRpdCA9IHRoaXMuYXVkaXROYW1lKHIuY2hlY2tMaXN0SWQpO1xyXG4gICAgICAgIGNvbnN0IHdobyA9IGVtYWlsICYmIGZpcnN0RW1haWwuZ2V0KHNsb3QpID09PSBlbWFpbCA/ICdUaGlzIHVzZXIgYW5kIHN0b3JlIGFscmVhZHkgaGF2ZSB0aGUgJyA6ICdUaGlzIHN0b3JlIGFscmVhZHkgaGFzIHRoZSAnO1xyXG4gICAgICAgIG91dC5zZXQoci5rZXkgKyAnfHN0b3JlSWQnLCB3aG8gKyAoYXVkaXQgPyAnXCInICsgYXVkaXQgKyAnXCInIDogJ3RoaXMnKSArICcgYXVkaXQgc2NoZWR1bGVkIGZvciB0aGlzIGRhdGUgYW5kIHZpc2l0IHdpbmRvdyBpbiBhbm90aGVyIHJvdycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpcnN0RW1haWwuc2V0KHNsb3QsIGVtYWlsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gb3V0O1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBwaWNrZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgb3BlblBpY2tlcihyb3c6IEVkaXRvclJvdywgZmllbGQ6IFBpY2tDZWxsLCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3QgYW5jaG9yID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICh0aGlzLmlzT3Blbihyb3csIGZpZWxkKSAmJiBldmVudC50eXBlID09PSAnY2xpY2snICYmIGZpZWxkID09PSAnY2hlY2tMaXN0SWQnKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VQaWNrZXIoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVvcGVuID0gIXRoaXMuaXNPcGVuKHJvdywgZmllbGQpO1xyXG4gICAgdGhpcy5vcGVuQ2VsbCA9IHsga2V5OiByb3cua2V5LCBmaWVsZCB9O1xyXG4gICAgdGhpcy5tZW51QW5jaG9yID0gYW5jaG9yO1xyXG4gICAgaWYgKHJlb3BlbiAmJiBmaWVsZCA9PT0gJ2NoZWNrTGlzdElkJykge1xyXG4gICAgICB0aGlzLmF1ZGl0UXVlcnkgPSAnJztcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNlLW1lbnUgLnNlLW1lbnUtc2VhcmNoIGlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGwpPy5mb2N1cygpKTtcclxuICAgIH1cclxuICAgIGlmIChyZW9wZW4pIHsgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleChyb3csIGZpZWxkKTsgfVxyXG4gICAgdGhpcy5wbGFjZU1lbnUoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlUGlja2VyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVuQ2VsbCA9IG51bGw7XHJcbiAgICB0aGlzLm1lbnVBbmNob3IgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJlbG93IHRoZSBjZWxsLCBvciBhYm92ZSBpdCB3aGVuIHRoZSB2aWV3cG9ydCBoYXMgbm8gcm9vbSB1bmRlcm5lYXRoLiAqL1xyXG4gIHBsYWNlTWVudSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5tZW51QW5jaG9yKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgciA9IHRoaXMubWVudUFuY2hvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHJvb20gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSByLmJvdHRvbTtcclxuICAgIGNvbnN0IHVwID0gcm9vbSA8IDMwMCAmJiByLnRvcCA+IHJvb207XHJcbiAgICB0aGlzLm1lbnVQb3MgPSB7XHJcbiAgICAgIHRvcDogdXAgPyBudWxsIDogTWF0aC5yb3VuZChyLmJvdHRvbSArIDQpLFxyXG4gICAgICBib3R0b206IHVwID8gTWF0aC5yb3VuZCh3aW5kb3cuaW5uZXJIZWlnaHQgLSByLnRvcCArIDQpIDogbnVsbCxcclxuICAgICAgbGVmdDogTWF0aC5yb3VuZChyLmxlZnQpLFxyXG4gICAgICB3aWR0aDogTWF0aC5yb3VuZChyLndpZHRoKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGlzT3Blbihyb3c6IEVkaXRvclJvdywgZmllbGQ6IFBpY2tDZWxsKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVuQ2VsbD8ua2V5ID09PSByb3cua2V5ICYmIHRoaXMub3BlbkNlbGw/LmZpZWxkID09PSBmaWVsZDtcclxuICB9XHJcblxyXG4gIHVzZXJNYXRjaGVzKHJvdzogRWRpdG9yUm93KTogUGlja1VzZXJbXSB7XHJcbiAgICBjb25zdCBxID0gcm93LnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnVzZXJzLmZpbHRlcih1ID0+ICFxIHx8IHUuZW1haWwuaW5jbHVkZXMocSkgfHwgdS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xyXG4gIH1cclxuXHJcbiAgdXNlclN1Z2dlc3Rpb25zKHJvdzogRWRpdG9yUm93KTogUGlja1VzZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyTWF0Y2hlcyhyb3cpLnNsaWNlKDAsIHRoaXMucGlja0xpbWl0KTtcclxuICB9XHJcblxyXG4gIHN0b3JlTWF0Y2hlcyhyb3c6IEVkaXRvclJvdyk6IFBpY2tTdG9yZVtdIHtcclxuICAgIGNvbnN0IHEgPSByb3cuc3RvcmVUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVzLmZpbHRlcihzID0+ICFxIHx8IHMuc3RvcmVJZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8IHMuc3RvcmVOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwgcy5jaXR5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xyXG4gIH1cclxuXHJcbiAgc3RvcmVTdWdnZXN0aW9ucyhyb3c6IEVkaXRvclJvdyk6IFBpY2tTdG9yZVtdIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlTWF0Y2hlcyhyb3cpLnNsaWNlKDAsIHRoaXMucGlja0xpbWl0KTtcclxuICB9XHJcblxyXG4gIC8qKiBcIlNob3dpbmcgMzAgb2YgMywzOTAgc3RvcmVzXCIgd2hlbiB0aGUgbGlzdCBpcyBjdXQ7IGVtcHR5IHdoZW4gZXZlcnl0aGluZyBmaXRzLiAqL1xyXG4gIG1vcmVMYWJlbChzaG93bjogbnVtYmVyLCB0b3RhbDogbnVtYmVyLCBub3VuOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRvdGFsID4gc2hvd24gPyAnU2hvd2luZyAnICsgc2hvd24gKyAnIG9mICcgKyB0b3RhbC50b0xvY2FsZVN0cmluZygpICsgJyAnICsgbm91biArICcgwrcgdHlwZSB0byBuYXJyb3cnIDogJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9wdGlvbkNvdW50KHJvdzogRWRpdG9yUm93LCBmaWVsZDogUGlja0NlbGwpOiBudW1iZXIge1xyXG4gICAgaWYgKGZpZWxkID09PSAndXNlckVtYWlsJykgeyByZXR1cm4gdGhpcy51c2VyU3VnZ2VzdGlvbnMocm93KS5sZW5ndGg7IH1cclxuICAgIGlmIChmaWVsZCA9PT0gJ3N0b3JlSWQnKSB7IHJldHVybiB0aGlzLnN0b3JlU3VnZ2VzdGlvbnMocm93KS5sZW5ndGg7IH1cclxuICAgIHJldHVybiB0aGlzLmF1ZGl0TWF0Y2hlcygpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VsZWN0ZWRJbmRleChyb3c6IEVkaXRvclJvdywgZmllbGQ6IFBpY2tDZWxsKTogbnVtYmVyIHtcclxuICAgIGxldCBpID0gLTE7XHJcbiAgICBpZiAoZmllbGQgPT09ICd1c2VyRW1haWwnKSB7IGkgPSB0aGlzLnVzZXJTdWdnZXN0aW9ucyhyb3cpLmZpbmRJbmRleCh1ID0+IHUuZW1haWwgPT09IHJvdy51c2VyRW1haWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpOyB9XHJcbiAgICBpZiAoZmllbGQgPT09ICdzdG9yZUlkJykgeyBpID0gdGhpcy5zdG9yZVN1Z2dlc3Rpb25zKHJvdykuZmluZEluZGV4KHMgPT4gcy5zdG9yZUlkID09PSByb3cuc3RvcmVJZC50cmltKCkpOyB9XHJcbiAgICBpZiAoZmllbGQgPT09ICdjaGVja0xpc3RJZCcpIHsgaSA9IHRoaXMuYXVkaXRNYXRjaGVzKCkuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gcm93LmNoZWNrTGlzdElkKTsgfVxyXG4gICAgcmV0dXJuIE1hdGgubWF4KGksIDApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFycm93IGtleXMgbW92ZSB0aHJvdWdoIHRoZSBvcHRpb25zLCBFbnRlciBwaWNrcywgRXNjYXBlIGNsb3Nlcy4gKi9cclxuICBvblBpY2tlcktleShyb3c6IEVkaXRvclJvdywgZmllbGQ6IFBpY2tDZWxsLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHsgdGhpcy5jbG9zZVBpY2tlcigpOyByZXR1cm47IH1cclxuICAgIGlmICghdGhpcy5pc09wZW4ocm93LCBmaWVsZCkpIHtcclxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHsgdGhpcy5vcGVuUGlja2VyKHJvdywgZmllbGQsIGV2ZW50KTsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb3VudCA9IHRoaXMub3B0aW9uQ291bnQocm93LCBmaWVsZCk7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyB8fCBldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBpZiAoIWNvdW50KSB7IHJldHVybjsgfVxyXG4gICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gKHRoaXMuYWN0aXZlSW5kZXggKyAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJyA/IDEgOiAtMSkgKyBjb3VudCkgJSBjb3VudDtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2UtbWVudSAuc2Utb3B0LmlzLWFjdGl2ZScpPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSkpO1xyXG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgaWYgKCFjb3VudCkgeyByZXR1cm47IH1cclxuICAgICAgY29uc3QgaSA9IE1hdGgubWluKHRoaXMuYWN0aXZlSW5kZXgsIGNvdW50IC0gMSk7XHJcbiAgICAgIGlmIChmaWVsZCA9PT0gJ3VzZXJFbWFpbCcpIHsgdGhpcy5waWNrVXNlcihyb3csIHRoaXMudXNlclN1Z2dlc3Rpb25zKHJvdylbaV0sIGV2ZW50KTsgfVxyXG4gICAgICBlbHNlIGlmIChmaWVsZCA9PT0gJ3N0b3JlSWQnKSB7IHRoaXMucGlja1N0b3JlKHJvdywgdGhpcy5zdG9yZVN1Z2dlc3Rpb25zKHJvdylbaV0sIGV2ZW50KTsgfVxyXG4gICAgICBlbHNlIHsgdGhpcy50b2dnbGVBdWRpdChyb3csIHRoaXMuYXVkaXRNYXRjaGVzKClbaV0sIGV2ZW50KTsgfVxyXG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VQaWNrZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBUeXBpbmcgaW4gYSBwaWNrZXIgY2VsbCBzdGFydHMgdGhlIGhpZ2hsaWdodCBvdmVyIGF0IHRoZSBmaXJzdCBtYXRjaC4gKi9cclxuICBvblBpY2tlcklucHV0KHJvdzogRWRpdG9yUm93LCBmaWVsZDogUGlja0NlbGwpOiB2b2lkIHtcclxuICAgIHRoaXMudG91Y2gocm93LCBmaWVsZCk7XHJcbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gMDtcclxuICAgIC8vIFR5cGluZyBhZnRlciBFc2NhcGUgYnJpbmdzIHRoZSBsaXN0IGJhY2sgdW5kZXIgdGhlIGZvY3VzZWQgY2VsbC5cclxuICAgIGlmICghdGhpcy5pc09wZW4ocm93LCBmaWVsZCkgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMub3BlbkNlbGwgPSB7IGtleTogcm93LmtleSwgZmllbGQgfTtcclxuICAgICAgdGhpcy5tZW51QW5jaG9yID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuICAgICAgdGhpcy5wbGFjZU1lbnUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBpY2tVc2VyKHJvdzogRWRpdG9yUm93LCB1OiBQaWNrVXNlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHJvdy51c2VyRW1haWwgPSB1LmVtYWlsO1xyXG4gICAgdGhpcy50b3VjaChyb3csICd1c2VyRW1haWwnKTtcclxuICAgIHRoaXMuY2xvc2VQaWNrZXIoKTtcclxuICAgIHRoaXMubWVyZ2VWaXNpdChyb3cpO1xyXG4gIH1cclxuXHJcbiAgcGlja1N0b3JlKHJvdzogRWRpdG9yUm93LCBzOiBQaWNrU3RvcmUsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICByb3cuc3RvcmVJZCA9IHMuc3RvcmVJZDtcclxuICAgIHJvdy5zdG9yZVRleHQgPSBzLnN0b3JlTmFtZSB8fCBzLnN0b3JlSWQ7XHJcbiAgICB0aGlzLnRvdWNoKHJvdywgJ3N0b3JlSWQnKTtcclxuICAgIHRoaXMuY2xvc2VQaWNrZXIoKTtcclxuICAgIHRoaXMubWVyZ2VWaXNpdChyb3cpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFR5cGluZyBpbiB0aGUgc3RvcmUgY2VsbDogdGhlIHRleHQgaXMgdGhlIHN0b3JlIG5hbWU7IGl0IHBpY2tzIHRoZSBzdG9yZSBvbmNlIGl0IG5hbWVzIG9uZSBleGFjdGx5LiAqL1xyXG4gIG9uU3RvcmVUeXBlZChyb3c6IEVkaXRvclJvdywgdGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICByb3cuc3RvcmVUZXh0ID0gdGV4dDtcclxuICAgIHJvdy5zdG9yZUlkID0gdGhpcy5zdG9yZUlkRm9yKHRleHQpO1xyXG4gICAgdGhpcy5vblBpY2tlcklucHV0KHJvdywgJ3N0b3JlSWQnKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYWN0aXZlIHN0b3JlIGEgbmFtZSAob3IsIGZyb20gYW4gb2xkIHRlbXBsYXRlLCBhbiBpZCkgc3RhbmRzIGZvcjsgJycgd2hlbiBub25lIG9yIG5vdCBsb2FkZWQuICovXHJcbiAgcHJpdmF0ZSBzdG9yZUlkRm9yKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0ID0gU3RyaW5nKHRleHQgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKCF0KSB7IHJldHVybiAnJzsgfVxyXG4gICAgY29uc3QgbmFtZWQgPSB0aGlzLnN0b3Jlcy5maWx0ZXIocyA9PiBzLnN0b3JlTmFtZS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gdCk7XHJcbiAgICBpZiAobmFtZWQubGVuZ3RoID09PSAxKSB7IHJldHVybiBuYW1lZFswXS5zdG9yZUlkOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZXMuZmluZChzID0+IHMuc3RvcmVJZC50b0xvd2VyQ2FzZSgpID09PSB0KT8uc3RvcmVJZCB8fCAnJztcclxuICB9XHJcblxyXG4gIHN0b3JlTGFiZWwoc3RvcmVJZDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlQnlJZC5nZXQoU3RyaW5nKHN0b3JlSWQgfHwgJycpLnRyaW0oKSk/LnN0b3JlTmFtZSB8fCAnJztcclxuICB9XHJcblxyXG4gIHVzZXJMYWJlbChlbWFpbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJCeUVtYWlsLmdldChTdHJpbmcoZW1haWwgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpKT8ubmFtZSB8fCAnJztcclxuICB9XHJcblxyXG4gIGluaXRpYWxzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXJ0cyA9IFN0cmluZyh0ZXh0IHx8ICcnKS50cmltKCkuc3BsaXQoL1tcXHMuX0AtXSsvKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICByZXR1cm4gKChwYXJ0c1swXT8uWzBdIHx8ICcnKSArIChwYXJ0c1sxXT8uWzBdIHx8IHBhcnRzWzBdPy5bMV0gfHwgJycpKS50b1VwcGVyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgYXVkaXROYW1lKGlkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsQXVkaXRzLmZpbmQoYSA9PiBhLmlkID09PSBpZCk/Lm5hbWUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Um93KF86IG51bWJlciwgcm93OiBFZGl0b3JSb3cpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHJvdy5rZXk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5QXVkaXQoXzogbnVtYmVyLCBhOiBTY2hlZHVsZUF1ZGl0KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBhLmlkO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBzYXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgc2F2ZURyYWZ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zYXZlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHB1Ymxpc2goKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2FuUHVibGlzaCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QodGhpcy5yb3dzLmxlbmd0aCA/ICdDb21wbGV0ZSB0aGUgaGlnaGxpZ2h0ZWQgcm93cyBmaXJzdCcgOiAnQWRkIGF0IGxlYXN0IG9uZSByb3cnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlKHB1Ymxpc2g6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNhdmluZykgeyByZXR1cm47IH1cclxuICAgIGlmICghdGhpcy5uYW1lLnRyaW0oKSkgeyB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05hbWUgdGhlIHNjaGVkdWxlIGZpcnN0Jyk7IHRoaXMuc3RlcCA9ICdjcmVhdGUnOyByZXR1cm47IH1cclxuICAgIC8vIEV2ZXJ5IGF1ZGl0IG9uIG9mZmVyOiB0aGUgc2NoZWR1bGUncyBhdWRpdHMgYXJlIHRoZSBvbmVzIGl0cyByb3dzIG5hbWUuIE90aGVyd2lzZSB0aGUgcGlja3MgcGx1cyBhbnkgYXVkaXQgYVxyXG4gICAgLy8gcm93IGNob3NlIGluIHRoZSBBdWRpdCBhc3NpZ25lZCBjb2x1bW4gKHRoZSBBUEkgY2hlY2tzIGVhY2ggcm93J3MgYXVkaXQgYWdhaW5zdCB0aGUgc2NoZWR1bGUncyBsaXN0KS5cclxuICAgIGNvbnN0IHJvd0F1ZGl0cyA9IHRoaXMucm93cy5tYXAociA9PiByLmNoZWNrTGlzdElkKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICB0aGlzLnBpY2tzID0gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMub3BlbkF1ZGl0cyA/IHJvd0F1ZGl0cyA6IFsuLi50aGlzLnBpY2tzLCAuLi5yb3dBdWRpdHNdKSk7XHJcbiAgICBpZiAoIXRoaXMucGlja3MubGVuZ3RoKSB7IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnUGljayBhdCBsZWFzdCBvbmUgYXVkaXQnKTsgdGhpcy5zdGVwID0gJ2NyZWF0ZSc7IHJldHVybjsgfVxyXG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zZXJ2ZXJFcnJvcnMuY2xlYXIoKTtcclxuICAgIHRoaXMucHVibGlzaFByb2JsZW0gPSAnJztcclxuICAgIGNvbnN0IHNlbnQgPSBbLi4udGhpcy5yb3dzXTtcclxuICAgIGNvbnN0IGJvZHk6IGFueSA9IHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIG5hbWU6IHRoaXMubmFtZS50cmltKCksXHJcbiAgICAgIGNoZWNrbGlzdElkczogdGhpcy5waWNrcyxcclxuICAgICAgLy8gc3RvcmVOYW1lIGxldHMgdGhlIEFQSSBmaW5kIHRoZSBzdG9yZSB3aGVuIHRoZSBpZCBpcyBub3QgcmVzb2x2ZWQgaGVyZSAoc3RvcmVzIG5vdCBsb2FkZWQpLlxyXG4gICAgICByb3dzOiBzZW50Lm1hcChyID0+ICh7XHJcbiAgICAgICAgZGF0ZTogci5kYXRlLCB1c2VyRW1haWw6IHIudXNlckVtYWlsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBzdG9yZUlkOiByLnN0b3JlSWQudHJpbSgpLCBzdG9yZU5hbWU6IHIuc3RvcmVUZXh0LnRyaW0oKSxcclxuICAgICAgICBjaGVja0xpc3RJZDogci5jaGVja0xpc3RJZCB8fCAnJywgc3RhcnQ6IHIuc3RhcnQsIGVuZDogci5lbmRcclxuICAgICAgfSkpLFxyXG4gICAgICBwdWJsaXNoXHJcbiAgICB9O1xyXG4gICAgY29uc3QgY2FsbCA9IHRoaXMuc2NoZWR1bGVJZFxyXG4gICAgICA/IHRoaXMudHJheFNlcnZpY2UuYXVkaXRTY2hlZHVsZVVwZGF0ZSh7IC4uLmJvZHksIHNjaGVkdWxlSWQ6IHRoaXMuc2NoZWR1bGVJZCB9KVxyXG4gICAgICA6IHRoaXMudHJheFNlcnZpY2UuYXVkaXRTY2hlZHVsZUNyZWF0ZShib2R5KTtcclxuICAgIGNhbGwucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJlcz8uY29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnB1Ymxpc2hQcm9ibGVtID0gcHVibGlzaCA/IHJlcz8ubWVzc2FnZSB8fCAnQ291bGQgbm90IHB1Ymxpc2ggdGhlIHNjaGVkdWxlJyA6ICcnO1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHJlcz8ubWVzc2FnZSB8fCAnQ291bGQgbm90IHNhdmUgdGhlIHNjaGVkdWxlJyk7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMubmFtZS50cmltKCk7XHJcbiAgICAgICAgaWYgKHB1Ymxpc2gpIHtcclxuICAgICAgICAgIGNvbnN0IGF1ZGl0czogYW55W10gPSByZXM/LmRhdGE/LmF1ZGl0cyB8fCBbXTtcclxuICAgICAgICAgIGNvbnN0IG5vd0xpdmUgPSBhdWRpdHMuZmlsdGVyKGEgPT4gYS5wdWJsaXNoZWROb3cpLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdcIicgKyBuYW1lICsgJ1wiIHB1Ymxpc2hlZCDCtyAnICsgc2VudC5sZW5ndGggKyAoc2VudC5sZW5ndGggPT09IDEgPyAnIHZpc2l0JyA6ICcgdmlzaXRzJykgKyAnIHNjaGVkdWxlZCdcclxuICAgICAgICAgICAgKyAobm93TGl2ZSA/ICcgwrcgJyArIG5vd0xpdmUgKyAobm93TGl2ZSA9PT0gMSA/ICcgYXVkaXQnIDogJyBhdWRpdHMnKSArICcgcHVibGlzaGVkJyA6ICcnKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdcIicgKyBuYW1lICsgJ1wiIHNhdmVkIGFzIGEgZHJhZnQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jbG9zZWQuZW1pdCh0cnVlKTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgICAgIC8vIFByb2R1Y3Rpb24gc2VuZHMgdGhlIGVycm9yIG9iamVjdCBhcyBgZXJyb3JgOyB0aGUgbG9jYWwgZGV2IGhlbHBlciBzZW5kcyB0ZXh0IHBsdXMgYGRldGFpbHNgLlxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBlPy5lcnJvciB8fCB7fTtcclxuICAgICAgICBjb25zdCBlcnIgPSBib2R5LmVycm9yICYmIHR5cGVvZiBib2R5LmVycm9yID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgPyBib2R5LmVycm9yXHJcbiAgICAgICAgICA6IHsgLi4uKGJvZHkuZGV0YWlscyB8fCB7fSksIG1lc3NhZ2U6IGJvZHkuZGV0YWlscz8ubWVzc2FnZSB8fCAodHlwZW9mIGJvZHkuZXJyb3IgPT09ICdzdHJpbmcnID8gYm9keS5lcnJvciA6ICcnKSB9O1xyXG4gICAgICAgIC8vIEEgbmV3IHNjaGVkdWxlIGlzIGtlcHQgYXMgYSBkcmFmdCB3aGVuIHB1Ymxpc2hpbmcgaXQgZmFpbHM7IHVwZGF0ZSBpdCBmcm9tIG5vdyBvbi5cclxuICAgICAgICBpZiAoZXJyPy5zY2hlZHVsZUlkICYmICF0aGlzLnNjaGVkdWxlSWQpIHsgdGhpcy5zY2hlZHVsZUlkID0gU3RyaW5nKGVyci5zY2hlZHVsZUlkKTsgfVxyXG4gICAgICAgIGxldCBtYXJrZWQgPSAwO1xyXG4gICAgICAgIChBcnJheS5pc0FycmF5KGVycj8ucm93RXJyb3JzKSA/IGVyci5yb3dFcnJvcnMgOiBbXSkuZm9yRWFjaCgoeDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCByb3cgPSBzZW50W051bWJlcih4LnJvdykgLSAxXTtcclxuICAgICAgICAgIGlmIChyb3cpIHsgdGhpcy5zZXJ2ZXJFcnJvcnMuc2V0KHJvdy5rZXkgKyAnfCcgKyBTdHJpbmcoeC5maWVsZCksIFN0cmluZyh4Lm1lc3NhZ2UgfHwgJ0NoZWNrIHRoaXMgdmFsdWUnKSk7IG1hcmtlZCsrOyB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycj8ubWVzc2FnZSB8fCAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycgPyBlcnIgOiAnJykgfHwgJ0NvdWxkIG5vdCBzYXZlIHRoZSBzY2hlZHVsZSc7XHJcbiAgICAgICAgLy8gQSByZWZ1c2FsIHRoYXQgbmFtZXMgbm8gcm93IChhdWRpdCBub3QgcmVhZHksIGEgdmlzaXQgdGhhdCBjYW5ub3QgYmUgcmFpc2VkKSBzdGlsbCB0dXJuc1xyXG4gICAgICAgIC8vIHRoZSBiYW5uZXIgZnJvbSBcIlJlYWR5IHRvIHB1Ymxpc2hcIiB0byB0aGUgcmVhc29uLCB1bnRpbCB0aGUgcm93cyBhcmUgZWRpdGVkLlxyXG4gICAgICAgIHRoaXMucHVibGlzaFByb2JsZW0gPSBwdWJsaXNoICYmICFtYXJrZWQgPyBtZXNzYWdlIDogJyc7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gQ1NWIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHByaXZhdGUgcm93c0Zyb21UYWJsZShyb3dzOiBzdHJpbmdbXVtdKTogRWRpdG9yUm93W10ge1xyXG4gICAgY29uc3QgdGFibGUgPSByb3dzLmZpbHRlcihyID0+IHIuc29tZShjID0+IFN0cmluZyhjID8/ICcnKS50cmltKCkpKTtcclxuICAgIGlmICh0YWJsZS5sZW5ndGggPCAyKSB7IHJldHVybiBbXTsgfVxyXG4gICAgY29uc3QgaGVhZCA9IHRhYmxlWzBdLm1hcChoID0+IGgudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgY29uc3QgY29sID0gKC4uLm5hbWVzOiBzdHJpbmdbXSkgPT4gaGVhZC5maW5kSW5kZXgoaCA9PiBuYW1lcy5zb21lKG4gPT4gaC5pbmNsdWRlcyhuKSkpO1xyXG4gICAgY29uc3QgY0RhdGUgPSBjb2woJ2RhdGUnKTtcclxuICAgIGNvbnN0IGNFbWFpbCA9IGNvbCgnZW1haWwnLCAndXNlcicpO1xyXG4gICAgY29uc3QgY1N0b3JlID0gY29sKCdzdG9yZScpO1xyXG4gICAgY29uc3QgY0F1ZGl0ID0gY29sKCdhdWRpdCcsICdjaGVja2xpc3QnKTtcclxuICAgIGNvbnN0IGNTdGFydCA9IGNvbCgnc3RhcnQnKTtcclxuICAgIGNvbnN0IGNFbmQgPSBjb2woJ2VuZCcpO1xyXG4gICAgY29uc3QgYnlOYW1lID0gbmV3IE1hcCh0aGlzLmFsbEF1ZGl0cy5tYXAoYSA9PiBbYS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBhLmlkXSkpO1xyXG4gICAgY29uc3QgY2VsbCA9IChyOiBzdHJpbmdbXSwgaTogbnVtYmVyKSA9PiAoaSA+PSAwID8gU3RyaW5nKHJbaV0gfHwgJycpLnRyaW0oKSA6ICcnKTtcclxuICAgIC8vIFRlbXBsYXRlIHJvd3Mgc3RpbGwgaG9sZGluZyBvbmx5IHRoZWlyIEF1ZGl0IG5hbWUgd2VyZSBuZXZlciBmaWxsZWQgaW4sIGFuZCB0aGUgZ3VpZGFuY2Ugcm93XHJcbiAgICAvLyAoVEVNUExBVEVfSElOVFMpIGlzIG5vdCBhIHJvdzogc2tpcCB0aGVtLlxyXG4gICAgY29uc3QgZmlsbGVkID0gKHI6IHN0cmluZ1tdKSA9PiBbY0RhdGUsIGNFbWFpbCwgY1N0b3JlLCBjU3RhcnQsIGNFbmRdLnNvbWUoaSA9PiBjZWxsKHIsIGkpKTtcclxuICAgIGNvbnN0IGhpbnQgPSAocjogc3RyaW5nW10pID0+IHIuc29tZShjID0+IEhJTlRfVEVYVFMuaGFzKFN0cmluZyhjID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgcmV0dXJuIHRhYmxlLnNsaWNlKDEpLmZpbHRlcihyID0+IGZpbGxlZChyKSAmJiAhaGludChyKSkubWFwKHIgPT4ge1xyXG4gICAgICBjb25zdCBhdWRpdElkID0gYnlOYW1lLmdldChjZWxsKHIsIGNBdWRpdCkudG9Mb3dlckNhc2UoKSkgfHwgJyc7XHJcbiAgICAgIC8vIEEgcm93IG5hbWluZyBhbm90aGVyIGF1ZGl0IGFkZHMgaXQgdG8gdGhlIHNjaGVkdWxlJ3MgYXVkaXRzIChzYXZlKCkgZG9lcyB0aGUgc2FtZSkuXHJcbiAgICAgIGlmIChhdWRpdElkICYmICF0aGlzLnBpY2tzLmluY2x1ZGVzKGF1ZGl0SWQpKSB7IHRoaXMucGlja3MgPSBbLi4udGhpcy5waWNrcywgYXVkaXRJZF07IH1cclxuICAgICAgLy8gVGhlIFN0b3JlIGNvbHVtbiBob2xkcyB0aGUgc3RvcmUgbmFtZSAob2xkZXIgdGVtcGxhdGVzOiB0aGUgc3RvcmUgaWQpOyBlaXRoZXIgcGlja3MgdGhlIHN0b3JlLlxyXG4gICAgICBjb25zdCBzdG9yZSA9IGNlbGwociwgY1N0b3JlKTtcclxuICAgICAgY29uc3Qgc3RvcmVJZCA9IHRoaXMuc3RvcmVJZEZvcihzdG9yZSk7XHJcbiAgICAgIHJldHVybiB0aGlzLnJvdyh7XHJcbiAgICAgICAgZGF0ZTogdG9Jc29EYXRlKGNlbGwociwgY0RhdGUpKSxcclxuICAgICAgICB1c2VyRW1haWw6IGNlbGwociwgY0VtYWlsKS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgIHN0b3JlSWQsXHJcbiAgICAgICAgc3RvcmVUZXh0OiBzdG9yZUlkID8gKHRoaXMuc3RvcmVMYWJlbChzdG9yZUlkKSB8fCBzdG9yZSkgOiBzdG9yZSxcclxuICAgICAgICBjaGVja0xpc3RJZDogYXVkaXRJZCB8fCAodGhpcy5waWNrcy5sZW5ndGggPT09IDEgPyB0aGlzLnBpY2tzWzBdIDogJycpLFxyXG4gICAgICAgIHN0YXJ0OiB0b1RpbWUoY2VsbChyLCBjU3RhcnQpKSxcclxuICAgICAgICBlbmQ6IHRvVGltZShjZWxsKHIsIGNFbmQpKVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHRlbXBsYXRlIGFzIHhsc3g6IFN0b3JlIG5hbWUgYW5kIEF1ZGl0IGFyZSBkcm9wZG93bnMgb2YgdGhlIGNsaWVudCdzIHN0b3JlcyBhbmQgdGhlIGF1ZGl0cyBvbiBvZmZlci4gV2FpdHMgZm9yXHJcbiAgICogdGhlIHN0b3JlIGxpc3QgKGxvYWRlZCB3aGVuIHRoZSBlZGl0b3Igb3BlbnMpLCBzbyBhIHF1aWNrIGNsaWNrIHN0aWxsIGdldHMgdGhlIFN0b3JlIG5hbWUgZHJvcGRvd24uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkb3dubG9hZFhsc3goZmlsZU5hbWU6IHN0cmluZywgbGluZXM6IHN0cmluZ1tdW10pOiB2b2lkIHtcclxuICAgIHRoaXMudGVtcGxhdGVXYWl0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucGVvcGxlUmVhZHkkLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnRlbXBsYXRlV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICBpZiAoIXRoaXMuc3RvcmVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQ291bGQgbm90IGxvYWQgdGhlIHN0b3JlIGxpc3Qg4oCUIFN0b3JlIG5hbWUgaGFzIG5vIGRyb3Bkb3duIGluIHRoaXMgdGVtcGxhdGUnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLndyaXRlWGxzeChmaWxlTmFtZSwgbGluZXMpO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3cml0ZVhsc3goZmlsZU5hbWU6IHN0cmluZywgbGluZXM6IHN0cmluZ1tdW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0b3JlcyA9IFsuLi5uZXcgU2V0KHRoaXMuc3RvcmVzLm1hcChzID0+IHMuc3RvcmVOYW1lIHx8IHMuc3RvcmVJZCkuZmlsdGVyKEJvb2xlYW4pKV0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcclxuICAgIGNvbnN0IGF1ZGl0cyA9IFsuLi5uZXcgU2V0KHRoaXMucm93QXVkaXRPcHRpb25zLm1hcChhID0+IGEubmFtZSkuZmlsdGVyKEJvb2xlYW4pKV07XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3NjaGVkdWxlVGVtcGxhdGVYbHN4KGxpbmVzLCBzdG9yZXMsIGF1ZGl0cyldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcgfSk7XHJcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGEuaHJlZiA9IHVybDtcclxuICAgIGEuZG93bmxvYWQgPSBmaWxlTmFtZTtcclxuICAgIGEuY2xpY2soKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZG93bmxvYWQoZmlsZU5hbWU6IHN0cmluZywgbGluZXM6IHN0cmluZ1tdW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGNzdiA9IGxpbmVzLm1hcChsID0+IGwubWFwKGNzdkNlbGwpLmpvaW4oJywnKSkuam9pbignXFxyXFxuJyk7XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2Nzdl0sIHsgdHlwZTogJ3RleHQvY3N2O2NoYXJzZXQ9dXRmLTgnIH0pO1xyXG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBhLmhyZWYgPSB1cmw7XHJcbiAgICBhLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBhLmNsaWNrKCk7XHJcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgfVxyXG59XHJcblxyXG4vKiogQSB3ZWxsLWZvcm1lZCBlbWFpbCAoYW4gZW1haWwgdGhlIGludml0ZSBjYW4gY3JlYXRlIGEgdXNlciBmb3IpLiAqL1xyXG5jb25zdCBFTUFJTCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvO1xyXG5cclxuLyoqIFdoeSAvc2NoZWR1bGUvaW52aXRlIGxlZnQgYW4gZW1haWwgb3V0IChpdHMgYHNraXBwZWRbXS5yZWFzb25gKS4gKi9cclxuY29uc3QgSU5WSVRFX1JFQVNPTlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgaW5hY3RpdmU6ICdpbmFjdGl2ZSB1c2VyLCBhY3RpdmF0ZSBpdCBpbiBNYW5hZ2UgPiBVc2VycycsXHJcbiAgb3RoZXJDbGllbnQ6ICdiZWxvbmdzIHRvIGFub3RoZXIgY2xpZW50JyxcclxuICBmYWlsZWQ6ICdjb3VsZCBub3QgYmUgY3JlYXRlZCdcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSb3cgMiBvZiB0aGUgZG93bmxvYWRlZCB0ZW1wbGF0ZTogd2hhdCBlYWNoIGNvbHVtbiB0YWtlcyAoUUE6IHNob3cgcGxhY2Vob2xkZXJzKS4gSW1wb3J0IHNraXBzIGEgcm93IGhvbGRpbmdcclxuICogYW55IG9mIHRoZXNlIHRleHRzLCBzbyBpdCBjYW4gYmUgbGVmdCBpbiB0aGUgZmlsZS5cclxuICovXHJcbmNvbnN0IFRFTVBMQVRFX0hJTlRTID0gW1xyXG4gICdQbGVhc2UgZW50ZXIgZGF0ZSAoREQtTU0tWVlZWSknLFxyXG4gICdQbGVhc2UgZW50ZXIgdmFsaWQgdXNlciBlbWFpbCcsXHJcbiAgJ1BpY2sgYSBzdG9yZSBmcm9tIHRoZSBkcm9wZG93bicsXHJcbiAgJ1BpY2sgYW4gYXVkaXQgZnJvbSB0aGUgZHJvcGRvd24nLFxyXG4gICdPcHRpb25hbDogSEg6TU0sIGUuZy4gMTA6MDAnLFxyXG4gICdPcHRpb25hbDogSEg6TU0sIGUuZy4gMTg6MDAnXHJcbl07XHJcbmNvbnN0IEhJTlRfVEVYVFMgPSBuZXcgU2V0KFRFTVBMQVRFX0hJTlRTLm1hcChoID0+IGgudG9Mb3dlckNhc2UoKSkpO1xyXG5cclxuLyoqIExhc3Qgcm93IHRoZSB0ZW1wbGF0ZSBkcm9wZG93bnMgY292ZXIuICovXHJcbmNvbnN0IFRFTVBMQVRFX1JPV1MgPSA1MDAwO1xyXG5cclxuLyoqXHJcbiAqIFNjaGVkdWxlIHRlbXBsYXRlIHdvcmtib29rLiBTaGVldCBTY2hlZHVsZSBob2xkcyB0aGUgcm93czsgU3RvcmUgbmFtZSAoQykgYW5kIEF1ZGl0IChEKSBhcmUgbGlzdFxyXG4gKiBkcm9wZG93bnMgb3ZlciBhIGhpZGRlbiBMaXN0cyBzaGVldCAoYSBjbGllbnQncyB0aG91c2FuZHMgb2Ygc3RvcmUgbmFtZXMgZG8gbm90IGZpdCBFeGNlbCdzIDI1NS1jaGFyYWN0ZXJcclxuICogaW5saW5lIGxpc3QpLiBUaGUgY29tbXVuaXR5IHhsc3ggYnVpbGQgY2Fubm90IHdyaXRlIGRhdGEgdmFsaWRhdGlvbiwgc28gaXQgaXMgYWRkZWQgdG8gdGhlIHNoZWV0IFhNTFxyXG4gKiAoQ1RfV29ya3NoZWV0IG9yZGVyOiBkYXRhVmFsaWRhdGlvbnMgZm9sbG93cyBzaGVldERhdGEpLCBhcyB0aGUgcXVlc3Rpb24gdGVtcGxhdGUgZG9lcyAoYnVsay11cGxvYWQpLlxyXG4gKi9cclxuZnVuY3Rpb24gc2NoZWR1bGVUZW1wbGF0ZVhsc3gobGluZXM6IHN0cmluZ1tdW10sIHN0b3Jlczogc3RyaW5nW10sIGF1ZGl0czogc3RyaW5nW10pOiBVaW50OEFycmF5IHtcclxuICBjb25zdCBib29rID0gWExTWC51dGlscy5ib29rX25ldygpO1xyXG4gIGNvbnN0IHNoZWV0ID0gWExTWC51dGlscy5hb2FfdG9fc2hlZXQobGluZXMpO1xyXG4gIHNoZWV0WychY29scyddID0gW3sgd2NoOiAxMiB9LCB7IHdjaDogMzIgfSwgeyB3Y2g6IDI2IH0sIHsgd2NoOiAzNCB9LCB7IHdjaDogMTEgfSwgeyB3Y2g6IDExIH1dO1xyXG4gIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQoYm9vaywgc2hlZXQsICdTY2hlZHVsZScpO1xyXG4gIGNvbnN0IGNvdW50ID0gTWF0aC5tYXgoc3RvcmVzLmxlbmd0aCwgYXVkaXRzLmxlbmd0aCk7XHJcbiAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldChib29rLCBYTFNYLnV0aWxzLmFvYV90b19zaGVldChbWydTdG9yZXMnLCAnQXVkaXRzJ10sXHJcbiAgICAuLi5BcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4gW3N0b3Jlc1tpXSA/PyAnJywgYXVkaXRzW2ldID8/ICcnXSldKSwgJ0xpc3RzJyk7XHJcbiAgYm9vay5Xb3JrYm9vayA9IHsgU2hlZXRzOiBbeyBIaWRkZW46IDAgfSwgeyBIaWRkZW46IDEgfV0gfTtcclxuICBjb25zdCBsaXN0ID0gKGNvbDogc3RyaW5nLCBsaXN0Q29sOiBzdHJpbmcsIG46IG51bWJlcikgPT4gKG4gPyAnPGRhdGFWYWxpZGF0aW9uIHR5cGU9XCJsaXN0XCIgYWxsb3dCbGFuaz1cIjFcIiBzaG93RXJyb3JNZXNzYWdlPVwiMVwiICdcclxuICAgICsgJ2Vycm9yVGl0bGU9XCJOb3QgaW4gdGhlIGxpc3RcIiBlcnJvcj1cIlBpY2sgYSB2YWx1ZSBmcm9tIHRoZSBkcm9wZG93bi5cIiBzcXJlZj1cIicgKyBjb2wgKyAnMjonICsgY29sICsgVEVNUExBVEVfUk9XUyArICdcIj4nXHJcbiAgICArICc8Zm9ybXVsYTE+TGlzdHMhJCcgKyBsaXN0Q29sICsgJyQyOiQnICsgbGlzdENvbCArICckJyArIChuICsgMSkgKyAnPC9mb3JtdWxhMT48L2RhdGFWYWxpZGF0aW9uPicgOiAnJyk7XHJcbiAgY29uc3QgcnVsZXMgPSBsaXN0KCdDJywgJ0EnLCBzdG9yZXMubGVuZ3RoKSArIGxpc3QoJ0QnLCAnQicsIGF1ZGl0cy5sZW5ndGgpO1xyXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoWExTWC53cml0ZShib29rLCB7IGJvb2tUeXBlOiAneGxzeCcsIHR5cGU6ICdhcnJheScgfSkpO1xyXG4gIGlmICghcnVsZXMpIHsgcmV0dXJuIGJ5dGVzOyB9XHJcbiAgY29uc3QgQ0ZCID0gKFhMU1ggYXMgYW55KS5DRkI7XHJcbiAgY29uc3QgemlwID0gQ0ZCLnJlYWQoYnl0ZXMsIHsgdHlwZTogJ2FycmF5JyB9KTtcclxuICBjb25zdCBlbnRyeSA9IHppcC5GaWxlSW5kZXhbemlwLkZ1bGxQYXRocy5maW5kSW5kZXgoKHA6IHN0cmluZykgPT4gcC5lbmRzV2l0aCgneGwvd29ya3NoZWV0cy9zaGVldDEueG1sJykpXTtcclxuICBpZiAoIWVudHJ5Py5jb250ZW50KSB7IHJldHVybiBieXRlczsgfVxyXG4gIGNvbnN0IHhtbDogc3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGVudHJ5LmNvbnRlbnQpO1xyXG4gIGNvbnN0IG4gPSAocnVsZXMubWF0Y2goLzxkYXRhVmFsaWRhdGlvbiAvZykgfHwgW10pLmxlbmd0aDtcclxuICBlbnRyeS5jb250ZW50ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHhtbC5yZXBsYWNlKCc8L3NoZWV0RGF0YT4nLCAnPC9zaGVldERhdGE+PGRhdGFWYWxpZGF0aW9ucyBjb3VudD1cIicgKyBuICsgJ1wiPicgKyBydWxlcyArICc8L2RhdGFWYWxpZGF0aW9ucz4nKSk7XHJcbiAgZW50cnkuc2l6ZSA9IGVudHJ5LmNvbnRlbnQubGVuZ3RoO1xyXG4gIHJldHVybiBuZXcgVWludDhBcnJheShDRkIud3JpdGUoemlwLCB7IGZpbGVUeXBlOiAnemlwJywgdHlwZTogJ2FycmF5JyB9KSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGUgZmlyc3Qgc2hlZXQgb2YgYW4gdXBsb2FkZWQgeGxzeCBhcyB0ZXh0IHJvd3MuIEEgZGF0ZSBvciB0aW1lIHR5cGVkIGluIEV4Y2VsIGlzIHN0b3JlZCBhcyBhIHNlcmlhbCBudW1iZXI7IGluXHJcbiAqIHRoZSBEYXRlIC8gVmlzaXQgc3RhcnQgLyBWaXNpdCBlbmQgY29sdW1ucyBpdCBpcyBkZWNvZGVkIHdpdGggdGhlIHNoZWV0J3Mgb3duIGNhbGVuZGFyIChTU0YpLCBub3QgYSBKUyBEYXRlICh0aGF0XHJcbiAqIHNoaWZ0cyB0aGUgZGF5IGJ5IHRoZSBicm93c2VyJ3MgdGltZSB6b25lKSwgYW5kIHdyaXR0ZW4gYXMgWVlZWS1NTS1ERCAvIEhIOm1tIHNvIGl0IHJlYWRzIGxpa2UgdGhlIENTViB0ZXh0LlxyXG4gKi9cclxuZnVuY3Rpb24gc2hlZXRUYWJsZShkYXRhOiBBcnJheUJ1ZmZlcik6IHN0cmluZ1tdW10ge1xyXG4gIGNvbnN0IGJvb2sgPSBYTFNYLnJlYWQoZGF0YSwgeyB0eXBlOiAnYXJyYXknIH0pO1xyXG4gIGNvbnN0IHNoZWV0ID0gYm9vay5TaGVldHNbYm9vay5TaGVldE5hbWVzLmluY2x1ZGVzKCdTY2hlZHVsZScpID8gJ1NjaGVkdWxlJyA6IGJvb2suU2hlZXROYW1lc1swXV07XHJcbiAgY29uc3Qgcm93czogYW55W11bXSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwgeyBoZWFkZXI6IDEsIHJhdzogdHJ1ZSwgZGVmdmFsOiAnJyB9KTtcclxuICBjb25zdCBoZWFkID0gKHJvd3NbMF0gfHwgW10pLm1hcChoID0+IFN0cmluZyhoID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgY29uc3QgdGltZUNvbHMgPSBuZXcgU2V0KGhlYWQubWFwKChoLCBpKSA9PiAoL2RhdGV8c3RhcnR8ZW5kLy50ZXN0KGgpID8gaSA6IC0xKSkuZmlsdGVyKGkgPT4gaSA+PSAwKSk7XHJcbiAgY29uc3QgcGFkID0gKG46IG51bWJlcikgPT4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgY29uc3QgdGV4dCA9ICh2OiBhbnksIGk6IG51bWJlcikgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiB2ICE9PSAnbnVtYmVyJyB8fCAhdGltZUNvbHMuaGFzKGkpKSB7IHJldHVybiBTdHJpbmcodiA/PyAnJyk7IH1cclxuICAgIGNvbnN0IGQgPSAoWExTWCBhcyBhbnkpLlNTRi5wYXJzZV9kYXRlX2NvZGUodik7XHJcbiAgICBpZiAoIWQpIHsgcmV0dXJuIFN0cmluZyh2KTsgfVxyXG4gICAgcmV0dXJuIHYgPCAxID8gcGFkKGQuSCkgKyAnOicgKyBwYWQoZC5NKSA6IGQueSArICctJyArIHBhZChkLm0pICsgJy0nICsgcGFkKGQuZCk7XHJcbiAgfTtcclxuICByZXR1cm4gcm93cy5tYXAoKHIsIHJpKSA9PiByLm1hcCgodiwgaSkgPT4gKHJpID09PSAwID8gU3RyaW5nKHYgPz8gJycpIDogdGV4dCh2LCBpKSkpKTtcclxufVxyXG5cclxuLyoqIFF1b3RlIGEgQ1NWIGNlbGwgd2hlbiBpdCBuZWVkcyBpdC4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNzdkNlbGwodjogYW55KTogc3RyaW5nIHtcclxuICBjb25zdCBzID0gU3RyaW5nKHYgPz8gJycpO1xyXG4gIHJldHVybiAvW1wiLFxcclxcbl0vLnRlc3QocykgPyAnXCInICsgcy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpICsgJ1wiJyA6IHM7XHJcbn1cclxuXHJcbi8qKiBNaW5pbWFsIFJGQyA0MTgwIHJlYWRlcjogcXVvdGVkIGNlbGxzLCBlc2NhcGVkIHF1b3RlcywgQ1JMRiBvciBMRi4gKi9cclxuZnVuY3Rpb24gcGFyc2VDc3YodGV4dDogc3RyaW5nKTogc3RyaW5nW11bXSB7XHJcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXVtdID0gW107XHJcbiAgbGV0IHJvdzogc3RyaW5nW10gPSBbXTtcclxuICBsZXQgY2VsbCA9ICcnO1xyXG4gIGxldCBxdW90ZWQgPSBmYWxzZTtcclxuICBjb25zdCBzcmMgPSB0ZXh0LnJlcGxhY2UoL17vu78vLCAnJyk7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGNoID0gc3JjW2ldO1xyXG4gICAgaWYgKHF1b3RlZCkge1xyXG4gICAgICBpZiAoY2ggPT09ICdcIicgJiYgc3JjW2kgKyAxXSA9PT0gJ1wiJykgeyBjZWxsICs9ICdcIic7IGkrKzsgfVxyXG4gICAgICBlbHNlIGlmIChjaCA9PT0gJ1wiJykgeyBxdW90ZWQgPSBmYWxzZTsgfVxyXG4gICAgICBlbHNlIHsgY2VsbCArPSBjaDsgfVxyXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJ1wiJykge1xyXG4gICAgICBxdW90ZWQgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJywnKSB7XHJcbiAgICAgIHJvdy5wdXNoKGNlbGwpOyBjZWxsID0gJyc7XHJcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnXFxuJyB8fCBjaCA9PT0gJ1xccicpIHtcclxuICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiBzcmNbaSArIDFdID09PSAnXFxuJykgeyBpKys7IH1cclxuICAgICAgcm93LnB1c2goY2VsbCk7IG91dC5wdXNoKHJvdyk7IHJvdyA9IFtdOyBjZWxsID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjZWxsICs9IGNoO1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoY2VsbCB8fCByb3cubGVuZ3RoKSB7IHJvdy5wdXNoKGNlbGwpOyBvdXQucHVzaChyb3cpOyB9XHJcbiAgcmV0dXJuIG91dDtcclxufVxyXG5cclxuLyoqIERELU1NLVlZWVksIEREL01NL1lZWVkgb3IgWVlZWS1NTS1ERCB0byBZWVlZLU1NLUREOyBhbnl0aGluZyBlbHNlIHN0YXlzIGJsYW5rLiAqL1xyXG5mdW5jdGlvbiB0b0lzb0RhdGUodjogc3RyaW5nKTogc3RyaW5nIHtcclxuICBsZXQgbSA9IHYubWF0Y2goL14oXFxkezR9KS0oXFxkezEsMn0pLShcXGR7MSwyfSkkLyk7XHJcbiAgaWYgKG0pIHsgcmV0dXJuIG1bMV0gKyAnLScgKyBtWzJdLnBhZFN0YXJ0KDIsICcwJykgKyAnLScgKyBtWzNdLnBhZFN0YXJ0KDIsICcwJyk7IH1cclxuICBtID0gdi5tYXRjaCgvXihcXGR7MSwyfSlbLS8uXShcXGR7MSwyfSlbLS8uXShcXGR7NH0pJC8pO1xyXG4gIGlmIChtKSB7IHJldHVybiBtWzNdICsgJy0nICsgbVsyXS5wYWRTdGFydCgyLCAnMCcpICsgJy0nICsgbVsxXS5wYWRTdGFydCgyLCAnMCcpOyB9XHJcbiAgcmV0dXJuICcnO1xyXG59XHJcblxyXG4vKiogSDptbSBvciBISDptbSAoMjRoKSB0byBISDptbTsgXCJibGFua1wiIGFuZCBhbnl0aGluZyBlbHNlIHN0YXkgYmxhbmsuICovXHJcbmZ1bmN0aW9uIHRvVGltZSh2OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IG0gPSB2Lm1hdGNoKC9eKFxcZHsxLDJ9KTooXFxkezJ9KSQvKTtcclxuICByZXR1cm4gbSAmJiBOdW1iZXIobVsxXSkgPCAyNCAmJiBOdW1iZXIobVsyXSkgPCA2MCA/IG1bMV0ucGFkU3RhcnQoMiwgJzAnKSArICc6JyArIG1bMl0gOiAnJztcclxufVxyXG4iLCI8aW5wdXQgI2NzdklucHV0IHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiLnhsc3gsLmNzdix0ZXh0L2NzdlwiIGNsYXNzPVwic2UtaGlkZGVuXCIgKGNoYW5nZSk9XCJvbkNzdlBpY2tlZCgkZXZlbnQpXCI+XG5cbjwhLS0gRWRpdGluZyBvcGVucyBvbiB0aGUgUm93cyBzdGVwLCBzbyBpdHMgc2tlbGV0b24gbWlycm9ycyB0aGF0IHNjcmVlbi4gLS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZ0VkaXRcIj5cbiAgPGRpdiBjbGFzcz1cInNlLXRpdGxlYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cInNlLXRpdGxldGV4dFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgc2Utc2stY3J1bWJcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXRpdGxlIHNlLXNrLW5hbWVcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzZS1jYXJkIHNlLWNhcmQtLXRhYmxlXCI+XG4gICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gPT09PT09PT09PT09IENyZWF0ZSBzY2hlZHVsZSA9PT09PT09PT09PT0gLS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwic3RlcCA9PT0gJ2NyZWF0ZScgJiYgIWxvYWRpbmdFZGl0XCI+XG4gIDxkaXYgY2xhc3M9XCJzZS1iYWNrYmFyXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtIHNlLWJhY2tcIiAoY2xpY2spPVwiYmFjaygpXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMTUgNiA5IDEyIDE1IDE4XCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgIHt7IGJhY2tMYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJzZS1jcnVtYlwiPjxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cImJhY2soJGV2ZW50KVwiPlNjaGVkdWxlPC9hPiDigLoge3sgc2NoZWR1bGVJZCA/IG5hbWUgfHwgJ1NjaGVkdWxlJyA6ICdDcmVhdGUgc2NoZWR1bGUnIH19PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzZS1jcmVhdGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2UtY2FyZCBzZS1jYXJkLS1mb3JtXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNlLWJhZGdlXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjlcIj48L2NpcmNsZT48cGF0aCBkPVwiTTEyIDh2OE04IDEyaDhcIj48L3BhdGg+PC9zdmc+XG4gICAgICA8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwic2UtaGVhZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2UtdGl0bGVcIj57eyBzY2hlZHVsZUlkID8gJ0VkaXQgc2NoZWR1bGUnIDogJ0NyZWF0ZSBzY2hlZHVsZScgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXN1YlwiPnt7IHNjaGVkdWxlSWQgPyAnUmVuYW1lIHRoZSBzY2hlZHVsZSwgb3IgYWRkIHJvd3MgZnJvbSB0aGUgdGVtcGxhdGUuJyA6IChsb2NrZWQgPyAnTmFtZSB0aGUgc2NoZWR1bGUsIHRoZW4gYWRkIHJvd3MgZm9yIHRoaXMgYXVkaXQuJyA6ICdOYW1lIHRoZSBzY2hlZHVsZSwgdGhlbiBhZGQgcm93cy4nKSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gT3BlbmVkIGZyb20gYW4gYXVkaXQncyBDb25maWd1cmUgcGFnZTogdGhhdCBhdWRpdCBpcyB0aGUgc2NoZWR1bGUncyBhdWRpdCwgbmFtZWQgb25jZSBoZXJlXG4gICAgICAgICAgIGluc3RlYWQgb2YgYW4gYXVkaXQgcGlja2VyIGNhcmQgKFFBOiB0aGUgY2FyZCBpcyBub3QgbmVlZGVkIHdoZW4gdGhlIGF1ZGl0IGlzIGFscmVhZHkgY2hvc2VuKS4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2UtZml4ZWQtYXVkaXRcIiAqbmdJZj1cImxvY2tlZFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWxhYmVsXCI+e3sgcGlja2VkQXVkaXRzLmxlbmd0aCA+IDEgPyAnQXVkaXRzJyA6ICdBdWRpdCcgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2UtZml4ZWQtYXVkaXQtbmFtZVwiPnt7IGxvY2tlZEF1ZGl0TmFtZXMgfHwgJ0xvYWRpbmcgYXVkaXTigKYnIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInNlLWZpZWxkXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2UtbGFiZWxcIj5TY2hlZHVsZSBuYW1lPC9zcGFuPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNlLWlucHV0XCIgWyhuZ01vZGVsKV09XCJuYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuIEZlYnJ1YXJ5IGh5Z2llbmUgcm91bmRcIj5cbiAgICAgIDwvbGFiZWw+XG5cbiAgICAgIDwhLS0gRXZlcnkgYXVkaXQsIHdpdGggdGhlIG9uZXMgcGlja2VkIG9uIHRoZSBwcmV2aW91cyBwYWdlIChOb3Qgc2NoZWR1bGVkKSBhbHJlYWR5IHRpY2tlZC5cbiAgICAgICAgICAgQ3JlYXRlIG9ubHk6IEVkaXQgc2NoZWR1bGUga2VlcHMgdGhlIHNjaGVkdWxlJ3MgYXVkaXRzIGFuZCBkb2VzIG5vdCBhc2sgZm9yIHRoZW0gKFFBKS5cbiAgICAgICAgICAgSGlkZGVuIGZvciBub3cgb24gYm90aCAoc2hvd0F1ZGl0UGlja2VyKS4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2UtZmllbGRcIiAqbmdJZj1cInNob3dBdWRpdFBpY2tlciAmJiAhbG9ja2VkICYmICFzY2hlZHVsZUlkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS1yb3dcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWxhYmVsIHNlLWdyb3dcIj5BdWRpdHMgdG8gc2NoZWR1bGU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1jb3VudFwiPnt7IHBpY2tDb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInNlLXNlYXJjaFwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3XCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+PC9zdmc+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJwaWNrUXVlcnlcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhdWRpdHNcIj5cbiAgICAgICAgICA8YSBjbGFzcz1cInNlLWNsZWFyXCIgKm5nSWY9XCJwaWNrUXVlcnkudHJpbSgpXCIgdGl0bGU9XCJDbGVhciBzZWFyY2hcIiAoY2xpY2spPVwicGlja1F1ZXJ5ID0gJydcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXBpY2tsaXN0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlLXBpY2tyb3cgc2UtcGlja3Jvdy0tYWxsXCIgKGNsaWNrKT1cInRvZ2dsZUFsbFBpY2tzKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2UtYm94XCIgW2NsYXNzLmlzLW9uXT1cImFsbFBpY2tlZFwiPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiYWxsUGlja2VkXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2UtcGlja2FsbFwiPnt7IGFsbExhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1lbXB0eS1zbVwiICpuZ0lmPVwiIXBpY2thYmxlcy5sZW5ndGhcIj5ObyBhdWRpdHMgbWF0Y2ggdGhhdCBzZWFyY2guPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlLXBpY2tyb3dcIiAqbmdGb3I9XCJsZXQgYSBvZiBwaWNrYWJsZXM7IHRyYWNrQnk6IHRyYWNrQnlBdWRpdFwiIFtjbGFzcy5pcy1vbl09XCJpc1BpY2tlZChhKVwiIChjbGljayk9XCJ0b2dnbGVQaWNrKGEpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWJveFwiIFtjbGFzcy5pcy1vbl09XCJpc1BpY2tlZChhKVwiPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNQaWNrZWQoYSlcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1waWNrbmFtZVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWVsbGlwc2lzXCI+e3sgYS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLW1ldGFcIj57eyBhLm1ldGEgfX17eyBhLnF1ZXN0aW9ucyA/ICcgwrcgJyArIGEucXVlc3Rpb25zICsgJyBxdWVzdGlvbnMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxvbCBjbGFzcz1cInNlLXN0ZXBzXCI+XG4gICAgICAgIDxsaT5Vc2UgdGhlIHRlbXBsYXRlIHRvIHNjaGVkdWxlIG11bHRpcGxlIHVzZXJzIGF0IG9uY2UuPC9saT5cbiAgICAgICAgPGxpPkRvd25sb2FkIHRoZSB0ZW1wbGF0ZSBoZXJlIOKAlCA8YSBocmVmPVwiI1wiIChjbGljayk9XCJkb3dubG9hZFRlbXBsYXRlKCRldmVudClcIj57eyB0ZW1wbGF0ZUxvYWRpbmcgfHwgdGVtcGxhdGVXYWl0aW5nID8gJ1ByZXBhcmluZ+KApicgOiAnRG93bmxvYWQgdGVtcGxhdGUnIH19PC9hPjwvbGk+XG4gICAgICAgIDxsaT5BZGQgeW91ciBkYXRhLCB0aGVuIHVwbG9hZCBpdCBiZWxvdy48L2xpPlxuICAgICAgPC9vbD5cblxuICAgICAgPGRpdiBjbGFzcz1cInNlLWFjdGlvbnNcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idG4tbGcgc2UtYnRuLWxnLS1wcmltYXJ5XCIgW2NsYXNzLmlzLW9mZl09XCIhcmVhZHlcIiBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIiFyZWFkeVwiXG4gICAgICAgICAgW25nYlRvb2x0aXBdPVwibm90UmVhZHlSZWFzb25cIiBbZGlzYWJsZVRvb2x0aXBdPVwicmVhZHlcIiBwbGFjZW1lbnQ9XCJ0b3BcIiAoY2xpY2spPVwiaW1wb3J0Q3N2KClcIj5JbXBvcnQgZnJvbSBDU1Y8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1vclwiPm9yPC9zcGFuPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ0bi1sZyBzZS1idG4tbGctLWdob3N0XCIgW2NsYXNzLmlzLW9mZl09XCIhcmVhZHlcIiBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIiFyZWFkeVwiXG4gICAgICAgICAgW25nYlRvb2x0aXBdPVwibm90UmVhZHlSZWFzb25cIiBbZGlzYWJsZVRvb2x0aXBdPVwicmVhZHlcIiBwbGFjZW1lbnQ9XCJ0b3BcIiAoY2xpY2spPVwiYWRkU2luZ2xlKClcIj5BZGQgYSBzaW5nbGUgcm93PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gSGlkZGVuIGZvciBub3cgb24gYm90aCBDcmVhdGUgYW5kIEVkaXQgKHNob3dUZW1wbGF0ZVByZXZpZXcpLiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic2UtY2FyZCBzZS1jYXJkLS1zaWRlXCIgKm5nSWY9XCJzaG93VGVtcGxhdGVQcmV2aWV3XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2UtaGVhZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Utc2lkZS10aXRsZVwiPldoYXQgdGhlIHRlbXBsYXRlIGV4cGVjdHM8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXN1YlwiPk9uZSByb3cgcGVyIHVzZXIsIHN0b3JlIGFuZCBkYXRlLiBUaGVzZSBhcmUgdGhlIHJvd3MgdGhlIGRvd25sb2FkZWQgdGVtcGxhdGUgd2lsbCBob2xkIGZvciB0aGUgc2VsZWN0ZWRcbiAgICAgICAgICB7eyBwaWNrcy5sZW5ndGggPT09IDEgPyAnYXVkaXQnIDogJ2F1ZGl0cycgfX0g4oCUIGVkaXQgb3IgYWRkIHJvd3MgaW4gdGhlIGZpbGUsIHRoZW4gaW1wb3J0IGl0LjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2Utc2FtcGxlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS1zYW1wbGUtcm93IHNlLXNhbXBsZS1yb3ctLWhlYWRcIj5cbiAgICAgICAgICA8c3Bhbj5EYXRlPC9zcGFuPjxzcGFuPlVzZXIgZW1haWw8L3NwYW4+PHNwYW4+QXNzaWduIHN0b3JlPC9zcGFuPjxzcGFuPkFzc2lnbiBhdWRpdDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cInRlbXBsYXRlTG9hZGluZ1wiIFtyb3dzXT1cIjNcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRlbXBsYXRlTG9hZGluZ1wiPlxuICAgICAgICAgIDwhLS0gVGhlIHNlbGVjdGVkIGF1ZGl0cycgYXNzaWduZWQgc3RvcmVzIC8gdXNlcnM6IHRoZSBzYW1lIHJvd3MgRG93bmxvYWQgdGVtcGxhdGUgd3JpdGVzLiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Utc2FtcGxlLXJvd1wiICpuZ0Zvcj1cImxldCByIG9mIHByZXZpZXdSb3dzXCI+XG4gICAgICAgICAgICA8c3BhbiBbdGl0bGVdPVwici5kYXRlXCI+e3sgci5kYXRlIH19PC9zcGFuPjxzcGFuIFt0aXRsZV09XCJyLmVtYWlsXCI+e3sgci5lbWFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIFt0aXRsZV09XCJyLnN0b3JlXCI+e3sgci5zdG9yZSB9fTwvc3Bhbj48c3BhbiBbdGl0bGVdPVwici5hdWRpdFwiPnt7IHIuYXVkaXQgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlLXNhbXBsZS1tb3JlXCIgKm5nSWY9XCJwcmV2aWV3TW9yZVwiPisge3sgcHJldmlld01vcmUgfX0gbW9yZSB7eyBwcmV2aWV3TW9yZSA9PT0gMSA/ICdyb3cnIDogJ3Jvd3MnIH19IGluIHRoZSBmaWxlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlLXNhbXBsZS1tb3JlXCIgKm5nSWY9XCIhcHJldmlld1Jvd3MubGVuZ3RoXCI+UGljayBhbiBhdWRpdCB0byBzZWUgaXRzIHRlbXBsYXRlIHJvd3MuPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cInNlLW5vdGUgc2Utbm90ZS0td2FyblwiICpuZ0lmPVwiIXRlbXBsYXRlTG9hZGluZyAmJiB1bmFzc2lnbmVkQXVkaXRzLmxlbmd0aFwiPlxuICAgICAgICB7eyB1bmFzc2lnbmVkQXVkaXRzLmpvaW4oJywgJykgfX0ge3sgdW5hc3NpZ25lZEF1ZGl0cy5sZW5ndGggPT09IDEgPyAnaGFzJyA6ICdoYXZlJyB9fSBubyBzdG9yZSBhc3NpZ25lZCB5ZXQg4oCUIGZpbGwgaW4gRGF0ZSwgVXNlciBlbWFpbFxuICAgICAgICBhbmQgU3RvcmUgbmFtZSBmb3Ige3sgdW5hc3NpZ25lZEF1ZGl0cy5sZW5ndGggPT09IDEgPyAnaXRzIHJvdycgOiAndGhlaXIgcm93cycgfX0uPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzZS1ub3RlXCI+VmlzaXQgc3RhcnQgYW5kIFZpc2l0IGVuZCAoSEg6bW0pIGFyZSBvcHRpb25hbCDigJQgbGVhdmUgdGhlbSBibGFuayB0byB1c2UgdGhlIHN0b3JlJ3Mgb3BlbiBhbmQgY2xvc2UgdGltZSAoMTA6MDAgdG8gMjI6MDAgd2hlbiB0aGUgc3RvcmUgaGFzIG5vbmUpLjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2Utbm90ZVwiPlJvd3Mgd2l0aCBhbiB1bmtub3duIHN0b3JlLCBlbWFpbCBvciBhdWRpdCBhcmUgcmVwb3J0ZWQgYmVmb3JlIGFueXRoaW5nIGlzIHNhdmVkLiBEcmFmdCBhdWRpdHNcbiAgICAgICAgYXJlIHB1Ymxpc2hlZCB3aGVuIHRoZSBzY2hlZHVsZSBpcyBwdWJsaXNoZWQuPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tID09PT09PT09PT09PSBSb3dzID09PT09PT09PT09PSAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJzdGVwID09PSAncm93cycgJiYgIWxvYWRpbmdFZGl0XCI+XG4gIDwhLS0gQmFjayArIGNydW1iIG9uIG9uZSBsaW5lLCBhcyBvbiB0aGUgQ3JlYXRlIHN0ZXA7IHRoZSBuYW1lIGFuZCBhY3Rpb25zIGJlbG93LCBsZWZ0IGVkZ2VzIGFsaWduZWQuXG4gICAgICAgRWRpdCBoYXMgbm8gXCJFZGl0IHNjaGVkdWxlXCIgc3RlcCBpbiB0aGUgY3J1bWIgKFFBIDkgT2N0KTogaXQgb3BlbnMgb24sIGFuZCBzdGF5cyBvbiwgdGhlIHJvd3MuIC0tPlxuICA8ZGl2IGNsYXNzPVwic2UtYmFja2JhclwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbSBzZS1iYWNrXCIgKGNsaWNrKT1cImJhY2soKVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDYgOSAxMiAxNSAxOFwiPjwvcG9seWxpbmU+PC9zdmc+XG4gICAgICB7eyBiYWNrTGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8ZGl2IGNsYXNzPVwic2UtY3J1bWJcIj5cbiAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cImJhY2soJGV2ZW50KVwiPlNjaGVkdWxlPC9hPiDigLpcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2NoZWR1bGVJZFwiPjxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cImJhY2tUb0NyZWF0ZSgkZXZlbnQpXCI+Q3JlYXRlIHNjaGVkdWxlPC9hPiDigLo8L25nLWNvbnRhaW5lcj5cbiAgICAgIFJvd3NcbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInNlLXRpdGxlYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cInNlLXRpdGxldGV4dFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlLW5hbWVcIj57eyBuYW1lLnRyaW0oKSB8fCAnVW50aXRsZWQgc2NoZWR1bGUnIH19PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgW2Rpc2FibGVkXT1cInNhdmluZ1wiIChjbGljayk9XCJzYXZlRHJhZnQoKVwiPlNhdmUgYXMgZHJhZnQ8L2J1dHRvbj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS1zbSBzZS1wdWJsaXNoXCIgW2NsYXNzLmlzLW9mZl09XCIhY2FuUHVibGlzaFwiIChjbGljayk9XCJwdWJsaXNoKClcIj5cbiAgICAgIHt7IHNhdmluZyA/ICdTYXZpbmfigKYnIDogKHB1Ymxpc2hlZCA/ICdTYXZlICYgcHVibGlzaCcgOiAnUHVibGlzaCBzY2hlZHVsZScpIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzZS1yZWFkeVwiIFtjbGFzcy5pcy1va109XCJyZWFkeU9rXCI+XG4gICAgPHN2ZyAqbmdJZj1cInJlYWR5T2tcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0xMiAzYTkgOSAwIDEgMCAwIDE4IDkgOSAwIDAgMCAwLTE4elwiPjwvcGF0aD48cGF0aCBkPVwiTTggMTIuNWwyLjcgMi43TDE2IDkuNVwiPjwvcGF0aD48L3N2Zz5cbiAgICA8c3ZnICpuZ0lmPVwiIXJlYWR5T2tcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0xMiA0bDkgMTZIM3pcIj48L3BhdGg+PHBhdGggZD1cIk0xMiAxMHY0TTEyIDE3aC4wMVwiPjwvcGF0aD48L3N2Zz5cbiAgICA8c3Bhbj57eyByZWFkeUxhYmVsIH19PC9zcGFuPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwic2UtbWV0cmljc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmRcIiAqbmdGb3I9XCJsZXQgbSBvZiBtZXRyaWNzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWhlYWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1jb3VudFwiPnt7IG0udmFsdWUgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC10ZXh0XCI+e3sgbS5sYWJlbCB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzZS1jYXJkIHNlLWNhcmQtLXRhYmxlXCI+XG4gICAgPGRpdiBjbGFzcz1cInNlLXRhYmxlaGVhZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlLXRpdGxldGV4dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Utc2lkZS10aXRsZVwiPlNjaGVkdWxlIHJvd3M8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXN1YlwiPkV2ZXJ5IHJvdyBpcyBvbmUgdXNlciwgYXQgb25lIHN0b3JlLCBvbiBvbmUgZGF0ZS48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgKGNsaWNrKT1cImFkZFJvdygpXCI+QWRkIHJvdzwvYnV0dG9uPlxuICAgICAgPGxhYmVsIGNsYXNzPVwic2Utc2VhcmNoIHNlLXNlYXJjaC0tc21cIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3XCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+PC9zdmc+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwicm93UXVlcnlcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCByb3dzXCI+XG4gICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInNlLXNjcm9sbFwiIChzY3JvbGwpPVwib25WaWV3cG9ydENoYW5nZSgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2UtZ3JpZCBzZS1ncmlkLS1oZWFkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZS1jZW50ZXJcIiAoY2xpY2spPVwidG9nZ2xlQWxsUm93cygpXCIgdGl0bGU9XCJTZWxlY3QgYWxsIHJvd3NcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLWJveFwiIFtjbGFzcy5pcy1vbl09XCJhbGxSb3dzU2VsZWN0ZWRcIj5cbiAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJhbGxSb3dzU2VsZWN0ZWRcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlNjaGVkdWxlIGRhdGU8L2Rpdj48ZGl2PlVzZXIgZW1haWw8L2Rpdj48ZGl2PkFzc2lnbmVkIHN0b3JlPC9kaXY+PGRpdj5BdWRpdCBhc3NpZ25lZDwvZGl2PjxkaXY+VmlzaXQgd2luZG93PC9kaXY+PGRpdj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic2UtZ3JpZCBzZS1ncmlkLS1yb3dcIiAqbmdGb3I9XCJsZXQgciBvZiBzaG93blJvd3M7IHRyYWNrQnk6IHRyYWNrQnlSb3dcIiBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwici5zZWxlY3RlZFwiIFtjbGFzcy5pcy1sb2NrZWRdPVwiaXNMb2NrZWQocilcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLWNlbnRlclwiIFtjbGFzcy5pcy1vZmZdPVwiaXNMb2NrZWQocilcIiBbYXR0ci50aXRsZV09XCJpc0xvY2tlZChyKSA/ICdQYXN0IHZpc2l0OiBhbHJlYWR5IHJhaXNlZCwgc28gaXQgY2Fubm90IGJlIHNlbGVjdGVkJyA6IG51bGxcIiAoY2xpY2spPVwidG9nZ2xlUm93KHIpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1ib3hcIiBbY2xhc3MuaXMtb25dPVwici5zZWxlY3RlZFwiPlxuICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInIuc2VsZWN0ZWRcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwic2UtY2VsbFwiIFtjbGFzcy5pcy1iYWRdPVwiY2VsbEVycm9yKHIsICdkYXRlJylcIiBbYXR0ci50aXRsZV09XCJjZWxsRXJyb3IociwgJ2RhdGUnKSB8fCBudWxsXCIgW2F0dHIubWluXT1cInRvZGF5XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2NrZWQocilcIiBbKG5nTW9kZWwpXT1cInIuZGF0ZVwiIChuZ01vZGVsQ2hhbmdlKT1cInRvdWNoKHIsICdkYXRlJylcIj5cblxuICAgICAgICA8IS0tIFVzZXI6IHNlYXJjaCBieSBuYW1lIG9yIGVtYWlsIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2UtcGlja1wiIFtjbGFzcy5pcy1vcGVuXT1cImlzT3BlbihyLCAndXNlckVtYWlsJylcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNlLWNlbGwgc2UtY2VsbC0tcGlja1wiIFtjbGFzcy5pcy1iYWRdPVwiY2VsbEVycm9yKHIsICd1c2VyRW1haWwnKVwiIFthdHRyLnRpdGxlXT1cImNlbGxFcnJvcihyLCAndXNlckVtYWlsJykgfHwgbnVsbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCB1c2VyXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgW2Rpc2FibGVkXT1cImlzTG9ja2VkKHIpXCIgWyhuZ01vZGVsKV09XCJyLnVzZXJFbWFpbFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uUGlja2VySW5wdXQociwgJ3VzZXJFbWFpbCcpXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvcGVuUGlja2VyKHIsICd1c2VyRW1haWwnLCAkZXZlbnQpXCIgKGNsaWNrKT1cIm9wZW5QaWNrZXIociwgJ3VzZXJFbWFpbCcsICRldmVudClcIiAoa2V5ZG93bik9XCJvblBpY2tlcktleShyLCAndXNlckVtYWlsJywgJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1tZW51XCIgKm5nSWY9XCJpc09wZW4ociwgJ3VzZXJFbWFpbCcpXCIgW3N0eWxlLnRvcC5weF09XCJtZW51UG9zLnRvcFwiIFtzdHlsZS5ib3R0b20ucHhdPVwibWVudVBvcy5ib3R0b21cIlxuICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwibWVudVBvcy5sZWZ0XCIgW3N0eWxlLm1pbi13aWR0aC5weF09XCJtZW51UG9zLndpZHRoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Utb3B0XCIgKm5nRm9yPVwibGV0IHUgb2YgdXNlclN1Z2dlc3Rpb25zKHIpOyBsZXQgaSA9IGluZGV4XCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJpID09PSBhY3RpdmVJbmRleFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1vbl09XCJ1LmVtYWlsID09PSByLnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKVwiIChtb3VzZWVudGVyKT1cImFjdGl2ZUluZGV4ID0gaVwiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwicGlja1VzZXIociwgdSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLW9wdC1hdmF0YXJcIj57eyBpbml0aWFscyh1Lm5hbWUgfHwgdS5lbWFpbCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3B0LXRleHRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLW9wdC1tYWluXCI+e3sgdS5uYW1lIHx8IHUuZW1haWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1vcHQtc3ViXCI+e3sgdS5lbWFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwic2Utb3B0LWNoZWNrXCIgKm5nSWY9XCJ1LmVtYWlsID09PSByLnVzZXJFbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi40XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlLW1lbnUtZW1wdHlcIiAqbmdJZj1cIiF1c2VyU3VnZ2VzdGlvbnMocikubGVuZ3RoXCI+e3sgdXNlcnMubGVuZ3RoID8gJ05vIHVzZXIgbWF0Y2hlcyDigJwnICsgci51c2VyRW1haWwgKyAn4oCdJyA6ICdMb2FkaW5nIHVzZXJz4oCmJyB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlLW1lbnUtbm90ZVwiICpuZ0lmPVwibW9yZUxhYmVsKHVzZXJTdWdnZXN0aW9ucyhyKS5sZW5ndGgsIHVzZXJNYXRjaGVzKHIpLmxlbmd0aCwgJ3VzZXJzJylcIj5cbiAgICAgICAgICAgICAge3sgbW9yZUxhYmVsKHVzZXJTdWdnZXN0aW9ucyhyKS5sZW5ndGgsIHVzZXJNYXRjaGVzKHIpLmxlbmd0aCwgJ3VzZXJzJykgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFN0b3JlOiBzZWFyY2ggYW5kIHNob3cgYnkgc3RvcmUgbmFtZSAob3IgY2l0eSk7IHRoZSBzdG9yZSBjb2RlIGlzIG5ldmVyIHNob3duIG9yIGFza2VkIGZvciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXBpY2tcIiBbY2xhc3MuaXMtb3Blbl09XCJpc09wZW4ociwgJ3N0b3JlSWQnKVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2UtY2VsbCBzZS1jZWxsLS1waWNrXCJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1iYWRdPVwiY2VsbEVycm9yKHIsICdzdG9yZUlkJylcIiBbYXR0ci50aXRsZV09XCJjZWxsRXJyb3IociwgJ3N0b3JlSWQnKSB8fCBudWxsXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHN0b3JlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgW2Rpc2FibGVkXT1cImlzTG9ja2VkKHIpXCIgW25nTW9kZWxdPVwici5zdG9yZVRleHRcIiAobmdNb2RlbENoYW5nZSk9XCJvblN0b3JlVHlwZWQociwgJGV2ZW50KVwiXG4gICAgICAgICAgICAoZm9jdXMpPVwib3BlblBpY2tlcihyLCAnc3RvcmVJZCcsICRldmVudClcIiAoY2xpY2spPVwib3BlblBpY2tlcihyLCAnc3RvcmVJZCcsICRldmVudClcIiAoa2V5ZG93bik9XCJvblBpY2tlcktleShyLCAnc3RvcmVJZCcsICRldmVudClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2UtbWVudVwiICpuZ0lmPVwiaXNPcGVuKHIsICdzdG9yZUlkJylcIiBbc3R5bGUudG9wLnB4XT1cIm1lbnVQb3MudG9wXCIgW3N0eWxlLmJvdHRvbS5weF09XCJtZW51UG9zLmJvdHRvbVwiXG4gICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJtZW51UG9zLmxlZnRcIiBbc3R5bGUubWluLXdpZHRoLnB4XT1cIm1lbnVQb3Mud2lkdGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1vcHRcIiAqbmdGb3I9XCJsZXQgcyBvZiBzdG9yZVN1Z2dlc3Rpb25zKHIpOyBsZXQgaSA9IGluZGV4XCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJpID09PSBhY3RpdmVJbmRleFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1vbl09XCJzLnN0b3JlSWQgPT09IHIuc3RvcmVJZC50cmltKClcIiAobW91c2VlbnRlcik9XCJhY3RpdmVJbmRleCA9IGlcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKGNsaWNrKT1cInBpY2tTdG9yZShyLCBzLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3B0LWljb25cIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTMgOWwxLjUtNWgxNUwyMSA5XCI+PC9wYXRoPjxwYXRoIGQ9XCJNNCA5djExaDE2VjlcIj48L3BhdGg+PHBhdGggZD1cIk05IDIwdi02aDZ2NlwiPjwvcGF0aD48L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLW9wdC10ZXh0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1vcHQtbWFpblwiPnt7IHMuc3RvcmVOYW1lIHx8IHMuc3RvcmVJZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLW9wdC1zdWJcIiAqbmdJZj1cInMuY2l0eVwiPnt7IHMuY2l0eSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwic2Utb3B0LWNoZWNrXCIgKm5nSWY9XCJzLnN0b3JlSWQgPT09IHIuc3RvcmVJZC50cmltKClcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuNFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZS1tZW51LWVtcHR5XCIgKm5nSWY9XCIhc3RvcmVTdWdnZXN0aW9ucyhyKS5sZW5ndGhcIj57eyBzdG9yZXMubGVuZ3RoID8gJ05vIHN0b3JlIG1hdGNoZXMg4oCcJyArIHIuc3RvcmVUZXh0ICsgJ+KAnScgOiAnTG9hZGluZyBzdG9yZXPigKYnIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2UtbWVudS1ub3RlXCIgKm5nSWY9XCJtb3JlTGFiZWwoc3RvcmVTdWdnZXN0aW9ucyhyKS5sZW5ndGgsIHN0b3JlTWF0Y2hlcyhyKS5sZW5ndGgsICdzdG9yZXMnKVwiPlxuICAgICAgICAgICAgICB7eyBtb3JlTGFiZWwoc3RvcmVTdWdnZXN0aW9ucyhyKS5sZW5ndGgsIHN0b3JlTWF0Y2hlcyhyKS5sZW5ndGgsICdzdG9yZXMnKSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQXVkaXQgYXNzaWduZWQ6IG11bHRpLXNlbGVjdCB3aXRoIHNlYXJjaCBvdmVyIHRoZSBwdWJsaXNoZWQgYXVkaXRzIChyb3dBdWRpdE9wdGlvbnMpLiBUaWNraW5nIGFub3RoZXIgYXVkaXRcbiAgICAgICAgICAgICBhZGRzIGEgcm93IGZvciBpdCB3aXRoIHRoZSBzYW1lIGRhdGUsIHVzZXIsIHN0b3JlIGFuZCB3aW5kb3c7IHVudGlja2luZyByZW1vdmVzIHRoYXQgcm93LiBObyBjb2x1bW4gd2hlblxuICAgICAgICAgICAgIHRoZSBzY2hlZHVsZSBoYXMgb25lIGZpeGVkIGF1ZGl0LiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXBpY2tcIiBbY2xhc3MuaXMtb3Blbl09XCJpc09wZW4ociwgJ2NoZWNrTGlzdElkJylcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWNlbGwgc2Utc2VsZWN0XCIgW2NsYXNzLmlzLWJhZF09XCJjZWxsRXJyb3IociwgJ2NoZWNrTGlzdElkJylcIiBbYXR0ci50aXRsZV09XCJjZWxsRXJyb3IociwgJ2NoZWNrTGlzdElkJykgfHwgbnVsbFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMb2NrZWQocilcIiAoY2xpY2spPVwib3BlblBpY2tlcihyLCAnY2hlY2tMaXN0SWQnLCAkZXZlbnQpXCIgKGtleWRvd24pPVwib25QaWNrZXJLZXkociwgJ2NoZWNrTGlzdElkJywgJGV2ZW50KVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1lbGxpcHNpc1wiIFtjbGFzcy5zZS1wbGFjZWhvbGRlcl09XCIhZ3JvdXBBdWRpdEZpcnN0KHIpXCIgW2F0dHIudGl0bGVdPVwiZ3JvdXBBdWRpdExhYmVsKHIpIHx8IG51bGxcIj57eyBncm91cEF1ZGl0Rmlyc3QocikgfHwgJ1NlbGVjdCBhdWRpdHMnIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1tb3JlXCIgKm5nSWY9XCJncm91cEF1ZGl0TW9yZShyKVwiIFthdHRyLnRpdGxlXT1cImdyb3VwQXVkaXRMYWJlbChyKVwiPit7eyBncm91cEF1ZGl0TW9yZShyKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzZS1jaGV2XCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+PC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlLW1lbnUgc2UtbWVudS0tbXVsdGlcIiAqbmdJZj1cImlzT3BlbihyLCAnY2hlY2tMaXN0SWQnKVwiIFtzdHlsZS50b3AucHhdPVwibWVudVBvcy50b3BcIiBbc3R5bGUuYm90dG9tLnB4XT1cIm1lbnVQb3MuYm90dG9tXCJcbiAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cIm1lbnVQb3MubGVmdFwiIFtzdHlsZS5taW4td2lkdGgucHhdPVwibWVudVBvcy53aWR0aFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic2UtbWVudS1zZWFyY2hcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT48bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT48L3N2Zz5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYXVkaXRzXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgWyhuZ01vZGVsKV09XCJhdWRpdFF1ZXJ5XCIgKG5nTW9kZWxDaGFuZ2UpPVwiYWN0aXZlSW5kZXggPSAwXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblBpY2tlcktleShyLCAnY2hlY2tMaXN0SWQnLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlLW9wdFwiICpuZ0Zvcj1cImxldCBhIG9mIGF1ZGl0TWF0Y2hlcygpOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5QXVkaXRcIiBbY2xhc3MuaXMtYWN0aXZlXT1cImkgPT09IGFjdGl2ZUluZGV4XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLW9uXT1cImF1ZGl0VGlja2VkKHIsIGEpXCIgKG1vdXNlZW50ZXIpPVwiYWN0aXZlSW5kZXggPSBpXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJ0b2dnbGVBdWRpdChyLCBhLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2UtYm94XCIgW2NsYXNzLmlzLW9uXT1cImF1ZGl0VGlja2VkKHIsIGEpXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImF1ZGl0VGlja2VkKHIsIGEpXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3B0LXRleHRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlLW9wdC1tYWluXCI+e3sgYS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Utb3B0LXN1YlwiICpuZ0lmPVwiYS5xdWVzdGlvbnNcIj57eyBhLnF1ZXN0aW9ucyB9fSB7eyBhLnF1ZXN0aW9ucyA9PT0gMSA/ICdxdWVzdGlvbicgOiAncXVlc3Rpb25zJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2UtbWVudS1lbXB0eVwiICpuZ0lmPVwiIWF1ZGl0TWF0Y2hlcygpLmxlbmd0aFwiPnt7IHJvd0F1ZGl0T3B0aW9ucy5sZW5ndGggPyAnTm8gYXVkaXQgbWF0Y2hlcyDigJwnICsgYXVkaXRRdWVyeSArICfigJ0nIDogJ05vIHB1Ymxpc2hlZCBhdWRpdHMgeWV0JyB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlLW1lbnUtbm90ZVwiICpuZ0lmPVwiYXVkaXRUaWNrQ291bnQocikgPiAxXCI+e3sgYXVkaXRUaWNrQ291bnQocikgfX0gYXVkaXRzIG9uIHRoaXMgcm93IMK3IHNhbWUgdXNlciwgc3RvcmUsIGRhdGUgYW5kIHdpbmRvdzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Utd2luZG93XCIgW2F0dHIudGl0bGVdPVwiY2VsbEVycm9yKHIsICd3aW5kb3cnKSB8fCBudWxsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0aW1lXCIgY2xhc3M9XCJzZS1jZWxsXCIgW2NsYXNzLmlzLWJhZF09XCJjZWxsRXJyb3IociwgJ3dpbmRvdycpXCIgW2Rpc2FibGVkXT1cImlzTG9ja2VkKHIpXCIgWyhuZ01vZGVsKV09XCJyLnN0YXJ0XCIgKG5nTW9kZWxDaGFuZ2UpPVwidG91Y2gociwgJ3dpbmRvdycpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1kYXNoXCI+4oCTPC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGltZVwiIGNsYXNzPVwic2UtY2VsbFwiIFtjbGFzcy5pcy1iYWRdPVwiY2VsbEVycm9yKHIsICd3aW5kb3cnKVwiIFtkaXNhYmxlZF09XCJpc0xvY2tlZChyKVwiIFsobmdNb2RlbCldPVwici5lbmRcIiAobmdNb2RlbENoYW5nZSk9XCJ0b3VjaChyLCAnd2luZG93JylcIj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLWNlbnRlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2UtbG9ja1wiICpuZ0lmPVwiaXNMb2NrZWQocilcIiB0aXRsZT1cIlBhc3QgdmlzaXQ6IGFscmVhZHkgcmFpc2VkLCBzbyBpdCBjYW5ub3QgYmUgZWRpdGVkIG9yIGRlbGV0ZWRcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHJlY3QgeD1cIjVcIiB5PVwiMTFcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTBcIiByeD1cIjJcIj48L3JlY3Q+PHBhdGggZD1cIk04IDExVjdhNCA0IDAgMCAxIDggMHY0XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YSBjbGFzcz1cInNlLWRlbFwiICpuZ0lmPVwiIWlzTG9ja2VkKHIpXCIgdGl0bGU9XCJEZWxldGUgcm93XCIgKGNsaWNrKT1cImRlbGV0ZVJvdyhyKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTQgN2gxNlwiPjwvcGF0aD48cGF0aCBkPVwiTTcgN2wxIDEzaDhsMS0xM005IDdWNGg2djNcIj48L3BhdGg+PC9zdmc+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFdoeSB0aGUgcm93IGlzIHJlZCwgaW4gd29yZHMuIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93TWVzc2FnZXMocikgYXMgbXNnc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2Utcm93ZXJyXCIgKm5nSWY9XCJtc2dzLmxlbmd0aFwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cbiAgICAgICAgICA8c3Bhbj57eyBtc2dzLmpvaW4oJyDCtyAnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8YSBjbGFzcz1cInNlLWludml0ZS1saW5rXCIgKm5nSWY9XCJpbnZpdGVhYmxlKHIpXCIgKGNsaWNrKT1cIm9wZW5JbnZpdGUobmV3VXNlckVtYWlscyhncm91cFJvd3MocikpKVwiPkludml0ZSB1c2VyPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gSGludHM6IGFsbG93ZWQgKFB1Ymxpc2ggaXMgbm90IGJsb2NrZWQpLCBlLmcuIHRoZSBzYW1lIHZpc2l0IGluIGFub3RoZXIgc2NoZWR1bGUuIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93SGludHMocikgYXMgaGludHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlLXJvd2VyciBzZS1yb3doaW50XCIgKm5nSWY9XCJoaW50cy5sZW5ndGhcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiPjwvbGluZT48L3N2Zz5cbiAgICAgICAgICA8c3Bhbj57eyBoaW50cy5qb2luKCcgwrcgJykgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiIXNob3duUm93cy5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj57eyByb3dzLmxlbmd0aCA/ICdObyByb3dzIG1hdGNoIHRoaXMgc2VhcmNoLicgOiAnTm8gcm93cyB5ZXQuIEFkZCBhIHJvdyBvciBpbXBvcnQgdGhlIHRlbXBsYXRlLicgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzZS1mb290XCI+XG4gICAgICA8IS0tIFJvdyBjb3VudCArIHZpc2l0LXdpbmRvdyBoaW50IHJlbW92ZWQgKHVzZXIsIDExIE9jdCk7IHRoZSBjb3VudCBzaG93cyBvbmx5IHdoaWxlIHJvd3MgYXJlIHNlbGVjdGVkLiAtLT5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2UtZm9vdC10ZXh0XCIgKm5nSWY9XCJzZWxlY3RlZENvdW50XCI+e3sgc2VsZWN0aW9uTGFiZWwgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNlLWZvb3QtYWN0aW9uc1wiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlLWJ1bGtcIiBbY2xhc3MuaXMtb2ZmXT1cIiFzZWxlY3RlZENvdW50XCIgKGNsaWNrKT1cImR1cGxpY2F0ZVNlbGVjdGVkKClcIj5EdXBsaWNhdGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZS1idWxrIHNlLWJ1bGstLWRhbmdlclwiIFtjbGFzcy5pcy1vZmZdPVwiIXNlbGVjdGVkQ291bnRcIiAoY2xpY2spPVwiZGVsZXRlU2VsZWN0ZWQoKVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIE5ldyBVc2VyIGZvdW5kIChhcyB0aGUgdjEgY2hlY2tsaXN0IHVwbG9hZCk6IGVtYWlscyB3aXRoIG5vIHVzZXIgeWV0LCBhZnRlciBhbiBpbXBvcnQgb3IgZnJvbSBhIHJvdydzIEludml0ZSB1c2VyLiAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpbnZpdGVPcGVuXCI+XG4gIDxkaXYgY2xhc3M9XCJzZS1pbnYtYmFja2Ryb3BcIiAoY2xpY2spPVwiY2xvc2VJbnZpdGUoKVwiPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2UtaW52XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwic2UtaW52LXRpdGxlXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJzZS1pbnYtaWNvblwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0xMC4zIDMuOUwxLjggMThhMiAyIDAgMCAwIDEuNyAzaDE3YTIgMiAwIDAgMCAxLjctM0wxMy43IDMuOWEyIDIgMCAwIDAtMy40IDB6XCI+PC9wYXRoPjxwYXRoIGQ9XCJNMTIgOXY0TTEyIDE3aC4wMVwiPjwvcGF0aD48L3N2Zz5cbiAgICA8L3NwYW4+XG4gICAgPGRpdiBjbGFzcz1cInNlLWludi10aXRsZVwiIGlkPVwic2UtaW52LXRpdGxlXCI+e3sgaW52aXRlRW1haWxzLmxlbmd0aCA9PT0gMSA/ICdOZXcgdXNlciBmb3VuZCcgOiAnTmV3IHVzZXJzIGZvdW5kJyB9fTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzZS1pbnYtdGV4dFwiPlxuICAgICAge3sgaW52aXRlRW1haWxzLmxlbmd0aCA9PT0gMSA/ICdUaGlzIGVtYWlsIGlzIG5vdCBhIHVzZXIgeWV0LicgOiAnVGhlc2UgZW1haWxzIGFyZSBub3QgdXNlcnMgeWV0LicgfX1cbiAgICAgIEludml0ZSB0aGVtIHRvIGFkZCB0aGVtIGFzIHVzZXJzIG9mIHRoaXMgY2xpZW50LCBvciBhZGQgdGhlbSBpbiBVc2VyIE1hbmFnZW1lbnQgdW5kZXIgdGhlIE1hbmFnZSBtZW51LlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInNlLWludi1saXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2UtcGlja3JvdyBzZS1waWNrcm93LS1hbGxcIiAqbmdJZj1cImludml0ZUVtYWlscy5sZW5ndGggPiAxXCIgKGNsaWNrKT1cInRvZ2dsZUFsbEludml0ZSgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2UtYm94XCIgW2NsYXNzLmlzLW9uXT1cImFsbEludml0ZVBpY2tlZFwiPlxuICAgICAgICAgIDxzdmcgKm5nSWY9XCJhbGxJbnZpdGVQaWNrZWRcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZS1waWNrYWxsXCI+U2VsZWN0IGFsbCAoe3sgaW52aXRlRW1haWxzLmxlbmd0aCB9fSk8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZS1waWNrcm93XCIgKm5nRm9yPVwibGV0IGUgb2YgaW52aXRlRW1haWxzXCIgW2NsYXNzLmlzLW9uXT1cImludml0ZVBpY2tlZC5oYXMoZSlcIiAoY2xpY2spPVwidG9nZ2xlSW52aXRlKGUpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2UtYm94XCIgW2NsYXNzLmlzLW9uXT1cImludml0ZVBpY2tlZC5oYXMoZSlcIj5cbiAgICAgICAgICA8c3ZnICpuZ0lmPVwiaW52aXRlUGlja2VkLmhhcyhlKVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNlLXBpY2tuYW1lXCI+PHNwYW4gY2xhc3M9XCJzZS1lbGxpcHNpc1wiPnt7IGUgfX08L3NwYW4+PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwic2UtaW52LWZvb3RcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIFtkaXNhYmxlZF09XCJpbnZpdGluZ1wiIChjbGljayk9XCJjbG9zZUludml0ZSgpXCI+U2tpcDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLXByaW1hcnkgYXYyLWJ0bi0tc21cIiBbZGlzYWJsZWRdPVwiaW52aXRpbmcgfHwgIWludml0ZVBpY2tlZC5zaXplXCIgKGNsaWNrKT1cImludml0ZVNlbGVjdGVkKClcIj5cbiAgICAgICAge3sgaW52aXRpbmcgPyAnSW52aXRpbmfigKYnIDogJ0ludml0ZSBzZWxlY3RlZCcgKyAoaW52aXRlUGlja2VkLnNpemUgPyAnICgnICsgaW52aXRlUGlja2VkLnNpemUgKyAnKScgOiAnJykgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
|