tango-app-ui-analyse-trax 4.0.48 → 4.0.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. package/esm2022/lib/components/audit-v2/configure/audit-v2-configure.component.mjs +120 -4
  2. package/esm2022/lib/components/audit-v2/dashboard/audit-v2-dashboard.component.mjs +3 -3
  3. package/esm2022/lib/components/audit-v2/detail/audit-v2-detail.component.mjs +40 -9
  4. package/esm2022/lib/components/audit-v2/gallery/audit-v2-gallery.component.mjs +56 -9
  5. package/esm2022/lib/components/audit-v2/reports/audit-v2-reports.component.mjs +103 -50
  6. package/esm2022/lib/components/audit-v2/schedule/audit-v2-schedule-detail.component.mjs +12 -6
  7. package/esm2022/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.mjs +14 -6
  8. package/fesm2022/{tango-app-ui-analyse-trax-audit-v2.module-D2O6kj8t.mjs → tango-app-ui-analyse-trax-audit-v2.module-D1hfP3Gi.mjs} +339 -82
  9. package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-D1hfP3Gi.mjs.map +1 -0
  10. package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-C4oOKSEZ.mjs → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-CxxPUa1I.mjs} +3 -3
  11. 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-CxxPUa1I.mjs.map} +1 -1
  12. package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
  13. package/lib/components/audit-v2/configure/audit-v2-configure.component.d.ts +17 -1
  14. package/lib/components/audit-v2/detail/audit-v2-detail.component.d.ts +13 -0
  15. package/lib/components/audit-v2/gallery/audit-v2-gallery.component.d.ts +25 -3
  16. package/lib/components/audit-v2/reports/audit-v2-reports.component.d.ts +10 -6
  17. package/lib/components/audit-v2/schedule/audit-v2-schedule-detail.component.d.ts +4 -1
  18. package/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.d.ts +3 -1
  19. package/package.json +1 -1
  20. package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-D2O6kj8t.mjs.map +0 -1
@@ -4,6 +4,7 @@ import { catchError, map } from 'rxjs/operators';
4
4
  import dayjs from 'dayjs';
5
5
  import utc from 'dayjs/plugin/utc';
6
6
  import timezone from 'dayjs/plugin/timezone';
7
+ import * as XLSX from 'xlsx';
7
8
  import { auditAccess } from '../audit-v2-access';
8
9
  import * as i0 from "@angular/core";
9
10
  import * as i1 from "../../../services/trax.service";
@@ -74,6 +75,10 @@ export class AuditV2ConfigureComponent {
74
75
  dailySendApprover = true;
75
76
  dailySendCustom = false;
76
77
  dailyUsers = [];
78
+ /** Daily Report > Custom bulk upload popup (as the Checklist Configure page's). */
79
+ dailyBulkOpen = false;
80
+ /** Row errors of the last upload; any error rejects the whole file, so nothing partial is applied. */
81
+ dailyBulkErrors = [];
77
82
  sharePostApproval = false;
78
83
  exportSubmissionOn = false;
79
84
  redoValidFor = 7;
@@ -169,8 +174,9 @@ export class AuditV2ConfigureComponent {
169
174
  this.destroy$.next();
170
175
  this.destroy$.complete();
171
176
  }
172
- /** Escape closes the open dropdown / suggestion list. */
177
+ /** Escape closes the open dropdown / suggestion list / bulk upload popup. */
173
178
  onEscape() {
179
+ this.dailyBulkOpen = false;
174
180
  this.openSelect = null;
175
181
  this.openChips = null;
176
182
  }
@@ -654,6 +660,116 @@ export class AuditV2ConfigureComponent {
654
660
  removeChip(list, index) {
655
661
  this[list] = this[list].filter((_, i) => i !== index);
656
662
  }
663
+ // ---- Daily Report custom users: bulk upload ----------------------------------------------
664
+ openDailyBulk() {
665
+ this.dailyBulkErrors = [];
666
+ this.dailyBulkOpen = true;
667
+ this.openChips = null;
668
+ this.openSelect = null;
669
+ }
670
+ closeDailyBulk() {
671
+ this.dailyBulkOpen = false;
672
+ this.dailyBulkErrors = [];
673
+ }
674
+ /** Username + Email template, pre-filled with the current Daily Report custom users (as the Checklist one). */
675
+ downloadDailyTemplate() {
676
+ const rows = this.dailyUsers.length ? this.dailyUsers.map(u => [u.n, u.e]) : [['', '']];
677
+ const sheet = XLSX.utils.aoa_to_sheet([['Username', 'Email'], ...rows]);
678
+ sheet['!cols'] = [{ wch: 28 }, { wch: 36 }];
679
+ const book = XLSX.utils.book_new();
680
+ XLSX.utils.book_append_sheet(book, sheet, 'Users');
681
+ XLSX.writeFile(book, 'dailyReportTemplate.xlsx');
682
+ }
683
+ /**
684
+ * Replaces the Daily Report custom users with the uploaded sheet, as the Checklist Configure page does:
685
+ * only the Email column counts (the name comes from the client's user list), and every row must be an
686
+ * existing user. Any invalid row rejects the whole file.
687
+ */
688
+ onDailyBulkFile(event) {
689
+ const input = event.target;
690
+ const file = input.files?.[0];
691
+ input.value = '';
692
+ if (!file) {
693
+ return;
694
+ }
695
+ this.dailyBulkErrors = [];
696
+ if (!/\.xlsx$/i.test(file.name)) {
697
+ this.dailyBulkErrors = ['Please upload a valid .xlsx file.'];
698
+ this.cd.detectChanges();
699
+ return;
700
+ }
701
+ if (!this.users.length) {
702
+ this.dailyBulkErrors = ['The users of this client could not be loaded. Reload the page and try again.'];
703
+ this.cd.detectChanges();
704
+ return;
705
+ }
706
+ file.arrayBuffer().then(buffer => {
707
+ this.dailyBulkErrors = this.applyDailyBulk(buffer);
708
+ if (!this.dailyBulkErrors.length) {
709
+ this.dailyBulkOpen = false;
710
+ this.toast.getSuccessToast('File uploaded successfully. ' + this.dailyUsers.length
711
+ + (this.dailyUsers.length === 1 ? ' user' : ' users') + ' added to the daily report.');
712
+ }
713
+ this.cd.detectChanges();
714
+ }).catch(() => {
715
+ this.dailyBulkErrors = ['Could not read this file. Upload the downloaded template as .xlsx.'];
716
+ this.cd.detectChanges();
717
+ });
718
+ }
719
+ /** Applies the sheet to dailyUsers and returns [] on success, else the reasons it was rejected. */
720
+ applyDailyBulk(buffer) {
721
+ let rows;
722
+ try {
723
+ const book = XLSX.read(buffer, { type: 'array' });
724
+ rows = XLSX.utils.sheet_to_json(book.Sheets[book.SheetNames[0]], { header: 1, defval: '', blankrows: true });
725
+ }
726
+ catch {
727
+ return ['Could not read this file. Upload the downloaded template as .xlsx.'];
728
+ }
729
+ const emailCol = (rows[0] || []).findIndex(h => String(h ?? '').trim().toLowerCase() === 'email');
730
+ if (emailCol < 0) {
731
+ return ["The template must contain an 'Email' column."];
732
+ }
733
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
734
+ const byEmail = new Map(this.users.map(u => [u.e, u]));
735
+ const matched = [];
736
+ const errors = [];
737
+ let dataRows = 0;
738
+ rows.slice(1).forEach((row, i) => {
739
+ // Skip fully blank rows (any column, not just Email).
740
+ if (!row.some(v => String(v ?? '').trim() !== '')) {
741
+ return;
742
+ }
743
+ dataRows++;
744
+ const rowNo = i + 2; // +1 header, +1 to 1-based
745
+ const email = String(row[emailCol] ?? '').trim().toLowerCase();
746
+ if (!email) {
747
+ errors.push('Row ' + rowNo + ': Email is required');
748
+ return;
749
+ }
750
+ if (!emailRegex.test(email)) {
751
+ errors.push('Row ' + rowNo + ': "' + email + '" is not a valid email');
752
+ return;
753
+ }
754
+ const user = byEmail.get(email);
755
+ if (!user) {
756
+ errors.push('Row ' + rowNo + ': "' + email + '" is not an existing user');
757
+ return;
758
+ }
759
+ if (!matched.some(u => u.e === user.e)) {
760
+ matched.push(user);
761
+ }
762
+ });
763
+ if (!dataRows) {
764
+ return ['The uploaded file has no data rows.'];
765
+ }
766
+ if (errors.length) {
767
+ return errors;
768
+ }
769
+ this.dailyUsers = matched;
770
+ this.dailySendCustom = true;
771
+ return [];
772
+ }
657
773
  /** What the checklist keeps as assignedUsers, exactly as the Checklist Configure page sends it. */
658
774
  assignedUsers() {
659
775
  const d = this.configData?.checkListDetails || {};
@@ -910,13 +1026,13 @@ export class AuditV2ConfigureComponent {
910
1026
  return data;
911
1027
  }
912
1028
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2ConfigureComponent, deps: [{ token: i1.TraxService }, { token: i2.GlobalStateService }, { token: i3.ActivatedRoute }, { token: i3.Router }, { token: i4.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
913
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2ConfigureComponent, selector: "lib-audit-v2-configure", host: { listeners: { "document:keydown.escape": "onEscape()" } }, ngImport: i0, template: "<div class=\"av2-page audit-configure\">\r\n\r\n <!-- Back + breadcrumb (as the schedule editor's back bar) -->\r\n <div class=\"cf-backbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm cf-back\" (click)=\"back()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\r\n {{ backLabel }}\r\n </button>\r\n <div class=\"cf-crumb\">\r\n <a href=\"#\" (click)=\"back($event)\">Manage Audit</a> \u203A Configure\r\n </div>\r\n </div>\r\n\r\n <!-- Title + actions -->\r\n <div class=\"cf-header\">\r\n <div class=\"cf-header-text\">\r\n <span class=\"av2-sk av2-sk--title cf-sk-title\" *ngIf=\"loading\"></span>\r\n <div class=\"cf-title\" *ngIf=\"!loading\">{{ auditName || 'Audit' }}</div>\r\n <input type=\"text\" class=\"cf-desc\" placeholder=\"Enter Audit Description\" [(ngModel)]=\"description\">\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary cf-publish\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason || publishBlockedReason\" (click)=\"publish()\">\r\n {{ saving ? 'Saving\u2026' : (published ? 'Save & Publish' : 'Publish') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost cf-draft\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason\" (click)=\"saveDraft()\">Save as Draft</button>\r\n </div>\r\n\r\n <div class=\"cf-error cf-error--page\" *ngIf=\"loadError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ loadError }}\r\n </div>\r\n\r\n <!-- Chip picker: chips + input + suggestion list (one template, used for every user list) -->\r\n <ng-template #chipPicker let-list=\"list\" let-large=\"large\">\r\n <div class=\"cf-chipbox\" [class.cf-chipbox--lg]=\"large\" [class.is-open]=\"openChips === list\" (click)=\"focusChips(list, $event)\">\r\n <span class=\"cf-chip\" [class.cf-chip--lg]=\"large\" *ngFor=\"let u of chipsOf(list); let i = index\" [title]=\"u.e\">\r\n <span [class]=\"large ? 'cf-chip-tag' : 'cf-chip-ini'\">{{ u.i }}</span>{{ u.n }}\r\n <a class=\"cf-chip-x\" (click)=\"removeChip(list, i); $event.stopPropagation()\">\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <input type=\"text\" class=\"cf-chip-input\" [class.cf-chip-input--lg]=\"large\" placeholder=\"Add user...\"\r\n [ngModel]=\"draftOf(list)\" (ngModelChange)=\"setDraft(list, $event)\" (focus)=\"focusChips(list, $event)\" (keyup.enter)=\"addChip(list)\">\r\n <div class=\"cf-suggest\" *ngIf=\"openChips === list\">\r\n <div class=\"cf-suggest-item\" *ngFor=\"let u of suggestions(list)\" (click)=\"addSuggestion(list, u, $event)\">\r\n <span class=\"cf-chip-ini\">{{ u.i }}</span>\r\n <span class=\"cf-suggest-name\">{{ u.n }}</span>\r\n <span class=\"cf-suggest-mail\">{{ u.e }}</span>\r\n </div>\r\n <div class=\"cf-suggest-empty\" *ngIf=\"!suggestions(list).length\">\r\n {{ users.length ? 'No matching user' : 'No users for this client' }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Dropdown: styled like the prototype instead of the browser's native select -->\r\n <ng-template #dropdown let-key=\"key\" let-options=\"options\">\r\n <span class=\"cf-select\" [class.is-open]=\"openSelect === key\">\r\n <button type=\"button\" class=\"cf-select-btn\" (click)=\"toggleSelect(key, $event)\">\r\n {{ selectLabel(key, options) }}\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"cf-select-menu\" *ngIf=\"openSelect === key\">\r\n <div class=\"cf-select-item\" *ngFor=\"let o of options\" [class.is-on]=\"isPicked(key, o)\"\r\n (click)=\"pick(key, o, $event)\">{{ o.label }}</div>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"cf-body\" *ngIf=\"!loadError\">\r\n <!-- Section tree -->\r\n <aside class=\"cf-left\">\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"cf-left-title\">{{ auditName || 'Audit' }}</div>\r\n\r\n <div class=\"cf-hint\" *ngIf=\"!sections.length\">No questions yet</div>\r\n <ng-container *ngFor=\"let s of sections\">\r\n <div class=\"cf-section\" [class.is-open]=\"s.open\" (click)=\"toggleSection(s)\">\r\n {{ s.label }}\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!s.open\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"cf-items\" *ngIf=\"s.open && s.items.length\">\r\n <div *ngFor=\"let it of s.items\">{{ it }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Schedule block (QA 10 Oct): audits have no one-time / repeat schedule here; visits come from Schedules. -->\r\n </ng-container>\r\n </aside>\r\n\r\n <!-- Configuration -->\r\n <div class=\"cf-right\">\r\n\r\n <section class=\"cf-card\" *ngIf=\"loading\">\r\n <lib-audit-v2-shimmer [rows]=\"4\"></lib-audit-v2-shimmer>\r\n </section>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n\r\n <!-- ===== Advance Configuration ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-head\">\r\n <span class=\"cf-block-title\">Advance Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </span>\r\n </div>\r\n\r\n <!-- Audit Owner -->\r\n <div>\r\n <div class=\"cf-label\">Audit Owner</div>\r\n <div class=\"cf-hint\">Owners get access to manage the audit</div>\r\n </div>\r\n <div class=\"cf-row\">\r\n <span class=\"cf-field\">Can be managed by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'owners', large: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Approver -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Approver</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"approverOn\" (click)=\"toggleApprover()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be able to approve the audit</div>\r\n <div class=\"cf-row\" *ngIf=\"approverOn\">\r\n <span class=\"cf-field\">To be approved by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'approvers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"approverError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ approverError }}\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Approver is off, so the {{ approvers.length }} approver{{ approvers.length === 1 ? '' : 's' }} added will be removed when you save. Turn Approver back on to keep {{ approvers.length === 1 ? 'it' : 'them' }}.\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && !approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Approver is off, so submitted audits are not sent for approval. Turn it on to add approvers or to send flags and reports to them.\r\n </div>\r\n\r\n <!-- Reminder -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Reminder</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"reminderOn\" (click)=\"toggleReminder()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be reminded in the selected interval</div>\r\n <div class=\"cf-inner\" *ngIf=\"reminderOn\">\r\n <div class=\"cf-inline\">\r\n Notify user before\r\n <span class=\"cf-reminder\" *ngFor=\"let m of reminders; let i = index\">\r\n <lib-audit-v2-select class=\"cf-reminder-select\" [value]=\"m\" [options]=\"reminderOpts[i] || []\" [searchable]=\"false\"\r\n [ariaLabel]=\"'Reminder ' + (i + 1) + ' in minutes'\" (changed)=\"setReminder(i, $event.target.value)\"></lib-audit-v2-select>\r\n <a class=\"cf-chip-x\" *ngIf=\"reminders.length > 1\" title=\"Remove reminder\" (click)=\"removeReminder(i)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <button type=\"button\" class=\"cf-icon-btn\" *ngIf=\"reminders.length < maxReminders\" title=\"Add reminder\" (click)=\"addReminder()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Send alerts {{ reminderSummary }} mins before the audit end time\r\n </div>\r\n </div>\r\n\r\n <!-- Notify Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"notifyFlagsOn\" (click)=\"toggleNotifyFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, all flags will be sent as an email</div>\r\n <ng-container *ngIf=\"notifyFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !notifySendApprover\" (click)=\"toggleSendApprover('notifySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendApprover\">\r\n <svg *ngIf=\"notifySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"notifySendCustom = !notifySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendCustom\">\r\n <svg *ngIf=\"notifySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"notifySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'notifyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-error\" *ngIf=\"notifyFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ notifyFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Notify on Recurring Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify on Recurring Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"recurringFlagsOn\" (click)=\"toggleRecurringFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">When enabled, emails are sent for recurring flags based on the configured threshold</div>\r\n\r\n <div class=\"cf-inner\" *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-inline\">\r\n Send Email if the same question is flagged\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'recurringThreshold', options: thresholdOpts }\"></ng-container>\r\n times by the same store\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Once the threshold is reached and an email is sent, the flag count resets to zero\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !recurringSendApprover\" (click)=\"toggleSendApprover('recurringSendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendApprover\">\r\n <svg *ngIf=\"recurringSendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"toggleRecurringCustom()\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendCustom\">\r\n <svg *ngIf=\"recurringSendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n <label class=\"cf-check\" (click)=\"recurringSameAsNotify = !recurringSameAsNotify\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSameAsNotify\">\r\n <svg *ngIf=\"recurringSameAsNotify\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Use same users from Notify Flags\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"recurringSendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'recurringUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-info\" *ngIf=\"recurringSameAsNotify\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ notifyRecipientsLabel }}\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"recurringFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ recurringFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Daily report -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Enable - Daily Report</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"dailyReportOn\" (click)=\"toggleDailyReport()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By Enabling, compliance score will be sent as an email to the above users</div>\r\n <ng-container *ngIf=\"dailyReportOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !dailySendApprover\" (click)=\"toggleSendApprover('dailySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendApprover\">\r\n <svg *ngIf=\"dailySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"dailySendCustom = !dailySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendCustom\">\r\n <svg *ngIf=\"dailySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"dailySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'dailyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <label class=\"cf-check\" (click)=\"sharePostApproval = !sharePostApproval\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"sharePostApproval\">\r\n <svg *ngIf=\"sharePostApproval\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Share Report Post Approval\r\n </label>\r\n <div class=\"cf-error\" *ngIf=\"dailyReportError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ dailyReportError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Export submission: Tango users only, as the v1 Configure (its stored value is kept for everyone else). -->\r\n <div class=\"cf-grid2\" *ngIf=\"access.isTango\">\r\n <div class=\"cf-stack cf-stack--tight\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Export Submission</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"exportSubmissionOn\" (click)=\"exportSubmissionOn = !exportSubmissionOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint\">Enable this to allow audit submitters to download their submission as a PDF file</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Redo validity -->\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Validity</div>\r\n <div class=\"cf-inline\">\r\n Redo valid for\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoValidFor', options: redoDayOpts }\"></ng-container>\r\n Day from Redo creation\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Auto create task -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Auto Create Task for Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"autoCreateTaskOn\" (click)=\"autoCreateTaskOn = !autoCreateTaskOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, a task is automatically created for every flagged question in the audit</div>\r\n\r\n <!-- Who gets the task and how long it stays open (as the Checklist Configure page) -->\r\n <div class=\"cf-autotask\" *ngIf=\"autoCreateTaskOn\">\r\n <div class=\"cf-autotask-title\">Task Assignee</div>\r\n <div class=\"cf-hint cf-hint--tight\">Choose who the flagged task is assigned to</div>\r\n <div class=\"cf-autotask-choices\">\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'submitter'\" (click)=\"taskAssignee = 'submitter'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'submitter'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Audit Submitter</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user who filled the audit</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'store'\" (click)=\"taskAssignee = 'store'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'store'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Store User</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user mapped to the flagged store</span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cf-autotask-title\">Task Validity</div>\r\n <div class=\"cf-autotask-validity\">\r\n <span>Task valid for</span>\r\n <lib-audit-v2-select class=\"cf-validity-select\" [(ngModel)]=\"taskValidity\" [options]=\"taskValidityOptions\"\r\n [searchable]=\"false\" ariaLabel=\"Task validity in days\"></lib-audit-v2-select>\r\n <span>days from task creation</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Audit Configuration ===== -->\r\n <div class=\"cf-divider-head\">\r\n <span class=\"cf-block-title\">Audit Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n </div>\r\n\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Submission &amp; Visibility</div>\r\n\r\n <!-- cf-box--open: the dispute-window and response-delay menus must not be clipped by the box -->\r\n <div class=\"cf-box cf-box--open\">\r\n <div class=\"cf-box-row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"showResponseInApp\"\r\n (click)=\"showResponseInApp = !showResponseInApp\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Show Response in Mobile App</div>\r\n <div class=\"cf-hint\">By enabling this option, store users can view the audit response in the Mobile App.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sub\" *ngIf=\"showResponseInApp\">\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Response Visibility</div>\r\n <div class=\"cf-hint\">Choose when the response becomes visible to store users</div>\r\n </div>\r\n\r\n <div class=\"cf-options\">\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'pre'\" (click)=\"responseVisibility = 'pre'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'pre'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\">Pre-approval</div>\r\n <div class=\"cf-hint\">The audit response will be visible to store users before it is approved.</div>\r\n <div class=\"cf-inline cf-inline--top\">\r\n Show response\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'respDelay', options: respDelayOpts }\"></ng-container>\r\n after submission\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'post'\" (click)=\"responseVisibility = 'post'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'post'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\" [class.cf-muted]=\"responseVisibility !== 'post'\">Post-approval</div>\r\n <div class=\"cf-hint\">Once the response is approved, it will automatically be displayed in the Mobile App. Store users cannot raise a dispute.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sep\">\r\n <ng-container *ngIf=\"responseVisibility === 'pre'\">\r\n <div class=\"cf-box-row cf-box-row--flush\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"disputeOn\" (click)=\"disputeOn = !disputeOn\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Dispute Configuration</div>\r\n <div class=\"cf-hint cf-hint--wrap\">When enabled, the store team can raise a dispute against the auditor's submission once the response becomes visible to them.</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--nested\" *ngIf=\"disputeOn\">\r\n <div class=\"cf-inline\">\r\n Dispute window\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'disputeWindow', options: dispWindowOpts }\"></ng-container>\r\n from when the response becomes visible\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Disputes raised inside this window go to the approver. Approved disputes revise the answer and the compliance score.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"!hasApprovers\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n No approver is set, so no one can review disputes. Turn on Approver and add an approver.\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"responseVisibility === 'post'\">\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm cf-muted\">Dispute Configuration</div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Disputes are not available when responses are shown post-approval.\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Pre-submission access -->\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pre-Submission Access</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"preSubmissionAccessOn\" (click)=\"preSubmissionAccessOn = !preSubmissionAccessOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Users added here can view Open and In Progress audits until submission. The Schedule Info tab is also visible only to these users.</div>\r\n <ng-container *ngIf=\"preSubmissionAccessOn\">\r\n <div class=\"cf-row cf-row--top\">\r\n <span class=\"cf-field\">Visible to</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'preSubmissionUsers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error cf-error--indent\" *ngIf=\"preSubmissionEmpty\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Add at least one user\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Scoring ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Scoring</div>\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pass/Fail Score Setup</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"passFailOn\" (click)=\"passFailOn = !passFailOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Set the compliance score an audit must reach to be marked {{ passLabel }}. Anything below it is marked {{ failLabel }}.</div>\r\n <div class=\"cf-row cf-row--wrap cf-row--top\" *ngIf=\"passFailOn\">\r\n <span class=\"cf-field\">Minimum score to {{ passLabel }}</span>\r\n <label class=\"cf-num\">\r\n <input type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"passThreshold\">\r\n <span>%</span>\r\n </label>\r\n <span class=\"cf-pill cf-pill--pass\">{{ passLabel }} \u2265 {{ passThreshold }}%</span>\r\n <span class=\"cf-pill cf-pill--fail\">{{ failLabel }} &lt; {{ passThreshold }}%</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Approver Controls ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Approver Controls</div>\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Edit Submitted Audit</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"editSubmittedOn\" (click)=\"toggleEditSubmitted()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">Allow Approvers to edit submitted Audit</div>\r\n <ng-container *ngIf=\"editSubmittedOn\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'editUsers', large: true }\"></ng-container>\r\n <div class=\"cf-error\" *ngIf=\"editSubmittedError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ editSubmittedError }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Extension</div>\r\n <div class=\"cf-inline\">\r\n Extend redo up to\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoExtension', options: redoExtensionOpts }\"></ng-container>\r\n Days till approval\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== User Verification ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-title\">User Verification Configuration</div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requirePhoto\" (click)=\"requirePhoto = !requirePhoto\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require Photo Capture</div>\r\n <div class=\"cf-hint\">By enabling, users must capture their photo to complete submission</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requireAcknowledgment\" (click)=\"requireAcknowledgment = !requireAcknowledgment\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require User Acknowledgment</div>\r\n <div class=\"cf-hint\">By enabling, users must type their name as acknowledgment to complete submission</div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.cf-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.cf-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.cf-crumb{font-size:13px;line-height:20px;color:#667085}.cf-crumb a{font-weight:600;color:#00a3ff}.cf-header{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px;display:flex;align-items:center;gap:12px}.cf-header-text{display:flex;flex-direction:column;gap:4px;min-width:0}.cf-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.cf-sk-title{margin:3px 0}.cf-desc{border:none;outline:none;padding:0;background:transparent;font-family:inherit;font-size:13px;line-height:18px;color:#344054;min-width:320px}.cf-desc::placeholder{color:#98a2b3}.cf-publish{padding:0 20px;box-shadow:0 1px 2px #1018280d}.cf-draft{padding:0 18px;box-shadow:inset 0 0 0 1px #d0d5dd,0 1px 2px #1018280d}.cf-body{display:flex;gap:16px;align-items:flex-start}.cf-left{width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px;display:flex;flex-direction:column;gap:10px;position:sticky;top:calc(var(--bs-app-header-height, 0px) + 16px);max-height:calc(100vh - var(--bs-app-header-height, 0px) - 32px);overflow-y:auto;scrollbar-width:thin}.cf-left-title{font-size:14px;line-height:20px;font-weight:600;color:#101828}.cf-section{display:flex;align-items:center;gap:8px;padding:2px 0;font-size:13px;font-weight:500;color:#344054;cursor:pointer;white-space:nowrap}.cf-section.is-open{color:#1d2939}.cf-rule{flex:1;border-top:1px solid #EAECF0}.cf-chev{display:flex;color:#98a2b3}.cf-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.cf-chev .rotate{transform:rotate(-90deg)}.cf-items{display:flex;flex-direction:column;gap:8px;padding-left:12px;font-size:13px;color:#475467}.cf-schedule-title{font-size:14px;font-weight:600;color:#101828;margin-top:6px}.cf-schedule{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#475467}.cf-schedule>div{display:flex;align-items:center;gap:6px}.cf-right{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}.cf-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px;display:flex;flex-direction:column;gap:14px}.cf-card--lg{border-radius:8px}.cf-block-head{display:flex;align-items:center;gap:12px}.cf-block-title{font-size:15px;font-weight:600;color:#101828}.cf-divider-head{display:flex;align-items:center;gap:10px;margin-top:4px}.cf-label{font-size:14px;font-weight:600;color:#101828}.cf-label-sm{font-size:13px;font-weight:600;color:#101828}.cf-muted{color:#667085}.cf-hint{font-size:12px;line-height:18px;color:#667085}.cf-hint--tight{margin-top:-8px}.cf-hint--wrap{max-width:640px;text-wrap:pretty}.cf-field{font-size:13px;font-weight:500;color:#344054;min-width:150px;flex-shrink:0}.cf-row{display:flex;align-items:center;gap:12px}.cf-row--top{margin-top:6px}.cf-row--wrap{flex-wrap:wrap}.cf-stack{display:flex;flex-direction:column;gap:8px}.cf-stack--tight,.cf-stack--sm{gap:4px}.cf-stack--xs{gap:2px}.cf-grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.cf-toggle-row{display:flex;align-items:center;gap:10px}.cf-switch{width:36px;height:20px;padding:2px;border:none;border-radius:9999px;background:#eaecf0;display:flex;align-items:center;justify-content:flex-start;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.cf-switch>span{width:16px;height:16px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #1018280d}.cf-switch.is-on{background:#00a3ff;justify-content:flex-end}.cf-switch--top{margin-top:2px}.cf-chipbox{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:8px 10px}.cf-chipbox--lg{gap:8px;padding:10px 12px}.cf-chip{display:flex;align-items:center;gap:6px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;border-radius:9999px;padding:3px 8px;font-size:12px;color:#344054;white-space:nowrap;flex-shrink:0;max-width:100%}.cf-chip--lg{gap:8px;background:#fff;padding:5px 11px;font-size:13px;color:#1d2939}.cf-chip-ini{color:#00a3ff;font-weight:600;font-size:11px}.cf-chip-tag{display:inline-flex;align-items:center;justify-content:center;padding:1px 5px;border-radius:6px;background:#eaf8ff;color:#00a3ff;font-weight:700;font-size:11px;letter-spacing:.02em}.cf-chip-x{display:flex;cursor:pointer;color:#98a2b3}.cf-chip-x:hover{color:#344054}.cf-chip-input{flex:1;min-width:100px;border:none;outline:none;background:transparent;font-family:inherit;font-size:12px;color:#101828}.cf-chip-input::placeholder{color:#98a2b3}.cf-chip-input--lg{min-width:120px;font-size:13px}.cf-inner{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:8px}.cf-inline{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-inline--top{margin-top:2px}.cf-mini{height:32px;padding:0 28px 0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 8px center;outline:none}.cf-info{display:flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#667085}.cf-info svg{flex-shrink:0}.cf-info--wrap{align-items:flex-start;max-width:560px;text-wrap:pretty}.cf-info--wrap svg{margin-top:3px}.cf-checks{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-checks-label{font-weight:500}.cf-check{display:flex;align-items:center;gap:6px;margin:0;font-size:13px;color:#344054;cursor:pointer;-webkit-user-select:none;user-select:none}.cf-check-box{width:16px;height:16px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.cf-check-box.is-on{background:#00a3ff;box-shadow:none}.cf-box{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden;display:flex;flex-direction:column}.cf-box--pad{padding:14px 16px;gap:6px;overflow:visible}.cf-box--row{padding:14px 16px;flex-direction:row;align-items:flex-start;gap:12px}.cf-box--nested{background:#fff;padding:12px 14px;gap:8px;margin-left:46px;overflow:visible}.cf-box--open{overflow:visible}.cf-box--open>.cf-box-sub:last-child{border-radius:0 0 8px 8px}.cf-box-row{padding:14px 16px;display:flex;align-items:flex-start;gap:12px}.cf-box-row--flush{padding:0;gap:10px}.cf-box-sub{border-top:1px solid #EAECF0;background:#f9fafb;padding:16px 16px 18px 64px;display:flex;flex-direction:column;gap:12px}.cf-options{display:flex;flex-direction:column;gap:10px}.cf-option{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:12px 14px;display:flex;align-items:flex-start;gap:10px;cursor:pointer}.cf-option.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.cf-box-sep{display:flex;flex-direction:column;gap:12px;padding-top:14px;border-top:1px solid #EAECF0}.cf-num{display:flex;align-items:center;gap:8px;height:36px;padding:0 6px 0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;margin:0}.cf-num input{width:52px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.cf-num span{font-size:13px;color:#667085;padding-right:6px}.cf-pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;border-radius:9999px;padding:4px 12px}.cf-pill--pass{background:#ecfdf3;color:#027a48}.cf-pill--fail{background:#fef3f2;color:#d92d20}.cf-error{display:flex;gap:6px;font-size:12px;font-weight:500;color:#d92d20;align-items:flex-start;line-height:18px;max-width:640px}.cf-error svg{flex-shrink:0;margin-top:3px}.cf-error--indent{margin-left:162px}.cf-check.is-blocked{color:#98a2b3;cursor:not-allowed}.cf-select{position:relative;display:inline-block;vertical-align:middle}.cf-select-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 10px 0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;white-space:nowrap}.cf-select-btn svg{color:#667085;transition:transform .15s ease}.is-open .cf-select-btn{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.is-open .cf-select-btn svg{transform:rotate(180deg)}.cf-select-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;min-width:100%;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-select-item{padding:8px 12px;border-radius:6px;font-size:13px;color:#344054;white-space:nowrap;cursor:pointer}.cf-select-item:hover{background:#f9fafb}.cf-select-item.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.cf-chipbox{position:relative}.cf-chipbox.is-open{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.cf-suggest{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:30;max-height:260px;overflow-y:auto;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-suggest-item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:6px;cursor:pointer}.cf-suggest-item:hover{background:#f9fafb}.cf-suggest-name{font-size:13px;color:#101828}.cf-suggest-mail{font-size:12px;color:#667085;margin-left:auto}.cf-suggest-empty{padding:8px 10px;font-size:12px;color:#667085}.cf-error--page{margin:0 0 12px}.cf-autotask{margin-top:12px;padding:14px 16px;border-radius:10px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column;gap:8px}.cf-autotask-title{font-size:14px;font-weight:600;color:#1d2939}.cf-autotask-title:not(:first-child){margin-top:6px}.cf-autotask-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 720px){.cf-autotask-choices{grid-template-columns:1fr}}.cf-choice{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;text-align:left;cursor:pointer}.cf-choice.is-on{background:#f5faff;box-shadow:inset 0 0 0 1px #66c8ff}.cf-radio{width:18px;height:18px;flex-shrink:0;margin-top:1px;border-radius:9999px;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center}.cf-radio span{width:8px;height:8px;border-radius:9999px;background:transparent}.cf-radio.is-on{box-shadow:inset 0 0 0 1px #1570ef}.cf-radio.is-on span{background:#1570ef}.cf-choice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.cf-choice-title{font-size:14px;font-weight:600;color:#101828}.cf-choice-sub{font-size:12px;color:#667085}.cf-autotask-validity{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:#344054}.cf-validity-select{width:96px}.cf-reminder{display:inline-flex;align-items:center;gap:6px}.cf-reminder-select{width:120px}.cf-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;cursor:pointer}.cf-icon-btn:hover{background:#f9fafb}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i8.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }] });
1029
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2ConfigureComponent, selector: "lib-audit-v2-configure", host: { listeners: { "document:keydown.escape": "onEscape()" } }, ngImport: i0, template: "<div class=\"av2-page audit-configure\">\r\n\r\n <!-- Back + breadcrumb (as the schedule editor's back bar) -->\r\n <div class=\"cf-backbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm cf-back\" (click)=\"back()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\r\n {{ backLabel }}\r\n </button>\r\n <div class=\"cf-crumb\">\r\n <a href=\"#\" (click)=\"back($event)\">Manage Audit</a> \u203A Configure\r\n </div>\r\n </div>\r\n\r\n <!-- Title + actions -->\r\n <div class=\"cf-header\">\r\n <div class=\"cf-header-text\">\r\n <span class=\"av2-sk av2-sk--title cf-sk-title\" *ngIf=\"loading\"></span>\r\n <div class=\"cf-title\" *ngIf=\"!loading\">{{ auditName || 'Audit' }}</div>\r\n <input type=\"text\" class=\"cf-desc\" placeholder=\"Enter Audit Description\" [(ngModel)]=\"description\">\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary cf-publish\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason || publishBlockedReason\" (click)=\"publish()\">\r\n {{ saving ? 'Saving\u2026' : (published ? 'Save & Publish' : 'Publish') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost cf-draft\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason\" (click)=\"saveDraft()\">Save as Draft</button>\r\n </div>\r\n\r\n <div class=\"cf-error cf-error--page\" *ngIf=\"loadError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ loadError }}\r\n </div>\r\n\r\n <!-- Chip picker: chips + input + suggestion list (one template, used for every user list) -->\r\n <ng-template #chipPicker let-list=\"list\" let-large=\"large\">\r\n <div class=\"cf-chipbox\" [class.cf-chipbox--lg]=\"large\" [class.is-open]=\"openChips === list\" (click)=\"focusChips(list, $event)\">\r\n <span class=\"cf-chip\" [class.cf-chip--lg]=\"large\" *ngFor=\"let u of chipsOf(list); let i = index\" [title]=\"u.e\">\r\n <span [class]=\"large ? 'cf-chip-tag' : 'cf-chip-ini'\">{{ u.i }}</span>{{ u.n }}\r\n <a class=\"cf-chip-x\" (click)=\"removeChip(list, i); $event.stopPropagation()\">\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <input type=\"text\" class=\"cf-chip-input\" [class.cf-chip-input--lg]=\"large\" placeholder=\"Add user...\"\r\n [ngModel]=\"draftOf(list)\" (ngModelChange)=\"setDraft(list, $event)\" (focus)=\"focusChips(list, $event)\" (keyup.enter)=\"addChip(list)\">\r\n <div class=\"cf-suggest\" *ngIf=\"openChips === list\">\r\n <div class=\"cf-suggest-item\" *ngFor=\"let u of suggestions(list)\" (click)=\"addSuggestion(list, u, $event)\">\r\n <span class=\"cf-chip-ini\">{{ u.i }}</span>\r\n <span class=\"cf-suggest-name\">{{ u.n }}</span>\r\n <span class=\"cf-suggest-mail\">{{ u.e }}</span>\r\n </div>\r\n <div class=\"cf-suggest-empty\" *ngIf=\"!suggestions(list).length\">\r\n {{ users.length ? 'No matching user' : 'No users for this client' }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Dropdown: styled like the prototype instead of the browser's native select -->\r\n <ng-template #dropdown let-key=\"key\" let-options=\"options\">\r\n <span class=\"cf-select\" [class.is-open]=\"openSelect === key\">\r\n <button type=\"button\" class=\"cf-select-btn\" (click)=\"toggleSelect(key, $event)\">\r\n {{ selectLabel(key, options) }}\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"cf-select-menu\" *ngIf=\"openSelect === key\">\r\n <div class=\"cf-select-item\" *ngFor=\"let o of options\" [class.is-on]=\"isPicked(key, o)\"\r\n (click)=\"pick(key, o, $event)\">{{ o.label }}</div>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"cf-body\" *ngIf=\"!loadError\">\r\n <!-- Section tree -->\r\n <aside class=\"cf-left\">\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"cf-left-title\">{{ auditName || 'Audit' }}</div>\r\n\r\n <div class=\"cf-hint\" *ngIf=\"!sections.length\">No questions yet</div>\r\n <ng-container *ngFor=\"let s of sections\">\r\n <div class=\"cf-section\" [class.is-open]=\"s.open\" (click)=\"toggleSection(s)\">\r\n {{ s.label }}\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!s.open\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"cf-items\" *ngIf=\"s.open && s.items.length\">\r\n <div *ngFor=\"let it of s.items\">{{ it }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Schedule block (QA 10 Oct): audits have no one-time / repeat schedule here; visits come from Schedules. -->\r\n </ng-container>\r\n </aside>\r\n\r\n <!-- Configuration -->\r\n <div class=\"cf-right\">\r\n\r\n <section class=\"cf-card\" *ngIf=\"loading\">\r\n <lib-audit-v2-shimmer [rows]=\"4\"></lib-audit-v2-shimmer>\r\n </section>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n\r\n <!-- ===== Advance Configuration ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-head\">\r\n <span class=\"cf-block-title\">Advance Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </span>\r\n </div>\r\n\r\n <!-- Audit Owner -->\r\n <div>\r\n <div class=\"cf-label\">Audit Owner</div>\r\n <div class=\"cf-hint\">Owners get access to manage the audit</div>\r\n </div>\r\n <div class=\"cf-row\">\r\n <span class=\"cf-field\">Can be managed by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'owners', large: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Approver -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Approver</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"approverOn\" (click)=\"toggleApprover()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be able to approve the audit</div>\r\n <div class=\"cf-row\" *ngIf=\"approverOn\">\r\n <span class=\"cf-field\">To be approved by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'approvers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"approverError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ approverError }}\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Approver is off, so the {{ approvers.length }} approver{{ approvers.length === 1 ? '' : 's' }} added will be removed when you save. Turn Approver back on to keep {{ approvers.length === 1 ? 'it' : 'them' }}.\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && !approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Approver is off, so submitted audits are not sent for approval. Turn it on to add approvers or to send flags and reports to them.\r\n </div>\r\n\r\n <!-- Reminder -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Reminder</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"reminderOn\" (click)=\"toggleReminder()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be reminded in the selected interval</div>\r\n <div class=\"cf-inner\" *ngIf=\"reminderOn\">\r\n <div class=\"cf-inline\">\r\n Notify user before\r\n <span class=\"cf-reminder\" *ngFor=\"let m of reminders; let i = index\">\r\n <lib-audit-v2-select class=\"cf-reminder-select\" [value]=\"m\" [options]=\"reminderOpts[i] || []\" [searchable]=\"false\"\r\n [ariaLabel]=\"'Reminder ' + (i + 1) + ' in minutes'\" (changed)=\"setReminder(i, $event.target.value)\"></lib-audit-v2-select>\r\n <a class=\"cf-chip-x\" *ngIf=\"reminders.length > 1\" title=\"Remove reminder\" (click)=\"removeReminder(i)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <button type=\"button\" class=\"cf-icon-btn\" *ngIf=\"reminders.length < maxReminders\" title=\"Add reminder\" (click)=\"addReminder()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Send alerts {{ reminderSummary }} mins before the audit end time\r\n </div>\r\n </div>\r\n\r\n <!-- Notify Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"notifyFlagsOn\" (click)=\"toggleNotifyFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, all flags will be sent as an email</div>\r\n <ng-container *ngIf=\"notifyFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !notifySendApprover\" (click)=\"toggleSendApprover('notifySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendApprover\">\r\n <svg *ngIf=\"notifySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"notifySendCustom = !notifySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendCustom\">\r\n <svg *ngIf=\"notifySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"notifySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'notifyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-error\" *ngIf=\"notifyFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ notifyFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Notify on Recurring Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify on Recurring Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"recurringFlagsOn\" (click)=\"toggleRecurringFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">When enabled, emails are sent for recurring flags based on the configured threshold</div>\r\n\r\n <div class=\"cf-inner\" *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-inline\">\r\n Send Email if the same question is flagged\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'recurringThreshold', options: thresholdOpts }\"></ng-container>\r\n times by the same store\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Once the threshold is reached and an email is sent, the flag count resets to zero\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !recurringSendApprover\" (click)=\"toggleSendApprover('recurringSendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendApprover\">\r\n <svg *ngIf=\"recurringSendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"toggleRecurringCustom()\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendCustom\">\r\n <svg *ngIf=\"recurringSendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n <label class=\"cf-check\" (click)=\"recurringSameAsNotify = !recurringSameAsNotify\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSameAsNotify\">\r\n <svg *ngIf=\"recurringSameAsNotify\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Use same users from Notify Flags\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"recurringSendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'recurringUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-info\" *ngIf=\"recurringSameAsNotify\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ notifyRecipientsLabel }}\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"recurringFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ recurringFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Daily report -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Enable - Daily Report</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"dailyReportOn\" (click)=\"toggleDailyReport()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By Enabling, compliance score will be sent as an email to the above users</div>\r\n <ng-container *ngIf=\"dailyReportOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !dailySendApprover\" (click)=\"toggleSendApprover('dailySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendApprover\">\r\n <svg *ngIf=\"dailySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"dailySendCustom = !dailySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendCustom\">\r\n <svg *ngIf=\"dailySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"dailySendCustom\">\r\n <div class=\"cf-bulkbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openDailyBulk()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n Bulk Upload\r\n </button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'dailyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <label class=\"cf-check\" (click)=\"sharePostApproval = !sharePostApproval\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"sharePostApproval\">\r\n <svg *ngIf=\"sharePostApproval\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Share Report Post Approval\r\n </label>\r\n <div class=\"cf-error\" *ngIf=\"dailyReportError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ dailyReportError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Export submission: Tango users only, as the v1 Configure (its stored value is kept for everyone else). -->\r\n <div class=\"cf-grid2\" *ngIf=\"access.isTango\">\r\n <div class=\"cf-stack cf-stack--tight\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Export Submission</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"exportSubmissionOn\" (click)=\"exportSubmissionOn = !exportSubmissionOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint\">Enable this to allow audit submitters to download their submission as a PDF file</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Redo validity -->\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Validity</div>\r\n <div class=\"cf-inline\">\r\n Redo valid for\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoValidFor', options: redoDayOpts }\"></ng-container>\r\n Day from Redo creation\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Auto create task -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Auto Create Task for Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"autoCreateTaskOn\" (click)=\"autoCreateTaskOn = !autoCreateTaskOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, a task is automatically created for every flagged question in the audit</div>\r\n\r\n <!-- Who gets the task and how long it stays open (as the Checklist Configure page) -->\r\n <div class=\"cf-autotask\" *ngIf=\"autoCreateTaskOn\">\r\n <div class=\"cf-autotask-title\">Task Assignee</div>\r\n <div class=\"cf-hint cf-hint--tight\">Choose who the flagged task is assigned to</div>\r\n <div class=\"cf-autotask-choices\">\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'submitter'\" (click)=\"taskAssignee = 'submitter'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'submitter'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Audit Submitter</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user who filled the audit</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'store'\" (click)=\"taskAssignee = 'store'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'store'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Store User</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user mapped to the flagged store</span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cf-autotask-title\">Task Validity</div>\r\n <div class=\"cf-autotask-validity\">\r\n <span>Task valid for</span>\r\n <lib-audit-v2-select class=\"cf-validity-select\" [(ngModel)]=\"taskValidity\" [options]=\"taskValidityOptions\"\r\n [searchable]=\"false\" ariaLabel=\"Task validity in days\"></lib-audit-v2-select>\r\n <span>days from task creation</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Audit Configuration ===== -->\r\n <div class=\"cf-divider-head\">\r\n <span class=\"cf-block-title\">Audit Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n </div>\r\n\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Submission &amp; Visibility</div>\r\n\r\n <!-- cf-box--open: the dispute-window and response-delay menus must not be clipped by the box -->\r\n <div class=\"cf-box cf-box--open\">\r\n <div class=\"cf-box-row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"showResponseInApp\"\r\n (click)=\"showResponseInApp = !showResponseInApp\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Show Response in Mobile App</div>\r\n <div class=\"cf-hint\">By enabling this option, store users can view the audit response in the Mobile App.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sub\" *ngIf=\"showResponseInApp\">\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Response Visibility</div>\r\n <div class=\"cf-hint\">Choose when the response becomes visible to store users</div>\r\n </div>\r\n\r\n <div class=\"cf-options\">\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'pre'\" (click)=\"responseVisibility = 'pre'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'pre'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\">Pre-approval</div>\r\n <div class=\"cf-hint\">The audit response will be visible to store users before it is approved.</div>\r\n <div class=\"cf-inline cf-inline--top\">\r\n Show response\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'respDelay', options: respDelayOpts }\"></ng-container>\r\n after submission\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'post'\" (click)=\"responseVisibility = 'post'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'post'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\" [class.cf-muted]=\"responseVisibility !== 'post'\">Post-approval</div>\r\n <div class=\"cf-hint\">Once the response is approved, it will automatically be displayed in the Mobile App. Store users cannot raise a dispute.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sep\">\r\n <ng-container *ngIf=\"responseVisibility === 'pre'\">\r\n <div class=\"cf-box-row cf-box-row--flush\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"disputeOn\" (click)=\"disputeOn = !disputeOn\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Dispute Configuration</div>\r\n <div class=\"cf-hint cf-hint--wrap\">When enabled, the store team can raise a dispute against the auditor's submission once the response becomes visible to them.</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--nested\" *ngIf=\"disputeOn\">\r\n <div class=\"cf-inline\">\r\n Dispute window\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'disputeWindow', options: dispWindowOpts }\"></ng-container>\r\n from when the response becomes visible\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Disputes raised inside this window go to the approver. Approved disputes revise the answer and the compliance score.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"!hasApprovers\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n No approver is set, so no one can review disputes. Turn on Approver and add an approver.\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"responseVisibility === 'post'\">\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm cf-muted\">Dispute Configuration</div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Disputes are not available when responses are shown post-approval.\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Pre-submission access -->\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pre-Submission Access</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"preSubmissionAccessOn\" (click)=\"preSubmissionAccessOn = !preSubmissionAccessOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Users added here can view Open and In Progress audits until submission. The Schedule Info tab is also visible only to these users.</div>\r\n <ng-container *ngIf=\"preSubmissionAccessOn\">\r\n <div class=\"cf-row cf-row--top\">\r\n <span class=\"cf-field\">Visible to</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'preSubmissionUsers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error cf-error--indent\" *ngIf=\"preSubmissionEmpty\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Add at least one user\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Scoring ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Scoring</div>\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pass/Fail Score Setup</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"passFailOn\" (click)=\"passFailOn = !passFailOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Set the compliance score an audit must reach to be marked {{ passLabel }}. Anything below it is marked {{ failLabel }}.</div>\r\n <div class=\"cf-row cf-row--wrap cf-row--top\" *ngIf=\"passFailOn\">\r\n <span class=\"cf-field\">Minimum score to {{ passLabel }}</span>\r\n <label class=\"cf-num\">\r\n <input type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"passThreshold\">\r\n <span>%</span>\r\n </label>\r\n <span class=\"cf-pill cf-pill--pass\">{{ passLabel }} \u2265 {{ passThreshold }}%</span>\r\n <span class=\"cf-pill cf-pill--fail\">{{ failLabel }} &lt; {{ passThreshold }}%</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Approver Controls ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Approver Controls</div>\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Edit Submitted Audit</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"editSubmittedOn\" (click)=\"toggleEditSubmitted()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">Allow Approvers to edit submitted Audit</div>\r\n <ng-container *ngIf=\"editSubmittedOn\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'editUsers', large: true }\"></ng-container>\r\n <div class=\"cf-error\" *ngIf=\"editSubmittedError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ editSubmittedError }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Extension</div>\r\n <div class=\"cf-inline\">\r\n Extend redo up to\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoExtension', options: redoExtensionOpts }\"></ng-container>\r\n Days till approval\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== User Verification ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-title\">User Verification Configuration</div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requirePhoto\" (click)=\"requirePhoto = !requirePhoto\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require Photo Capture</div>\r\n <div class=\"cf-hint\">By enabling, users must capture their photo to complete submission</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requireAcknowledgment\" (click)=\"requireAcknowledgment = !requireAcknowledgment\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require User Acknowledgment</div>\r\n <div class=\"cf-hint\">By enabling, users must type their name as acknowledgment to complete submission</div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Daily Report > Custom: bulk upload users (as the Checklist Configure page's popup) -->\r\n <ng-container *ngIf=\"dailyBulkOpen\">\r\n <div class=\"cf-dlg-backdrop\" (click)=\"closeDailyBulk()\"></div>\r\n <div class=\"cf-dlg\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"cf-dlg-title\">\r\n <span class=\"cf-dlg-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n </span>\r\n <div class=\"cf-dlg-title\" id=\"cf-dlg-title\">Bulk Upload</div>\r\n <div class=\"cf-dlg-steps\">\r\n <div>Step 1 - <a href=\"#\" (click)=\"$event.preventDefault(); downloadDailyTemplate()\">Download the template here</a></div>\r\n <div>Step 2 - Add the Email of existing users to the template</div>\r\n <div>Step 3 - Upload it below for processing</div>\r\n </div>\r\n <div class=\"cf-dlg-note\">\r\n **Note : Only the Email column is considered - the Username is taken from the existing user list.\r\n Only existing users of this client are accepted. On upload, all the existing data will be replaced.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"dailyBulkErrors.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n <div class=\"cf-dlg-errors\">\r\n <div>The file was not uploaded. Fix {{ dailyBulkErrors.length === 1 ? 'this row' : 'these rows' }} and upload again:</div>\r\n <div *ngFor=\"let e of dailyBulkErrors.slice(0, 5)\">{{ e }}</div>\r\n <div *ngIf=\"dailyBulkErrors.length > 5\">+{{ dailyBulkErrors.length - 5 }} more</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-dlg-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"closeDailyBulk()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" (click)=\"dailyBulkFile.click()\">Upload</button>\r\n <input #dailyBulkFile type=\"file\" accept=\".xlsx\" hidden (change)=\"onDailyBulkFile($event)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.cf-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.cf-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.cf-crumb{font-size:13px;line-height:20px;color:#667085}.cf-crumb a{font-weight:600;color:#00a3ff}.cf-header{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px;display:flex;align-items:center;gap:12px}.cf-header-text{display:flex;flex-direction:column;gap:4px;min-width:0}.cf-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.cf-sk-title{margin:3px 0}.cf-desc{border:none;outline:none;padding:0;background:transparent;font-family:inherit;font-size:13px;line-height:18px;color:#344054;min-width:320px}.cf-desc::placeholder{color:#98a2b3}.cf-publish{padding:0 20px;box-shadow:0 1px 2px #1018280d}.cf-draft{padding:0 18px;box-shadow:inset 0 0 0 1px #d0d5dd,0 1px 2px #1018280d}.cf-body{display:flex;gap:16px;align-items:flex-start}.cf-left{width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px;display:flex;flex-direction:column;gap:10px;position:sticky;top:calc(var(--bs-app-header-height, 0px) + 16px);max-height:calc(100vh - var(--bs-app-header-height, 0px) - 32px);overflow-y:auto;scrollbar-width:thin}.cf-left-title{font-size:14px;line-height:20px;font-weight:600;color:#101828}.cf-section{display:flex;align-items:center;gap:8px;padding:2px 0;font-size:13px;font-weight:500;color:#344054;cursor:pointer;white-space:nowrap}.cf-section.is-open{color:#1d2939}.cf-rule{flex:1;border-top:1px solid #EAECF0}.cf-chev{display:flex;color:#98a2b3}.cf-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.cf-chev .rotate{transform:rotate(-90deg)}.cf-items{display:flex;flex-direction:column;gap:8px;padding-left:12px;font-size:13px;color:#475467}.cf-schedule-title{font-size:14px;font-weight:600;color:#101828;margin-top:6px}.cf-schedule{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#475467}.cf-schedule>div{display:flex;align-items:center;gap:6px}.cf-right{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}.cf-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px;display:flex;flex-direction:column;gap:14px}.cf-card--lg{border-radius:8px}.cf-block-head{display:flex;align-items:center;gap:12px}.cf-block-title{font-size:15px;font-weight:600;color:#101828}.cf-divider-head{display:flex;align-items:center;gap:10px;margin-top:4px}.cf-label{font-size:14px;font-weight:600;color:#101828}.cf-label-sm{font-size:13px;font-weight:600;color:#101828}.cf-muted{color:#667085}.cf-hint{font-size:12px;line-height:18px;color:#667085}.cf-hint--tight{margin-top:-8px}.cf-hint--wrap{max-width:640px;text-wrap:pretty}.cf-field{font-size:13px;font-weight:500;color:#344054;min-width:150px;flex-shrink:0}.cf-row{display:flex;align-items:center;gap:12px}.cf-row--top{margin-top:6px}.cf-row--wrap{flex-wrap:wrap}.cf-stack{display:flex;flex-direction:column;gap:8px}.cf-stack--tight,.cf-stack--sm{gap:4px}.cf-stack--xs{gap:2px}.cf-grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.cf-toggle-row{display:flex;align-items:center;gap:10px}.cf-switch{width:36px;height:20px;padding:2px;border:none;border-radius:9999px;background:#eaecf0;display:flex;align-items:center;justify-content:flex-start;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.cf-switch>span{width:16px;height:16px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #1018280d}.cf-switch.is-on{background:#00a3ff;justify-content:flex-end}.cf-switch--top{margin-top:2px}.cf-chipbox{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:8px 10px}.cf-chipbox--lg{gap:8px;padding:10px 12px}.cf-chip{display:flex;align-items:center;gap:6px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;border-radius:9999px;padding:3px 8px;font-size:12px;color:#344054;white-space:nowrap;flex-shrink:0;max-width:100%}.cf-chip--lg{gap:8px;background:#fff;padding:5px 11px;font-size:13px;color:#1d2939}.cf-chip-ini{color:#00a3ff;font-weight:600;font-size:11px}.cf-chip-tag{display:inline-flex;align-items:center;justify-content:center;padding:1px 5px;border-radius:6px;background:#eaf8ff;color:#00a3ff;font-weight:700;font-size:11px;letter-spacing:.02em}.cf-chip-x{display:flex;cursor:pointer;color:#98a2b3}.cf-chip-x:hover{color:#344054}.cf-chip-input{flex:1;min-width:100px;border:none;outline:none;background:transparent;font-family:inherit;font-size:12px;color:#101828}.cf-chip-input::placeholder{color:#98a2b3}.cf-chip-input--lg{min-width:120px;font-size:13px}.cf-inner{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:8px}.cf-inline{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-inline--top{margin-top:2px}.cf-mini{height:32px;padding:0 28px 0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 8px center;outline:none}.cf-info{display:flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#667085}.cf-info svg{flex-shrink:0}.cf-info--wrap{align-items:flex-start;max-width:560px;text-wrap:pretty}.cf-info--wrap svg{margin-top:3px}.cf-checks{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-checks-label{font-weight:500}.cf-check{display:flex;align-items:center;gap:6px;margin:0;font-size:13px;color:#344054;cursor:pointer;-webkit-user-select:none;user-select:none}.cf-check-box{width:16px;height:16px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.cf-check-box.is-on{background:#00a3ff;box-shadow:none}.cf-box{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden;display:flex;flex-direction:column}.cf-box--pad{padding:14px 16px;gap:6px;overflow:visible}.cf-box--row{padding:14px 16px;flex-direction:row;align-items:flex-start;gap:12px}.cf-box--nested{background:#fff;padding:12px 14px;gap:8px;margin-left:46px;overflow:visible}.cf-box--open{overflow:visible}.cf-box--open>.cf-box-sub:last-child{border-radius:0 0 8px 8px}.cf-box-row{padding:14px 16px;display:flex;align-items:flex-start;gap:12px}.cf-box-row--flush{padding:0;gap:10px}.cf-box-sub{border-top:1px solid #EAECF0;background:#f9fafb;padding:16px 16px 18px 64px;display:flex;flex-direction:column;gap:12px}.cf-options{display:flex;flex-direction:column;gap:10px}.cf-option{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:12px 14px;display:flex;align-items:flex-start;gap:10px;cursor:pointer}.cf-option.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.cf-box-sep{display:flex;flex-direction:column;gap:12px;padding-top:14px;border-top:1px solid #EAECF0}.cf-num{display:flex;align-items:center;gap:8px;height:36px;padding:0 6px 0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;margin:0}.cf-num input{width:52px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.cf-num span{font-size:13px;color:#667085;padding-right:6px}.cf-pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;border-radius:9999px;padding:4px 12px}.cf-pill--pass{background:#ecfdf3;color:#027a48}.cf-pill--fail{background:#fef3f2;color:#d92d20}.cf-error{display:flex;gap:6px;font-size:12px;font-weight:500;color:#d92d20;align-items:flex-start;line-height:18px;max-width:640px}.cf-error svg{flex-shrink:0;margin-top:3px}.cf-error--indent{margin-left:162px}.cf-check.is-blocked{color:#98a2b3;cursor:not-allowed}.cf-select{position:relative;display:inline-block;vertical-align:middle}.cf-select-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 10px 0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;white-space:nowrap}.cf-select-btn svg{color:#667085;transition:transform .15s ease}.is-open .cf-select-btn{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.is-open .cf-select-btn svg{transform:rotate(180deg)}.cf-select-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;min-width:100%;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-select-item{padding:8px 12px;border-radius:6px;font-size:13px;color:#344054;white-space:nowrap;cursor:pointer}.cf-select-item:hover{background:#f9fafb}.cf-select-item.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.cf-chipbox{position:relative}.cf-chipbox.is-open{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.cf-suggest{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:30;max-height:260px;overflow-y:auto;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-suggest-item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:6px;cursor:pointer}.cf-suggest-item:hover{background:#f9fafb}.cf-suggest-name{font-size:13px;color:#101828}.cf-suggest-mail{font-size:12px;color:#667085;margin-left:auto}.cf-suggest-empty{padding:8px 10px;font-size:12px;color:#667085}.cf-error--page{margin:0 0 12px}.cf-autotask{margin-top:12px;padding:14px 16px;border-radius:10px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column;gap:8px}.cf-autotask-title{font-size:14px;font-weight:600;color:#1d2939}.cf-autotask-title:not(:first-child){margin-top:6px}.cf-autotask-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 720px){.cf-autotask-choices{grid-template-columns:1fr}}.cf-choice{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;text-align:left;cursor:pointer}.cf-choice.is-on{background:#f5faff;box-shadow:inset 0 0 0 1px #66c8ff}.cf-radio{width:18px;height:18px;flex-shrink:0;margin-top:1px;border-radius:9999px;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center}.cf-radio span{width:8px;height:8px;border-radius:9999px;background:transparent}.cf-radio.is-on{box-shadow:inset 0 0 0 1px #1570ef}.cf-radio.is-on span{background:#1570ef}.cf-choice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.cf-choice-title{font-size:14px;font-weight:600;color:#101828}.cf-choice-sub{font-size:12px;color:#667085}.cf-autotask-validity{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:#344054}.cf-validity-select{width:96px}.cf-reminder{display:inline-flex;align-items:center;gap:6px}.cf-reminder-select{width:120px}.cf-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;cursor:pointer}.cf-icon-btn:hover{background:#f9fafb}.cf-bulkbar{display:flex;justify-content:flex-end;margin-bottom:-4px}.cf-bulkbar .av2-btn{display:inline-flex;align-items:center;gap:6px}.cf-dlg-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.cf-dlg{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:520px;max-width:calc(100vw - 32px);max-height:90vh;overflow-y:auto;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.cf-dlg-icon{width:40px;height:40px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.cf-dlg-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.cf-dlg-steps{display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.cf-dlg-steps a{color:#00a3ff;text-decoration:underline;cursor:pointer}.cf-dlg-note{font-size:13px;line-height:20px;font-weight:600;color:#344054}.cf-dlg-errors{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}.cf-dlg-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i8.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }] });
914
1030
  }
915
1031
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2ConfigureComponent, decorators: [{
916
1032
  type: Component,
917
- args: [{ selector: 'lib-audit-v2-configure', template: "<div class=\"av2-page audit-configure\">\r\n\r\n <!-- Back + breadcrumb (as the schedule editor's back bar) -->\r\n <div class=\"cf-backbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm cf-back\" (click)=\"back()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\r\n {{ backLabel }}\r\n </button>\r\n <div class=\"cf-crumb\">\r\n <a href=\"#\" (click)=\"back($event)\">Manage Audit</a> \u203A Configure\r\n </div>\r\n </div>\r\n\r\n <!-- Title + actions -->\r\n <div class=\"cf-header\">\r\n <div class=\"cf-header-text\">\r\n <span class=\"av2-sk av2-sk--title cf-sk-title\" *ngIf=\"loading\"></span>\r\n <div class=\"cf-title\" *ngIf=\"!loading\">{{ auditName || 'Audit' }}</div>\r\n <input type=\"text\" class=\"cf-desc\" placeholder=\"Enter Audit Description\" [(ngModel)]=\"description\">\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary cf-publish\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason || publishBlockedReason\" (click)=\"publish()\">\r\n {{ saving ? 'Saving\u2026' : (published ? 'Save & Publish' : 'Publish') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost cf-draft\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason\" (click)=\"saveDraft()\">Save as Draft</button>\r\n </div>\r\n\r\n <div class=\"cf-error cf-error--page\" *ngIf=\"loadError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ loadError }}\r\n </div>\r\n\r\n <!-- Chip picker: chips + input + suggestion list (one template, used for every user list) -->\r\n <ng-template #chipPicker let-list=\"list\" let-large=\"large\">\r\n <div class=\"cf-chipbox\" [class.cf-chipbox--lg]=\"large\" [class.is-open]=\"openChips === list\" (click)=\"focusChips(list, $event)\">\r\n <span class=\"cf-chip\" [class.cf-chip--lg]=\"large\" *ngFor=\"let u of chipsOf(list); let i = index\" [title]=\"u.e\">\r\n <span [class]=\"large ? 'cf-chip-tag' : 'cf-chip-ini'\">{{ u.i }}</span>{{ u.n }}\r\n <a class=\"cf-chip-x\" (click)=\"removeChip(list, i); $event.stopPropagation()\">\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <input type=\"text\" class=\"cf-chip-input\" [class.cf-chip-input--lg]=\"large\" placeholder=\"Add user...\"\r\n [ngModel]=\"draftOf(list)\" (ngModelChange)=\"setDraft(list, $event)\" (focus)=\"focusChips(list, $event)\" (keyup.enter)=\"addChip(list)\">\r\n <div class=\"cf-suggest\" *ngIf=\"openChips === list\">\r\n <div class=\"cf-suggest-item\" *ngFor=\"let u of suggestions(list)\" (click)=\"addSuggestion(list, u, $event)\">\r\n <span class=\"cf-chip-ini\">{{ u.i }}</span>\r\n <span class=\"cf-suggest-name\">{{ u.n }}</span>\r\n <span class=\"cf-suggest-mail\">{{ u.e }}</span>\r\n </div>\r\n <div class=\"cf-suggest-empty\" *ngIf=\"!suggestions(list).length\">\r\n {{ users.length ? 'No matching user' : 'No users for this client' }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Dropdown: styled like the prototype instead of the browser's native select -->\r\n <ng-template #dropdown let-key=\"key\" let-options=\"options\">\r\n <span class=\"cf-select\" [class.is-open]=\"openSelect === key\">\r\n <button type=\"button\" class=\"cf-select-btn\" (click)=\"toggleSelect(key, $event)\">\r\n {{ selectLabel(key, options) }}\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"cf-select-menu\" *ngIf=\"openSelect === key\">\r\n <div class=\"cf-select-item\" *ngFor=\"let o of options\" [class.is-on]=\"isPicked(key, o)\"\r\n (click)=\"pick(key, o, $event)\">{{ o.label }}</div>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"cf-body\" *ngIf=\"!loadError\">\r\n <!-- Section tree -->\r\n <aside class=\"cf-left\">\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"cf-left-title\">{{ auditName || 'Audit' }}</div>\r\n\r\n <div class=\"cf-hint\" *ngIf=\"!sections.length\">No questions yet</div>\r\n <ng-container *ngFor=\"let s of sections\">\r\n <div class=\"cf-section\" [class.is-open]=\"s.open\" (click)=\"toggleSection(s)\">\r\n {{ s.label }}\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!s.open\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"cf-items\" *ngIf=\"s.open && s.items.length\">\r\n <div *ngFor=\"let it of s.items\">{{ it }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Schedule block (QA 10 Oct): audits have no one-time / repeat schedule here; visits come from Schedules. -->\r\n </ng-container>\r\n </aside>\r\n\r\n <!-- Configuration -->\r\n <div class=\"cf-right\">\r\n\r\n <section class=\"cf-card\" *ngIf=\"loading\">\r\n <lib-audit-v2-shimmer [rows]=\"4\"></lib-audit-v2-shimmer>\r\n </section>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n\r\n <!-- ===== Advance Configuration ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-head\">\r\n <span class=\"cf-block-title\">Advance Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </span>\r\n </div>\r\n\r\n <!-- Audit Owner -->\r\n <div>\r\n <div class=\"cf-label\">Audit Owner</div>\r\n <div class=\"cf-hint\">Owners get access to manage the audit</div>\r\n </div>\r\n <div class=\"cf-row\">\r\n <span class=\"cf-field\">Can be managed by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'owners', large: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Approver -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Approver</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"approverOn\" (click)=\"toggleApprover()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be able to approve the audit</div>\r\n <div class=\"cf-row\" *ngIf=\"approverOn\">\r\n <span class=\"cf-field\">To be approved by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'approvers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"approverError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ approverError }}\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Approver is off, so the {{ approvers.length }} approver{{ approvers.length === 1 ? '' : 's' }} added will be removed when you save. Turn Approver back on to keep {{ approvers.length === 1 ? 'it' : 'them' }}.\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && !approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Approver is off, so submitted audits are not sent for approval. Turn it on to add approvers or to send flags and reports to them.\r\n </div>\r\n\r\n <!-- Reminder -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Reminder</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"reminderOn\" (click)=\"toggleReminder()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be reminded in the selected interval</div>\r\n <div class=\"cf-inner\" *ngIf=\"reminderOn\">\r\n <div class=\"cf-inline\">\r\n Notify user before\r\n <span class=\"cf-reminder\" *ngFor=\"let m of reminders; let i = index\">\r\n <lib-audit-v2-select class=\"cf-reminder-select\" [value]=\"m\" [options]=\"reminderOpts[i] || []\" [searchable]=\"false\"\r\n [ariaLabel]=\"'Reminder ' + (i + 1) + ' in minutes'\" (changed)=\"setReminder(i, $event.target.value)\"></lib-audit-v2-select>\r\n <a class=\"cf-chip-x\" *ngIf=\"reminders.length > 1\" title=\"Remove reminder\" (click)=\"removeReminder(i)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <button type=\"button\" class=\"cf-icon-btn\" *ngIf=\"reminders.length < maxReminders\" title=\"Add reminder\" (click)=\"addReminder()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Send alerts {{ reminderSummary }} mins before the audit end time\r\n </div>\r\n </div>\r\n\r\n <!-- Notify Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"notifyFlagsOn\" (click)=\"toggleNotifyFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, all flags will be sent as an email</div>\r\n <ng-container *ngIf=\"notifyFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !notifySendApprover\" (click)=\"toggleSendApprover('notifySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendApprover\">\r\n <svg *ngIf=\"notifySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"notifySendCustom = !notifySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendCustom\">\r\n <svg *ngIf=\"notifySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"notifySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'notifyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-error\" *ngIf=\"notifyFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ notifyFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Notify on Recurring Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify on Recurring Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"recurringFlagsOn\" (click)=\"toggleRecurringFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">When enabled, emails are sent for recurring flags based on the configured threshold</div>\r\n\r\n <div class=\"cf-inner\" *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-inline\">\r\n Send Email if the same question is flagged\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'recurringThreshold', options: thresholdOpts }\"></ng-container>\r\n times by the same store\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Once the threshold is reached and an email is sent, the flag count resets to zero\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !recurringSendApprover\" (click)=\"toggleSendApprover('recurringSendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendApprover\">\r\n <svg *ngIf=\"recurringSendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"toggleRecurringCustom()\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendCustom\">\r\n <svg *ngIf=\"recurringSendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n <label class=\"cf-check\" (click)=\"recurringSameAsNotify = !recurringSameAsNotify\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSameAsNotify\">\r\n <svg *ngIf=\"recurringSameAsNotify\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Use same users from Notify Flags\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"recurringSendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'recurringUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-info\" *ngIf=\"recurringSameAsNotify\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ notifyRecipientsLabel }}\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"recurringFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ recurringFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Daily report -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Enable - Daily Report</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"dailyReportOn\" (click)=\"toggleDailyReport()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By Enabling, compliance score will be sent as an email to the above users</div>\r\n <ng-container *ngIf=\"dailyReportOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !dailySendApprover\" (click)=\"toggleSendApprover('dailySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendApprover\">\r\n <svg *ngIf=\"dailySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"dailySendCustom = !dailySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendCustom\">\r\n <svg *ngIf=\"dailySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"dailySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'dailyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <label class=\"cf-check\" (click)=\"sharePostApproval = !sharePostApproval\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"sharePostApproval\">\r\n <svg *ngIf=\"sharePostApproval\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Share Report Post Approval\r\n </label>\r\n <div class=\"cf-error\" *ngIf=\"dailyReportError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ dailyReportError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Export submission: Tango users only, as the v1 Configure (its stored value is kept for everyone else). -->\r\n <div class=\"cf-grid2\" *ngIf=\"access.isTango\">\r\n <div class=\"cf-stack cf-stack--tight\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Export Submission</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"exportSubmissionOn\" (click)=\"exportSubmissionOn = !exportSubmissionOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint\">Enable this to allow audit submitters to download their submission as a PDF file</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Redo validity -->\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Validity</div>\r\n <div class=\"cf-inline\">\r\n Redo valid for\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoValidFor', options: redoDayOpts }\"></ng-container>\r\n Day from Redo creation\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Auto create task -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Auto Create Task for Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"autoCreateTaskOn\" (click)=\"autoCreateTaskOn = !autoCreateTaskOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, a task is automatically created for every flagged question in the audit</div>\r\n\r\n <!-- Who gets the task and how long it stays open (as the Checklist Configure page) -->\r\n <div class=\"cf-autotask\" *ngIf=\"autoCreateTaskOn\">\r\n <div class=\"cf-autotask-title\">Task Assignee</div>\r\n <div class=\"cf-hint cf-hint--tight\">Choose who the flagged task is assigned to</div>\r\n <div class=\"cf-autotask-choices\">\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'submitter'\" (click)=\"taskAssignee = 'submitter'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'submitter'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Audit Submitter</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user who filled the audit</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'store'\" (click)=\"taskAssignee = 'store'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'store'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Store User</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user mapped to the flagged store</span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cf-autotask-title\">Task Validity</div>\r\n <div class=\"cf-autotask-validity\">\r\n <span>Task valid for</span>\r\n <lib-audit-v2-select class=\"cf-validity-select\" [(ngModel)]=\"taskValidity\" [options]=\"taskValidityOptions\"\r\n [searchable]=\"false\" ariaLabel=\"Task validity in days\"></lib-audit-v2-select>\r\n <span>days from task creation</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Audit Configuration ===== -->\r\n <div class=\"cf-divider-head\">\r\n <span class=\"cf-block-title\">Audit Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n </div>\r\n\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Submission &amp; Visibility</div>\r\n\r\n <!-- cf-box--open: the dispute-window and response-delay menus must not be clipped by the box -->\r\n <div class=\"cf-box cf-box--open\">\r\n <div class=\"cf-box-row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"showResponseInApp\"\r\n (click)=\"showResponseInApp = !showResponseInApp\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Show Response in Mobile App</div>\r\n <div class=\"cf-hint\">By enabling this option, store users can view the audit response in the Mobile App.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sub\" *ngIf=\"showResponseInApp\">\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Response Visibility</div>\r\n <div class=\"cf-hint\">Choose when the response becomes visible to store users</div>\r\n </div>\r\n\r\n <div class=\"cf-options\">\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'pre'\" (click)=\"responseVisibility = 'pre'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'pre'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\">Pre-approval</div>\r\n <div class=\"cf-hint\">The audit response will be visible to store users before it is approved.</div>\r\n <div class=\"cf-inline cf-inline--top\">\r\n Show response\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'respDelay', options: respDelayOpts }\"></ng-container>\r\n after submission\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'post'\" (click)=\"responseVisibility = 'post'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'post'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\" [class.cf-muted]=\"responseVisibility !== 'post'\">Post-approval</div>\r\n <div class=\"cf-hint\">Once the response is approved, it will automatically be displayed in the Mobile App. Store users cannot raise a dispute.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sep\">\r\n <ng-container *ngIf=\"responseVisibility === 'pre'\">\r\n <div class=\"cf-box-row cf-box-row--flush\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"disputeOn\" (click)=\"disputeOn = !disputeOn\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Dispute Configuration</div>\r\n <div class=\"cf-hint cf-hint--wrap\">When enabled, the store team can raise a dispute against the auditor's submission once the response becomes visible to them.</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--nested\" *ngIf=\"disputeOn\">\r\n <div class=\"cf-inline\">\r\n Dispute window\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'disputeWindow', options: dispWindowOpts }\"></ng-container>\r\n from when the response becomes visible\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Disputes raised inside this window go to the approver. Approved disputes revise the answer and the compliance score.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"!hasApprovers\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n No approver is set, so no one can review disputes. Turn on Approver and add an approver.\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"responseVisibility === 'post'\">\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm cf-muted\">Dispute Configuration</div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Disputes are not available when responses are shown post-approval.\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Pre-submission access -->\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pre-Submission Access</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"preSubmissionAccessOn\" (click)=\"preSubmissionAccessOn = !preSubmissionAccessOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Users added here can view Open and In Progress audits until submission. The Schedule Info tab is also visible only to these users.</div>\r\n <ng-container *ngIf=\"preSubmissionAccessOn\">\r\n <div class=\"cf-row cf-row--top\">\r\n <span class=\"cf-field\">Visible to</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'preSubmissionUsers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error cf-error--indent\" *ngIf=\"preSubmissionEmpty\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Add at least one user\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Scoring ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Scoring</div>\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pass/Fail Score Setup</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"passFailOn\" (click)=\"passFailOn = !passFailOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Set the compliance score an audit must reach to be marked {{ passLabel }}. Anything below it is marked {{ failLabel }}.</div>\r\n <div class=\"cf-row cf-row--wrap cf-row--top\" *ngIf=\"passFailOn\">\r\n <span class=\"cf-field\">Minimum score to {{ passLabel }}</span>\r\n <label class=\"cf-num\">\r\n <input type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"passThreshold\">\r\n <span>%</span>\r\n </label>\r\n <span class=\"cf-pill cf-pill--pass\">{{ passLabel }} \u2265 {{ passThreshold }}%</span>\r\n <span class=\"cf-pill cf-pill--fail\">{{ failLabel }} &lt; {{ passThreshold }}%</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Approver Controls ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Approver Controls</div>\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Edit Submitted Audit</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"editSubmittedOn\" (click)=\"toggleEditSubmitted()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">Allow Approvers to edit submitted Audit</div>\r\n <ng-container *ngIf=\"editSubmittedOn\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'editUsers', large: true }\"></ng-container>\r\n <div class=\"cf-error\" *ngIf=\"editSubmittedError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ editSubmittedError }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Extension</div>\r\n <div class=\"cf-inline\">\r\n Extend redo up to\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoExtension', options: redoExtensionOpts }\"></ng-container>\r\n Days till approval\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== User Verification ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-title\">User Verification Configuration</div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requirePhoto\" (click)=\"requirePhoto = !requirePhoto\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require Photo Capture</div>\r\n <div class=\"cf-hint\">By enabling, users must capture their photo to complete submission</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requireAcknowledgment\" (click)=\"requireAcknowledgment = !requireAcknowledgment\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require User Acknowledgment</div>\r\n <div class=\"cf-hint\">By enabling, users must type their name as acknowledgment to complete submission</div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.cf-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.cf-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.cf-crumb{font-size:13px;line-height:20px;color:#667085}.cf-crumb a{font-weight:600;color:#00a3ff}.cf-header{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px;display:flex;align-items:center;gap:12px}.cf-header-text{display:flex;flex-direction:column;gap:4px;min-width:0}.cf-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.cf-sk-title{margin:3px 0}.cf-desc{border:none;outline:none;padding:0;background:transparent;font-family:inherit;font-size:13px;line-height:18px;color:#344054;min-width:320px}.cf-desc::placeholder{color:#98a2b3}.cf-publish{padding:0 20px;box-shadow:0 1px 2px #1018280d}.cf-draft{padding:0 18px;box-shadow:inset 0 0 0 1px #d0d5dd,0 1px 2px #1018280d}.cf-body{display:flex;gap:16px;align-items:flex-start}.cf-left{width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px;display:flex;flex-direction:column;gap:10px;position:sticky;top:calc(var(--bs-app-header-height, 0px) + 16px);max-height:calc(100vh - var(--bs-app-header-height, 0px) - 32px);overflow-y:auto;scrollbar-width:thin}.cf-left-title{font-size:14px;line-height:20px;font-weight:600;color:#101828}.cf-section{display:flex;align-items:center;gap:8px;padding:2px 0;font-size:13px;font-weight:500;color:#344054;cursor:pointer;white-space:nowrap}.cf-section.is-open{color:#1d2939}.cf-rule{flex:1;border-top:1px solid #EAECF0}.cf-chev{display:flex;color:#98a2b3}.cf-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.cf-chev .rotate{transform:rotate(-90deg)}.cf-items{display:flex;flex-direction:column;gap:8px;padding-left:12px;font-size:13px;color:#475467}.cf-schedule-title{font-size:14px;font-weight:600;color:#101828;margin-top:6px}.cf-schedule{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#475467}.cf-schedule>div{display:flex;align-items:center;gap:6px}.cf-right{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}.cf-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px;display:flex;flex-direction:column;gap:14px}.cf-card--lg{border-radius:8px}.cf-block-head{display:flex;align-items:center;gap:12px}.cf-block-title{font-size:15px;font-weight:600;color:#101828}.cf-divider-head{display:flex;align-items:center;gap:10px;margin-top:4px}.cf-label{font-size:14px;font-weight:600;color:#101828}.cf-label-sm{font-size:13px;font-weight:600;color:#101828}.cf-muted{color:#667085}.cf-hint{font-size:12px;line-height:18px;color:#667085}.cf-hint--tight{margin-top:-8px}.cf-hint--wrap{max-width:640px;text-wrap:pretty}.cf-field{font-size:13px;font-weight:500;color:#344054;min-width:150px;flex-shrink:0}.cf-row{display:flex;align-items:center;gap:12px}.cf-row--top{margin-top:6px}.cf-row--wrap{flex-wrap:wrap}.cf-stack{display:flex;flex-direction:column;gap:8px}.cf-stack--tight,.cf-stack--sm{gap:4px}.cf-stack--xs{gap:2px}.cf-grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.cf-toggle-row{display:flex;align-items:center;gap:10px}.cf-switch{width:36px;height:20px;padding:2px;border:none;border-radius:9999px;background:#eaecf0;display:flex;align-items:center;justify-content:flex-start;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.cf-switch>span{width:16px;height:16px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #1018280d}.cf-switch.is-on{background:#00a3ff;justify-content:flex-end}.cf-switch--top{margin-top:2px}.cf-chipbox{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:8px 10px}.cf-chipbox--lg{gap:8px;padding:10px 12px}.cf-chip{display:flex;align-items:center;gap:6px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;border-radius:9999px;padding:3px 8px;font-size:12px;color:#344054;white-space:nowrap;flex-shrink:0;max-width:100%}.cf-chip--lg{gap:8px;background:#fff;padding:5px 11px;font-size:13px;color:#1d2939}.cf-chip-ini{color:#00a3ff;font-weight:600;font-size:11px}.cf-chip-tag{display:inline-flex;align-items:center;justify-content:center;padding:1px 5px;border-radius:6px;background:#eaf8ff;color:#00a3ff;font-weight:700;font-size:11px;letter-spacing:.02em}.cf-chip-x{display:flex;cursor:pointer;color:#98a2b3}.cf-chip-x:hover{color:#344054}.cf-chip-input{flex:1;min-width:100px;border:none;outline:none;background:transparent;font-family:inherit;font-size:12px;color:#101828}.cf-chip-input::placeholder{color:#98a2b3}.cf-chip-input--lg{min-width:120px;font-size:13px}.cf-inner{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:8px}.cf-inline{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-inline--top{margin-top:2px}.cf-mini{height:32px;padding:0 28px 0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 8px center;outline:none}.cf-info{display:flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#667085}.cf-info svg{flex-shrink:0}.cf-info--wrap{align-items:flex-start;max-width:560px;text-wrap:pretty}.cf-info--wrap svg{margin-top:3px}.cf-checks{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-checks-label{font-weight:500}.cf-check{display:flex;align-items:center;gap:6px;margin:0;font-size:13px;color:#344054;cursor:pointer;-webkit-user-select:none;user-select:none}.cf-check-box{width:16px;height:16px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.cf-check-box.is-on{background:#00a3ff;box-shadow:none}.cf-box{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden;display:flex;flex-direction:column}.cf-box--pad{padding:14px 16px;gap:6px;overflow:visible}.cf-box--row{padding:14px 16px;flex-direction:row;align-items:flex-start;gap:12px}.cf-box--nested{background:#fff;padding:12px 14px;gap:8px;margin-left:46px;overflow:visible}.cf-box--open{overflow:visible}.cf-box--open>.cf-box-sub:last-child{border-radius:0 0 8px 8px}.cf-box-row{padding:14px 16px;display:flex;align-items:flex-start;gap:12px}.cf-box-row--flush{padding:0;gap:10px}.cf-box-sub{border-top:1px solid #EAECF0;background:#f9fafb;padding:16px 16px 18px 64px;display:flex;flex-direction:column;gap:12px}.cf-options{display:flex;flex-direction:column;gap:10px}.cf-option{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:12px 14px;display:flex;align-items:flex-start;gap:10px;cursor:pointer}.cf-option.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.cf-box-sep{display:flex;flex-direction:column;gap:12px;padding-top:14px;border-top:1px solid #EAECF0}.cf-num{display:flex;align-items:center;gap:8px;height:36px;padding:0 6px 0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;margin:0}.cf-num input{width:52px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.cf-num span{font-size:13px;color:#667085;padding-right:6px}.cf-pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;border-radius:9999px;padding:4px 12px}.cf-pill--pass{background:#ecfdf3;color:#027a48}.cf-pill--fail{background:#fef3f2;color:#d92d20}.cf-error{display:flex;gap:6px;font-size:12px;font-weight:500;color:#d92d20;align-items:flex-start;line-height:18px;max-width:640px}.cf-error svg{flex-shrink:0;margin-top:3px}.cf-error--indent{margin-left:162px}.cf-check.is-blocked{color:#98a2b3;cursor:not-allowed}.cf-select{position:relative;display:inline-block;vertical-align:middle}.cf-select-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 10px 0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;white-space:nowrap}.cf-select-btn svg{color:#667085;transition:transform .15s ease}.is-open .cf-select-btn{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.is-open .cf-select-btn svg{transform:rotate(180deg)}.cf-select-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;min-width:100%;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-select-item{padding:8px 12px;border-radius:6px;font-size:13px;color:#344054;white-space:nowrap;cursor:pointer}.cf-select-item:hover{background:#f9fafb}.cf-select-item.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.cf-chipbox{position:relative}.cf-chipbox.is-open{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.cf-suggest{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:30;max-height:260px;overflow-y:auto;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-suggest-item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:6px;cursor:pointer}.cf-suggest-item:hover{background:#f9fafb}.cf-suggest-name{font-size:13px;color:#101828}.cf-suggest-mail{font-size:12px;color:#667085;margin-left:auto}.cf-suggest-empty{padding:8px 10px;font-size:12px;color:#667085}.cf-error--page{margin:0 0 12px}.cf-autotask{margin-top:12px;padding:14px 16px;border-radius:10px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column;gap:8px}.cf-autotask-title{font-size:14px;font-weight:600;color:#1d2939}.cf-autotask-title:not(:first-child){margin-top:6px}.cf-autotask-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 720px){.cf-autotask-choices{grid-template-columns:1fr}}.cf-choice{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;text-align:left;cursor:pointer}.cf-choice.is-on{background:#f5faff;box-shadow:inset 0 0 0 1px #66c8ff}.cf-radio{width:18px;height:18px;flex-shrink:0;margin-top:1px;border-radius:9999px;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center}.cf-radio span{width:8px;height:8px;border-radius:9999px;background:transparent}.cf-radio.is-on{box-shadow:inset 0 0 0 1px #1570ef}.cf-radio.is-on span{background:#1570ef}.cf-choice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.cf-choice-title{font-size:14px;font-weight:600;color:#101828}.cf-choice-sub{font-size:12px;color:#667085}.cf-autotask-validity{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:#344054}.cf-validity-select{width:96px}.cf-reminder{display:inline-flex;align-items:center;gap:6px}.cf-reminder-select{width:120px}.cf-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;cursor:pointer}.cf-icon-btn:hover{background:#f9fafb}\n"] }]
1033
+ args: [{ selector: 'lib-audit-v2-configure', template: "<div class=\"av2-page audit-configure\">\r\n\r\n <!-- Back + breadcrumb (as the schedule editor's back bar) -->\r\n <div class=\"cf-backbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm cf-back\" (click)=\"back()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\r\n {{ backLabel }}\r\n </button>\r\n <div class=\"cf-crumb\">\r\n <a href=\"#\" (click)=\"back($event)\">Manage Audit</a> \u203A Configure\r\n </div>\r\n </div>\r\n\r\n <!-- Title + actions -->\r\n <div class=\"cf-header\">\r\n <div class=\"cf-header-text\">\r\n <span class=\"av2-sk av2-sk--title cf-sk-title\" *ngIf=\"loading\"></span>\r\n <div class=\"cf-title\" *ngIf=\"!loading\">{{ auditName || 'Audit' }}</div>\r\n <input type=\"text\" class=\"cf-desc\" placeholder=\"Enter Audit Description\" [(ngModel)]=\"description\">\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary cf-publish\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason || publishBlockedReason\" (click)=\"publish()\">\r\n {{ saving ? 'Saving\u2026' : (published ? 'Save & Publish' : 'Publish') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost cf-draft\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason\" (click)=\"saveDraft()\">Save as Draft</button>\r\n </div>\r\n\r\n <div class=\"cf-error cf-error--page\" *ngIf=\"loadError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ loadError }}\r\n </div>\r\n\r\n <!-- Chip picker: chips + input + suggestion list (one template, used for every user list) -->\r\n <ng-template #chipPicker let-list=\"list\" let-large=\"large\">\r\n <div class=\"cf-chipbox\" [class.cf-chipbox--lg]=\"large\" [class.is-open]=\"openChips === list\" (click)=\"focusChips(list, $event)\">\r\n <span class=\"cf-chip\" [class.cf-chip--lg]=\"large\" *ngFor=\"let u of chipsOf(list); let i = index\" [title]=\"u.e\">\r\n <span [class]=\"large ? 'cf-chip-tag' : 'cf-chip-ini'\">{{ u.i }}</span>{{ u.n }}\r\n <a class=\"cf-chip-x\" (click)=\"removeChip(list, i); $event.stopPropagation()\">\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <input type=\"text\" class=\"cf-chip-input\" [class.cf-chip-input--lg]=\"large\" placeholder=\"Add user...\"\r\n [ngModel]=\"draftOf(list)\" (ngModelChange)=\"setDraft(list, $event)\" (focus)=\"focusChips(list, $event)\" (keyup.enter)=\"addChip(list)\">\r\n <div class=\"cf-suggest\" *ngIf=\"openChips === list\">\r\n <div class=\"cf-suggest-item\" *ngFor=\"let u of suggestions(list)\" (click)=\"addSuggestion(list, u, $event)\">\r\n <span class=\"cf-chip-ini\">{{ u.i }}</span>\r\n <span class=\"cf-suggest-name\">{{ u.n }}</span>\r\n <span class=\"cf-suggest-mail\">{{ u.e }}</span>\r\n </div>\r\n <div class=\"cf-suggest-empty\" *ngIf=\"!suggestions(list).length\">\r\n {{ users.length ? 'No matching user' : 'No users for this client' }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Dropdown: styled like the prototype instead of the browser's native select -->\r\n <ng-template #dropdown let-key=\"key\" let-options=\"options\">\r\n <span class=\"cf-select\" [class.is-open]=\"openSelect === key\">\r\n <button type=\"button\" class=\"cf-select-btn\" (click)=\"toggleSelect(key, $event)\">\r\n {{ selectLabel(key, options) }}\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"cf-select-menu\" *ngIf=\"openSelect === key\">\r\n <div class=\"cf-select-item\" *ngFor=\"let o of options\" [class.is-on]=\"isPicked(key, o)\"\r\n (click)=\"pick(key, o, $event)\">{{ o.label }}</div>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"cf-body\" *ngIf=\"!loadError\">\r\n <!-- Section tree -->\r\n <aside class=\"cf-left\">\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"cf-left-title\">{{ auditName || 'Audit' }}</div>\r\n\r\n <div class=\"cf-hint\" *ngIf=\"!sections.length\">No questions yet</div>\r\n <ng-container *ngFor=\"let s of sections\">\r\n <div class=\"cf-section\" [class.is-open]=\"s.open\" (click)=\"toggleSection(s)\">\r\n {{ s.label }}\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!s.open\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"cf-items\" *ngIf=\"s.open && s.items.length\">\r\n <div *ngFor=\"let it of s.items\">{{ it }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Schedule block (QA 10 Oct): audits have no one-time / repeat schedule here; visits come from Schedules. -->\r\n </ng-container>\r\n </aside>\r\n\r\n <!-- Configuration -->\r\n <div class=\"cf-right\">\r\n\r\n <section class=\"cf-card\" *ngIf=\"loading\">\r\n <lib-audit-v2-shimmer [rows]=\"4\"></lib-audit-v2-shimmer>\r\n </section>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n\r\n <!-- ===== Advance Configuration ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-head\">\r\n <span class=\"cf-block-title\">Advance Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </span>\r\n </div>\r\n\r\n <!-- Audit Owner -->\r\n <div>\r\n <div class=\"cf-label\">Audit Owner</div>\r\n <div class=\"cf-hint\">Owners get access to manage the audit</div>\r\n </div>\r\n <div class=\"cf-row\">\r\n <span class=\"cf-field\">Can be managed by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'owners', large: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Approver -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Approver</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"approverOn\" (click)=\"toggleApprover()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be able to approve the audit</div>\r\n <div class=\"cf-row\" *ngIf=\"approverOn\">\r\n <span class=\"cf-field\">To be approved by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'approvers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"approverError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ approverError }}\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Approver is off, so the {{ approvers.length }} approver{{ approvers.length === 1 ? '' : 's' }} added will be removed when you save. Turn Approver back on to keep {{ approvers.length === 1 ? 'it' : 'them' }}.\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && !approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Approver is off, so submitted audits are not sent for approval. Turn it on to add approvers or to send flags and reports to them.\r\n </div>\r\n\r\n <!-- Reminder -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Reminder</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"reminderOn\" (click)=\"toggleReminder()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be reminded in the selected interval</div>\r\n <div class=\"cf-inner\" *ngIf=\"reminderOn\">\r\n <div class=\"cf-inline\">\r\n Notify user before\r\n <span class=\"cf-reminder\" *ngFor=\"let m of reminders; let i = index\">\r\n <lib-audit-v2-select class=\"cf-reminder-select\" [value]=\"m\" [options]=\"reminderOpts[i] || []\" [searchable]=\"false\"\r\n [ariaLabel]=\"'Reminder ' + (i + 1) + ' in minutes'\" (changed)=\"setReminder(i, $event.target.value)\"></lib-audit-v2-select>\r\n <a class=\"cf-chip-x\" *ngIf=\"reminders.length > 1\" title=\"Remove reminder\" (click)=\"removeReminder(i)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <button type=\"button\" class=\"cf-icon-btn\" *ngIf=\"reminders.length < maxReminders\" title=\"Add reminder\" (click)=\"addReminder()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Send alerts {{ reminderSummary }} mins before the audit end time\r\n </div>\r\n </div>\r\n\r\n <!-- Notify Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"notifyFlagsOn\" (click)=\"toggleNotifyFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, all flags will be sent as an email</div>\r\n <ng-container *ngIf=\"notifyFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !notifySendApprover\" (click)=\"toggleSendApprover('notifySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendApprover\">\r\n <svg *ngIf=\"notifySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"notifySendCustom = !notifySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendCustom\">\r\n <svg *ngIf=\"notifySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"notifySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'notifyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-error\" *ngIf=\"notifyFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ notifyFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Notify on Recurring Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify on Recurring Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"recurringFlagsOn\" (click)=\"toggleRecurringFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">When enabled, emails are sent for recurring flags based on the configured threshold</div>\r\n\r\n <div class=\"cf-inner\" *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-inline\">\r\n Send Email if the same question is flagged\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'recurringThreshold', options: thresholdOpts }\"></ng-container>\r\n times by the same store\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Once the threshold is reached and an email is sent, the flag count resets to zero\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !recurringSendApprover\" (click)=\"toggleSendApprover('recurringSendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendApprover\">\r\n <svg *ngIf=\"recurringSendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"toggleRecurringCustom()\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendCustom\">\r\n <svg *ngIf=\"recurringSendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n <label class=\"cf-check\" (click)=\"recurringSameAsNotify = !recurringSameAsNotify\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSameAsNotify\">\r\n <svg *ngIf=\"recurringSameAsNotify\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Use same users from Notify Flags\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"recurringSendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'recurringUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-info\" *ngIf=\"recurringSameAsNotify\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ notifyRecipientsLabel }}\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"recurringFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ recurringFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Daily report -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Enable - Daily Report</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"dailyReportOn\" (click)=\"toggleDailyReport()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By Enabling, compliance score will be sent as an email to the above users</div>\r\n <ng-container *ngIf=\"dailyReportOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !dailySendApprover\" (click)=\"toggleSendApprover('dailySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendApprover\">\r\n <svg *ngIf=\"dailySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"dailySendCustom = !dailySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendCustom\">\r\n <svg *ngIf=\"dailySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"dailySendCustom\">\r\n <div class=\"cf-bulkbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openDailyBulk()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n Bulk Upload\r\n </button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'dailyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <label class=\"cf-check\" (click)=\"sharePostApproval = !sharePostApproval\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"sharePostApproval\">\r\n <svg *ngIf=\"sharePostApproval\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Share Report Post Approval\r\n </label>\r\n <div class=\"cf-error\" *ngIf=\"dailyReportError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ dailyReportError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Export submission: Tango users only, as the v1 Configure (its stored value is kept for everyone else). -->\r\n <div class=\"cf-grid2\" *ngIf=\"access.isTango\">\r\n <div class=\"cf-stack cf-stack--tight\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Export Submission</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"exportSubmissionOn\" (click)=\"exportSubmissionOn = !exportSubmissionOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint\">Enable this to allow audit submitters to download their submission as a PDF file</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Redo validity -->\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Validity</div>\r\n <div class=\"cf-inline\">\r\n Redo valid for\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoValidFor', options: redoDayOpts }\"></ng-container>\r\n Day from Redo creation\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Auto create task -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Auto Create Task for Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"autoCreateTaskOn\" (click)=\"autoCreateTaskOn = !autoCreateTaskOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, a task is automatically created for every flagged question in the audit</div>\r\n\r\n <!-- Who gets the task and how long it stays open (as the Checklist Configure page) -->\r\n <div class=\"cf-autotask\" *ngIf=\"autoCreateTaskOn\">\r\n <div class=\"cf-autotask-title\">Task Assignee</div>\r\n <div class=\"cf-hint cf-hint--tight\">Choose who the flagged task is assigned to</div>\r\n <div class=\"cf-autotask-choices\">\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'submitter'\" (click)=\"taskAssignee = 'submitter'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'submitter'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Audit Submitter</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user who filled the audit</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'store'\" (click)=\"taskAssignee = 'store'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'store'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Store User</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user mapped to the flagged store</span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cf-autotask-title\">Task Validity</div>\r\n <div class=\"cf-autotask-validity\">\r\n <span>Task valid for</span>\r\n <lib-audit-v2-select class=\"cf-validity-select\" [(ngModel)]=\"taskValidity\" [options]=\"taskValidityOptions\"\r\n [searchable]=\"false\" ariaLabel=\"Task validity in days\"></lib-audit-v2-select>\r\n <span>days from task creation</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Audit Configuration ===== -->\r\n <div class=\"cf-divider-head\">\r\n <span class=\"cf-block-title\">Audit Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n </div>\r\n\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Submission &amp; Visibility</div>\r\n\r\n <!-- cf-box--open: the dispute-window and response-delay menus must not be clipped by the box -->\r\n <div class=\"cf-box cf-box--open\">\r\n <div class=\"cf-box-row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"showResponseInApp\"\r\n (click)=\"showResponseInApp = !showResponseInApp\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Show Response in Mobile App</div>\r\n <div class=\"cf-hint\">By enabling this option, store users can view the audit response in the Mobile App.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sub\" *ngIf=\"showResponseInApp\">\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Response Visibility</div>\r\n <div class=\"cf-hint\">Choose when the response becomes visible to store users</div>\r\n </div>\r\n\r\n <div class=\"cf-options\">\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'pre'\" (click)=\"responseVisibility = 'pre'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'pre'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\">Pre-approval</div>\r\n <div class=\"cf-hint\">The audit response will be visible to store users before it is approved.</div>\r\n <div class=\"cf-inline cf-inline--top\">\r\n Show response\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'respDelay', options: respDelayOpts }\"></ng-container>\r\n after submission\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'post'\" (click)=\"responseVisibility = 'post'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'post'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\" [class.cf-muted]=\"responseVisibility !== 'post'\">Post-approval</div>\r\n <div class=\"cf-hint\">Once the response is approved, it will automatically be displayed in the Mobile App. Store users cannot raise a dispute.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sep\">\r\n <ng-container *ngIf=\"responseVisibility === 'pre'\">\r\n <div class=\"cf-box-row cf-box-row--flush\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"disputeOn\" (click)=\"disputeOn = !disputeOn\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Dispute Configuration</div>\r\n <div class=\"cf-hint cf-hint--wrap\">When enabled, the store team can raise a dispute against the auditor's submission once the response becomes visible to them.</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--nested\" *ngIf=\"disputeOn\">\r\n <div class=\"cf-inline\">\r\n Dispute window\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'disputeWindow', options: dispWindowOpts }\"></ng-container>\r\n from when the response becomes visible\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Disputes raised inside this window go to the approver. Approved disputes revise the answer and the compliance score.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"!hasApprovers\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n No approver is set, so no one can review disputes. Turn on Approver and add an approver.\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"responseVisibility === 'post'\">\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm cf-muted\">Dispute Configuration</div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Disputes are not available when responses are shown post-approval.\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Pre-submission access -->\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pre-Submission Access</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"preSubmissionAccessOn\" (click)=\"preSubmissionAccessOn = !preSubmissionAccessOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Users added here can view Open and In Progress audits until submission. The Schedule Info tab is also visible only to these users.</div>\r\n <ng-container *ngIf=\"preSubmissionAccessOn\">\r\n <div class=\"cf-row cf-row--top\">\r\n <span class=\"cf-field\">Visible to</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'preSubmissionUsers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error cf-error--indent\" *ngIf=\"preSubmissionEmpty\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n Add at least one user\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Scoring ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Scoring</div>\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pass/Fail Score Setup</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"passFailOn\" (click)=\"passFailOn = !passFailOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Set the compliance score an audit must reach to be marked {{ passLabel }}. Anything below it is marked {{ failLabel }}.</div>\r\n <div class=\"cf-row cf-row--wrap cf-row--top\" *ngIf=\"passFailOn\">\r\n <span class=\"cf-field\">Minimum score to {{ passLabel }}</span>\r\n <label class=\"cf-num\">\r\n <input type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"passThreshold\">\r\n <span>%</span>\r\n </label>\r\n <span class=\"cf-pill cf-pill--pass\">{{ passLabel }} \u2265 {{ passThreshold }}%</span>\r\n <span class=\"cf-pill cf-pill--fail\">{{ failLabel }} &lt; {{ passThreshold }}%</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Approver Controls ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Approver Controls</div>\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Edit Submitted Audit</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"editSubmittedOn\" (click)=\"toggleEditSubmitted()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">Allow Approvers to edit submitted Audit</div>\r\n <ng-container *ngIf=\"editSubmittedOn\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'editUsers', large: true }\"></ng-container>\r\n <div class=\"cf-error\" *ngIf=\"editSubmittedError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n {{ editSubmittedError }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Extension</div>\r\n <div class=\"cf-inline\">\r\n Extend redo up to\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoExtension', options: redoExtensionOpts }\"></ng-container>\r\n Days till approval\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== User Verification ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-title\">User Verification Configuration</div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requirePhoto\" (click)=\"requirePhoto = !requirePhoto\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require Photo Capture</div>\r\n <div class=\"cf-hint\">By enabling, users must capture their photo to complete submission</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requireAcknowledgment\" (click)=\"requireAcknowledgment = !requireAcknowledgment\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require User Acknowledgment</div>\r\n <div class=\"cf-hint\">By enabling, users must type their name as acknowledgment to complete submission</div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Daily Report > Custom: bulk upload users (as the Checklist Configure page's popup) -->\r\n <ng-container *ngIf=\"dailyBulkOpen\">\r\n <div class=\"cf-dlg-backdrop\" (click)=\"closeDailyBulk()\"></div>\r\n <div class=\"cf-dlg\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"cf-dlg-title\">\r\n <span class=\"cf-dlg-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n </span>\r\n <div class=\"cf-dlg-title\" id=\"cf-dlg-title\">Bulk Upload</div>\r\n <div class=\"cf-dlg-steps\">\r\n <div>Step 1 - <a href=\"#\" (click)=\"$event.preventDefault(); downloadDailyTemplate()\">Download the template here</a></div>\r\n <div>Step 2 - Add the Email of existing users to the template</div>\r\n <div>Step 3 - Upload it below for processing</div>\r\n </div>\r\n <div class=\"cf-dlg-note\">\r\n **Note : Only the Email column is considered - the Username is taken from the existing user list.\r\n Only existing users of this client are accepted. On upload, all the existing data will be replaced.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"dailyBulkErrors.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\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>\r\n <div class=\"cf-dlg-errors\">\r\n <div>The file was not uploaded. Fix {{ dailyBulkErrors.length === 1 ? 'this row' : 'these rows' }} and upload again:</div>\r\n <div *ngFor=\"let e of dailyBulkErrors.slice(0, 5)\">{{ e }}</div>\r\n <div *ngIf=\"dailyBulkErrors.length > 5\">+{{ dailyBulkErrors.length - 5 }} more</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-dlg-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"closeDailyBulk()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" (click)=\"dailyBulkFile.click()\">Upload</button>\r\n <input #dailyBulkFile type=\"file\" accept=\".xlsx\" hidden (change)=\"onDailyBulkFile($event)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.cf-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.cf-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.cf-crumb{font-size:13px;line-height:20px;color:#667085}.cf-crumb a{font-weight:600;color:#00a3ff}.cf-header{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px;display:flex;align-items:center;gap:12px}.cf-header-text{display:flex;flex-direction:column;gap:4px;min-width:0}.cf-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.cf-sk-title{margin:3px 0}.cf-desc{border:none;outline:none;padding:0;background:transparent;font-family:inherit;font-size:13px;line-height:18px;color:#344054;min-width:320px}.cf-desc::placeholder{color:#98a2b3}.cf-publish{padding:0 20px;box-shadow:0 1px 2px #1018280d}.cf-draft{padding:0 18px;box-shadow:inset 0 0 0 1px #d0d5dd,0 1px 2px #1018280d}.cf-body{display:flex;gap:16px;align-items:flex-start}.cf-left{width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px;display:flex;flex-direction:column;gap:10px;position:sticky;top:calc(var(--bs-app-header-height, 0px) + 16px);max-height:calc(100vh - var(--bs-app-header-height, 0px) - 32px);overflow-y:auto;scrollbar-width:thin}.cf-left-title{font-size:14px;line-height:20px;font-weight:600;color:#101828}.cf-section{display:flex;align-items:center;gap:8px;padding:2px 0;font-size:13px;font-weight:500;color:#344054;cursor:pointer;white-space:nowrap}.cf-section.is-open{color:#1d2939}.cf-rule{flex:1;border-top:1px solid #EAECF0}.cf-chev{display:flex;color:#98a2b3}.cf-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.cf-chev .rotate{transform:rotate(-90deg)}.cf-items{display:flex;flex-direction:column;gap:8px;padding-left:12px;font-size:13px;color:#475467}.cf-schedule-title{font-size:14px;font-weight:600;color:#101828;margin-top:6px}.cf-schedule{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#475467}.cf-schedule>div{display:flex;align-items:center;gap:6px}.cf-right{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}.cf-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px;display:flex;flex-direction:column;gap:14px}.cf-card--lg{border-radius:8px}.cf-block-head{display:flex;align-items:center;gap:12px}.cf-block-title{font-size:15px;font-weight:600;color:#101828}.cf-divider-head{display:flex;align-items:center;gap:10px;margin-top:4px}.cf-label{font-size:14px;font-weight:600;color:#101828}.cf-label-sm{font-size:13px;font-weight:600;color:#101828}.cf-muted{color:#667085}.cf-hint{font-size:12px;line-height:18px;color:#667085}.cf-hint--tight{margin-top:-8px}.cf-hint--wrap{max-width:640px;text-wrap:pretty}.cf-field{font-size:13px;font-weight:500;color:#344054;min-width:150px;flex-shrink:0}.cf-row{display:flex;align-items:center;gap:12px}.cf-row--top{margin-top:6px}.cf-row--wrap{flex-wrap:wrap}.cf-stack{display:flex;flex-direction:column;gap:8px}.cf-stack--tight,.cf-stack--sm{gap:4px}.cf-stack--xs{gap:2px}.cf-grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.cf-toggle-row{display:flex;align-items:center;gap:10px}.cf-switch{width:36px;height:20px;padding:2px;border:none;border-radius:9999px;background:#eaecf0;display:flex;align-items:center;justify-content:flex-start;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.cf-switch>span{width:16px;height:16px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #1018280d}.cf-switch.is-on{background:#00a3ff;justify-content:flex-end}.cf-switch--top{margin-top:2px}.cf-chipbox{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:8px 10px}.cf-chipbox--lg{gap:8px;padding:10px 12px}.cf-chip{display:flex;align-items:center;gap:6px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;border-radius:9999px;padding:3px 8px;font-size:12px;color:#344054;white-space:nowrap;flex-shrink:0;max-width:100%}.cf-chip--lg{gap:8px;background:#fff;padding:5px 11px;font-size:13px;color:#1d2939}.cf-chip-ini{color:#00a3ff;font-weight:600;font-size:11px}.cf-chip-tag{display:inline-flex;align-items:center;justify-content:center;padding:1px 5px;border-radius:6px;background:#eaf8ff;color:#00a3ff;font-weight:700;font-size:11px;letter-spacing:.02em}.cf-chip-x{display:flex;cursor:pointer;color:#98a2b3}.cf-chip-x:hover{color:#344054}.cf-chip-input{flex:1;min-width:100px;border:none;outline:none;background:transparent;font-family:inherit;font-size:12px;color:#101828}.cf-chip-input::placeholder{color:#98a2b3}.cf-chip-input--lg{min-width:120px;font-size:13px}.cf-inner{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:8px}.cf-inline{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-inline--top{margin-top:2px}.cf-mini{height:32px;padding:0 28px 0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 8px center;outline:none}.cf-info{display:flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#667085}.cf-info svg{flex-shrink:0}.cf-info--wrap{align-items:flex-start;max-width:560px;text-wrap:pretty}.cf-info--wrap svg{margin-top:3px}.cf-checks{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-checks-label{font-weight:500}.cf-check{display:flex;align-items:center;gap:6px;margin:0;font-size:13px;color:#344054;cursor:pointer;-webkit-user-select:none;user-select:none}.cf-check-box{width:16px;height:16px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.cf-check-box.is-on{background:#00a3ff;box-shadow:none}.cf-box{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden;display:flex;flex-direction:column}.cf-box--pad{padding:14px 16px;gap:6px;overflow:visible}.cf-box--row{padding:14px 16px;flex-direction:row;align-items:flex-start;gap:12px}.cf-box--nested{background:#fff;padding:12px 14px;gap:8px;margin-left:46px;overflow:visible}.cf-box--open{overflow:visible}.cf-box--open>.cf-box-sub:last-child{border-radius:0 0 8px 8px}.cf-box-row{padding:14px 16px;display:flex;align-items:flex-start;gap:12px}.cf-box-row--flush{padding:0;gap:10px}.cf-box-sub{border-top:1px solid #EAECF0;background:#f9fafb;padding:16px 16px 18px 64px;display:flex;flex-direction:column;gap:12px}.cf-options{display:flex;flex-direction:column;gap:10px}.cf-option{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:12px 14px;display:flex;align-items:flex-start;gap:10px;cursor:pointer}.cf-option.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.cf-box-sep{display:flex;flex-direction:column;gap:12px;padding-top:14px;border-top:1px solid #EAECF0}.cf-num{display:flex;align-items:center;gap:8px;height:36px;padding:0 6px 0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;margin:0}.cf-num input{width:52px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.cf-num span{font-size:13px;color:#667085;padding-right:6px}.cf-pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;border-radius:9999px;padding:4px 12px}.cf-pill--pass{background:#ecfdf3;color:#027a48}.cf-pill--fail{background:#fef3f2;color:#d92d20}.cf-error{display:flex;gap:6px;font-size:12px;font-weight:500;color:#d92d20;align-items:flex-start;line-height:18px;max-width:640px}.cf-error svg{flex-shrink:0;margin-top:3px}.cf-error--indent{margin-left:162px}.cf-check.is-blocked{color:#98a2b3;cursor:not-allowed}.cf-select{position:relative;display:inline-block;vertical-align:middle}.cf-select-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 10px 0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;white-space:nowrap}.cf-select-btn svg{color:#667085;transition:transform .15s ease}.is-open .cf-select-btn{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.is-open .cf-select-btn svg{transform:rotate(180deg)}.cf-select-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;min-width:100%;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-select-item{padding:8px 12px;border-radius:6px;font-size:13px;color:#344054;white-space:nowrap;cursor:pointer}.cf-select-item:hover{background:#f9fafb}.cf-select-item.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.cf-chipbox{position:relative}.cf-chipbox.is-open{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.cf-suggest{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:30;max-height:260px;overflow-y:auto;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-suggest-item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:6px;cursor:pointer}.cf-suggest-item:hover{background:#f9fafb}.cf-suggest-name{font-size:13px;color:#101828}.cf-suggest-mail{font-size:12px;color:#667085;margin-left:auto}.cf-suggest-empty{padding:8px 10px;font-size:12px;color:#667085}.cf-error--page{margin:0 0 12px}.cf-autotask{margin-top:12px;padding:14px 16px;border-radius:10px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column;gap:8px}.cf-autotask-title{font-size:14px;font-weight:600;color:#1d2939}.cf-autotask-title:not(:first-child){margin-top:6px}.cf-autotask-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 720px){.cf-autotask-choices{grid-template-columns:1fr}}.cf-choice{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;text-align:left;cursor:pointer}.cf-choice.is-on{background:#f5faff;box-shadow:inset 0 0 0 1px #66c8ff}.cf-radio{width:18px;height:18px;flex-shrink:0;margin-top:1px;border-radius:9999px;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center}.cf-radio span{width:8px;height:8px;border-radius:9999px;background:transparent}.cf-radio.is-on{box-shadow:inset 0 0 0 1px #1570ef}.cf-radio.is-on span{background:#1570ef}.cf-choice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.cf-choice-title{font-size:14px;font-weight:600;color:#101828}.cf-choice-sub{font-size:12px;color:#667085}.cf-autotask-validity{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:#344054}.cf-validity-select{width:96px}.cf-reminder{display:inline-flex;align-items:center;gap:6px}.cf-reminder-select{width:120px}.cf-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;cursor:pointer}.cf-icon-btn:hover{background:#f9fafb}.cf-bulkbar{display:flex;justify-content:flex-end;margin-bottom:-4px}.cf-bulkbar .av2-btn{display:inline-flex;align-items:center;gap:6px}.cf-dlg-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.cf-dlg{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:520px;max-width:calc(100vw - 32px);max-height:90vh;overflow-y:auto;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.cf-dlg-icon{width:40px;height:40px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.cf-dlg-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.cf-dlg-steps{display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.cf-dlg-steps a{color:#00a3ff;text-decoration:underline;cursor:pointer}.cf-dlg-note{font-size:13px;line-height:20px;font-weight:600;color:#344054}.cf-dlg-errors{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}.cf-dlg-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:4px}\n"] }]
918
1034
  }], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.GlobalStateService }, { type: i3.ActivatedRoute }, { type: i3.Router }, { type: i4.ToastService }, { type: i0.ChangeDetectorRef }], propDecorators: { onEscape: [{
919
1035
  type: HostListener,
920
1036
  args: ['document:keydown.escape']
921
1037
  }] } });
922
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItY29uZmlndXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvY29uZmlndXJlL2F1ZGl0LXYyLWNvbmZpZ3VyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2NvbmZpZ3VyZS9hdWRpdC12Mi1jb25maWd1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU5RixPQUFPLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHakQsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFDO0FBQ25DLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFDO0FBRTdDLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7OztBQUc5RCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFzQnZCLDBHQUEwRztBQUMxRyxNQUFNLGdCQUFnQixHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLGlFQUFpRTtBQUNqRSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFL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QyxRQUFRLEVBQUU7WUFBRSxDQUFDLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztTQUFFO1FBQzFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRXpDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLDZFQUE2RTtRQUM3RSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO3dHQXYwQlUseUJBQXlCOzRGQUF6Qix5QkFBeUIsZ0lDNUR0QyxpbXBDQStpQkE7OzRGRG5mYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0Usd0JBQXdCOzhOQXVKbEMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGZvcmtKb2luLCBvZiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgdXRjIGZyb20gJ2RheWpzL3BsdWdpbi91dGMnO1xyXG5pbXBvcnQgdGltZXpvbmUgZnJvbSAnZGF5anMvcGx1Z2luL3RpbWV6b25lJztcclxuaW1wb3J0IHsgVHJheFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90cmF4LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdWRpdEFjY2VzcywgYXVkaXRBY2Nlc3MgfSBmcm9tICcuLi9hdWRpdC12Mi1hY2Nlc3MnO1xyXG5pbXBvcnQgeyBBdWRpdFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uL3NlbGVjdC9hdWRpdC12Mi1zZWxlY3QuY29tcG9uZW50JztcclxuXHJcbmRheWpzLmV4dGVuZCh1dGMpO1xyXG5kYXlqcy5leHRlbmQodGltZXpvbmUpO1xyXG5cclxuLyoqIEEgdXNlciBjaGlwOiBpbml0aWFscywgZGlzcGxheSBuYW1lLCBlbWFpbC4gU3RvcmVkIG9uIHRoZSBjaGVja2xpc3QgYXMgeyBuYW1lLCB2YWx1ZSB9LiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIENoaXBVc2VyIHtcclxuICBpOiBzdHJpbmc7XHJcbiAgbjogc3RyaW5nO1xyXG4gIGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb25maWdTZWN0aW9uIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGl0ZW1zOiBzdHJpbmdbXTtcclxuICBvcGVuOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XHJcbiAgdmFsdWU6IG51bWJlcjtcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIENoaXBMaXN0ID0gJ293bmVycycgfCAnYXBwcm92ZXJzJyB8ICdub3RpZnlVc2VycycgfCAncmVjdXJyaW5nVXNlcnMnIHwgJ2RhaWx5VXNlcnMnIHwgJ3ByZVN1Ym1pc3Npb25Vc2VycycgfCAnZWRpdFVzZXJzJztcclxuXHJcbi8qKiBSZW1pbmRlciBpbnRlcnZhbHMgb2ZmZXJlZCwgaW4gbWludXRlcyBiZWZvcmUgdGhlIGF1ZGl0IGVuZCB0aW1lIChhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlKS4gKi9cclxuY29uc3QgUkVNSU5ERVJfTUlOVVRFUyA9IFszMCwgNDUsIDYwLCA3NSwgOTBdO1xyXG4vKiogVGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBhbGxvd3MgdXAgdG8gdGhyZWUgcmVtaW5kZXJzLiAqL1xyXG5jb25zdCBNQVhfUkVNSU5ERVJTID0gMztcclxudHlwZSBTZWxlY3RLZXkgPSAncmVjdXJyaW5nVGhyZXNob2xkJyB8ICdyZWRvVmFsaWRGb3InIHwgJ3Jlc3BEZWxheScgfCAnZGlzcHV0ZVdpbmRvdycgfCAncmVkb0V4dGVuc2lvbic7XHJcbi8qKiBcIlNlbmQgVG8gPiBBcHByb3ZlclwiIHRpY2tzIHRoYXQgbmVlZCBhdCBsZWFzdCBvbmUgYXBwcm92ZXIgdG8gc2VuZCB0by4gKi9cclxudHlwZSBTZW5kQXBwcm92ZXJLZXkgPSAnbm90aWZ5U2VuZEFwcHJvdmVyJyB8ICdyZWN1cnJpbmdTZW5kQXBwcm92ZXInIHwgJ2RhaWx5U2VuZEFwcHJvdmVyJztcclxuXHJcbi8qKlxyXG4gKiBNYW5hZ2UgLT4gQ29uZmlndXJlIGZvciBvbmUgYXVkaXQgKGA/Y2hlY2tsaXN0SWQ9YCkuXHJcbiAqXHJcbiAqIFRoZSBhdWRpdCBpcyBhIGNoZWNrbGlzdCwgc28gdGhpcyBwYWdlIHJlYWRzIGFuZCB3cml0ZXMgdGhlIFNBTUUgZmllbGRzIHRoZSBDaGVja2xpc3RcclxuICogQ29uZmlndXJlIHBhZ2UgdXNlcyAoR0VUIC90cmF4L2dldENvbmZpZ0RldGFpbHMsIFBPU1QgL3RyYXgvY2hlY2tsaXN0Q29uZmlndXJldjEpOlxyXG4gKiBvd25lciwgYXBwcm92ZXIsIHJlbWFpbmRlciwgbm90aWZ5RmxhZ3MsIHJlY3VycmluZ0ZsYWcsIGF1dG9FbWFpbCwgZXhwb3J0LCByZWRvVmFsaWRpdHksXHJcbiAqIHJlZG9FeHRlbnNpb24sIGF1dG9DcmVhdGVUYXNrLCB1c2VyVmVyaWZpY2F0aW9uLCBzaG93QXBwcm92ZWRSZXNwb25zZSwgcmVzcG9uc2VWaXNpYmlsaXR5KCtIb3VycyksXHJcbiAqIHNoYXJlUmVwb3J0UG9zdEFwcHJvdmFsLCBjaGVja0xpc3REZXNjcmlwdGlvbi4gQXVkaXQtb25seSBzZXR0aW5ncyB0aGF0IHRoZSBjaGVja2xpc3Qgc2NoZW1hXHJcbiAqIGhhcyBubyBmaWVsZCBmb3IgKHBhc3MgbWFyaywgZGlzcHV0ZSB3aW5kb3csIHByZS1zdWJtaXNzaW9uIGFjY2VzcywgZWRpdC1zdWJtaXNzaW9uIHVzZXJzKVxyXG4gKiBhcmUga2VwdCBvbiBhdWRpdGNvbmZpZyB2aWEgUE9TVCAvdHJheC9hdWRpdC9jb25maWcvc2F2ZS5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWF1ZGl0LXYyLWNvbmZpZ3VyZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2F1ZGl0LXYyLWNvbmZpZ3VyZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2F1ZGl0LXYyLWNvbmZpZ3VyZS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGl0VjJDb25maWd1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY2hlY2tsaXN0SWQgPSAnJztcclxuICBhdWRpdE5hbWUgPSAnJztcclxuICBkZXNjcmlwdGlvbiA9ICcnO1xyXG4gIHB1Ymxpc2hlZCA9IGZhbHNlO1xyXG4gIHNjaGVkdWxlID0gJ+KAlCc7XHJcbiAgc2NoZWR1bGVXaW5kb3cgPSAn4oCUJztcclxuICBzZWN0aW9uczogQ29uZmlnU2VjdGlvbltdID0gW107XHJcblxyXG4gIC8vIC0tLS0gY2hlY2tsaXN0IGZpZWxkcyAoc2F2ZWQgb24gY2hlY2tsaXN0Y29uZmlnKSAtLS0tXHJcbiAgb3duZXJzOiBDaGlwVXNlcltdID0gW107XHJcbiAgYXBwcm92ZXJPbiA9IGZhbHNlO1xyXG4gIGFwcHJvdmVyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIC8qKiBUaGUgY2xpZW50J3Mgc3VwZXJhZG1pbiAoZnJvbSB0aGUgdXNlciBsaXN0KSwgdGhlIHYxIGRlZmF1bHQgYXBwcm92ZXIgZm9yIFRhbmdvIHVzZXJzIGFuZCByb2xlICd1c2VyJy4gKi9cclxuICBwcml2YXRlIHN1cGVyQWRtaW46IENoaXBVc2VyIHwgbnVsbCA9IG51bGw7XHJcbiAgcmVtaW5kZXJPbiA9IGZhbHNlO1xyXG4gIC8qKiBjaGVja2xpc3QucmVtYWluZGVyOiBtaW51dGVzIGJlZm9yZSB0aGUgZW5kIHRpbWUgYXQgd2hpY2ggdGhlIGF1ZGl0b3IgZ2V0cyBhIHB1c2ggcmVtaW5kZXIuICovXHJcbiAgcmVtaW5kZXJzOiBudW1iZXJbXSA9IFtdO1xyXG4gIC8qKiBPcHRpb25zIHBlciByZW1pbmRlciByb3c6IGV2ZXJ5IGludGVydmFsIG5vdCBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciByb3cuICovXHJcbiAgcmVtaW5kZXJPcHRzOiBBdWRpdFNlbGVjdE9wdGlvbltdW10gPSBbXTtcclxuICByZWFkb25seSBtYXhSZW1pbmRlcnMgPSBNQVhfUkVNSU5ERVJTO1xyXG4gIC8vIE5vdGlmeSBGbGFncyAoY2hlY2tsaXN0Lm5vdGlmeUZsYWdzKTogd2hvIGdldHMgdGhlIGZsYWcgZW1haWxzLlxyXG4gIG5vdGlmeUZsYWdzT24gPSBmYWxzZTtcclxuICBub3RpZnlTZW5kQXBwcm92ZXIgPSB0cnVlO1xyXG4gIG5vdGlmeVNlbmRDdXN0b20gPSBmYWxzZTtcclxuICBub3RpZnlVc2VyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIC8vIE5vdGlmeSBvbiBSZWN1cnJpbmcgRmxhZ3MgKGNoZWNrbGlzdC5yZWN1cnJpbmdGbGFnKTogdGhyZXNob2xkICsgaXRzIG93biByZWNpcGllbnRzLlxyXG4gIHJlY3VycmluZ0ZsYWdzT24gPSBmYWxzZTtcclxuICByZWN1cnJpbmdUaHJlc2hvbGQgPSAzO1xyXG4gIHJlY3VycmluZ1NlbmRBcHByb3ZlciA9IHRydWU7XHJcbiAgcmVjdXJyaW5nU2VuZEN1c3RvbSA9IGZhbHNlO1xyXG4gIC8qKiBTdG9yZWQgYXMgbm90aWZ5VHlwZSAnc2FtZUFzTm90aWZ5JzogdGhlIHNlcnZlciBtYWlscyB3aG9ldmVyIE5vdGlmeSBGbGFncyBtYWlscyBhdCBzZW5kIHRpbWUuICovXHJcbiAgcmVjdXJyaW5nU2FtZUFzTm90aWZ5ID0gZmFsc2U7XHJcbiAgcmVjdXJyaW5nVXNlcnM6IENoaXBVc2VyW10gPSBbXTtcclxuICBkYWlseVJlcG9ydE9uID0gZmFsc2U7XHJcbiAgZGFpbHlTZW5kQXBwcm92ZXIgPSB0cnVlO1xyXG4gIGRhaWx5U2VuZEN1c3RvbSA9IGZhbHNlO1xyXG4gIGRhaWx5VXNlcnM6IENoaXBVc2VyW10gPSBbXTtcclxuICBzaGFyZVBvc3RBcHByb3ZhbCA9IGZhbHNlO1xyXG4gIGV4cG9ydFN1Ym1pc3Npb25PbiA9IGZhbHNlO1xyXG4gIHJlZG9WYWxpZEZvciA9IDc7XHJcbiAgYXV0b0NyZWF0ZVRhc2tPbiA9IGZhbHNlO1xyXG4gIC8qKiBBdXRvLXRhc2sgc2V0dGluZ3MgKGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UpOiB3aG8gZ2V0cyB0aGUgdGFzayBhbmQgZm9yIGhvdyBtYW55IGRheXMuICovXHJcbiAgdGFza0Fzc2lnbmVlOiAnc3VibWl0dGVyJyB8ICdzdG9yZScgPSAnc3VibWl0dGVyJztcclxuICB0YXNrVmFsaWRpdHkgPSAxMDtcclxuICByZWFkb25seSB0YXNrVmFsaWRpdHlPcHRpb25zID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxNSwgMjAsIDI1LCAzMF0ubWFwKGQgPT4gKHsgdmFsdWU6IGQsIGxhYmVsOiBTdHJpbmcoZCkgfSkpO1xyXG4gIHNob3dSZXNwb25zZUluQXBwID0gdHJ1ZTtcclxuICByZXNwb25zZVZpc2liaWxpdHk6ICdwcmUnIHwgJ3Bvc3QnID0gJ3Bvc3QnO1xyXG4gIHJlc3BEZWxheSA9IDI7XHJcbiAgcmVxdWlyZVBob3RvID0gZmFsc2U7XHJcbiAgcmVxdWlyZUFja25vd2xlZGdtZW50ID0gZmFsc2U7XHJcbiAgcmVkb0V4dGVuc2lvbiA9IDE7XHJcblxyXG4gIC8vIC0tLS0gYXVkaXQtb25seSBmaWVsZHMgKHNhdmVkIG9uIGF1ZGl0Y29uZmlnKSAtLS0tXHJcbiAgcGFzc0ZhaWxPbiA9IHRydWU7XHJcbiAgcGFzc1RocmVzaG9sZCA9IDc1O1xyXG4gIGRpc3B1dGVPbiA9IHRydWU7XHJcbiAgZGlzcHV0ZVdpbmRvdyA9IDQ4O1xyXG4gIHByZVN1Ym1pc3Npb25BY2Nlc3NPbiA9IGZhbHNlO1xyXG4gIHByZVN1Ym1pc3Npb25Vc2VyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIGVkaXRTdWJtaXR0ZWRPbiA9IGZhbHNlO1xyXG4gIGVkaXRVc2VyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG5cclxuICBwYXNzTGFiZWwgPSAnUGFzcyc7XHJcbiAgZmFpbExhYmVsID0gJ0ZhaWwnO1xyXG5cclxuICAvKiogQ2xpZW50IHVzZXJzIG9mZmVyZWQgYnkgdGhlIGNoaXAgcGlja2Vycy4gKi9cclxuICB1c2VyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIGRyYWZ0czogUmVjb3JkPENoaXBMaXN0LCBzdHJpbmc+ID0geyBvd25lcnM6ICcnLCBhcHByb3ZlcnM6ICcnLCBub3RpZnlVc2VyczogJycsIHJlY3VycmluZ1VzZXJzOiAnJywgZGFpbHlVc2VyczogJycsIHByZVN1Ym1pc3Npb25Vc2VyczogJycsIGVkaXRVc2VyczogJycgfTtcclxuICAvKiogV2hpY2ggY2hpcCBib3ggaXMgc2hvd2luZyBzdWdnZXN0aW9ucywgYW5kIHdoaWNoIGRyb3Bkb3duIGlzIG9wZW4uICovXHJcbiAgb3BlbkNoaXBzOiBDaGlwTGlzdCB8IG51bGwgPSBudWxsO1xyXG4gIG9wZW5TZWxlY3Q6IFNlbGVjdEtleSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogU3RvcmVzIC8gdXNlcnMgYWxyZWFkeSBhc3NpZ25lZCB0byB0aGUgY2hlY2tsaXN0LiBBdWRpdHMgZ2V0IHRoZW0gZnJvbSBhIHNjaGVkdWxlXHJcbiAgICogIChNYW5hZ2Ug4oC6IFNjaGVkdWxlIEluZm8pLCBzbyB0aGlzIHBhZ2Ugb25seSByZWFkcyB0aGUgY291bnQuICovXHJcbiAgYXNzaWduZWRDb3VudCA9IDA7XHJcbiAgLyoqIFB1Ymxpc2ggd2l0aCBub3RoaW5nIGFzc2lnbmVkIHNhdmVzIGZpcnN0LCB0aGVuIG9wZW5zIENyZWF0ZSBzY2hlZHVsZSBmb3IgdGhpcyBhdWRpdC4gKi9cclxuICBwcml2YXRlIHNjaGVkdWxlQWZ0ZXJTYXZlID0gZmFsc2U7XHJcbiAgLyoqIFB1Ymxpc2ggc3RhdGUgYmVmb3JlIHRoZSBjdXJyZW50IHNhdmUsIHNvIHRoZSB0b2FzdCBjYW4gc2F5IFwicHVibGlzaGVkXCIgdnMgXCJzYXZlZCBhbmQgcHVibGlzaGVkXCIuICovXHJcbiAgcHJpdmF0ZSB3YXNQdWJsaXNoZWQgPSBmYWxzZTtcclxuXHJcbiAgcmVhZG9ubHkgdGhyZXNob2xkT3B0czogU2VsZWN0T3B0aW9uW10gPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdLm1hcChuID0+ICh7IHZhbHVlOiBuLCBsYWJlbDogU3RyaW5nKG4pIH0pKTtcclxuICByZWFkb25seSByZWRvRGF5T3B0czogU2VsZWN0T3B0aW9uW10gPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgMTAsIDE0LCAyMSwgMzBdLm1hcChuID0+ICh7IHZhbHVlOiBuLCBsYWJlbDogU3RyaW5nKG4pIH0pKTtcclxuICByZWFkb25seSByZXNwRGVsYXlPcHRzOiBTZWxlY3RPcHRpb25bXSA9IFswLCAyLCA2LCAxMiwgMjQsIDQ4XS5tYXAobiA9PiAoeyB2YWx1ZTogbiwgbGFiZWw6IG4gPT09IDAgPyAnSW1tZWRpYXRlbHknIDogbiArICcgaG91cnMnIH0pKTtcclxuICByZWFkb25seSBkaXNwV2luZG93T3B0czogU2VsZWN0T3B0aW9uW10gPSBbNiwgMTIsIDI0LCA0OCwgNzIsIDE2OF0ubWFwKG4gPT4gKHsgdmFsdWU6IG4sIGxhYmVsOiBuID09PSAxNjggPyAnNyBkYXlzJyA6IG4gKyAnIGhvdXJzJyB9KSk7XHJcbiAgcmVhZG9ubHkgcmVkb0V4dGVuc2lvbk9wdHM6IFNlbGVjdE9wdGlvbltdID0gWzEsIDIsIDMsIDQsIDUsIDYsIDddLm1hcChuID0+ICh7IHZhbHVlOiBuLCBsYWJlbDogU3RyaW5nKG4pIH0pKTtcclxuXHJcbiAgLyoqIFN0YXJ0cyB0cnVlIHNvIHRoZSBzZXR0aW5ncyBzaGltbWVyIGluc3RlYWQgb2Ygc2hvd2luZyBkZWZhdWx0cyB0aGF0IHRoZW4ganVtcC4gKi9cclxuICBsb2FkaW5nID0gdHJ1ZTtcclxuICBzYXZpbmcgPSBmYWxzZTtcclxuICBsb2FkRXJyb3IgPSAnJztcclxuICAvKiogL2F1ZGl0L2NvbmZpZy9nZXQgZmFpbGVkOiBzYXZpbmcgbm93IHdvdWxkIG92ZXJ3cml0ZSB0aGUgc3RvcmVkIHBhc3MgbWFyayAvIGFjY2VzcyBzZXR0aW5ncyB3aXRoIGRlZmF1bHRzLiAqL1xyXG4gIGF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgY2xpZW50SWQgPSAnJztcclxuICAvKiogVGhlIGdldENvbmZpZ0RldGFpbHMgcGF5bG9hZCwgc2VudCBiYWNrIHdob2xlIG9uIHNhdmUgKGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UgZG9lcykuICovXHJcbiAgcHJpdmF0ZSBjb25maWdEYXRhOiBhbnkgPSBudWxsO1xyXG4gIC8qKiBQdWJsaXNoIC8gU2F2ZSBuZWVkIHRoZSBDaGVja2xpc3QgZWRpdCBwZXJtaXNzaW9uICh0aGUgc2F2ZSBBUElzIGNoZWNrIGl0IHRvbykuICovXHJcbiAgYWNjZXNzOiBBdWRpdEFjY2VzcyA9IHsgY2FuQWRkOiBmYWxzZSwgY2FuRWRpdDogZmFsc2UgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRyYXhTZXJ2aWNlOiBUcmF4U2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBhdWRpdEFjY2Vzcyh0aGlzLmdzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGFjY2VzcyA9PiB7XHJcbiAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgdGhpcy5jaGVja2xpc3RJZCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ2NoZWNrbGlzdElkJykgfHwgJyc7XHJcbiAgICB0aGlzLmZyb21TY2hlZHVsZSA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ2Zyb20nKSA9PT0gJ3NjaGVkdWxlJztcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZGF0YT8uY2xpZW50IHx8IGRhdGEuY2xpZW50ID09PSB0aGlzLmNsaWVudElkKSB7IHJldHVybjsgfVxyXG4gICAgICB0aGlzLmNsaWVudElkID0gZGF0YS5jbGllbnQ7XHJcbiAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbmVkIGZyb20gU2NoZWR1bGUgSW5mbyAoP2Zyb209c2NoZWR1bGUpOiBCYWNrIHJldHVybnMgdG8gdGhhdCB0YWIsIGVsc2UgdG8gQXVkaXQgSW5mbyAoUUEgNiBPY3QpLiAqL1xyXG4gIGZyb21TY2hlZHVsZSA9IGZhbHNlO1xyXG5cclxuICBnZXQgYmFja0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5mcm9tU2NoZWR1bGUgPyAnQmFjayB0byBTY2hlZHVsZScgOiAnQmFjayB0byBNYW5hZ2UnO1xyXG4gIH1cclxuXHJcbiAgYmFjayhldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS90cmF4L2F1ZGl0LXYyL21hbmFnZSddLCB0aGlzLmZyb21TY2hlZHVsZSA/IHsgcXVlcnlQYXJhbXM6IHsgdGFiOiAnc2NoZWR1bGUnIH0gfSA6IHt9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogRXNjYXBlIGNsb3NlcyB0aGUgb3BlbiBkcm9wZG93biAvIHN1Z2dlc3Rpb24gbGlzdC4gKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXHJcbiAgb25Fc2NhcGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wZW5TZWxlY3QgPSBudWxsO1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBwcmVzcyBvciBmb2N1cyBvdXRzaWRlIHRoZSBvcGVuIGRyb3Bkb3duIC8gc3VnZ2VzdGlvbiBsaXN0IGNsb3NlcyBpdC4gTGlzdGVuZWQgdG8gaW4gdGhlXHJcbiAgICogY2FwdHVyZSBwaGFzZSwgc28gbm8gZWxlbWVudCB0aGF0IHN0b3BzIGNsaWNrIHByb3BhZ2F0aW9uIGNhbiBrZWVwIGl0IG9wZW4uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk91dHNpZGUgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBpZiAoIXRoaXMub3BlblNlbGVjdCAmJiAhdGhpcy5vcGVuQ2hpcHMpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgY29uc3QgaW5zaWRlID0gdGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuY2xvc2VzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXJnZXQuY2xvc2VzdCgnLmNmLXNlbGVjdC5pcy1vcGVuLCAuY2YtY2hpcGJveC5pcy1vcGVuJyk7XHJcbiAgICBpZiAoaW5zaWRlKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5vcGVuU2VsZWN0ID0gbnVsbDtcclxuICAgIHRoaXMub3BlbkNoaXBzID0gbnVsbDtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH07XHJcblxyXG4gIC8vIC0tLS0gbG9hZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrbGlzdElkKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxvYWRFcnJvciA9ICdObyBhdWRpdCBzZWxlY3RlZC4gT3BlbiBDb25maWd1cmUgZnJvbSB0aGUgTWFuYWdlIHBhZ2UuJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZEVycm9yID0gJyc7XHJcbiAgICB0aGlzLmF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkID0gZmFsc2U7XHJcbiAgICAvLyBBIGZhaWxlZCBjYWxsIHJlc29sdmVzIHRvIHsgZmFpbGVkOiBlcnJvciB9IHNvIGVhY2ggcGFydCBjYW4gc2F5IHdoYXQgd2VudCB3cm9uZy5cclxuICAgIGNvbnN0IHNhZmUgPSAobzogYW55KSA9PiBvLnBpcGUoY2F0Y2hFcnJvcigoZTogYW55KSA9PiBvZih7IGZhaWxlZDogZSB9KSkpO1xyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICBkZXRhaWxzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRHZXRDb25maWcoeyBjaGVja0xpc3RJZDogdGhpcy5jaGVja2xpc3RJZCwgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQgfSkpLFxyXG4gICAgICBhdWRpdDogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0Q29uZmlnR2V0KHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIGNoZWNrbGlzdElkOiB0aGlzLmNoZWNrbGlzdElkIH0pKSxcclxuICAgICAgdXNlcnM6IHNhZmUodGhpcy50cmF4U2VydmljZS5nZXRDbGllbnRVc2VyKHRoaXMuY2xpZW50SWQpKSxcclxuICAgICAgbGFiZWxzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRTZXR0aW5nc0dldCh0aGlzLmNsaWVudElkKSlcclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHsgZGV0YWlscywgYXVkaXQsIHVzZXJzLCBsYWJlbHMgfTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNsaWVudFVzZXJzOiBhbnlbXSA9IHVzZXJzPy5jb2RlID09PSAyMDAgPyB1c2Vycy5kYXRhIHx8IFtdIDogW107XHJcbiAgICAgIC8vIFRoZSBjbGllbnQncyBzdXBlcmFkbWluOiB0aGUgZGVmYXVsdCBhcHByb3ZlciBmb3IgVGFuZ28gdXNlcnMgYW5kIHJvbGUgJ3VzZXInICh2MSBDb25maWd1cmUpLlxyXG4gICAgICBjb25zdCBzdXBlckFkbWluID0gY2xpZW50VXNlcnMuZmluZCgodTogYW55KSA9PiB1Py5yb2xlID09PSAnc3VwZXJhZG1pbicgJiYgdT8uZW1haWwpO1xyXG4gICAgICB0aGlzLnN1cGVyQWRtaW4gPSBzdXBlckFkbWluID8gdGhpcy5jaGlwKHN1cGVyQWRtaW4udXNlck5hbWUsIHN1cGVyQWRtaW4uZW1haWwpIDogbnVsbDtcclxuICAgICAgdGhpcy51c2VycyA9IGNsaWVudFVzZXJzXHJcbiAgICAgICAgLm1hcCgodTogYW55KSA9PiB0aGlzLmNoaXAodS51c2VyTmFtZSwgdS5lbWFpbCkpXHJcbiAgICAgICAgLmZpbHRlcigodTogQ2hpcFVzZXIpID0+IHUuZSk7XHJcbiAgICAgIHRoaXMucGFzc0xhYmVsID0gbGFiZWxzPy5kYXRhPy5wYXNzTGFiZWwgfHwgJ1Bhc3MnO1xyXG4gICAgICB0aGlzLmZhaWxMYWJlbCA9IGxhYmVscz8uZGF0YT8uZmFpbExhYmVsIHx8ICdGYWlsJztcclxuXHJcbiAgICAgIGNvbnN0IGQgPSBkZXRhaWxzPy5jb2RlID09PSAyMDAgPyBkZXRhaWxzLmRhdGE/LmNoZWNrTGlzdERldGFpbHMgOiBudWxsO1xyXG4gICAgICBpZiAoIWQpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAvLyBUaGUgQVBJIGFuc3dlcnMgMjA0IChubyBib2R5KSB3aGVuIHRoZSBhdWRpdCBkb2VzIG5vdCBleGlzdCBvciBiZWxvbmdzIHRvIGFub3RoZXIgY2xpZW50LlxyXG4gICAgICAgIHRoaXMubG9hZEVycm9yID0gZGV0YWlscz8uZmFpbGVkXHJcbiAgICAgICAgICA/IHRoaXMuYXBpRXJyb3IoZGV0YWlscy5mYWlsZWQsICdDb3VsZCBub3QgbG9hZCB0aGlzIGF1ZGl0LiBSZWxvYWQgdGhlIHBhZ2UgdG8gdHJ5IGFnYWluLicsIGZhbHNlKVxyXG4gICAgICAgICAgOiAnVGhpcyBhdWRpdCB3YXMgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQuIE9wZW4gQ29uZmlndXJlIGFnYWluIGZyb20gdGhlIE1hbmFnZSBwYWdlLic7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29uZmlnRGF0YSA9IGRldGFpbHMuZGF0YTtcclxuICAgICAgdGhpcy5hcHBseUNoZWNrbGlzdChkKTtcclxuICAgICAgdGhpcy5hcHBseUFzc2lnbm1lbnQoZCk7XHJcbiAgICAgIHRoaXMuYXVkaXRTZXR0aW5nc0xvYWRGYWlsZWQgPSBhdWRpdD8uY29kZSAhPT0gMjAwO1xyXG4gICAgICB0aGlzLmFwcGx5QXVkaXQodGhpcy5hdWRpdFNldHRpbmdzTG9hZEZhaWxlZCA/IG51bGwgOiBhdWRpdC5kYXRhPy5jb25maWcpO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuYXVkaXRTZXR0aW5nc0xvYWRGYWlsZWQpIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBsb2FkIHRoZSBzY29yaW5nLCBkaXNwdXRlIGFuZCBhY2Nlc3Mgc2V0dGluZ3Mgb2YgdGhpcyBhdWRpdC4gUmVsb2FkIHRoZSBwYWdlIGJlZm9yZSBzYXZpbmcsIHNvIHRoZXkgYXJlIG5vdCByZXNldC4nKTtcclxuICAgICAgfSBlbHNlIGlmICh1c2Vycz8uZmFpbGVkKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRXYXJuaW5nVG9hc3QoJ0NvdWxkIG5vdCBsb2FkIHRoZSB1c2VycyBvZiB0aGlzIGNsaWVudCwgc28gdGhlIHVzZXIgcGlja2VycyBoYXZlIG5vIHN1Z2dlc3Rpb25zLiBZb3UgY2FuIHN0aWxsIGFkZCBhIHVzZXIgYnkgdHlwaW5nIHRoZWlyIGZ1bGwgZW1haWwuJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBnZXRDb25maWdEZXRhaWxzIGxpc3RzIHRoZSBhc3NpZ25tZW50IGFzIHsgaWQsIHR5cGUgfSBwYWlycyAoc3RvcmVzIC8gY2x1c3RlcnMgb3IgdXNlcnMgLyB0ZWFtcykuICovXHJcbiAgcHJpdmF0ZSBhcHBseUFzc2lnbm1lbnQoZDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBjb3VudCA9IChsaXN0OiBhbnkpID0+IChBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdC5sZW5ndGggOiAwKTtcclxuICAgIHRoaXMuYXNzaWduZWRDb3VudCA9IGNvdW50KGQuc2luZ2xlQXNzaWduKSArIGNvdW50KGQuZ3JvdXBBc3NpZ24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUNoZWNrbGlzdChkOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIE5ldmVyIGNvbmZpZ3VyZWQgeWV0OiBubyBzY2hlZHVsZSB3aW5kb3cgaGFzIGJlZW4gc2F2ZWQgKGNoZWNrZWQgYmVmb3JlIHRoZSBkZWZhdWx0cyBiZWxvdyBmaWxsIGl0KS5cclxuICAgIGNvbnN0IGZpcnN0Q29uZmlndXJlID0gIWQuc2NoZWR1bGVTdGFydFRpbWU7XHJcbiAgICAvLyBBIG5ldyBhdWRpdCBoYXMgbm8gc2NoZWR1bGUgd2luZG93LCBhbmQgY2hlY2tsaXN0Q29uZmlndXJldjEgY2Fubm90IHN0b3JlIGFuIGVtcHR5IG9uZTtcclxuICAgIC8vIHNhbWUgZGVmYXVsdHMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBhcHBsaWVzIG9uIGxvYWQuXHJcbiAgICBpZiAoIWQuc2NoZWR1bGVTdGFydFRpbWUpIHsgZC5zY2hlZHVsZVN0YXJ0VGltZSA9ICcxMDowMCBBTSc7IH1cclxuICAgIGlmICghZC5zY2hlZHVsZUVuZFRpbWUpIHsgZC5zY2hlZHVsZUVuZFRpbWUgPSAnMTA6MDAgUE0nOyB9XHJcbiAgICB0aGlzLmF1ZGl0TmFtZSA9IGQuY2hlY2tMaXN0TmFtZSB8fCAn4oCUJztcclxuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkLmNoZWNrTGlzdERlc2NyaXB0aW9uIHx8ICcnO1xyXG4gICAgdGhpcy5wdWJsaXNoZWQgPSAhIWQucHVibGlzaDtcclxuICAgIHRoaXMuc2NoZWR1bGUgPSBkLnNjaGVkdWxlUmVwZWF0ZWRUeXBlIHx8IGQuc2NoZWR1bGUgPyB0aGlzLnRpdGxlQ2FzZShkLnNjaGVkdWxlUmVwZWF0ZWRUeXBlIHx8IGQuc2NoZWR1bGUpIDogJ+KAlCc7XHJcbiAgICB0aGlzLnNjaGVkdWxlV2luZG93ID0gZC5zY2hlZHVsZVN0YXJ0VGltZSAmJiBkLnNjaGVkdWxlRW5kVGltZSA/IGQuc2NoZWR1bGVTdGFydFRpbWUgKyAnIHRvICcgKyBkLnNjaGVkdWxlRW5kVGltZSA6ICfigJQnO1xyXG4gICAgdGhpcy5zZWN0aW9ucyA9IChkLnNlY3Rpb25zIHx8IFtdKS5tYXAoKHNlYzogYW55LCBpOiBudW1iZXIpID0+ICh7XHJcbiAgICAgIGxhYmVsOiBzZWMubmFtZSB8fCAnU2VjdGlvbiAnICsgKGkgKyAxKSxcclxuICAgICAgaXRlbXM6IChzZWMucXVlc3Rpb25zIHx8IFtdKS5tYXAoKHE6IGFueSkgPT4gcT8ucW5hbWUgfHwgU3RyaW5nKHEpKSxcclxuICAgICAgb3BlbjogaSA9PT0gMFxyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMub3duZXJzID0gdGhpcy5jaGlwcyhkLm93bmVyKTtcclxuICAgIC8vIE5vIG93bmVyIHlldCAoYXVkaXRzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjcmVhdG9yIHdhcyBzdG9yZWQgYXMgb25lKTogdGhlIGxvZ2dlZC1pbiB1c2VyLCBzYXZlZCB3aXRoIHRoZSBwYWdlLlxyXG4gICAgaWYgKCF0aGlzLm93bmVycy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbWUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcclxuICAgICAgaWYgKG1lPy5lbWFpbCkgeyB0aGlzLm93bmVycyA9IFt0aGlzLmNoaXAobWUudXNlck5hbWUsIG1lLmVtYWlsKV07IH1cclxuICAgIH1cclxuICAgIHRoaXMuYXBwcm92ZXJzID0gdGhpcy5jaGlwcyhkLmFwcHJvdmVyKTtcclxuICAgIC8vIHYxIENvbmZpZ3VyZSBkZWZhdWx0IGFwcHJvdmVyLCBvbiB0aGUgZmlyc3QgQ29uZmlndXJlIG9ubHkgKGxhdGVyIGFuIGVtcHR5IGxpc3QgbWVhbnMgQXBwcm92ZXIgd2FzIHR1cm5lZFxyXG4gICAgLy8gb2ZmIG9uIHB1cnBvc2UpOiBUYW5nbyB1c2VycyBhbmQgY2xpZW50IHVzZXJzIHdpdGggcm9sZSAndXNlcicgZ2V0IHRoZSBjbGllbnQncyBzdXBlcmFkbWluLCBvdGhlcnMgdGhlbXNlbHZlcy5cclxuICAgIGlmIChmaXJzdENvbmZpZ3VyZSAmJiAhdGhpcy5hcHByb3ZlcnMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG1lID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XHJcbiAgICAgIGNvbnN0IHRvU3VwZXJBZG1pbiA9IG1lPy51c2VyVHlwZSA9PT0gJ3RhbmdvJyB8fCAobWU/LnVzZXJUeXBlID09PSAnY2xpZW50JyAmJiBtZT8ucm9sZSA9PT0gJ3VzZXInKTtcclxuICAgICAgY29uc3QgZmFsbGJhY2sgPSB0b1N1cGVyQWRtaW4gPyB0aGlzLnN1cGVyQWRtaW4gOiAobWU/LmVtYWlsID8gdGhpcy5jaGlwKG1lLnVzZXJOYW1lLCBtZS5lbWFpbCkgOiBudWxsKTtcclxuICAgICAgaWYgKGZhbGxiYWNrKSB7IHRoaXMuYXBwcm92ZXJzID0gW2ZhbGxiYWNrXTsgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5hcHByb3Zlck9uID0gdGhpcy5hcHByb3ZlcnMubGVuZ3RoID4gMDtcclxuICAgIC8vIFN0b3JlZCBhcyBtaW51dGVzIChudW1iZXJzKTsga2VlcCB0aGUga25vd24gaW50ZXJ2YWxzLCB1bmlxdWUsIGF0IG1vc3QgdGhyZWUuXHJcbiAgICBjb25zdCBzdG9yZWQ6IG51bWJlcltdID0gKEFycmF5LmlzQXJyYXkoZC5yZW1haW5kZXIpID8gZC5yZW1haW5kZXIgOiBbXSkubWFwKChtOiBhbnkpID0+IE51bWJlcihtKSk7XHJcbiAgICB0aGlzLnJlbWluZGVycyA9IHN0b3JlZC5maWx0ZXIoKG0sIGkpID0+IFJFTUlOREVSX01JTlVURVMuaW5jbHVkZXMobSkgJiYgc3RvcmVkLmluZGV4T2YobSkgPT09IGkpLnNsaWNlKDAsIE1BWF9SRU1JTkRFUlMpO1xyXG4gICAgdGhpcy5yZW1pbmRlck9uID0gdGhpcy5yZW1pbmRlcnMubGVuZ3RoID4gMDtcclxuICAgIHRoaXMucmVmcmVzaFJlbWluZGVyT3B0cygpO1xyXG5cclxuICAgIGNvbnN0IG5mID0gZC5ub3RpZnlGbGFncyB8fCB7fTtcclxuICAgIGNvbnN0IG5mVHlwZXM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShuZi5ub3RpZnlUeXBlKSA/IG5mLm5vdGlmeVR5cGUgOiBbXTtcclxuICAgIHRoaXMubm90aWZ5RmxhZ3NPbiA9IG5mVHlwZXMubGVuZ3RoID4gMDtcclxuICAgIHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyID0gbmZUeXBlcy5pbmNsdWRlcygnYXBwcm92ZXInKSB8fCAhdGhpcy5ub3RpZnlGbGFnc09uO1xyXG4gICAgdGhpcy5ub3RpZnlTZW5kQ3VzdG9tID0gbmZUeXBlcy5pbmNsdWRlcygnY3VzdG9tJyk7XHJcbiAgICB0aGlzLm5vdGlmeVVzZXJzID0gdGhpcy5jaGlwcyhuZi51c2Vycyk7XHJcblxyXG4gICAgY29uc3QgcmYgPSBkLnJlY3VycmluZ0ZsYWcgfHwge307XHJcbiAgICBjb25zdCByZlR5cGVzOiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkocmYubm90aWZ5VHlwZSkgPyByZi5ub3RpZnlUeXBlIDogW107XHJcbiAgICB0aGlzLnJlY3VycmluZ0ZsYWdzT24gPSByZlR5cGVzLmxlbmd0aCA+IDA7XHJcbiAgICB0aGlzLnJlY3VycmluZ1NlbmRBcHByb3ZlciA9IHJmVHlwZXMuaW5jbHVkZXMoJ2FwcHJvdmVyJykgfHwgIXRoaXMucmVjdXJyaW5nRmxhZ3NPbjtcclxuICAgIHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSA9IHJmVHlwZXMuaW5jbHVkZXMoJ2N1c3RvbScpO1xyXG4gICAgdGhpcy5yZWN1cnJpbmdTYW1lQXNOb3RpZnkgPSByZlR5cGVzLmluY2x1ZGVzKCdzYW1lQXNOb3RpZnknKTtcclxuICAgIHRoaXMucmVjdXJyaW5nVXNlcnMgPSB0aGlzLmNoaXBzKHJmLnVzZXJzKTtcclxuICAgIHRoaXMucmVjdXJyaW5nVGhyZXNob2xkID0gTnVtYmVyKHJmLnRocmVzaG9sZCkgfHwgMztcclxuXHJcbiAgICBjb25zdCBhZSA9IGQuYXV0b0VtYWlsIHx8IHt9O1xyXG4gICAgY29uc3QgYWVUeXBlczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGFlLnR5cGUpID8gYWUudHlwZSA6IFtdO1xyXG4gICAgdGhpcy5kYWlseVJlcG9ydE9uID0gYWVUeXBlcy5sZW5ndGggPiAwO1xyXG4gICAgdGhpcy5kYWlseVNlbmRBcHByb3ZlciA9IGFlVHlwZXMuaW5jbHVkZXMoJ2FwcHJvdmVyJykgfHwgIXRoaXMuZGFpbHlSZXBvcnRPbjtcclxuICAgIHRoaXMuZGFpbHlTZW5kQ3VzdG9tID0gYWVUeXBlcy5pbmNsdWRlcygnY3VzdG9tJyk7XHJcbiAgICB0aGlzLmRhaWx5VXNlcnMgPSB0aGlzLmNoaXBzKGFlLnVzZXJzKTtcclxuICAgIHRoaXMuc2hhcmVQb3N0QXBwcm92YWwgPSAhIWQuc2hhcmVSZXBvcnRQb3N0QXBwcm92YWw7XHJcblxyXG4gICAgdGhpcy5leHBvcnRTdWJtaXNzaW9uT24gPSAhIWQuZXhwb3J0O1xyXG4gICAgdGhpcy5yZWRvVmFsaWRGb3IgPSBOdW1iZXIoZC5yZWRvVmFsaWRpdHkpIHx8IDc7XHJcbiAgICB0aGlzLmF1dG9DcmVhdGVUYXNrT24gPSAhIWQuYXV0b0NyZWF0ZVRhc2s7XHJcbiAgICAvLyBEZWZhdWx0cyBsaWtlIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2U7IHdpdGhvdXQgYW4gYXNzaWduZWUgdGhlIGFwcHJvdmFsIHJhaXNlcyBubyB0YXNrLlxyXG4gICAgdGhpcy50YXNrQXNzaWduZWUgPSBkLnRhc2tBc3NpZ25lZSA9PT0gJ3N0b3JlJyB8fCBkLnRhc2tBc3NpZ25lZSA9PT0gJ3N0b3JldXNlcicgPyAnc3RvcmUnIDogJ3N1Ym1pdHRlcic7XHJcbiAgICB0aGlzLnRhc2tWYWxpZGl0eSA9IE51bWJlcihkLnRhc2tWYWxpZGl0eSkgfHwgMTA7XHJcbiAgICB0aGlzLnNob3dSZXNwb25zZUluQXBwID0gZC5zaG93QXBwcm92ZWRSZXNwb25zZSAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnJlc3BvbnNlVmlzaWJpbGl0eSA9IGQucmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncHJlQXBwcm92YWwnID8gJ3ByZScgOiAncG9zdCc7XHJcbiAgICB0aGlzLnJlc3BEZWxheSA9IGQucmVzcG9uc2VWaXNpYmlsaXR5SG91cnMgPz8gMjtcclxuICAgIHRoaXMucmVxdWlyZVBob3RvID0gISFkLnVzZXJWZXJpZmljYXRpb24/LnJlcXVpcmVQaG90b0NhcHR1cmU7XHJcbiAgICB0aGlzLnJlcXVpcmVBY2tub3dsZWRnbWVudCA9ICEhZC51c2VyVmVyaWZpY2F0aW9uPy5yZXF1aXJlVXNlckFja25vd2xlZGdtZW50O1xyXG4gICAgdGhpcy5yZWRvRXh0ZW5zaW9uID0gTnVtYmVyKGQucmVkb0V4dGVuc2lvbikgfHwgMTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlBdWRpdChjZmc6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgcyA9IGNmZz8uc2V0dGluZ3MgfHwge307XHJcbiAgICB0aGlzLnBhc3NUaHJlc2hvbGQgPSBOdW1iZXIoY2ZnPy5wYXNzTWFyaykgfHwgNzU7XHJcbiAgICB0aGlzLnBhc3NGYWlsT24gPSBzLnBhc3NGYWlsT24gIT09IGZhbHNlO1xyXG4gICAgdGhpcy5kaXNwdXRlT24gPSBzLmRpc3B1dGVPbiAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLmRpc3B1dGVXaW5kb3cgPSBOdW1iZXIocy5kaXNwdXRlV2luZG93KSB8fCA0ODtcclxuICAgIHRoaXMucHJlU3VibWlzc2lvbkFjY2Vzc09uID0gISFzLnByZVN1Ym1pc3Npb25BY2Nlc3NPbjtcclxuICAgIHRoaXMucHJlU3VibWlzc2lvblVzZXJzID0gdGhpcy5jaGlwcyhzLnByZVN1Ym1pc3Npb25Vc2Vycyk7XHJcbiAgICB0aGlzLmVkaXRTdWJtaXR0ZWRPbiA9ICEhcy5lZGl0U3VibWl0dGVkT247XHJcbiAgICB0aGlzLmVkaXRVc2VycyA9IHRoaXMuY2hpcHMocy5lZGl0VXNlcnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFjY2VwdHMgYm90aCB0aGUgY2hlY2tsaXN0IHNoYXBlIHsgbmFtZSwgdmFsdWUgfSBhbmQgdGhlIGF1ZGl0IHNoYXBlIHsgbiwgZSB9LiAqL1xyXG4gIHByaXZhdGUgY2hpcHMobGlzdDogYW55KTogQ2hpcFVzZXJbXSB7XHJcbiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0IDogW10pXHJcbiAgICAgIC5tYXAoKHU6IGFueSkgPT4gdGhpcy5jaGlwKHU/Lm5hbWUgPz8gdT8ubiwgdT8udmFsdWUgPz8gdT8uZSA/PyB1Py5lbWFpbCkpXHJcbiAgICAgIC5maWx0ZXIoKHU6IENoaXBVc2VyKSA9PiB1LmUgfHwgdS5uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hpcChuYW1lOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcpOiBDaGlwVXNlciB7XHJcbiAgICBjb25zdCBuID0gU3RyaW5nKG5hbWUgfHwgZW1haWwgfHwgJycpLnRyaW0oKTtcclxuICAgIGNvbnN0IHBhcnRzID0gbi5zcGxpdCgvXFxzKy8pO1xyXG4gICAgY29uc3QgaSA9ICgocGFydHNbMF0/LlswXSB8fCAnJykgKyAocGFydHNbMV0/LlswXSB8fCBwYXJ0c1swXT8uWzFdIHx8ICcnKSkudG9VcHBlckNhc2UoKTtcclxuICAgIHJldHVybiB7IGksIG4sIGU6IFN0cmluZyhlbWFpbCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGl0bGVDYXNlKHY6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdiA/IHYuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2LnNsaWNlKDEpIDogdjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oc2VjdGlvbjogQ29uZmlnU2VjdGlvbik6IHZvaWQge1xyXG4gICAgc2VjdGlvbi5vcGVuID0gIXNlY3Rpb24ub3BlbjtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gcmVtaW5kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBUdXJuaW5nIFJlbWluZGVyIG9uIHN0YXJ0cyB3aXRoIG9uZSAzMC1taW51dGUgcmVtaW5kZXIsIGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UgZG9lcy4gKi9cclxuICB0b2dnbGVSZW1pbmRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMucmVtaW5kZXJPbiA9ICF0aGlzLnJlbWluZGVyT247XHJcbiAgICBpZiAodGhpcy5yZW1pbmRlck9uICYmICF0aGlzLnJlbWluZGVycy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5yZW1pbmRlcnMgPSBbUkVNSU5ERVJfTUlOVVRFU1swXV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZnJlc2hSZW1pbmRlck9wdHMoKTtcclxuICB9XHJcblxyXG4gIHNldFJlbWluZGVyKGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgaWYgKCFSRU1JTkRFUl9NSU5VVEVTLmluY2x1ZGVzKG1pbnV0ZXMpKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5yZW1pbmRlcnMgPSB0aGlzLnJlbWluZGVycy5tYXAoKG0sIGkpID0+IChpID09PSBpbmRleCA/IG1pbnV0ZXMgOiBtKSk7XHJcbiAgICB0aGlzLnJlZnJlc2hSZW1pbmRlck9wdHMoKTtcclxuICB9XHJcblxyXG4gIC8qKiBBZGRzIHRoZSBmaXJzdCBpbnRlcnZhbCBub3QgdXNlZCB5ZXQuICovXHJcbiAgYWRkUmVtaW5kZXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBuZXh0ID0gUkVNSU5ERVJfTUlOVVRFUy5maW5kKG0gPT4gIXRoaXMucmVtaW5kZXJzLmluY2x1ZGVzKG0pKTtcclxuICAgIGlmIChuZXh0ID09PSB1bmRlZmluZWQgfHwgdGhpcy5yZW1pbmRlcnMubGVuZ3RoID49IE1BWF9SRU1JTkRFUlMpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnJlbWluZGVycyA9IFsuLi50aGlzLnJlbWluZGVycywgbmV4dF07XHJcbiAgICB0aGlzLnJlZnJlc2hSZW1pbmRlck9wdHMoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVJlbWluZGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJlbWluZGVycy5sZW5ndGggPD0gMSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucmVtaW5kZXJzID0gdGhpcy5yZW1pbmRlcnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XHJcbiAgICB0aGlzLnJlZnJlc2hSZW1pbmRlck9wdHMoKTtcclxuICB9XHJcblxyXG4gIC8qKiBcIjMwLCA0NSBhbmQgNjAgbWluc1wiIGZvciB0aGUgc3VtbWFyeSBsaW5lLiAqL1xyXG4gIGdldCByZW1pbmRlclN1bW1hcnkoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxpc3QgPSBbLi4udGhpcy5yZW1pbmRlcnNdLnNvcnQoKGEsIGIpID0+IGEgLSBiKS5tYXAoU3RyaW5nKTtcclxuICAgIHJldHVybiBsaXN0Lmxlbmd0aCA+IDEgPyBsaXN0LnNsaWNlKDAsIC0xKS5qb2luKCcsICcpICsgJyBhbmQgJyArIGxpc3RbbGlzdC5sZW5ndGggLSAxXSA6IChsaXN0WzBdIHx8ICcnKTtcclxuICB9XHJcblxyXG4gIC8qKiBFYWNoIHJvdyBvZmZlcnMgaXRzIG93biB2YWx1ZSBwbHVzIGV2ZXJ5IGludGVydmFsIG5vIG90aGVyIHJvdyB1c2VzIChyZWJ1aWx0IG9ubHkgb24gY2hhbmdlKS4gKi9cclxuICBwcml2YXRlIHJlZnJlc2hSZW1pbmRlck9wdHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbWluZGVyT3B0cyA9IHRoaXMucmVtaW5kZXJzLm1hcCgob3duLCBpbmRleCkgPT4gUkVNSU5ERVJfTUlOVVRFU1xyXG4gICAgICAuZmlsdGVyKG0gPT4gbSA9PT0gb3duIHx8ICF0aGlzLnJlbWluZGVycy5zb21lKChvdGhlciwgaSkgPT4gaSAhPT0gaW5kZXggJiYgb3RoZXIgPT09IG0pKVxyXG4gICAgICAubWFwKG0gPT4gKHsgdmFsdWU6IG0sIGxhYmVsOiBtICsgJyBtaW5zJyB9KSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBhcHByb3ZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIEFwcHJvdmVyIGlzIG9uIGFuZCBoYXMgYXQgbGVhc3Qgb25lIHVzZXI6IHRoZSBvbmx5IHN0YXRlIGluIHdoaWNoIGFueXRoaW5nIGNhbiBnbyBcInRvIHRoZSBhcHByb3ZlclwiLiAqL1xyXG4gIGdldCBoYXNBcHByb3ZlcnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHByb3Zlck9uICYmIHRoaXMuYXBwcm92ZXJzLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICAvKiogV2h5IFwiYXBwcm92ZXJcIiBjYW5ub3QgYmUgdXNlZCByaWdodCBub3cgKCcnIHdoZW4gaXQgY2FuKS4gKi9cclxuICBwcml2YXRlIGdldCBhcHByb3Zlck1pc3NpbmdUZXh0KCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuYXBwcm92ZXJPbikgeyByZXR1cm4gJ0FwcHJvdmVyIGlzIHR1cm5lZCBvZmYuIFR1cm4gb24gQXBwcm92ZXIgYW5kIGFkZCBhdCBsZWFzdCBvbmUgYXBwcm92ZXIgZmlyc3QuJzsgfVxyXG4gICAgaWYgKCF0aGlzLmFwcHJvdmVycy5sZW5ndGgpIHsgcmV0dXJuICdObyBhcHByb3ZlciBoYXMgYmVlbiBhZGRlZCB5ZXQuIEFkZCBhdCBsZWFzdCBvbmUgYXBwcm92ZXIgdW5kZXIgQXBwcm92ZXIgZmlyc3QuJzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNob3duIHVuZGVyIHRoZSBhcHByb3ZlciBwaWNrZXIgd2hpbGUgaXQgaXMgb24gYnV0IGVtcHR5IChTYXZlIGFzIERyYWZ0IHN0aWxsIHdvcmtzOyBQdWJsaXNoIGRvZXMgbm90KS4gKi9cclxuICBnZXQgYXBwcm92ZXJFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuYXBwcm92ZXJPbiAmJiAhdGhpcy5hcHByb3ZlcnMubGVuZ3RoID8gJ0FkZCBhdCBsZWFzdCBvbmUgYXBwcm92ZXIsIG9yIHR1cm4gQXBwcm92ZXIgb2ZmIHRvIHB1Ymxpc2ggd2l0aG91dCBhcHByb3ZhbC4nIDogJyc7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHBhcnRzIG9mIHRoZSBwYWdlIHRoYXQgc2VuZCB0byAvIHJlbHkgb24gdGhlIGFwcHJvdmVycyBhbmQgYXJlIHN3aXRjaGVkIG9uIG5vdy4gKi9cclxuICBwcml2YXRlIGdldCBhcHByb3ZlckRlcGVuZGVudHMoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgbGlzdDogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLm5vdGlmeUZsYWdzT24gJiYgdGhpcy5ub3RpZnlTZW5kQXBwcm92ZXIpIHsgbGlzdC5wdXNoKCdOb3RpZnkgRmxhZ3MnKTsgfVxyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nRmxhZ3NPbiAmJiB0aGlzLnJlY3VycmluZ1NlbmRBcHByb3ZlcikgeyBsaXN0LnB1c2goJ05vdGlmeSBvbiBSZWN1cnJpbmcgRmxhZ3MnKTsgfVxyXG4gICAgaWYgKHRoaXMuZGFpbHlSZXBvcnRPbiAmJiB0aGlzLmRhaWx5U2VuZEFwcHJvdmVyKSB7IGxpc3QucHVzaCgnRGFpbHkgUmVwb3J0Jyk7IH1cclxuICAgIGlmICh0aGlzLmVkaXRTdWJtaXR0ZWRPbikgeyBsaXN0LnB1c2goJ0VkaXQgU3VibWl0dGVkIEF1ZGl0Jyk7IH1cclxuICAgIHJldHVybiBsaXN0O1xyXG4gIH1cclxuXHJcbiAgLyoqIFR1cm5pbmcgQXBwcm92ZXIgb2ZmIHdhcm5zIGFib3V0IGV2ZXJ5IHNldHRpbmcgdGhhdCBzdGlsbCBzZW5kcyB0byAvIHJlbGllcyBvbiB0aGUgYXBwcm92ZXJzLiAqL1xyXG4gIHRvZ2dsZUFwcHJvdmVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hcHByb3Zlck9uID0gIXRoaXMuYXBwcm92ZXJPbjtcclxuICAgIGNvbnN0IGRlcGVuZGVudHMgPSB0aGlzLmFwcHJvdmVyRGVwZW5kZW50cztcclxuICAgIGlmICghdGhpcy5hcHByb3Zlck9uICYmIGRlcGVuZGVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0V2FybmluZ1RvYXN0KCdBcHByb3ZlciBpcyB0dXJuZWQgb2ZmLCBidXQgJyArIGRlcGVuZGVudHMuam9pbignLCAnKSArICcgc3RpbGwgdXNlIHRoZSBhcHByb3ZlcnMuIFR1cm4gQXBwcm92ZXIgYmFjayBvbiBvciBjaGFuZ2UgdGhvc2Ugc2V0dGluZ3MgYmVmb3JlIHNhdmluZy4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBTZW5kIFRvID4gQXBwcm92ZXIgY2FuIG9ubHkgYmUgdGlja2VkIHdoZW4gdGhlcmUgaXMgYW4gYXBwcm92ZXIgdG8gc2VuZCB0by4gKi9cclxuICB0b2dnbGVTZW5kQXBwcm92ZXIoa2V5OiBTZW5kQXBwcm92ZXJLZXkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpc1trZXldICYmICF0aGlzLmhhc0FwcHJvdmVycykge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QodGhpcy5hcHByb3Zlck1pc3NpbmdUZXh0KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpc1trZXldID0gIXRoaXNba2V5XTtcclxuICB9XHJcblxyXG4gIC8qKiBTd2l0Y2hpbmcgYSBmbGFnIC8gcmVwb3J0IGVtYWlsIG9uIHRpY2tzIEFwcHJvdmVyIG9ubHkgd2hlbiB0aGVyZSBpcyBhbiBhcHByb3ZlciB0byBzZW5kIHRvLiAqL1xyXG4gIHRvZ2dsZU5vdGlmeUZsYWdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ub3RpZnlGbGFnc09uID0gIXRoaXMubm90aWZ5RmxhZ3NPbjtcclxuICAgIGlmICh0aGlzLm5vdGlmeUZsYWdzT24gJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyID0gZmFsc2U7IH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVJlY3VycmluZ0ZsYWdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWN1cnJpbmdGbGFnc09uID0gIXRoaXMucmVjdXJyaW5nRmxhZ3NPbjtcclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHRoaXMucmVjdXJyaW5nU2VuZEFwcHJvdmVyID0gZmFsc2U7IH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZURhaWx5UmVwb3J0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYWlseVJlcG9ydE9uID0gIXRoaXMuZGFpbHlSZXBvcnRPbjtcclxuICAgIGlmICh0aGlzLmRhaWx5UmVwb3J0T24gJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHRoaXMuZGFpbHlTZW5kQXBwcm92ZXIgPSBmYWxzZTsgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEVkaXQgU3VibWl0dGVkIEF1ZGl0IGxldHMgYXBwcm92ZXJzIGNoYW5nZSBzdWJtaXNzaW9ucyBiZWZvcmUgYXBwcm92aW5nLCBzbyBpdCBuZWVkcyBhcHByb3ZlcnMuICovXHJcbiAgdG9nZ2xlRWRpdFN1Ym1pdHRlZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5lZGl0U3VibWl0dGVkT24gJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRWRpdCBTdWJtaXR0ZWQgQXVkaXQgaXMgZm9yIGFwcHJvdmVycy4gJyArIHRoaXMuYXBwcm92ZXJNaXNzaW5nVGV4dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZWRpdFN1Ym1pdHRlZE9uID0gIXRoaXMuZWRpdFN1Ym1pdHRlZE9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVkaXRTdWJtaXR0ZWRFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmVkaXRTdWJtaXR0ZWRPbikgeyByZXR1cm4gJyc7IH1cclxuICAgIGlmICghdGhpcy5oYXNBcHByb3ZlcnMpIHsgcmV0dXJuICdFZGl0IFN1Ym1pdHRlZCBBdWRpdCBpcyBmb3IgYXBwcm92ZXJzLiAnICsgdGhpcy5hcHByb3Zlck1pc3NpbmdUZXh0ICsgJyBPciB0dXJuIEVkaXQgU3VibWl0dGVkIEF1ZGl0IG9mZi4nOyB9XHJcbiAgICBpZiAoIXRoaXMuZWRpdFVzZXJzLmxlbmd0aCkgeyByZXR1cm4gJ0FkZCBhdCBsZWFzdCBvbmUgdXNlciB3aG8gY2FuIGVkaXQgc3VibWl0dGVkIGF1ZGl0cyc7IH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gbm90aWZ5IC8gcmVjdXJyaW5nIGZsYWcgcmVjaXBpZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogVGlja2luZyBDdXN0b20gdW5kZXIgUmVjdXJyaW5nIEZsYWdzIHN0YXJ0cyBpdHMgdXNlciBsaXN0IGZyb20gdGhlIE5vdGlmeSBGbGFncyBjdXN0b20gdXNlcnMsXHJcbiAgICogc28gdGhlIHNhbWUgcGVvcGxlIGFyZSB1c2VkIGJ5IGRlZmF1bHQ7IHRoZSBsaXN0IHN0YXlzIGVkaXRhYmxlLlxyXG4gICAqL1xyXG4gIHRvZ2dsZVJlY3VycmluZ0N1c3RvbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSA9ICF0aGlzLnJlY3VycmluZ1NlbmRDdXN0b207XHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdTZW5kQ3VzdG9tICYmICF0aGlzLnJlY3VycmluZ1VzZXJzLmxlbmd0aCAmJiB0aGlzLm5vdGlmeUZsYWdzT24gJiYgdGhpcy5ub3RpZnlTZW5kQ3VzdG9tKSB7XHJcbiAgICAgIHRoaXMucmVjdXJyaW5nVXNlcnMgPSBbLi4udGhpcy5ub3RpZnlVc2Vyc107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogV2hvIFwiVXNlIHNhbWUgdXNlcnMgZnJvbSBOb3RpZnkgRmxhZ3NcIiByZXNvbHZlcyB0byAoc2hvd24gcmVhZC1vbmx5IHVuZGVyIHRoZSBvcHRpb24pLiAqL1xyXG4gIGdldCBub3RpZnlSZWNpcGllbnRzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5ub3RpZnlGbGFnc09uKSB7IHJldHVybiAnTm90aWZ5IEZsYWdzIGlzIG9mZiwgc28gbm8gb25lIGlzIGFkZGVkIGZyb20gaXQnOyB9XHJcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLm5vdGlmeVNlbmRBcHByb3ZlcikgeyBwYXJ0cy5wdXNoKHRoaXMuYXBwcm92ZXJzLmxlbmd0aCA/ICd0aGUgYXBwcm92ZXJzJyA6ICd0aGUgYXBwcm92ZXJzIChub25lIHNldCknKTsgfVxyXG4gICAgaWYgKHRoaXMubm90aWZ5U2VuZEN1c3RvbSAmJiB0aGlzLm5vdGlmeVVzZXJzLmxlbmd0aCkgeyBwYXJ0cy5wdXNoKHRoaXMubm90aWZ5VXNlcnMubWFwKHUgPT4gdS5uKS5qb2luKCcsICcpKTsgfVxyXG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA/ICdBbHNvIHNlbmRzIHRvICcgKyBwYXJ0cy5qb2luKCcgYW5kICcpIDogJ05vdGlmeSBGbGFncyBoYXMgbm8gcmVjaXBpZW50cyB5ZXQnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vdGlmeUZsYWdzRXJyb3IoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5ub3RpZnlGbGFnc09uKSB7IHJldHVybiAnJzsgfVxyXG4gICAgaWYgKCF0aGlzLm5vdGlmeVNlbmRBcHByb3ZlciAmJiAhdGhpcy5ub3RpZnlTZW5kQ3VzdG9tKSB7IHJldHVybiAnQ2hvb3NlIHdobyByZWNlaXZlcyB0aGUgZmxhZyBlbWFpbHMnOyB9XHJcbiAgICBpZiAodGhpcy5ub3RpZnlTZW5kQXBwcm92ZXIgJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHJldHVybiAnTm90aWZ5IEZsYWdzIHNlbmRzIHRvIHRoZSBhcHByb3Zlci4gJyArIHRoaXMuYXBwcm92ZXJNaXNzaW5nVGV4dCArICcgT3IgdW50aWNrIEFwcHJvdmVyIGhlcmUuJzsgfVxyXG4gICAgaWYgKHRoaXMubm90aWZ5U2VuZEN1c3RvbSAmJiAhdGhpcy5ub3RpZnlVc2Vycy5sZW5ndGgpIHsgcmV0dXJuICdBZGQgYXQgbGVhc3Qgb25lIGN1c3RvbSB1c2VyIGZvciBOb3RpZnkgRmxhZ3MnOyB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVjdXJyaW5nRmxhZ3NFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLnJlY3VycmluZ0ZsYWdzT24pIHsgcmV0dXJuICcnOyB9XHJcbiAgICBpZiAoIXRoaXMucmVjdXJyaW5nU2VuZEFwcHJvdmVyICYmICF0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gJiYgIXRoaXMucmVjdXJyaW5nU2FtZUFzTm90aWZ5KSB7IHJldHVybiAnQ2hvb3NlIHdobyByZWNlaXZlcyB0aGUgcmVjdXJyaW5nIGZsYWcgZW1haWxzJzsgfVxyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nU2VuZEFwcHJvdmVyICYmICF0aGlzLmhhc0FwcHJvdmVycykgeyByZXR1cm4gJ1JlY3VycmluZyBGbGFncyBzZW5kcyB0byB0aGUgYXBwcm92ZXIuICcgKyB0aGlzLmFwcHJvdmVyTWlzc2luZ1RleHQgKyAnIE9yIHVudGljayBBcHByb3ZlciBoZXJlLic7IH1cclxuICAgIGlmICh0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gJiYgIXRoaXMucmVjdXJyaW5nVXNlcnMubGVuZ3RoKSB7IHJldHVybiAnQWRkIGF0IGxlYXN0IG9uZSBjdXN0b20gdXNlciBmb3IgUmVjdXJyaW5nIEZsYWdzJzsgfVxyXG4gICAgLy8gQXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZTogXCJzYW1lIHVzZXJzXCIgbmVlZHMgTm90aWZ5IEZsYWdzIG9uLCBlbHNlIGl0IHdvdWxkIG1haWwgbm8gb25lLlxyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nU2FtZUFzTm90aWZ5ICYmICF0aGlzLm5vdGlmeUZsYWdzT24pIHsgcmV0dXJuICdcIlVzZSBzYW1lIHVzZXJzIGZyb20gTm90aWZ5IEZsYWdzXCIgbmVlZHMgTm90aWZ5IEZsYWdzIG9uLiBUdXJuIE5vdGlmeSBGbGFncyBvbiwgb3IgdW50aWNrIHRoaXMgb3B0aW9uLic7IH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGdldCBkYWlseVJlcG9ydEVycm9yKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuZGFpbHlSZXBvcnRPbikgeyByZXR1cm4gJyc7IH1cclxuICAgIGlmICghdGhpcy5kYWlseVNlbmRBcHByb3ZlciAmJiAhdGhpcy5kYWlseVNlbmRDdXN0b20pIHsgcmV0dXJuICdDaG9vc2Ugd2hvIHJlY2VpdmVzIHRoZSBkYWlseSByZXBvcnQnOyB9XHJcbiAgICBpZiAodGhpcy5kYWlseVNlbmRBcHByb3ZlciAmJiAhdGhpcy5oYXNBcHByb3ZlcnMpIHsgcmV0dXJuICdUaGUgZGFpbHkgcmVwb3J0IGlzIHNlbnQgdG8gdGhlIGFwcHJvdmVyLiAnICsgdGhpcy5hcHByb3Zlck1pc3NpbmdUZXh0ICsgJyBPciB1bnRpY2sgQXBwcm92ZXIgaGVyZS4nOyB9XHJcbiAgICBpZiAodGhpcy5kYWlseVNlbmRDdXN0b20gJiYgIXRoaXMuZGFpbHlVc2Vycy5sZW5ndGgpIHsgcmV0dXJuICdBZGQgYXQgbGVhc3Qgb25lIGN1c3RvbSB1c2VyIGZvciB0aGUgZGFpbHkgcmVwb3J0JzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBkcm9wZG93bnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0KGtleTogU2VsZWN0S2V5LCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5vcGVuU2VsZWN0ID0gdGhpcy5vcGVuU2VsZWN0ID09PSBrZXkgPyBudWxsIDoga2V5O1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcGljayhrZXk6IFNlbGVjdEtleSwgb3B0aW9uOiBTZWxlY3RPcHRpb24sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzW2tleV0gPSBvcHRpb24udmFsdWU7XHJcbiAgICB0aGlzLm9wZW5TZWxlY3QgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0TGFiZWwoa2V5OiBTZWxlY3RLZXksIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xyXG4gICAgcmV0dXJuIG9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT09IHZhbHVlKT8ubGFiZWwgPz8gU3RyaW5nKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGlzUGlja2VkKGtleTogU2VsZWN0S2V5LCBvcHRpb246IFNlbGVjdE9wdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXNba2V5XSA9PT0gb3B0aW9uLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gVHlwZWQgYWNjZXNzb3JzIGZvciB0aGUgc2hhcmVkIHRlbXBsYXRlcyAodGhlaXIgY29udGV4dCB2YXJpYWJsZXMgYXJlIHVudHlwZWQsIGFuZCB0aGVcclxuICAvLyByb290IGFwcCdzIHN0cmljdCB0ZW1wbGF0ZSBjaGVjayByZWplY3RzIGB0aGlzW2xpc3RdYCAvIGBkcmFmdHNbbGlzdF1gKS5cclxuICBjaGlwc09mKGxpc3Q6IENoaXBMaXN0KTogQ2hpcFVzZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpc1tsaXN0XTtcclxuICB9XHJcblxyXG4gIGRyYWZ0T2YobGlzdDogQ2hpcExpc3QpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZHJhZnRzW2xpc3RdO1xyXG4gIH1cclxuXHJcbiAgc2V0RHJhZnQobGlzdDogQ2hpcExpc3QsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZnRzW2xpc3RdID0gdmFsdWUgPz8gJyc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIGNoaXAgcGlja2VycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBDbGllbnQgdXNlcnMgbWF0Y2hpbmcgdGhlIHR5cGVkIHRleHQsIG1pbnVzIHRoZSBvbmVzIGFscmVhZHkgaW4gdGhlIGxpc3QuICovXHJcbiAgc3VnZ2VzdGlvbnMobGlzdDogQ2hpcExpc3QpOiBDaGlwVXNlcltdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLmRyYWZ0c1tsaXN0XS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IGNob3NlbiA9IG5ldyBTZXQodGhpc1tsaXN0XS5tYXAodSA9PiB1LmUpKTtcclxuICAgIHJldHVybiB0aGlzLnVzZXJzXHJcbiAgICAgIC5maWx0ZXIodSA9PiAhY2hvc2VuLmhhcyh1LmUpICYmICghcSB8fCB1Lm4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCB1LmUuaW5jbHVkZXMocSkpKVxyXG4gICAgICAuc2xpY2UoMCwgOCk7XHJcbiAgfVxyXG5cclxuICBmb2N1c0NoaXBzKGxpc3Q6IENoaXBMaXN0LCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBsaXN0O1xyXG4gICAgdGhpcy5vcGVuU2VsZWN0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBBcHByb3ZlcnMgY2FuIG9ubHkgYmUgYWRkZWQgd2hpbGUgQXBwcm92ZXIgaXMgb24gKHRoZSBwaWNrZXIgaXMgaGlkZGVuIG90aGVyd2lzZTsgdGhpcyBndWFyZHMgaXQpLiAqL1xyXG4gIHByaXZhdGUgYXBwcm92ZXJMaXN0TG9ja2VkKGxpc3Q6IENoaXBMaXN0KTogYm9vbGVhbiB7XHJcbiAgICBpZiAobGlzdCAhPT0gJ2FwcHJvdmVycycgfHwgdGhpcy5hcHByb3Zlck9uKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdBcHByb3ZlciBpcyB0dXJuZWQgb2ZmLiBUdXJuIG9uIEFwcHJvdmVyIHRvIGFkZCBhcHByb3ZlcnMuJyk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFkZFN1Z2dlc3Rpb24obGlzdDogQ2hpcExpc3QsIHVzZXI6IENoaXBVc2VyLCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuYXBwcm92ZXJMaXN0TG9ja2VkKGxpc3QpKSB7IHJldHVybjsgfVxyXG4gICAgaWYgKCF0aGlzW2xpc3RdLnNvbWUodSA9PiB1LmUgPT09IHVzZXIuZSkpIHtcclxuICAgICAgdGhpc1tsaXN0XSA9IFsuLi50aGlzW2xpc3RdLCB1c2VyXTtcclxuICAgIH1cclxuICAgIHRoaXMuZHJhZnRzW2xpc3RdID0gJyc7XHJcbiAgICB0aGlzLm9wZW5DaGlwcyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogRW50ZXIgdGFrZXMgdGhlIGZpcnN0IHN1Z2dlc3Rpb247IGFuIGV4YWN0IGVtYWlsIHdvcmtzIGV2ZW4gZm9yIGEgdXNlciBub3QgaW4gdGhlIGxpc3QuICovXHJcbiAgYWRkQ2hpcChsaXN0OiBDaGlwTGlzdCk6IHZvaWQge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuZHJhZnRzW2xpc3RdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKCFxIHx8IHRoaXMuYXBwcm92ZXJMaXN0TG9ja2VkKGxpc3QpKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgdHlwZWQgPSB0aGlzLmVzYyh0aGlzLmRyYWZ0c1tsaXN0XS50cmltKCkpO1xyXG4gICAgY29uc3QgaXNFbWFpbCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QocSk7XHJcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuc3VnZ2VzdGlvbnMobGlzdClbMF0gfHwgKGlzRW1haWwgPyB0aGlzLmNoaXAocSwgcSkgOiBudWxsKTtcclxuICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHEuaW5jbHVkZXMoJ0AnKVxyXG4gICAgICAgID8gJ1wiJyArIHR5cGVkICsgJ1wiIGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuJ1xyXG4gICAgICAgIDogJ05vIHVzZXIgbWF0Y2hlcyBcIicgKyB0eXBlZCArICdcIi4gUGljayBhIHVzZXIgZnJvbSB0aGUgbGlzdCBvciB0eXBlIHRoZWlyIGZ1bGwgZW1haWwuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzW2xpc3RdLnNvbWUodSA9PiB1LmUgPT09IG1hdGNoLmUpKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCh0aGlzLmVzYyhtYXRjaC5uIHx8IG1hdGNoLmUpICsgJyBpcyBhbHJlYWR5IGFkZGVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzW2xpc3RdID0gWy4uLnRoaXNbbGlzdF0sIG1hdGNoXTtcclxuICAgIHRoaXMuZHJhZnRzW2xpc3RdID0gJyc7XHJcbiAgICB0aGlzLm9wZW5DaGlwcyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICByZW1vdmVDaGlwKGxpc3Q6IENoaXBMaXN0LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzW2xpc3RdID0gdGhpc1tsaXN0XS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGF0IHRoZSBjaGVja2xpc3Qga2VlcHMgYXMgYXNzaWduZWRVc2VycywgZXhhY3RseSBhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIHNlbmRzIGl0LiAqL1xyXG4gIHByaXZhdGUgYXNzaWduZWRVc2VycygpOiB7IGlkOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9W10ge1xyXG4gICAgY29uc3QgZCA9IHRoaXMuY29uZmlnRGF0YT8uY2hlY2tMaXN0RGV0YWlscyB8fCB7fTtcclxuICAgIHJldHVybiBbLi4uKGQuc2luZ2xlQXNzaWduIHx8IFtdKSwgLi4uKGQuZ3JvdXBBc3NpZ24gfHwgW10pXTtcclxuICB9XHJcblxyXG4gIGdldCBwcmVTdWJtaXNzaW9uRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVTdWJtaXNzaW9uQWNjZXNzT24gJiYgdGhpcy5wcmVTdWJtaXNzaW9uVXNlcnMubGVuZ3RoID09PSAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3B1dGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVZpc2liaWxpdHkgPT09ICdwcmUnICYmIHRoaXMuZGlzcHV0ZU9uO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoeSBQdWJsaXNoIC8gU2F2ZSBhcmUgZGlzYWJsZWQgKGJ1dHRvbiB0aXRsZSksICcnIHdoZW4gdGhleSBhcmUgbm90LiAqL1xyXG4gIGdldCBzYXZlQmxvY2tlZFJlYXNvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmFjY2Vzcy5jYW5FZGl0KSB7IHJldHVybiAnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY2hhbmdlIGF1ZGl0cyc7IH1cclxuICAgIGlmICh0aGlzLmF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkKSB7IHJldHVybiAnVGhlIHNjb3JpbmcgYW5kIGFjY2VzcyBzZXR0aW5ncyBjb3VsZCBub3QgYmUgbG9hZGVkLiBSZWxvYWQgdGhlIHBhZ2UgYmVmb3JlIHNhdmluZy4nOyB9XHJcbiAgICBpZiAodGhpcy5wYXNzRmFpbE9uICYmICh0aGlzLnBhc3NUaHJlc2hvbGQgPCAxIHx8IHRoaXMucGFzc1RocmVzaG9sZCA+IDEwMCkpIHsgcmV0dXJuICdQYXNzIG1hcmsgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMCc7IH1cclxuICAgIGlmICh0aGlzLnByZVN1Ym1pc3Npb25FbXB0eSkgeyByZXR1cm4gJ0FkZCBhdCBsZWFzdCBvbmUgdXNlciBmb3IgcHJlLXN1Ym1pc3Npb24gYWNjZXNzJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZWRpdFN1Ym1pdHRlZEVycm9yIHx8IHRoaXMubm90aWZ5RmxhZ3NFcnJvciB8fCB0aGlzLnJlY3VycmluZ0ZsYWdzRXJyb3IgfHwgdGhpcy5kYWlseVJlcG9ydEVycm9yO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoeSBQdWJsaXNoIHdvdWxkIGJlIHJlZnVzZWQgKCcnIHdoZW4gaXQgd291bGQgbm90KTsgY2hlY2tlZCBvbiBjbGljayBzbyB0aGUgdG9hc3QgY2FuIHNheSBzby4gKi9cclxuICBnZXQgcHVibGlzaEJsb2NrZWRSZWFzb24oKTogc3RyaW5nIHtcclxuICAgIC8vIEFwcHJvdmVycyBhcmUgbmVlZGVkIG9ubHkgd2hpbGUgQXBwcm92ZXIgaXMgb247IHdpdGggaXQgb2ZmIHRoZSBhdWRpdCBwdWJsaXNoZXMgd2l0aG91dCBhcHByb3ZhbC5cclxuICAgIGlmICh0aGlzLmFwcHJvdmVyT24gJiYgIXRoaXMuYXBwcm92ZXJzLmxlbmd0aCkgeyByZXR1cm4gJ0FwcHJvdmVyIGlzIHR1cm5lZCBvbi4gQWRkIGF0IGxlYXN0IG9uZSBhcHByb3Zlciwgb3IgdHVybiBBcHByb3ZlciBvZmYuJzsgfVxyXG4gICAgaWYgKCF0aGlzLnNlY3Rpb25zLnNvbWUocyA9PiBzLml0ZW1zLmxlbmd0aCkpIHsgcmV0dXJuICdUaGlzIGF1ZGl0IGhhcyBubyBxdWVzdGlvbnMuIEFkZCBhdCBsZWFzdCBvbmUgcXVlc3Rpb24gYmVmb3JlIHB1Ymxpc2hpbmcuJzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhblNhdmUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zYXZpbmcgfHwgdGhpcy5sb2FkaW5nIHx8ICF0aGlzLmNoZWNrbGlzdElkIHx8ICF0aGlzLmNvbmZpZ0RhdGEpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICByZXR1cm4gIXRoaXMuc2F2ZUJsb2NrZWRSZWFzb247XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIHNhdmUgLyBwdWJsaXNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHNhdmVEcmFmdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2ZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhblNhdmUpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wdWJsaXNoQmxvY2tlZFJlYXNvbjtcclxuICAgIGlmIChibG9ja2VkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChibG9ja2VkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmFzc2lnbmVkQ291bnQpIHtcclxuICAgICAgLy8gU3RvcmVzIGFuZCBhdWRpdG9ycyBjb21lIGZyb20gc2NoZWR1bGUgcm93czsgcHVibGlzaGluZyB0aGUgc2NoZWR1bGUgcHVibGlzaGVzIHRoZSBhdWRpdC5cclxuICAgICAgdGhpcy5zY2hlZHVsZUFmdGVyU2F2ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2F2ZShmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZShwdWJsaXNoOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU2F2ZSkgeyB0aGlzLnNjaGVkdWxlQWZ0ZXJTYXZlID0gZmFsc2U7IHJldHVybjsgfVxyXG4gICAgdGhpcy53YXNQdWJsaXNoZWQgPSB0aGlzLnB1Ymxpc2hlZDtcclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZUNoZWNrbGlzdChwdWJsaXNoKTtcclxuICB9XHJcblxyXG4gIC8qKiBcInB1Ymxpc2ggU3RvcmUgQXVkaXRcIiAvIFwic2F2ZSBTdG9yZSBBdWRpdFwiLCBmb3IgdGhlIGVycm9yIHRvYXN0cy4gKi9cclxuICBwcml2YXRlIGFjdGlvblRleHQocHVibGlzaDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHB1Ymxpc2ggPyAncHVibGlzaCAnIDogJ3NhdmUgJykgKyB0aGlzLmVzYyh0aGlzLmF1ZGl0TmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQSBzYXZlIHN0ZXAgZmFpbGVkOiBzdG9wLCBhbmQgZG8gbm90IG9wZW4gQ3JlYXRlIHNjaGVkdWxlIG9uIHRoZSBuZXh0IHBsYWluIHNhdmUuICovXHJcbiAgcHJpdmF0ZSBmYWlsU2F2ZShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnNjaGVkdWxlQWZ0ZXJTYXZlID0gZmFsc2U7XHJcbiAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobWVzc2FnZSk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjaGVja2xpc3QgcGFydCAoY2hlY2tsaXN0Q29uZmlndXJldjE6IG5vdGlmaWNhdGlvbnMsIGFwcHJvdmVycywgcHVibGlzaCkgYW5kIHRoZSBhdWRpdC1vbmx5IHNldHRpbmdzXHJcbiAgICogKGNvbmZpZy9zYXZlOiBzY29yaW5nLCBkaXNwdXRlLCBhY2Nlc3MpIGRvIG5vdCBkZXBlbmQgb24gZWFjaCBvdGhlciwgc28gYm90aCBhcmUgc2VudCBhdCBvbmNlIGluc3RlYWQgb2Ygb25lXHJcbiAgICogYWZ0ZXIgdGhlIG90aGVyIChRQTogc2F2ZSAvIHB1Ymxpc2ggdG9vayBsb25nKS4gT3V0Y29tZXMgYXJlIHJlcG9ydGVkIGFzIGJlZm9yZTogdGhlIGNoZWNrbGlzdCBwYXJ0IGZpcnN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2F2ZUNoZWNrbGlzdChwdWJsaXNoOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBmYWxsYmFjayA9ICdDb3VsZCBub3QgJyArIHRoaXMuYWN0aW9uVGV4dChwdWJsaXNoKSArICcuIFBsZWFzZSB0cnkgYWdhaW4uJztcclxuICAgIGNvbnN0IHNldHRsZSA9IChjYWxsOiBPYnNlcnZhYmxlPGFueT4pID0+IGNhbGwucGlwZShtYXAoKHJlczogYW55KSA9PiAoeyByZXMsIGVycjogbnVsbCB9KSksIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiBvZih7IHJlczogbnVsbCwgZXJyIH0pKSk7XHJcbiAgICBmb3JrSm9pbihbXHJcbiAgICAgIHNldHRsZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0Q29uZmlnVXBkYXRlKHRoaXMuY2hlY2tsaXN0UGF5bG9hZChwdWJsaXNoKSkpLFxyXG4gICAgICBzZXR0bGUodGhpcy50cmF4U2VydmljZS5hdWRpdENvbmZpZ1NhdmUodGhpcy5leHRyYXNQYXlsb2FkKCkpKVxyXG4gICAgXSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoW21haW4sIGV4dHJhc10pID0+IHtcclxuICAgICAgaWYgKG1haW4uZXJyKSB7XHJcbiAgICAgICAgdGhpcy5mYWlsU2F2ZSh0aGlzLmFwaUVycm9yKG1haW4uZXJyLCBmYWxsYmFjaywgdHJ1ZSwgJ0NvdWxkIG5vdCAnICsgdGhpcy5hY3Rpb25UZXh0KHB1Ymxpc2gpICsgJzogJykpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWFpbi5yZXM/LmNvZGUgIT09IDIwMCkge1xyXG4gICAgICAgIC8vIDIwNCAobm8gYm9keSkgPSB0aGUgYXVkaXQgbm8gbG9uZ2VyIGV4aXN0cyBmb3IgdGhpcyBjbGllbnQuXHJcbiAgICAgICAgdGhpcy5mYWlsU2F2ZShtYWluLnJlcyA/IGZhbGxiYWNrIDogJ0NvdWxkIG5vdCAnICsgdGhpcy5hY3Rpb25UZXh0KHB1Ymxpc2gpICsgJzogdGhlIGF1ZGl0IHdhcyBub3QgZm91bmQuIEl0IG1heSBoYXZlIGJlZW4gZGVsZXRlZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHB1Ymxpc2gpIHsgdGhpcy5wdWJsaXNoZWQgPSB0cnVlOyB9XHJcbiAgICAgIGlmIChleHRyYXMuZXJyIHx8IGV4dHJhcy5yZXM/LmNvZGUgIT09IDIwMCkge1xyXG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IGV4dHJhcy5lcnIgPyB0aGlzLmFwaUVycm9yKGV4dHJhcy5lcnIsICcnLCB0cnVlKSA6ICcnO1xyXG4gICAgICAgIHRoaXMuZmFpbFNhdmUoKHB1Ymxpc2ggPyB0aGlzLmVzYyh0aGlzLmF1ZGl0TmFtZSkgKyAnIHdhcyBwdWJsaXNoZWQnIDogJ1RoZSBub3RpZmljYXRpb24gYW5kIGFwcHJvdmVyIHNldHRpbmdzIHdlcmUgc2F2ZWQnKVxyXG4gICAgICAgICAgKyAnLCBidXQgdGhlIHNjb3JpbmcsIGRpc3B1dGUgYW5kIGFjY2VzcyBzZXR0aW5ncyB3ZXJlIG5vdCcgKyAocmVhc29uID8gJyAoJyArIHJlYXNvbiArICcpJyA6ICcnKSArICcuIFNhdmUgYWdhaW4gdG8ga2VlcCB0aGVtLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpbmlzaFNhdmUocHVibGlzaCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYXVkaXQtb25seSBzZXR0aW5ncyBzYXZlZCBieSBjb25maWcvc2F2ZS4gKi9cclxuICBwcml2YXRlIGV4dHJhc1BheWxvYWQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBjb25zdCB0b1N0b3JlZCA9IChsaXN0OiBDaGlwVXNlcltdKSA9PiBsaXN0Lm1hcCh1ID0+ICh7IG46IHUubiwgZTogdS5lIH0pKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBjaGVja2xpc3RJZDogdGhpcy5jaGVja2xpc3RJZCxcclxuICAgICAgcGFzc01hcms6IHRoaXMucGFzc0ZhaWxPbiA/IE51bWJlcih0aGlzLnBhc3NUaHJlc2hvbGQpIDogNzUsXHJcbiAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgcGFzc0ZhaWxPbjogdGhpcy5wYXNzRmFpbE9uLFxyXG4gICAgICAgIGRpc3B1dGVPbjogdGhpcy5kaXNwdXRlT24sXHJcbiAgICAgICAgZGlzcHV0ZVdpbmRvdzogdGhpcy5kaXNwdXRlV2luZG93LFxyXG4gICAgICAgIHByZVN1Ym1pc3Npb25BY2Nlc3NPbjogdGhpcy5wcmVTdWJtaXNzaW9uQWNjZXNzT24sXHJcbiAgICAgICAgcHJlU3VibWlzc2lvblVzZXJzOiB0b1N0b3JlZCh0aGlzLnByZVN1Ym1pc3Npb25Vc2VycyksXHJcbiAgICAgICAgZWRpdFN1Ym1pdHRlZE9uOiB0aGlzLmVkaXRTdWJtaXR0ZWRPbixcclxuICAgICAgICBlZGl0VXNlcnM6IHRvU3RvcmVkKHRoaXMuZWRpdFVzZXJzKVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5pc2hTYXZlKHB1Ymxpc2g6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5lc2ModGhpcy5hdWRpdE5hbWUpO1xyXG4gICAgaWYgKHRoaXMuc2NoZWR1bGVBZnRlclNhdmUpIHtcclxuICAgICAgdGhpcy5zY2hlZHVsZUFmdGVyU2F2ZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChuYW1lICsgKHRoaXMucHVibGlzaGVkID8gJyBzYXZlZC4nIDogJyBzYXZlZCBhcyBkcmFmdC4nKSArICcgSXQgaGFzIG5vIHN0b3JlcyB5ZXQ6IGFkZCBzY2hlZHVsZSByb3dzLCB0aGVuIHB1Ymxpc2ggdGhlIHNjaGVkdWxlIHRvIHB1Ymxpc2ggdGhlIGF1ZGl0LicpO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvdHJheC9hdWRpdC12Mi9tYW5hZ2UnXSwgeyBxdWVyeVBhcmFtczogeyB0YWI6ICdzY2hlZHVsZScsIHNjaGVkdWxlOiAnY3JlYXRlJywgYXVkaXQ6IHRoaXMuY2hlY2tsaXN0SWQgfSB9KTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChwdWJsaXNoKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHRoaXMud2FzUHVibGlzaGVkID8gJ0NoYW5nZXMgdG8gJyArIG5hbWUgKyAnIHNhdmVkIGFuZCBwdWJsaXNoZWQuJyA6IG5hbWUgKyAnIGhhcyBiZWVuIHB1Ymxpc2hlZC4nKTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3RyYXgvYXVkaXQtdjIvbWFuYWdlJ10pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gQSBkcmFmdCBzYXZlIG5ldmVyIHVucHVibGlzaGVzICh0aGUgQVBJIGtlZXBzIHRoZSBwdWJsaXNoIHN0YXRlKSwgc28gZG8gbm90IGNhbGwgYSBsaXZlIGF1ZGl0IGEgZHJhZnQuXHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHRoaXMucHVibGlzaGVkID8gJ0NoYW5nZXMgdG8gJyArIG5hbWUgKyAnIHNhdmVkLiBUaGUgYXVkaXQgc3RheXMgcHVibGlzaGVkLicgOiBuYW1lICsgJyBzYXZlZCBhcyBkcmFmdC4nKTtcclxuICAgICAgLy8gUmVsb2FkIHNvIHRoZSBwYWdlIHNob3dzIGV4YWN0bHkgd2hhdCB0aGUgc2VydmVyIGtlcHQuXHJcbiAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbWVzc2FnZSB0byBzaG93IGZvciBhIGZhaWxlZCBjYWxsOiB0aGUgQVBJJ3Mgb3duIHRleHQgZm9yIGEgNHh4IChwcm9kdWN0aW9uIHNlbmRzIGl0IGFzXHJcbiAgICogYGVycm9yYCAodGV4dCBvciB7IG1lc3NhZ2UgfSksIHRoZSBsb2NhbCBkZXYgaGVscGVyIGFzIGBlcnJvcmAgdGV4dCBwbHVzIGBkZXRhaWxzYCksIGVsc2UgYGZhbGxiYWNrYC5cclxuICAgKiA1eHggYm9kaWVzIGNhcnJ5IHJhdyBleGNlcHRpb25zLCBzbyB0aGV5IGdldCB0aGUgZmFsbGJhY2suIGBwcmVmaXhgIGlzIHB1dCBiZWZvcmUgYW4gQVBJIHRleHQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcGlFcnJvcihlOiBhbnksIGZhbGxiYWNrOiBzdHJpbmcsIGVzY2FwZSA9IHRydWUsIHByZWZpeCA9ICcnKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHN0YXR1cyA9IE51bWJlcihlPy5zdGF0dXMpIHx8IDA7XHJcbiAgICBpZiAoc3RhdHVzID09PSA0MDMpIHsgcmV0dXJuICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IG9yIGNoYW5nZSB0aGlzIGF1ZGl0Lic7IH1cclxuICAgIGlmIChzdGF0dXMgPT09IDApIHsgcmV0dXJuIGZhbGxiYWNrID8gJ0NvdWxkIG5vdCByZWFjaCB0aGUgc2VydmVyLiBDaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nIDogJyc7IH1cclxuICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7IHJldHVybiBmYWxsYmFjazsgfVxyXG4gICAgY29uc3QgYm9keSA9IGU/LmVycm9yO1xyXG4gICAgY29uc3QgZXJyID0gYm9keT8uZXJyb3I7XHJcbiAgICBjb25zdCByYXcgPSAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycgPyBlcnIgOiBlcnI/Lm1lc3NhZ2UpIHx8IGJvZHk/LmRldGFpbHM/Lm1lc3NhZ2UgfHwgYm9keT8ubWVzc2FnZSB8fCAnJztcclxuICAgIGNvbnN0IHRleHQgPSBTdHJpbmcocmF3KS50cmltKCk7XHJcbiAgICBpZiAoIXRleHQpIHsgcmV0dXJuIGZhbGxiYWNrOyB9XHJcbiAgICByZXR1cm4gcHJlZml4ICsgKGVzY2FwZSA/IHRoaXMuZXNjKHRleHQpIDogdGV4dCk7XHJcbiAgfVxyXG5cclxuICAvKiogVG9hc3RzIHJlbmRlciB0aGVpciBtZXNzYWdlIGFzIEhUTUwsIHNvIG5hbWVzLCB0eXBlZCB0ZXh0IGFuZCBBUEkgbWVzc2FnZXMgYXJlIGVzY2FwZWQuICovXHJcbiAgcHJpdmF0ZSBlc2ModmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgJ1wiJzogJyZxdW90OycsICdcXCcnOiAnJiMzOTsnIH07XHJcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlID8/ICcnKS5yZXBsYWNlKC9bJjw+XCInXS9nLCBjID0+IG1hcFtjXSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGdldENvbmZpZ0RldGFpbHMgcGF5bG9hZCB3aXRoIHRoaXMgcGFnZSdzIGZpZWxkcyB3cml0dGVuIGJhY2ssIGluIHRoZSBjaGVja2xpc3QncyBvd24gc2hhcGUuICovXHJcbiAgcHJpdmF0ZSBjaGVja2xpc3RQYXlsb2FkKHB1Ymxpc2g6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgY29uc3QgdG9TdG9yZWQgPSAobGlzdDogQ2hpcFVzZXJbXSkgPT4gbGlzdC5tYXAodSA9PiAoeyBuYW1lOiB1Lm4sIHZhbHVlOiB1LmUgfSkpO1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY29uZmlnRGF0YTtcclxuICAgIGNvbnN0IGQgPSBkYXRhLmNoZWNrTGlzdERldGFpbHM7XHJcblxyXG4gICAgZC5jaGVja0xpc3REZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb24udHJpbSgpO1xyXG4gICAgZC5vd25lciA9IHRvU3RvcmVkKHRoaXMub3duZXJzKTtcclxuICAgIGQuYXBwcm92ZXIgPSB0aGlzLmFwcHJvdmVyT24gPyB0b1N0b3JlZCh0aGlzLmFwcHJvdmVycykgOiBbXTtcclxuICAgIC8vIE1pbnV0ZXMgYmVmb3JlIHRoZSBhdWRpdCBlbmQgdGltZSwgYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBzdG9yZXMgdGhlbS5cclxuICAgIGQucmVtYWluZGVyID0gdGhpcy5yZW1pbmRlck9uID8gWy4uLnRoaXMucmVtaW5kZXJzXSA6IFtdO1xyXG5cclxuICAgIGNvbnN0IG5mVHlwZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5ub3RpZnlGbGFnc09uICYmIHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyKSB7IG5mVHlwZXMucHVzaCgnYXBwcm92ZXInKTsgfVxyXG4gICAgaWYgKHRoaXMubm90aWZ5RmxhZ3NPbiAmJiB0aGlzLm5vdGlmeVNlbmRDdXN0b20pIHsgbmZUeXBlcy5wdXNoKCdjdXN0b20nKTsgfVxyXG4gICAgZC5ub3RpZnlGbGFncyA9IHsgbm90aWZ5VHlwZTogbmZUeXBlcywgdXNlcnM6IHRoaXMubm90aWZ5RmxhZ3NPbiAmJiB0aGlzLm5vdGlmeVNlbmRDdXN0b20gPyB0b1N0b3JlZCh0aGlzLm5vdGlmeVVzZXJzKSA6IFtdIH07XHJcblxyXG4gICAgY29uc3QgcmZUeXBlczogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgdGhpcy5yZWN1cnJpbmdTZW5kQXBwcm92ZXIpIHsgcmZUeXBlcy5wdXNoKCdhcHByb3ZlcicpOyB9XHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdGbGFnc09uICYmIHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSkgeyByZlR5cGVzLnB1c2goJ2N1c3RvbScpOyB9XHJcbiAgICAvLyBUaGUgc2VydmVyIHJlc29sdmVzICdzYW1lQXNOb3RpZnknIHRvIHRoZSBOb3RpZnkgRmxhZ3MgcmVjaXBpZW50cyB3aGVuIGl0IHNlbmRzIHRoZSBlbWFpbC5cclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgdGhpcy5yZWN1cnJpbmdTYW1lQXNOb3RpZnkpIHsgcmZUeXBlcy5wdXNoKCdzYW1lQXNOb3RpZnknKTsgfVxyXG4gICAgY29uc3QgcmZVc2VycyA9IHRoaXMucmVjdXJyaW5nRmxhZ3NPbiAmJiB0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gPyB0b1N0b3JlZCh0aGlzLnJlY3VycmluZ1VzZXJzKSA6IFtdO1xyXG4gICAgZC5yZWN1cnJpbmdGbGFnID0geyBub3RpZnlUeXBlOiByZlR5cGVzLCB1c2VyczogcmZVc2VycywgdGhyZXNob2xkOiB0aGlzLnJlY3VycmluZ0ZsYWdzT24gPyB0aGlzLnJlY3VycmluZ1RocmVzaG9sZCA6IDAgfTtcclxuXHJcbiAgICBjb25zdCBhZVR5cGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZGFpbHlSZXBvcnRPbiAmJiB0aGlzLmRhaWx5U2VuZEFwcHJvdmVyKSB7IGFlVHlwZXMucHVzaCgnYXBwcm92ZXInKTsgfVxyXG4gICAgaWYgKHRoaXMuZGFpbHlSZXBvcnRPbiAmJiB0aGlzLmRhaWx5U2VuZEN1c3RvbSkgeyBhZVR5cGVzLnB1c2goJ2N1c3RvbScpOyB9XHJcbiAgICBkLmF1dG9FbWFpbCA9IHsgdHlwZTogYWVUeXBlcywgdXNlcnM6IHRoaXMuZGFpbHlTZW5kQ3VzdG9tID8gdG9TdG9yZWQodGhpcy5kYWlseVVzZXJzKSA6IFtdIH07XHJcbiAgICBkLnNoYXJlUmVwb3J0UG9zdEFwcHJvdmFsID0gdGhpcy5kYWlseVJlcG9ydE9uICYmIHRoaXMuc2hhcmVQb3N0QXBwcm92YWw7XHJcblxyXG4gICAgZC5leHBvcnQgPSB0aGlzLmV4cG9ydFN1Ym1pc3Npb25PbjtcclxuICAgIGQucmVkb1ZhbGlkaXR5ID0gdGhpcy5yZWRvVmFsaWRGb3I7XHJcbiAgICBkLmF1dG9DcmVhdGVUYXNrID0gdGhpcy5hdXRvQ3JlYXRlVGFza09uO1xyXG4gICAgZC50YXNrQXNzaWduZWUgPSB0aGlzLnRhc2tBc3NpZ25lZTtcclxuICAgIGQudGFza1ZhbGlkaXR5ID0gTnVtYmVyKHRoaXMudGFza1ZhbGlkaXR5KSB8fCAxMDtcclxuICAgIGQuc2hvd0FwcHJvdmVkUmVzcG9uc2UgPSB0aGlzLnNob3dSZXNwb25zZUluQXBwO1xyXG4gICAgZC5yZXNwb25zZVZpc2liaWxpdHkgPSB0aGlzLnJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3ByZScgPyAncHJlQXBwcm92YWwnIDogJ3Bvc3RBcHByb3ZhbCc7XHJcbiAgICBkLnJlc3BvbnNlVmlzaWJpbGl0eUhvdXJzID0gdGhpcy5yZXNwRGVsYXk7XHJcbiAgICBkLnVzZXJWZXJpZmljYXRpb24gPSB7IHJlcXVpcmVQaG90b0NhcHR1cmU6IHRoaXMucmVxdWlyZVBob3RvLCByZXF1aXJlVXNlckFja25vd2xlZGdtZW50OiB0aGlzLnJlcXVpcmVBY2tub3dsZWRnbWVudCB9O1xyXG4gICAgZC5yZWRvRXh0ZW5zaW9uID0gdGhpcy5yZWRvRXh0ZW5zaW9uO1xyXG5cclxuICAgIC8vIFdoYXQgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBzZW5kczogZXZlcnlvbmUgY3VycmVudGx5IGFzc2lnbmVkLCBhbmQgdGhlIHB1Ymxpc2ggc3RhdGUuXHJcbiAgICBkLmFzc2lnbmVkVXNlcnMgPSB0aGlzLmFzc2lnbmVkVXNlcnMoKTtcclxuICAgIGQuc3RvcmVDb3VudCA9IGQuYXNzaWduZWRVc2Vycy5sZW5ndGg7XHJcbiAgICBpZiAoIWQuY292ZXJhZ2UpIHsgZC5jb3ZlcmFnZSA9ICdzdG9yZSc7IH1cclxuICAgIGQucHVibGlzaCA9IHB1Ymxpc2ggPyB0cnVlIDogISFkLnB1Ymxpc2g7XHJcblxyXG4gICAgZGF0YS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XHJcbiAgICBkYXRhLnN1Ym1pdFR5cGUgPSBwdWJsaXNoID8gJ3B1Ymxpc2gnIDogJ3NhdmUnO1xyXG4gICAgZGF0YS5zaG93RWRpdCA9IGZhbHNlO1xyXG4gICAgZGF0YS51cGRhdGVDb25maWd1cmUgPSBmYWxzZTtcclxuICAgIGRhdGEudGltZVpvbmUgPSBkYXlqcy50ei5ndWVzcygpO1xyXG4gICAgLy8gQXNzaWdubWVudCBkaWZmIGZvciB0aGUgYWN0aXZpdHkgbG9nOyB0aGlzIHBhZ2UgbmV2ZXIgY2hhbmdlcyBhc3NpZ25tZW50cy5cclxuICAgIGRhdGEuYWRkZWQgPSBbXTtcclxuICAgIGRhdGEucmVtb3ZlZCA9IHsgdXNlcjogW10sIHN0b3JlOiBbXSB9O1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhdjItcGFnZSBhdWRpdC1jb25maWd1cmVcIj5cclxuXHJcbiAgPCEtLSBCYWNrICsgYnJlYWRjcnVtYiAoYXMgdGhlIHNjaGVkdWxlIGVkaXRvcidzIGJhY2sgYmFyKSAtLT5cclxuICA8ZGl2IGNsYXNzPVwiY2YtYmFja2JhclwiPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtIGNmLWJhY2tcIiAoY2xpY2spPVwiYmFjaygpXCI+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDYgOSAxMiAxNSAxOFwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgIHt7IGJhY2tMYWJlbCB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtY3J1bWJcIj5cclxuICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwiYmFjaygkZXZlbnQpXCI+TWFuYWdlIEF1ZGl0PC9hPiDigLogQ29uZmlndXJlXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBUaXRsZSArIGFjdGlvbnMgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNmLWhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNmLWhlYWRlci10ZXh0XCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdGl0bGUgY2Ytc2stdGl0bGVcIiAqbmdJZj1cImxvYWRpbmdcIj48L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi10aXRsZVwiICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBhdWRpdE5hbWUgfHwgJ0F1ZGl0JyB9fTwvZGl2PlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImNmLWRlc2NcIiBwbGFjZWhvbGRlcj1cIkVudGVyIEF1ZGl0IERlc2NyaXB0aW9uXCIgWyhuZ01vZGVsKV09XCJkZXNjcmlwdGlvblwiPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGNmLXB1Ymxpc2hcIiBbZGlzYWJsZWRdPVwiIWNhblNhdmVcIiBbdGl0bGVdPVwic2F2ZUJsb2NrZWRSZWFzb24gfHwgcHVibGlzaEJsb2NrZWRSZWFzb25cIiAoY2xpY2spPVwicHVibGlzaCgpXCI+XHJcbiAgICAgIHt7IHNhdmluZyA/ICdTYXZpbmfigKYnIDogKHB1Ymxpc2hlZCA/ICdTYXZlICYgUHVibGlzaCcgOiAnUHVibGlzaCcpIH19XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBjZi1kcmFmdFwiIFtkaXNhYmxlZF09XCIhY2FuU2F2ZVwiIFt0aXRsZV09XCJzYXZlQmxvY2tlZFJlYXNvblwiIChjbGljayk9XCJzYXZlRHJhZnQoKVwiPlNhdmUgYXMgRHJhZnQ8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImNmLWVycm9yIGNmLWVycm9yLS1wYWdlXCIgKm5nSWY9XCJsb2FkRXJyb3JcIj5cclxuICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgIHt7IGxvYWRFcnJvciB9fVxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIENoaXAgcGlja2VyOiBjaGlwcyArIGlucHV0ICsgc3VnZ2VzdGlvbiBsaXN0IChvbmUgdGVtcGxhdGUsIHVzZWQgZm9yIGV2ZXJ5IHVzZXIgbGlzdCkgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNjaGlwUGlja2VyIGxldC1saXN0PVwibGlzdFwiIGxldC1sYXJnZT1cImxhcmdlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtY2hpcGJveFwiIFtjbGFzcy5jZi1jaGlwYm94LS1sZ109XCJsYXJnZVwiIFtjbGFzcy5pcy1vcGVuXT1cIm9wZW5DaGlwcyA9PT0gbGlzdFwiIChjbGljayk9XCJmb2N1c0NoaXBzKGxpc3QsICRldmVudClcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGlwXCIgW2NsYXNzLmNmLWNoaXAtLWxnXT1cImxhcmdlXCIgKm5nRm9yPVwibGV0IHUgb2YgY2hpcHNPZihsaXN0KTsgbGV0IGkgPSBpbmRleFwiIFt0aXRsZV09XCJ1LmVcIj5cclxuICAgICAgICA8c3BhbiBbY2xhc3NdPVwibGFyZ2UgPyAnY2YtY2hpcC10YWcnIDogJ2NmLWNoaXAtaW5pJ1wiPnt7IHUuaSB9fTwvc3Bhbj57eyB1Lm4gfX1cclxuICAgICAgICA8YSBjbGFzcz1cImNmLWNoaXAteFwiIChjbGljayk9XCJyZW1vdmVDaGlwKGxpc3QsIGkpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImNmLWNoaXAtaW5wdXRcIiBbY2xhc3MuY2YtY2hpcC1pbnB1dC0tbGddPVwibGFyZ2VcIiBwbGFjZWhvbGRlcj1cIkFkZCB1c2VyLi4uXCJcclxuICAgICAgICBbbmdNb2RlbF09XCJkcmFmdE9mKGxpc3QpXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0RHJhZnQobGlzdCwgJGV2ZW50KVwiIChmb2N1cyk9XCJmb2N1c0NoaXBzKGxpc3QsICRldmVudClcIiAoa2V5dXAuZW50ZXIpPVwiYWRkQ2hpcChsaXN0KVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3VnZ2VzdFwiICpuZ0lmPVwib3BlbkNoaXBzID09PSBsaXN0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN1Z2dlc3QtaXRlbVwiICpuZ0Zvcj1cImxldCB1IG9mIHN1Z2dlc3Rpb25zKGxpc3QpXCIgKGNsaWNrKT1cImFkZFN1Z2dlc3Rpb24obGlzdCwgdSwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGlwLWluaVwiPnt7IHUuaSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2Ytc3VnZ2VzdC1uYW1lXCI+e3sgdS5uIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1zdWdnZXN0LW1haWxcIj57eyB1LmUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN1Z2dlc3QtZW1wdHlcIiAqbmdJZj1cIiFzdWdnZXN0aW9ucyhsaXN0KS5sZW5ndGhcIj5cclxuICAgICAgICAgIHt7IHVzZXJzLmxlbmd0aCA/ICdObyBtYXRjaGluZyB1c2VyJyA6ICdObyB1c2VycyBmb3IgdGhpcyBjbGllbnQnIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPCEtLSBEcm9wZG93bjogc3R5bGVkIGxpa2UgdGhlIHByb3RvdHlwZSBpbnN0ZWFkIG9mIHRoZSBicm93c2VyJ3MgbmF0aXZlIHNlbGVjdCAtLT5cclxuICA8bmctdGVtcGxhdGUgI2Ryb3Bkb3duIGxldC1rZXk9XCJrZXlcIiBsZXQtb3B0aW9ucz1cIm9wdGlvbnNcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiY2Ytc2VsZWN0XCIgW2NsYXNzLmlzLW9wZW5dPVwib3BlblNlbGVjdCA9PT0ga2V5XCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc2VsZWN0LWJ0blwiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Qoa2V5LCAkZXZlbnQpXCI+XHJcbiAgICAgICAge3sgc2VsZWN0TGFiZWwoa2V5LCBvcHRpb25zKSB9fVxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNiA5IDEyIDE1IDE4IDlcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJvcGVuU2VsZWN0ID09PSBrZXlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc2VsZWN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgbyBvZiBvcHRpb25zXCIgW2NsYXNzLmlzLW9uXT1cImlzUGlja2VkKGtleSwgbylcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInBpY2soa2V5LCBvLCAkZXZlbnQpXCI+e3sgby5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvc3Bhbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY2YtYm9keVwiICpuZ0lmPVwiIWxvYWRFcnJvclwiPlxyXG4gICAgPCEtLSBTZWN0aW9uIHRyZWUgLS0+XHJcbiAgICA8YXNpZGUgY2xhc3M9XCJjZi1sZWZ0XCI+XHJcbiAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cImxvYWRpbmdcIiBbcm93c109XCIzXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtbGVmdC10aXRsZVwiPnt7IGF1ZGl0TmFtZSB8fCAnQXVkaXQnIH19PC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiICpuZ0lmPVwiIXNlY3Rpb25zLmxlbmd0aFwiPk5vIHF1ZXN0aW9ucyB5ZXQ8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBzZWN0aW9uc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zZWN0aW9uXCIgW2NsYXNzLmlzLW9wZW5dPVwicy5vcGVuXCIgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24ocylcIj5cclxuICAgICAgICAgIHt7IHMubGFiZWwgfX1cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcnVsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hldlwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIFtjbGFzcy5yb3RhdGVdPVwiIXMub3BlblwiPlxyXG4gICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pdGVtc1wiICpuZ0lmPVwicy5vcGVuICYmIHMuaXRlbXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdCBvZiBzLml0ZW1zXCI+e3sgaXQgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8IS0tIE5vIFNjaGVkdWxlIGJsb2NrIChRQSAxMCBPY3QpOiBhdWRpdHMgaGF2ZSBubyBvbmUtdGltZSAvIHJlcGVhdCBzY2hlZHVsZSBoZXJlOyB2aXNpdHMgY29tZSBmcm9tIFNjaGVkdWxlcy4gLS0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9hc2lkZT5cclxuXHJcbiAgICA8IS0tIENvbmZpZ3VyYXRpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtcmlnaHRcIj5cclxuXHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2YtY2FyZFwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciBbcm93c109XCI0XCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcblxyXG4gICAgICA8IS0tID09PT09IEFkdmFuY2UgQ29uZmlndXJhdGlvbiA9PT09PSAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjZi1jYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJsb2NrLWhlYWRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5BZHZhbmNlIENvbmZpZ3VyYXRpb248L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJ1bGVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZXZcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNiA5IDEyIDE1IDE4IDlcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEF1ZGl0IE93bmVyIC0tPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWxcIj5BdWRpdCBPd25lcjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5Pd25lcnMgZ2V0IGFjY2VzcyB0byBtYW5hZ2UgdGhlIGF1ZGl0PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1maWVsZFwiPkNhbiBiZSBtYW5hZ2VkIGJ5PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ293bmVycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQXBwcm92ZXIgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5BcHByb3Zlcjwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cImFwcHJvdmVyT25cIiAoY2xpY2spPVwidG9nZ2xlQXBwcm92ZXIoKVwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPkJ5IGVuYWJsaW5nLCB0aGUgdXNlcnMgd2lsbCBiZSBhYmxlIHRvIGFwcHJvdmUgdGhlIGF1ZGl0PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXJvd1wiICpuZ0lmPVwiYXBwcm92ZXJPblwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1maWVsZFwiPlRvIGJlIGFwcHJvdmVkIGJ5PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ2FwcHJvdmVycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJhcHByb3ZlckVycm9yXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICB7eyBhcHByb3ZlckVycm9yIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWluZm8gY2YtaW5mby0td3JhcFwiICpuZ0lmPVwiIWFwcHJvdmVyT24gJiYgYXBwcm92ZXJzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICBBcHByb3ZlciBpcyBvZmYsIHNvIHRoZSB7eyBhcHByb3ZlcnMubGVuZ3RoIH19IGFwcHJvdmVye3sgYXBwcm92ZXJzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnIH19IGFkZGVkIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHlvdSBzYXZlLiBUdXJuIEFwcHJvdmVyIGJhY2sgb24gdG8ga2VlcCB7eyBhcHByb3ZlcnMubGVuZ3RoID09PSAxID8gJ2l0JyA6ICd0aGVtJyB9fS5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mbyBjZi1pbmZvLS13cmFwXCIgKm5nSWY9XCIhYXBwcm92ZXJPbiAmJiAhYXBwcm92ZXJzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICBBcHByb3ZlciBpcyBvZmYsIHNvIHN1Ym1pdHRlZCBhdWRpdHMgYXJlIG5vdCBzZW50IGZvciBhcHByb3ZhbC4gVHVybiBpdCBvbiB0byBhZGQgYXBwcm92ZXJzIG9yIHRvIHNlbmQgZmxhZ3MgYW5kIHJlcG9ydHMgdG8gdGhlbS5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBSZW1pbmRlciAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPlJlbWluZGVyPC9zcGFuPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwicmVtaW5kZXJPblwiIChjbGljayk9XCJ0b2dnbGVSZW1pbmRlcigpXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+QnkgZW5hYmxpbmcsIHRoZSB1c2VycyB3aWxsIGJlIHJlbWluZGVkIGluIHRoZSBzZWxlY3RlZCBpbnRlcnZhbDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbm5lclwiICpuZ0lmPVwicmVtaW5kZXJPblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubGluZVwiPlxyXG4gICAgICAgICAgICBOb3RpZnkgdXNlciBiZWZvcmVcclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1yZW1pbmRlclwiICpuZ0Zvcj1cImxldCBtIG9mIHJlbWluZGVyczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiY2YtcmVtaW5kZXItc2VsZWN0XCIgW3ZhbHVlXT1cIm1cIiBbb3B0aW9uc109XCJyZW1pbmRlck9wdHNbaV0gfHwgW11cIiBbc2VhcmNoYWJsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidSZW1pbmRlciAnICsgKGkgKyAxKSArICcgaW4gbWludXRlcydcIiAoY2hhbmdlZCk9XCJzZXRSZW1pbmRlcihpLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImNmLWNoaXAteFwiICpuZ0lmPVwicmVtaW5kZXJzLmxlbmd0aCA+IDFcIiB0aXRsZT1cIlJlbW92ZSByZW1pbmRlclwiIChjbGljayk9XCJyZW1vdmVSZW1pbmRlcihpKVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjVcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2YtaWNvbi1idG5cIiAqbmdJZj1cInJlbWluZGVycy5sZW5ndGggPCBtYXhSZW1pbmRlcnNcIiB0aXRsZT1cIkFkZCByZW1pbmRlclwiIChjbGljayk9XCJhZGRSZW1pbmRlcigpXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjVcIiB4Mj1cIjEyXCIgeTI9XCIxOVwiPjwvbGluZT48bGluZSB4MT1cIjVcIiB5MT1cIjEyXCIgeDI9XCIxOVwiIHkyPVwiMTJcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mb1wiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICBTZW5kIGFsZXJ0cyB7eyByZW1pbmRlclN1bW1hcnkgfX0gbWlucyBiZWZvcmUgdGhlIGF1ZGl0IGVuZCB0aW1lXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBOb3RpZnkgRmxhZ3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5Ob3RpZnkgRmxhZ3M8L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJub3RpZnlGbGFnc09uXCIgKGNsaWNrKT1cInRvZ2dsZU5vdGlmeUZsYWdzKClcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5CeSBlbmFibGluZywgYWxsIGZsYWdzIHdpbGwgYmUgc2VudCBhcyBhbiBlbWFpbDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub3RpZnlGbGFnc09uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtY2hlY2tzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2tzLWxhYmVsXCI+U2VuZCBUbzwvc3Bhbj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiBbY2xhc3MuaXMtYmxvY2tlZF09XCIhaGFzQXBwcm92ZXJzICYmICFub3RpZnlTZW5kQXBwcm92ZXJcIiAoY2xpY2spPVwidG9nZ2xlU2VuZEFwcHJvdmVyKCdub3RpZnlTZW5kQXBwcm92ZXInKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cIm5vdGlmeVNlbmRBcHByb3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIm5vdGlmeVNlbmRBcHByb3ZlclwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5BcHByb3ZlclxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIChjbGljayk9XCJub3RpZnlTZW5kQ3VzdG9tID0gIW5vdGlmeVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJub3RpZnlTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwibm90aWZ5U2VuZEN1c3RvbVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5DdXN0b21cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdGlmeVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ25vdGlmeVVzZXJzJywgbGFyZ2U6IGZhbHNlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJub3RpZnlGbGFnc0Vycm9yXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyBub3RpZnlGbGFnc0Vycm9yIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBOb3RpZnkgb24gUmVjdXJyaW5nIEZsYWdzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+Tm90aWZ5IG9uIFJlY3VycmluZyBGbGFnczwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cInJlY3VycmluZ0ZsYWdzT25cIiAoY2xpY2spPVwidG9nZ2xlUmVjdXJyaW5nRmxhZ3MoKVwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPldoZW4gZW5hYmxlZCwgZW1haWxzIGFyZSBzZW50IGZvciByZWN1cnJpbmcgZmxhZ3MgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbm5lclwiICpuZ0lmPVwicmVjdXJyaW5nRmxhZ3NPblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubGluZVwiPlxyXG4gICAgICAgICAgICBTZW5kIEVtYWlsIGlmIHRoZSBzYW1lIHF1ZXN0aW9uIGlzIGZsYWdnZWRcclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3duOyBjb250ZXh0OiB7IGtleTogJ3JlY3VycmluZ1RocmVzaG9sZCcsIG9wdGlvbnM6IHRocmVzaG9sZE9wdHMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICB0aW1lcyBieSB0aGUgc2FtZSBzdG9yZVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mb1wiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICBPbmNlIHRoZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCBhbmQgYW4gZW1haWwgaXMgc2VudCwgdGhlIGZsYWcgY291bnQgcmVzZXRzIHRvIHplcm9cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWN1cnJpbmdGbGFnc09uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtY2hlY2tzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2tzLWxhYmVsXCI+U2VuZCBUbzwvc3Bhbj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiBbY2xhc3MuaXMtYmxvY2tlZF09XCIhaGFzQXBwcm92ZXJzICYmICFyZWN1cnJpbmdTZW5kQXBwcm92ZXJcIiAoY2xpY2spPVwidG9nZ2xlU2VuZEFwcHJvdmVyKCdyZWN1cnJpbmdTZW5kQXBwcm92ZXInKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cInJlY3VycmluZ1NlbmRBcHByb3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInJlY3VycmluZ1NlbmRBcHByb3ZlclwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5BcHByb3ZlclxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIChjbGljayk9XCJ0b2dnbGVSZWN1cnJpbmdDdXN0b20oKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cInJlY3VycmluZ1NlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJyZWN1cnJpbmdTZW5kQ3VzdG9tXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPkN1c3RvbVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIChjbGljayk9XCJyZWN1cnJpbmdTYW1lQXNOb3RpZnkgPSAhcmVjdXJyaW5nU2FtZUFzTm90aWZ5XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVjay1ib3hcIiBbY2xhc3MuaXMtb25dPVwicmVjdXJyaW5nU2FtZUFzTm90aWZ5XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicmVjdXJyaW5nU2FtZUFzTm90aWZ5XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlVzZSBzYW1lIHVzZXJzIGZyb20gTm90aWZ5IEZsYWdzXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWN1cnJpbmdTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwUGlja2VyOyBjb250ZXh0OiB7IGxpc3Q6ICdyZWN1cnJpbmdVc2VycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmZvXCIgKm5nSWY9XCJyZWN1cnJpbmdTYW1lQXNOb3RpZnlcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgbm90aWZ5UmVjaXBpZW50c0xhYmVsIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1lcnJvclwiICpuZ0lmPVwicmVjdXJyaW5nRmxhZ3NFcnJvclwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgcmVjdXJyaW5nRmxhZ3NFcnJvciB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGFpbHkgcmVwb3J0IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+RW5hYmxlIC0gRGFpbHkgUmVwb3J0PC9zcGFuPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwiZGFpbHlSZXBvcnRPblwiIChjbGljayk9XCJ0b2dnbGVEYWlseVJlcG9ydCgpXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+QnkgRW5hYmxpbmcsIGNvbXBsaWFuY2Ugc2NvcmUgd2lsbCBiZSBzZW50IGFzIGFuIGVtYWlsIHRvIHRoZSBhYm92ZSB1c2VyczwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYWlseVJlcG9ydE9uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtY2hlY2tzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2tzLWxhYmVsXCI+U2VuZCBUbzwvc3Bhbj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiBbY2xhc3MuaXMtYmxvY2tlZF09XCIhaGFzQXBwcm92ZXJzICYmICFkYWlseVNlbmRBcHByb3ZlclwiIChjbGljayk9XCJ0b2dnbGVTZW5kQXBwcm92ZXIoJ2RhaWx5U2VuZEFwcHJvdmVyJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJkYWlseVNlbmRBcHByb3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRhaWx5U2VuZEFwcHJvdmVyXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPkFwcHJvdmVyXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLWNoZWNrXCIgKGNsaWNrKT1cImRhaWx5U2VuZEN1c3RvbSA9ICFkYWlseVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJkYWlseVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkYWlseVNlbmRDdXN0b21cIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+Q3VzdG9tXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYWlseVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ2RhaWx5VXNlcnMnLCBsYXJnZTogZmFsc2UgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIChjbGljayk9XCJzaGFyZVBvc3RBcHByb3ZhbCA9ICFzaGFyZVBvc3RBcHByb3ZhbFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJzaGFyZVBvc3RBcHByb3ZhbFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJzaGFyZVBvc3RBcHByb3ZhbFwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlNoYXJlIFJlcG9ydCBQb3N0IEFwcHJvdmFsXHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJkYWlseVJlcG9ydEVycm9yXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyBkYWlseVJlcG9ydEVycm9yIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBFeHBvcnQgc3VibWlzc2lvbjogVGFuZ28gdXNlcnMgb25seSwgYXMgdGhlIHYxIENvbmZpZ3VyZSAoaXRzIHN0b3JlZCB2YWx1ZSBpcyBrZXB0IGZvciBldmVyeW9uZSBlbHNlKS4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWdyaWQyXCIgKm5nSWY9XCJhY2Nlc3MuaXNUYW5nb1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS10aWdodFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5FeHBvcnQgU3VibWlzc2lvbjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJleHBvcnRTdWJtaXNzaW9uT25cIiAoY2xpY2spPVwiZXhwb3J0U3VibWlzc2lvbk9uID0gIWV4cG9ydFN1Ym1pc3Npb25PblwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+RW5hYmxlIHRoaXMgdG8gYWxsb3cgYXVkaXQgc3VibWl0dGVycyB0byBkb3dubG9hZCB0aGVpciBzdWJtaXNzaW9uIGFzIGEgUERGIGZpbGU8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFJlZG8gdmFsaWRpdHkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWdyaWQyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2tcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsXCI+UmVkbyBWYWxpZGl0eTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5saW5lXCI+XHJcbiAgICAgICAgICAgICAgUmVkbyB2YWxpZCBmb3JcclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd247IGNvbnRleHQ6IHsga2V5OiAncmVkb1ZhbGlkRm9yJywgb3B0aW9uczogcmVkb0RheU9wdHMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIERheSBmcm9tIFJlZG8gY3JlYXRpb25cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBdXRvIGNyZWF0ZSB0YXNrIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+QXV0byBDcmVhdGUgVGFzayBmb3IgRmxhZ3M8L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJhdXRvQ3JlYXRlVGFza09uXCIgKGNsaWNrKT1cImF1dG9DcmVhdGVUYXNrT24gPSAhYXV0b0NyZWF0ZVRhc2tPblwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPkJ5IGVuYWJsaW5nLCBhIHRhc2sgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciBldmVyeSBmbGFnZ2VkIHF1ZXN0aW9uIGluIHRoZSBhdWRpdDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFdobyBnZXRzIHRoZSB0YXNrIGFuZCBob3cgbG9uZyBpdCBzdGF5cyBvcGVuIChhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlKSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYXV0b3Rhc2tcIiAqbmdJZj1cImF1dG9DcmVhdGVUYXNrT25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1hdXRvdGFzay10aXRsZVwiPlRhc2sgQXNzaWduZWU8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+Q2hvb3NlIHdobyB0aGUgZmxhZ2dlZCB0YXNrIGlzIGFzc2lnbmVkIHRvPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYXV0b3Rhc2stY2hvaWNlc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLWNob2ljZVwiIFtjbGFzcy5pcy1vbl09XCJ0YXNrQXNzaWduZWUgPT09ICdzdWJtaXR0ZXInXCIgKGNsaWNrKT1cInRhc2tBc3NpZ25lZSA9ICdzdWJtaXR0ZXInXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJ0YXNrQXNzaWduZWUgPT09ICdzdWJtaXR0ZXInXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNob2ljZS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNob2ljZS10aXRsZVwiPkF1ZGl0IFN1Ym1pdHRlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hvaWNlLXN1YlwiPlRhc2sgaXMgYXNzaWduZWQgdG8gdGhlIHVzZXIgd2hvIGZpbGxlZCB0aGUgYXVkaXQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1jaG9pY2VcIiBbY2xhc3MuaXMtb25dPVwidGFza0Fzc2lnbmVlID09PSAnc3RvcmUnXCIgKGNsaWNrKT1cInRhc2tBc3NpZ25lZSA9ICdzdG9yZSdcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cInRhc2tBc3NpZ25lZSA9PT0gJ3N0b3JlJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaG9pY2UtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaG9pY2UtdGl0bGVcIj5TdG9yZSBVc2VyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaG9pY2Utc3ViXCI+VGFzayBpcyBhc3NpZ25lZCB0byB0aGUgdXNlciBtYXBwZWQgdG8gdGhlIGZsYWdnZWQgc3RvcmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWF1dG90YXNrLXRpdGxlXCI+VGFzayBWYWxpZGl0eTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWF1dG90YXNrLXZhbGlkaXR5XCI+XHJcbiAgICAgICAgICAgIDxzcGFuPlRhc2sgdmFsaWQgZm9yPC9zcGFuPlxyXG4gICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImNmLXZhbGlkaXR5LXNlbGVjdFwiIFsobmdNb2RlbCldPVwidGFza1ZhbGlkaXR5XCIgW29wdGlvbnNdPVwidGFza1ZhbGlkaXR5T3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwiZmFsc2VcIiBhcmlhTGFiZWw9XCJUYXNrIHZhbGlkaXR5IGluIGRheXNcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDxzcGFuPmRheXMgZnJvbSB0YXNrIGNyZWF0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDwhLS0gPT09PT0gQXVkaXQgQ29uZmlndXJhdGlvbiA9PT09PSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLWRpdmlkZXItaGVhZFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5BdWRpdCBDb25maWd1cmF0aW9uPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcnVsZVwiPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNmLWNhcmQgY2YtY2FyZC0tbGdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5TdWJtaXNzaW9uICZhbXA7IFZpc2liaWxpdHk8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBjZi1ib3gtLW9wZW46IHRoZSBkaXNwdXRlLXdpbmRvdyBhbmQgcmVzcG9uc2UtZGVsYXkgbWVudXMgbXVzdCBub3QgYmUgY2xpcHBlZCBieSB0aGUgYm94IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3ggY2YtYm94LS1vcGVuXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94LXJvd1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaCBjZi1zd2l0Y2gtLXRvcFwiIFtjbGFzcy5pcy1vbl09XCJzaG93UmVzcG9uc2VJbkFwcFwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dSZXNwb25zZUluQXBwID0gIXNob3dSZXNwb25zZUluQXBwXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXhzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsXCI+U2hvdyBSZXNwb25zZSBpbiBNb2JpbGUgQXBwPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5CeSBlbmFibGluZyB0aGlzIG9wdGlvbiwgc3RvcmUgdXNlcnMgY2FuIHZpZXcgdGhlIGF1ZGl0IHJlc3BvbnNlIGluIHRoZSBNb2JpbGUgQXBwLjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3gtc3ViXCIgKm5nSWY9XCJzaG93UmVzcG9uc2VJbkFwcFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXhzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsLXNtXCI+UmVzcG9uc2UgVmlzaWJpbGl0eTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+Q2hvb3NlIHdoZW4gdGhlIHJlc3BvbnNlIGJlY29tZXMgdmlzaWJsZSB0byBzdG9yZSB1c2VyczwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1vcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJyZXNwb25zZVZpc2liaWxpdHkgPT09ICdwcmUnXCIgKGNsaWNrKT1cInJlc3BvbnNlVmlzaWJpbGl0eSA9ICdwcmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cInJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3ByZSdcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS1zbVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWwtc21cIj5QcmUtYXBwcm92YWw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5UaGUgYXVkaXQgcmVzcG9uc2Ugd2lsbCBiZSB2aXNpYmxlIHRvIHN0b3JlIHVzZXJzIGJlZm9yZSBpdCBpcyBhcHByb3ZlZC48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubGluZSBjZi1pbmxpbmUtLXRvcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3cgcmVzcG9uc2VcclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd247IGNvbnRleHQ6IHsga2V5OiAncmVzcERlbGF5Jywgb3B0aW9uczogcmVzcERlbGF5T3B0cyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgc3VibWlzc2lvblxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwicmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncG9zdCdcIiAoY2xpY2spPVwicmVzcG9uc2VWaXNpYmlsaXR5ID0gJ3Bvc3QnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cInJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3Bvc3QnXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0tc21cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsLXNtXCIgW2NsYXNzLmNmLW11dGVkXT1cInJlc3BvbnNlVmlzaWJpbGl0eSAhPT0gJ3Bvc3QnXCI+UG9zdC1hcHByb3ZhbDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPk9uY2UgdGhlIHJlc3BvbnNlIGlzIGFwcHJvdmVkLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBNb2JpbGUgQXBwLiBTdG9yZSB1c2VycyBjYW5ub3QgcmFpc2UgYSBkaXNwdXRlLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveC1zZXBcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncHJlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveC1yb3cgY2YtYm94LXJvdy0tZmx1c2hcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2ggY2Ytc3dpdGNoLS10b3BcIiBbY2xhc3MuaXMtb25dPVwiZGlzcHV0ZU9uXCIgKGNsaWNrKT1cImRpc3B1dGVPbiA9ICFkaXNwdXRlT25cIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0teHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWwtc21cIj5EaXNwdXRlIENvbmZpZ3VyYXRpb248L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS13cmFwXCI+V2hlbiBlbmFibGVkLCB0aGUgc3RvcmUgdGVhbSBjYW4gcmFpc2UgYSBkaXNwdXRlIGFnYWluc3QgdGhlIGF1ZGl0b3IncyBzdWJtaXNzaW9uIG9uY2UgdGhlIHJlc3BvbnNlIGJlY29tZXMgdmlzaWJsZSB0byB0aGVtLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLW5lc3RlZFwiICpuZ0lmPVwiZGlzcHV0ZU9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICBEaXNwdXRlIHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bjsgY29udGV4dDogeyBrZXk6ICdkaXNwdXRlV2luZG93Jywgb3B0aW9uczogZGlzcFdpbmRvd09wdHMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gd2hlbiB0aGUgcmVzcG9uc2UgYmVjb21lcyB2aXNpYmxlXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mbyBjZi1pbmZvLS13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIERpc3B1dGVzIHJhaXNlZCBpbnNpZGUgdGhpcyB3aW5kb3cgZ28gdG8gdGhlIGFwcHJvdmVyLiBBcHByb3ZlZCBkaXNwdXRlcyByZXZpc2UgdGhlIGFuc3dlciBhbmQgdGhlIGNvbXBsaWFuY2Ugc2NvcmUuXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3JcIiAqbmdJZj1cIiFoYXNBcHByb3ZlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIE5vIGFwcHJvdmVyIGlzIHNldCwgc28gbm8gb25lIGNhbiByZXZpZXcgZGlzcHV0ZXMuIFR1cm4gb24gQXBwcm92ZXIgYW5kIGFkZCBhbiBhcHByb3Zlci5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncG9zdCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0tc21cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsLXNtIGNmLW11dGVkXCI+RGlzcHV0ZSBDb25maWd1cmF0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmZvIGNmLWluZm8tLXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgRGlzcHV0ZXMgYXJlIG5vdCBhdmFpbGFibGUgd2hlbiByZXNwb25zZXMgYXJlIHNob3duIHBvc3QtYXBwcm92YWwuXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUHJlLXN1Ym1pc3Npb24gYWNjZXNzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3ggY2YtYm94LS1wYWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5QcmUtU3VibWlzc2lvbiBBY2Nlc3M8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cInByZVN1Ym1pc3Npb25BY2Nlc3NPblwiIChjbGljayk9XCJwcmVTdWJtaXNzaW9uQWNjZXNzT24gPSAhcHJlU3VibWlzc2lvbkFjY2Vzc09uXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS13cmFwXCI+VXNlcnMgYWRkZWQgaGVyZSBjYW4gdmlldyBPcGVuIGFuZCBJbiBQcm9ncmVzcyBhdWRpdHMgdW50aWwgc3VibWlzc2lvbi4gVGhlIFNjaGVkdWxlIEluZm8gdGFiIGlzIGFsc28gdmlzaWJsZSBvbmx5IHRvIHRoZXNlIHVzZXJzLjwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByZVN1Ym1pc3Npb25BY2Nlc3NPblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytcm93IGNmLXJvdy0tdG9wXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1maWVsZFwiPlZpc2libGUgdG88L3NwYW4+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ3ByZVN1Ym1pc3Npb25Vc2VycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3IgY2YtZXJyb3ItLWluZGVudFwiICpuZ0lmPVwicHJlU3VibWlzc2lvbkVtcHR5XCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICBBZGQgYXQgbGVhc3Qgb25lIHVzZXJcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPCEtLSA9PT09PSBTY29yaW5nID09PT09IC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNmLWNhcmQgY2YtY2FyZC0tbGdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5TY29yaW5nPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLXBhZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPlBhc3MvRmFpbCBTY29yZSBTZXR1cDwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwicGFzc0ZhaWxPblwiIChjbGljayk9XCJwYXNzRmFpbE9uID0gIXBhc3NGYWlsT25cIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXdyYXBcIj5TZXQgdGhlIGNvbXBsaWFuY2Ugc2NvcmUgYW4gYXVkaXQgbXVzdCByZWFjaCB0byBiZSBtYXJrZWQge3sgcGFzc0xhYmVsIH19LiBBbnl0aGluZyBiZWxvdyBpdCBpcyBtYXJrZWQge3sgZmFpbExhYmVsIH19LjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXJvdyBjZi1yb3ctLXdyYXAgY2Ytcm93LS10b3BcIiAqbmdJZj1cInBhc3NGYWlsT25cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1maWVsZFwiPk1pbmltdW0gc2NvcmUgdG8ge3sgcGFzc0xhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1udW1cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIiBbKG5nTW9kZWwpXT1cInBhc3NUaHJlc2hvbGRcIj5cclxuICAgICAgICAgICAgICA8c3Bhbj4lPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXBpbGwgY2YtcGlsbC0tcGFzc1wiPnt7IHBhc3NMYWJlbCB9fSDiiaUge3sgcGFzc1RocmVzaG9sZCB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcGlsbCBjZi1waWxsLS1mYWlsXCI+e3sgZmFpbExhYmVsIH19ICZsdDsge3sgcGFzc1RocmVzaG9sZCB9fSU8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPCEtLSA9PT09PSBBcHByb3ZlciBDb250cm9scyA9PT09PSAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjZi1jYXJkIGNmLWNhcmQtLWxnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJsb2NrLXRpdGxlXCI+QXBwcm92ZXIgQ29udHJvbHM8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2tcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5FZGl0IFN1Ym1pdHRlZCBBdWRpdDwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwiZWRpdFN1Ym1pdHRlZE9uXCIgKGNsaWNrKT1cInRvZ2dsZUVkaXRTdWJtaXR0ZWQoKVwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5BbGxvdyBBcHByb3ZlcnMgdG8gZWRpdCBzdWJtaXR0ZWQgQXVkaXQ8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0U3VibWl0dGVkT25cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ2VkaXRVc2VycycsIGxhcmdlOiB0cnVlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJlZGl0U3VibWl0dGVkRXJyb3JcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIHt7IGVkaXRTdWJtaXR0ZWRFcnJvciB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ncmlkMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbFwiPlJlZG8gRXh0ZW5zaW9uPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICBFeHRlbmQgcmVkbyB1cCB0b1xyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bjsgY29udGV4dDogeyBrZXk6ICdyZWRvRXh0ZW5zaW9uJywgb3B0aW9uczogcmVkb0V4dGVuc2lvbk9wdHMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIERheXMgdGlsbCBhcHByb3ZhbFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8IS0tID09PT09IFVzZXIgVmVyaWZpY2F0aW9uID09PT09IC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNmLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5Vc2VyIFZlcmlmaWNhdGlvbiBDb25maWd1cmF0aW9uPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLXJvd1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2ggY2Ytc3dpdGNoLS10b3BcIiBbY2xhc3MuaXMtb25dPVwicmVxdWlyZVBob3RvXCIgKGNsaWNrKT1cInJlcXVpcmVQaG90byA9ICFyZXF1aXJlUGhvdG9cIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXhzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbFwiPlJlcXVpcmUgUGhvdG8gQ2FwdHVyZTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPkJ5IGVuYWJsaW5nLCB1c2VycyBtdXN0IGNhcHR1cmUgdGhlaXIgcGhvdG8gdG8gY29tcGxldGUgc3VibWlzc2lvbjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLXJvd1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2ggY2Ytc3dpdGNoLS10b3BcIiBbY2xhc3MuaXMtb25dPVwicmVxdWlyZUFja25vd2xlZGdtZW50XCIgKGNsaWNrKT1cInJlcXVpcmVBY2tub3dsZWRnbWVudCA9ICFyZXF1aXJlQWNrbm93bGVkZ21lbnRcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXhzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbFwiPlJlcXVpcmUgVXNlciBBY2tub3dsZWRnbWVudDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPkJ5IGVuYWJsaW5nLCB1c2VycyBtdXN0IHR5cGUgdGhlaXIgbmFtZSBhcyBhY2tub3dsZWRnbWVudCB0byBjb21wbGV0ZSBzdWJtaXNzaW9uPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
1038
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItY29uZmlndXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvY29uZmlndXJlL2F1ZGl0LXYyLWNvbmZpZ3VyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2NvbmZpZ3VyZS9hdWRpdC12Mi1jb25maWd1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU5RixPQUFPLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHakQsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFDO0FBQ25DLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7OztBQUc5RCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFzQnZCLDBHQUEwRztBQUMxRyxNQUFNLGdCQUFnQixHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLGlFQUFp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QUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLDZFQUE2RTtRQUM3RSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO3dHQTU2QlUseUJBQXlCOzRGQUF6Qix5QkFBeUIsZ0lDN0R0QyxnaXdDQXlsQkE7OzRGRDVoQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3Qjs4TkEySmxDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmb3JrSm9pbiwgb2YsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcclxuaW1wb3J0IHRpbWV6b25lIGZyb20gJ2RheWpzL3BsdWdpbi90aW1lem9uZSc7XHJcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXVkaXRBY2Nlc3MsIGF1ZGl0QWNjZXNzIH0gZnJvbSAnLi4vYXVkaXQtdjItYWNjZXNzJztcclxuaW1wb3J0IHsgQXVkaXRTZWxlY3RPcHRpb24gfSBmcm9tICcuLi9zZWxlY3QvYXVkaXQtdjItc2VsZWN0LmNvbXBvbmVudCc7XHJcblxyXG5kYXlqcy5leHRlbmQodXRjKTtcclxuZGF5anMuZXh0ZW5kKHRpbWV6b25lKTtcclxuXHJcbi8qKiBBIHVzZXIgY2hpcDogaW5pdGlhbHMsIGRpc3BsYXkgbmFtZSwgZW1haWwuIFN0b3JlZCBvbiB0aGUgY2hlY2tsaXN0IGFzIHsgbmFtZSwgdmFsdWUgfS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDaGlwVXNlciB7XHJcbiAgaTogc3RyaW5nO1xyXG4gIG46IHN0cmluZztcclxuICBlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnU2VjdGlvbiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBpdGVtczogc3RyaW5nW107XHJcbiAgb3BlbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RPcHRpb24ge1xyXG4gIHZhbHVlOiBudW1iZXI7XHJcbiAgbGFiZWw6IHN0cmluZztcclxufVxyXG5cclxudHlwZSBDaGlwTGlzdCA9ICdvd25lcnMnIHwgJ2FwcHJvdmVycycgfCAnbm90aWZ5VXNlcnMnIHwgJ3JlY3VycmluZ1VzZXJzJyB8ICdkYWlseVVzZXJzJyB8ICdwcmVTdWJtaXNzaW9uVXNlcnMnIHwgJ2VkaXRVc2Vycyc7XHJcblxyXG4vKiogUmVtaW5kZXIgaW50ZXJ2YWxzIG9mZmVyZWQsIGluIG1pbnV0ZXMgYmVmb3JlIHRoZSBhdWRpdCBlbmQgdGltZSAoYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSkuICovXHJcbmNvbnN0IFJFTUlOREVSX01JTlVURVMgPSBbMzAsIDQ1LCA2MCwgNzUsIDkwXTtcclxuLyoqIFRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UgYWxsb3dzIHVwIHRvIHRocmVlIHJlbWluZGVycy4gKi9cclxuY29uc3QgTUFYX1JFTUlOREVSUyA9IDM7XHJcbnR5cGUgU2VsZWN0S2V5ID0gJ3JlY3VycmluZ1RocmVzaG9sZCcgfCAncmVkb1ZhbGlkRm9yJyB8ICdyZXNwRGVsYXknIHwgJ2Rpc3B1dGVXaW5kb3cnIHwgJ3JlZG9FeHRlbnNpb24nO1xyXG4vKiogXCJTZW5kIFRvID4gQXBwcm92ZXJcIiB0aWNrcyB0aGF0IG5lZWQgYXQgbGVhc3Qgb25lIGFwcHJvdmVyIHRvIHNlbmQgdG8uICovXHJcbnR5cGUgU2VuZEFwcHJvdmVyS2V5ID0gJ25vdGlmeVNlbmRBcHByb3ZlcicgfCAncmVjdXJyaW5nU2VuZEFwcHJvdmVyJyB8ICdkYWlseVNlbmRBcHByb3Zlcic7XHJcblxyXG4vKipcclxuICogTWFuYWdlIC0+IENvbmZpZ3VyZSBmb3Igb25lIGF1ZGl0IChgP2NoZWNrbGlzdElkPWApLlxyXG4gKlxyXG4gKiBUaGUgYXVkaXQgaXMgYSBjaGVja2xpc3QsIHNvIHRoaXMgcGFnZSByZWFkcyBhbmQgd3JpdGVzIHRoZSBTQU1FIGZpZWxkcyB0aGUgQ2hlY2tsaXN0XHJcbiAqIENvbmZpZ3VyZSBwYWdlIHVzZXMgKEdFVCAvdHJheC9nZXRDb25maWdEZXRhaWxzLCBQT1NUIC90cmF4L2NoZWNrbGlzdENvbmZpZ3VyZXYxKTpcclxuICogb3duZXIsIGFwcHJvdmVyLCByZW1haW5kZXIsIG5vdGlmeUZsYWdzLCByZWN1cnJpbmdGbGFnLCBhdXRvRW1haWwsIGV4cG9ydCwgcmVkb1ZhbGlkaXR5LFxyXG4gKiByZWRvRXh0ZW5zaW9uLCBhdXRvQ3JlYXRlVGFzaywgdXNlclZlcmlmaWNhdGlvbiwgc2hvd0FwcHJvdmVkUmVzcG9uc2UsIHJlc3BvbnNlVmlzaWJpbGl0eSgrSG91cnMpLFxyXG4gKiBzaGFyZVJlcG9ydFBvc3RBcHByb3ZhbCwgY2hlY2tMaXN0RGVzY3JpcHRpb24uIEF1ZGl0LW9ubHkgc2V0dGluZ3MgdGhhdCB0aGUgY2hlY2tsaXN0IHNjaGVtYVxyXG4gKiBoYXMgbm8gZmllbGQgZm9yIChwYXNzIG1hcmssIGRpc3B1dGUgd2luZG93LCBwcmUtc3VibWlzc2lvbiBhY2Nlc3MsIGVkaXQtc3VibWlzc2lvbiB1c2VycylcclxuICogYXJlIGtlcHQgb24gYXVkaXRjb25maWcgdmlhIFBPU1QgL3RyYXgvYXVkaXQvY29uZmlnL3NhdmUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1jb25maWd1cmUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1jb25maWd1cmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1jb25maWd1cmUuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyQ29uZmlndXJlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNoZWNrbGlzdElkID0gJyc7XHJcbiAgYXVkaXROYW1lID0gJyc7XHJcbiAgZGVzY3JpcHRpb24gPSAnJztcclxuICBwdWJsaXNoZWQgPSBmYWxzZTtcclxuICBzY2hlZHVsZSA9ICfigJQnO1xyXG4gIHNjaGVkdWxlV2luZG93ID0gJ+KAlCc7XHJcbiAgc2VjdGlvbnM6IENvbmZpZ1NlY3Rpb25bXSA9IFtdO1xyXG5cclxuICAvLyAtLS0tIGNoZWNrbGlzdCBmaWVsZHMgKHNhdmVkIG9uIGNoZWNrbGlzdGNvbmZpZykgLS0tLVxyXG4gIG93bmVyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIGFwcHJvdmVyT24gPSBmYWxzZTtcclxuICBhcHByb3ZlcnM6IENoaXBVc2VyW10gPSBbXTtcclxuICAvKiogVGhlIGNsaWVudCdzIHN1cGVyYWRtaW4gKGZyb20gdGhlIHVzZXIgbGlzdCksIHRoZSB2MSBkZWZhdWx0IGFwcHJvdmVyIGZvciBUYW5nbyB1c2VycyBhbmQgcm9sZSAndXNlcicuICovXHJcbiAgcHJpdmF0ZSBzdXBlckFkbWluOiBDaGlwVXNlciB8IG51bGwgPSBudWxsO1xyXG4gIHJlbWluZGVyT24gPSBmYWxzZTtcclxuICAvKiogY2hlY2tsaXN0LnJlbWFpbmRlcjogbWludXRlcyBiZWZvcmUgdGhlIGVuZCB0aW1lIGF0IHdoaWNoIHRoZSBhdWRpdG9yIGdldHMgYSBwdXNoIHJlbWluZGVyLiAqL1xyXG4gIHJlbWluZGVyczogbnVtYmVyW10gPSBbXTtcclxuICAvKiogT3B0aW9ucyBwZXIgcmVtaW5kZXIgcm93OiBldmVyeSBpbnRlcnZhbCBub3QgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgcm93LiAqL1xyXG4gIHJlbWluZGVyT3B0czogQXVkaXRTZWxlY3RPcHRpb25bXVtdID0gW107XHJcbiAgcmVhZG9ubHkgbWF4UmVtaW5kZXJzID0gTUFYX1JFTUlOREVSUztcclxuICAvLyBOb3RpZnkgRmxhZ3MgKGNoZWNrbGlzdC5ub3RpZnlGbGFncyk6IHdobyBnZXRzIHRoZSBmbGFnIGVtYWlscy5cclxuICBub3RpZnlGbGFnc09uID0gZmFsc2U7XHJcbiAgbm90aWZ5U2VuZEFwcHJvdmVyID0gdHJ1ZTtcclxuICBub3RpZnlTZW5kQ3VzdG9tID0gZmFsc2U7XHJcbiAgbm90aWZ5VXNlcnM6IENoaXBVc2VyW10gPSBbXTtcclxuICAvLyBOb3RpZnkgb24gUmVjdXJyaW5nIEZsYWdzIChjaGVja2xpc3QucmVjdXJyaW5nRmxhZyk6IHRocmVzaG9sZCArIGl0cyBvd24gcmVjaXBpZW50cy5cclxuICByZWN1cnJpbmdGbGFnc09uID0gZmFsc2U7XHJcbiAgcmVjdXJyaW5nVGhyZXNob2xkID0gMztcclxuICByZWN1cnJpbmdTZW5kQXBwcm92ZXIgPSB0cnVlO1xyXG4gIHJlY3VycmluZ1NlbmRDdXN0b20gPSBmYWxzZTtcclxuICAvKiogU3RvcmVkIGFzIG5vdGlmeVR5cGUgJ3NhbWVBc05vdGlmeSc6IHRoZSBzZXJ2ZXIgbWFpbHMgd2hvZXZlciBOb3RpZnkgRmxhZ3MgbWFpbHMgYXQgc2VuZCB0aW1lLiAqL1xyXG4gIHJlY3VycmluZ1NhbWVBc05vdGlmeSA9IGZhbHNlO1xyXG4gIHJlY3VycmluZ1VzZXJzOiBDaGlwVXNlcltdID0gW107XHJcbiAgZGFpbHlSZXBvcnRPbiA9IGZhbHNlO1xyXG4gIGRhaWx5U2VuZEFwcHJvdmVyID0gdHJ1ZTtcclxuICBkYWlseVNlbmRDdXN0b20gPSBmYWxzZTtcclxuICBkYWlseVVzZXJzOiBDaGlwVXNlcltdID0gW107XHJcbiAgLyoqIERhaWx5IFJlcG9ydCA+IEN1c3RvbSBidWxrIHVwbG9hZCBwb3B1cCAoYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSdzKS4gKi9cclxuICBkYWlseUJ1bGtPcGVuID0gZmFsc2U7XHJcbiAgLyoqIFJvdyBlcnJvcnMgb2YgdGhlIGxhc3QgdXBsb2FkOyBhbnkgZXJyb3IgcmVqZWN0cyB0aGUgd2hvbGUgZmlsZSwgc28gbm90aGluZyBwYXJ0aWFsIGlzIGFwcGxpZWQuICovXHJcbiAgZGFpbHlCdWxrRXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHNoYXJlUG9zdEFwcHJvdmFsID0gZmFsc2U7XHJcbiAgZXhwb3J0U3VibWlzc2lvbk9uID0gZmFsc2U7XHJcbiAgcmVkb1ZhbGlkRm9yID0gNztcclxuICBhdXRvQ3JlYXRlVGFza09uID0gZmFsc2U7XHJcbiAgLyoqIEF1dG8tdGFzayBzZXR0aW5ncyAoYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSk6IHdobyBnZXRzIHRoZSB0YXNrIGFuZCBmb3IgaG93IG1hbnkgZGF5cy4gKi9cclxuICB0YXNrQXNzaWduZWU6ICdzdWJtaXR0ZXInIHwgJ3N0b3JlJyA9ICdzdWJtaXR0ZXInO1xyXG4gIHRhc2tWYWxpZGl0eSA9IDEwO1xyXG4gIHJlYWRvbmx5IHRhc2tWYWxpZGl0eU9wdGlvbnMgPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDE1LCAyMCwgMjUsIDMwXS5tYXAoZCA9PiAoeyB2YWx1ZTogZCwgbGFiZWw6IFN0cmluZyhkKSB9KSk7XHJcbiAgc2hvd1Jlc3BvbnNlSW5BcHAgPSB0cnVlO1xyXG4gIHJlc3BvbnNlVmlzaWJpbGl0eTogJ3ByZScgfCAncG9zdCcgPSAncG9zdCc7XHJcbiAgcmVzcERlbGF5ID0gMjtcclxuICByZXF1aXJlUGhvdG8gPSBmYWxzZTtcclxuICByZXF1aXJlQWNrbm93bGVkZ21lbnQgPSBmYWxzZTtcclxuICByZWRvRXh0ZW5zaW9uID0gMTtcclxuXHJcbiAgLy8gLS0tLSBhdWRpdC1vbmx5IGZpZWxkcyAoc2F2ZWQgb24gYXVkaXRjb25maWcpIC0tLS1cclxuICBwYXNzRmFpbE9uID0gdHJ1ZTtcclxuICBwYXNzVGhyZXNob2xkID0gNzU7XHJcbiAgZGlzcHV0ZU9uID0gdHJ1ZTtcclxuICBkaXNwdXRlV2luZG93ID0gNDg7XHJcbiAgcHJlU3VibWlzc2lvbkFjY2Vzc09uID0gZmFsc2U7XHJcbiAgcHJlU3VibWlzc2lvblVzZXJzOiBDaGlwVXNlcltdID0gW107XHJcbiAgZWRpdFN1Ym1pdHRlZE9uID0gZmFsc2U7XHJcbiAgZWRpdFVzZXJzOiBDaGlwVXNlcltdID0gW107XHJcblxyXG4gIHBhc3NMYWJlbCA9ICdQYXNzJztcclxuICBmYWlsTGFiZWwgPSAnRmFpbCc7XHJcblxyXG4gIC8qKiBDbGllbnQgdXNlcnMgb2ZmZXJlZCBieSB0aGUgY2hpcCBwaWNrZXJzLiAqL1xyXG4gIHVzZXJzOiBDaGlwVXNlcltdID0gW107XHJcbiAgZHJhZnRzOiBSZWNvcmQ8Q2hpcExpc3QsIHN0cmluZz4gPSB7IG93bmVyczogJycsIGFwcHJvdmVyczogJycsIG5vdGlmeVVzZXJzOiAnJywgcmVjdXJyaW5nVXNlcnM6ICcnLCBkYWlseVVzZXJzOiAnJywgcHJlU3VibWlzc2lvblVzZXJzOiAnJywgZWRpdFVzZXJzOiAnJyB9O1xyXG4gIC8qKiBXaGljaCBjaGlwIGJveCBpcyBzaG93aW5nIHN1Z2dlc3Rpb25zLCBhbmQgd2hpY2ggZHJvcGRvd24gaXMgb3Blbi4gKi9cclxuICBvcGVuQ2hpcHM6IENoaXBMaXN0IHwgbnVsbCA9IG51bGw7XHJcbiAgb3BlblNlbGVjdDogU2VsZWN0S2V5IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBTdG9yZXMgLyB1c2VycyBhbHJlYWR5IGFzc2lnbmVkIHRvIHRoZSBjaGVja2xpc3QuIEF1ZGl0cyBnZXQgdGhlbSBmcm9tIGEgc2NoZWR1bGVcclxuICAgKiAgKE1hbmFnZSDigLogU2NoZWR1bGUgSW5mbyksIHNvIHRoaXMgcGFnZSBvbmx5IHJlYWRzIHRoZSBjb3VudC4gKi9cclxuICBhc3NpZ25lZENvdW50ID0gMDtcclxuICAvKiogUHVibGlzaCB3aXRoIG5vdGhpbmcgYXNzaWduZWQgc2F2ZXMgZmlyc3QsIHRoZW4gb3BlbnMgQ3JlYXRlIHNjaGVkdWxlIGZvciB0aGlzIGF1ZGl0LiAqL1xyXG4gIHByaXZhdGUgc2NoZWR1bGVBZnRlclNhdmUgPSBmYWxzZTtcclxuICAvKiogUHVibGlzaCBzdGF0ZSBiZWZvcmUgdGhlIGN1cnJlbnQgc2F2ZSwgc28gdGhlIHRvYXN0IGNhbiBzYXkgXCJwdWJsaXNoZWRcIiB2cyBcInNhdmVkIGFuZCBwdWJsaXNoZWRcIi4gKi9cclxuICBwcml2YXRlIHdhc1B1Ymxpc2hlZCA9IGZhbHNlO1xyXG5cclxuICByZWFkb25seSB0aHJlc2hvbGRPcHRzOiBTZWxlY3RPcHRpb25bXSA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0ubWFwKG4gPT4gKHsgdmFsdWU6IG4sIGxhYmVsOiBTdHJpbmcobikgfSkpO1xyXG4gIHJlYWRvbmx5IHJlZG9EYXlPcHRzOiBTZWxlY3RPcHRpb25bXSA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCAxMCwgMTQsIDIxLCAzMF0ubWFwKG4gPT4gKHsgdmFsdWU6IG4sIGxhYmVsOiBTdHJpbmcobikgfSkpO1xyXG4gIHJlYWRvbmx5IHJlc3BEZWxheU9wdHM6IFNlbGVjdE9wdGlvbltdID0gWzAsIDIsIDYsIDEyLCAyNCwgNDhdLm1hcChuID0+ICh7IHZhbHVlOiBuLCBsYWJlbDogbiA9PT0gMCA/ICdJbW1lZGlhdGVseScgOiBuICsgJyBob3VycycgfSkpO1xyXG4gIHJlYWRvbmx5IGRpc3BXaW5kb3dPcHRzOiBTZWxlY3RPcHRpb25bXSA9IFs2LCAxMiwgMjQsIDQ4LCA3MiwgMTY4XS5tYXAobiA9PiAoeyB2YWx1ZTogbiwgbGFiZWw6IG4gPT09IDE2OCA/ICc3IGRheXMnIDogbiArICcgaG91cnMnIH0pKTtcclxuICByZWFkb25seSByZWRvRXh0ZW5zaW9uT3B0czogU2VsZWN0T3B0aW9uW10gPSBbMSwgMiwgMywgNCwgNSwgNiwgN10ubWFwKG4gPT4gKHsgdmFsdWU6IG4sIGxhYmVsOiBTdHJpbmcobikgfSkpO1xyXG5cclxuICAvKiogU3RhcnRzIHRydWUgc28gdGhlIHNldHRpbmdzIHNoaW1tZXIgaW5zdGVhZCBvZiBzaG93aW5nIGRlZmF1bHRzIHRoYXQgdGhlbiBqdW1wLiAqL1xyXG4gIGxvYWRpbmcgPSB0cnVlO1xyXG4gIHNhdmluZyA9IGZhbHNlO1xyXG4gIGxvYWRFcnJvciA9ICcnO1xyXG4gIC8qKiAvYXVkaXQvY29uZmlnL2dldCBmYWlsZWQ6IHNhdmluZyBub3cgd291bGQgb3ZlcndyaXRlIHRoZSBzdG9yZWQgcGFzcyBtYXJrIC8gYWNjZXNzIHNldHRpbmdzIHdpdGggZGVmYXVsdHMuICovXHJcbiAgYXVkaXRTZXR0aW5nc0xvYWRGYWlsZWQgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBjbGllbnRJZCA9ICcnO1xyXG4gIC8qKiBUaGUgZ2V0Q29uZmlnRGV0YWlscyBwYXlsb2FkLCBzZW50IGJhY2sgd2hvbGUgb24gc2F2ZSAoYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBkb2VzKS4gKi9cclxuICBwcml2YXRlIGNvbmZpZ0RhdGE6IGFueSA9IG51bGw7XHJcbiAgLyoqIFB1Ymxpc2ggLyBTYXZlIG5lZWQgdGhlIENoZWNrbGlzdCBlZGl0IHBlcm1pc3Npb24gKHRoZSBzYXZlIEFQSXMgY2hlY2sgaXQgdG9vKS4gKi9cclxuICBhY2Nlc3M6IEF1ZGl0QWNjZXNzID0geyBjYW5BZGQ6IGZhbHNlLCBjYW5FZGl0OiBmYWxzZSB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGF1ZGl0QWNjZXNzKHRoaXMuZ3MpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoYWNjZXNzID0+IHtcclxuICAgICAgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25PdXRzaWRlLCB0cnVlKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XHJcbiAgICB0aGlzLmNoZWNrbGlzdElkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgnY2hlY2tsaXN0SWQnKSB8fCAnJztcclxuICAgIHRoaXMuZnJvbVNjaGVkdWxlID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgnZnJvbScpID09PSAnc2NoZWR1bGUnO1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFkYXRhPy5jbGllbnQgfHwgZGF0YS5jbGllbnQgPT09IHRoaXMuY2xpZW50SWQpIHsgcmV0dXJuOyB9XHJcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhLmNsaWVudDtcclxuICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVuZWQgZnJvbSBTY2hlZHVsZSBJbmZvICg/ZnJvbT1zY2hlZHVsZSk6IEJhY2sgcmV0dXJucyB0byB0aGF0IHRhYiwgZWxzZSB0byBBdWRpdCBJbmZvIChRQSA2IE9jdCkuICovXHJcbiAgZnJvbVNjaGVkdWxlID0gZmFsc2U7XHJcblxyXG4gIGdldCBiYWNrTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZyb21TY2hlZHVsZSA/ICdCYWNrIHRvIFNjaGVkdWxlJyA6ICdCYWNrIHRvIE1hbmFnZSc7XHJcbiAgfVxyXG5cclxuICBiYWNrKGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3RyYXgvYXVkaXQtdjIvbWFuYWdlJ10sIHRoaXMuZnJvbVNjaGVkdWxlID8geyBxdWVyeVBhcmFtczogeyB0YWI6ICdzY2hlZHVsZScgfSB9IDoge30pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25PdXRzaWRlLCB0cnVlKTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBFc2NhcGUgY2xvc2VzIHRoZSBvcGVuIGRyb3Bkb3duIC8gc3VnZ2VzdGlvbiBsaXN0IC8gYnVsayB1cGxvYWQgcG9wdXAuICovXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxyXG4gIG9uRXNjYXBlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYWlseUJ1bGtPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLm9wZW5TZWxlY3QgPSBudWxsO1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQSBwcmVzcyBvciBmb2N1cyBvdXRzaWRlIHRoZSBvcGVuIGRyb3Bkb3duIC8gc3VnZ2VzdGlvbiBsaXN0IGNsb3NlcyBpdC4gTGlzdGVuZWQgdG8gaW4gdGhlXHJcbiAgICogY2FwdHVyZSBwaGFzZSwgc28gbm8gZWxlbWVudCB0aGF0IHN0b3BzIGNsaWNrIHByb3BhZ2F0aW9uIGNhbiBrZWVwIGl0IG9wZW4uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBvbk91dHNpZGUgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBpZiAoIXRoaXMub3BlblNlbGVjdCAmJiAhdGhpcy5vcGVuQ2hpcHMpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgY29uc3QgaW5zaWRlID0gdGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuY2xvc2VzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXJnZXQuY2xvc2VzdCgnLmNmLXNlbGVjdC5pcy1vcGVuLCAuY2YtY2hpcGJveC5pcy1vcGVuJyk7XHJcbiAgICBpZiAoaW5zaWRlKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5vcGVuU2VsZWN0ID0gbnVsbDtcclxuICAgIHRoaXMub3BlbkNoaXBzID0gbnVsbDtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH07XHJcblxyXG4gIC8vIC0tLS0gbG9hZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNoZWNrbGlzdElkKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxvYWRFcnJvciA9ICdObyBhdWRpdCBzZWxlY3RlZC4gT3BlbiBDb25maWd1cmUgZnJvbSB0aGUgTWFuYWdlIHBhZ2UuJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMubG9hZEVycm9yID0gJyc7XHJcbiAgICB0aGlzLmF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkID0gZmFsc2U7XHJcbiAgICAvLyBBIGZhaWxlZCBjYWxsIHJlc29sdmVzIHRvIHsgZmFpbGVkOiBlcnJvciB9IHNvIGVhY2ggcGFydCBjYW4gc2F5IHdoYXQgd2VudCB3cm9uZy5cclxuICAgIGNvbnN0IHNhZmUgPSAobzogYW55KSA9PiBvLnBpcGUoY2F0Y2hFcnJvcigoZTogYW55KSA9PiBvZih7IGZhaWxlZDogZSB9KSkpO1xyXG4gICAgZm9ya0pvaW4oe1xyXG4gICAgICBkZXRhaWxzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRHZXRDb25maWcoeyBjaGVja0xpc3RJZDogdGhpcy5jaGVja2xpc3RJZCwgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQgfSkpLFxyXG4gICAgICBhdWRpdDogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0Q29uZmlnR2V0KHsgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsIGNoZWNrbGlzdElkOiB0aGlzLmNoZWNrbGlzdElkIH0pKSxcclxuICAgICAgdXNlcnM6IHNhZmUodGhpcy50cmF4U2VydmljZS5nZXRDbGllbnRVc2VyKHRoaXMuY2xpZW50SWQpKSxcclxuICAgICAgbGFiZWxzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRTZXR0aW5nc0dldCh0aGlzLmNsaWVudElkKSlcclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHsgZGV0YWlscywgYXVkaXQsIHVzZXJzLCBsYWJlbHMgfTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNsaWVudFVzZXJzOiBhbnlbXSA9IHVzZXJzPy5jb2RlID09PSAyMDAgPyB1c2Vycy5kYXRhIHx8IFtdIDogW107XHJcbiAgICAgIC8vIFRoZSBjbGllbnQncyBzdXBlcmFkbWluOiB0aGUgZGVmYXVsdCBhcHByb3ZlciBmb3IgVGFuZ28gdXNlcnMgYW5kIHJvbGUgJ3VzZXInICh2MSBDb25maWd1cmUpLlxyXG4gICAgICBjb25zdCBzdXBlckFkbWluID0gY2xpZW50VXNlcnMuZmluZCgodTogYW55KSA9PiB1Py5yb2xlID09PSAnc3VwZXJhZG1pbicgJiYgdT8uZW1haWwpO1xyXG4gICAgICB0aGlzLnN1cGVyQWRtaW4gPSBzdXBlckFkbWluID8gdGhpcy5jaGlwKHN1cGVyQWRtaW4udXNlck5hbWUsIHN1cGVyQWRtaW4uZW1haWwpIDogbnVsbDtcclxuICAgICAgdGhpcy51c2VycyA9IGNsaWVudFVzZXJzXHJcbiAgICAgICAgLm1hcCgodTogYW55KSA9PiB0aGlzLmNoaXAodS51c2VyTmFtZSwgdS5lbWFpbCkpXHJcbiAgICAgICAgLmZpbHRlcigodTogQ2hpcFVzZXIpID0+IHUuZSk7XHJcbiAgICAgIHRoaXMucGFzc0xhYmVsID0gbGFiZWxzPy5kYXRhPy5wYXNzTGFiZWwgfHwgJ1Bhc3MnO1xyXG4gICAgICB0aGlzLmZhaWxMYWJlbCA9IGxhYmVscz8uZGF0YT8uZmFpbExhYmVsIHx8ICdGYWlsJztcclxuXHJcbiAgICAgIGNvbnN0IGQgPSBkZXRhaWxzPy5jb2RlID09PSAyMDAgPyBkZXRhaWxzLmRhdGE/LmNoZWNrTGlzdERldGFpbHMgOiBudWxsO1xyXG4gICAgICBpZiAoIWQpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAvLyBUaGUgQVBJIGFuc3dlcnMgMjA0IChubyBib2R5KSB3aGVuIHRoZSBhdWRpdCBkb2VzIG5vdCBleGlzdCBvciBiZWxvbmdzIHRvIGFub3RoZXIgY2xpZW50LlxyXG4gICAgICAgIHRoaXMubG9hZEVycm9yID0gZGV0YWlscz8uZmFpbGVkXHJcbiAgICAgICAgICA/IHRoaXMuYXBpRXJyb3IoZGV0YWlscy5mYWlsZWQsICdDb3VsZCBub3QgbG9hZCB0aGlzIGF1ZGl0LiBSZWxvYWQgdGhlIHBhZ2UgdG8gdHJ5IGFnYWluLicsIGZhbHNlKVxyXG4gICAgICAgICAgOiAnVGhpcyBhdWRpdCB3YXMgbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQuIE9wZW4gQ29uZmlndXJlIGFnYWluIGZyb20gdGhlIE1hbmFnZSBwYWdlLic7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29uZmlnRGF0YSA9IGRldGFpbHMuZGF0YTtcclxuICAgICAgdGhpcy5hcHBseUNoZWNrbGlzdChkKTtcclxuICAgICAgdGhpcy5hcHBseUFzc2lnbm1lbnQoZCk7XHJcbiAgICAgIHRoaXMuYXVkaXRTZXR0aW5nc0xvYWRGYWlsZWQgPSBhdWRpdD8uY29kZSAhPT0gMjAwO1xyXG4gICAgICB0aGlzLmFwcGx5QXVkaXQodGhpcy5hdWRpdFNldHRpbmdzTG9hZEZhaWxlZCA/IG51bGwgOiBhdWRpdC5kYXRhPy5jb25maWcpO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuYXVkaXRTZXR0aW5nc0xvYWRGYWlsZWQpIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBsb2FkIHRoZSBzY29yaW5nLCBkaXNwdXRlIGFuZCBhY2Nlc3Mgc2V0dGluZ3Mgb2YgdGhpcyBhdWRpdC4gUmVsb2FkIHRoZSBwYWdlIGJlZm9yZSBzYXZpbmcsIHNvIHRoZXkgYXJlIG5vdCByZXNldC4nKTtcclxuICAgICAgfSBlbHNlIGlmICh1c2Vycz8uZmFpbGVkKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRXYXJuaW5nVG9hc3QoJ0NvdWxkIG5vdCBsb2FkIHRoZSB1c2VycyBvZiB0aGlzIGNsaWVudCwgc28gdGhlIHVzZXIgcGlja2VycyBoYXZlIG5vIHN1Z2dlc3Rpb25zLiBZb3UgY2FuIHN0aWxsIGFkZCBhIHVzZXIgYnkgdHlwaW5nIHRoZWlyIGZ1bGwgZW1haWwuJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBnZXRDb25maWdEZXRhaWxzIGxpc3RzIHRoZSBhc3NpZ25tZW50IGFzIHsgaWQsIHR5cGUgfSBwYWlycyAoc3RvcmVzIC8gY2x1c3RlcnMgb3IgdXNlcnMgLyB0ZWFtcykuICovXHJcbiAgcHJpdmF0ZSBhcHBseUFzc2lnbm1lbnQoZDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBjb3VudCA9IChsaXN0OiBhbnkpID0+IChBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdC5sZW5ndGggOiAwKTtcclxuICAgIHRoaXMuYXNzaWduZWRDb3VudCA9IGNvdW50KGQuc2luZ2xlQXNzaWduKSArIGNvdW50KGQuZ3JvdXBBc3NpZ24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUNoZWNrbGlzdChkOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIE5ldmVyIGNvbmZpZ3VyZWQgeWV0OiBubyBzY2hlZHVsZSB3aW5kb3cgaGFzIGJlZW4gc2F2ZWQgKGNoZWNrZWQgYmVmb3JlIHRoZSBkZWZhdWx0cyBiZWxvdyBmaWxsIGl0KS5cclxuICAgIGNvbnN0IGZpcnN0Q29uZmlndXJlID0gIWQuc2NoZWR1bGVTdGFydFRpbWU7XHJcbiAgICAvLyBBIG5ldyBhdWRpdCBoYXMgbm8gc2NoZWR1bGUgd2luZG93LCBhbmQgY2hlY2tsaXN0Q29uZmlndXJldjEgY2Fubm90IHN0b3JlIGFuIGVtcHR5IG9uZTtcclxuICAgIC8vIHNhbWUgZGVmYXVsdHMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBhcHBsaWVzIG9uIGxvYWQuXHJcbiAgICBpZiAoIWQuc2NoZWR1bGVTdGFydFRpbWUpIHsgZC5zY2hlZHVsZVN0YXJ0VGltZSA9ICcxMDowMCBBTSc7IH1cclxuICAgIGlmICghZC5zY2hlZHVsZUVuZFRpbWUpIHsgZC5zY2hlZHVsZUVuZFRpbWUgPSAnMTA6MDAgUE0nOyB9XHJcbiAgICB0aGlzLmF1ZGl0TmFtZSA9IGQuY2hlY2tMaXN0TmFtZSB8fCAn4oCUJztcclxuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkLmNoZWNrTGlzdERlc2NyaXB0aW9uIHx8ICcnO1xyXG4gICAgdGhpcy5wdWJsaXNoZWQgPSAhIWQucHVibGlzaDtcclxuICAgIHRoaXMuc2NoZWR1bGUgPSBkLnNjaGVkdWxlUmVwZWF0ZWRUeXBlIHx8IGQuc2NoZWR1bGUgPyB0aGlzLnRpdGxlQ2FzZShkLnNjaGVkdWxlUmVwZWF0ZWRUeXBlIHx8IGQuc2NoZWR1bGUpIDogJ+KAlCc7XHJcbiAgICB0aGlzLnNjaGVkdWxlV2luZG93ID0gZC5zY2hlZHVsZVN0YXJ0VGltZSAmJiBkLnNjaGVkdWxlRW5kVGltZSA/IGQuc2NoZWR1bGVTdGFydFRpbWUgKyAnIHRvICcgKyBkLnNjaGVkdWxlRW5kVGltZSA6ICfigJQnO1xyXG4gICAgdGhpcy5zZWN0aW9ucyA9IChkLnNlY3Rpb25zIHx8IFtdKS5tYXAoKHNlYzogYW55LCBpOiBudW1iZXIpID0+ICh7XHJcbiAgICAgIGxhYmVsOiBzZWMubmFtZSB8fCAnU2VjdGlvbiAnICsgKGkgKyAxKSxcclxuICAgICAgaXRlbXM6IChzZWMucXVlc3Rpb25zIHx8IFtdKS5tYXAoKHE6IGFueSkgPT4gcT8ucW5hbWUgfHwgU3RyaW5nKHEpKSxcclxuICAgICAgb3BlbjogaSA9PT0gMFxyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMub3duZXJzID0gdGhpcy5jaGlwcyhkLm93bmVyKTtcclxuICAgIC8vIE5vIG93bmVyIHlldCAoYXVkaXRzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjcmVhdG9yIHdhcyBzdG9yZWQgYXMgb25lKTogdGhlIGxvZ2dlZC1pbiB1c2VyLCBzYXZlZCB3aXRoIHRoZSBwYWdlLlxyXG4gICAgaWYgKCF0aGlzLm93bmVycy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbWUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcclxuICAgICAgaWYgKG1lPy5lbWFpbCkgeyB0aGlzLm93bmVycyA9IFt0aGlzLmNoaXAobWUudXNlck5hbWUsIG1lLmVtYWlsKV07IH1cclxuICAgIH1cclxuICAgIHRoaXMuYXBwcm92ZXJzID0gdGhpcy5jaGlwcyhkLmFwcHJvdmVyKTtcclxuICAgIC8vIHYxIENvbmZpZ3VyZSBkZWZhdWx0IGFwcHJvdmVyLCBvbiB0aGUgZmlyc3QgQ29uZmlndXJlIG9ubHkgKGxhdGVyIGFuIGVtcHR5IGxpc3QgbWVhbnMgQXBwcm92ZXIgd2FzIHR1cm5lZFxyXG4gICAgLy8gb2ZmIG9uIHB1cnBvc2UpOiBUYW5nbyB1c2VycyBhbmQgY2xpZW50IHVzZXJzIHdpdGggcm9sZSAndXNlcicgZ2V0IHRoZSBjbGllbnQncyBzdXBlcmFkbWluLCBvdGhlcnMgdGhlbXNlbHZlcy5cclxuICAgIGlmIChmaXJzdENvbmZpZ3VyZSAmJiAhdGhpcy5hcHByb3ZlcnMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG1lID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XHJcbiAgICAgIGNvbnN0IHRvU3VwZXJBZG1pbiA9IG1lPy51c2VyVHlwZSA9PT0gJ3RhbmdvJyB8fCAobWU/LnVzZXJUeXBlID09PSAnY2xpZW50JyAmJiBtZT8ucm9sZSA9PT0gJ3VzZXInKTtcclxuICAgICAgY29uc3QgZmFsbGJhY2sgPSB0b1N1cGVyQWRtaW4gPyB0aGlzLnN1cGVyQWRtaW4gOiAobWU/LmVtYWlsID8gdGhpcy5jaGlwKG1lLnVzZXJOYW1lLCBtZS5lbWFpbCkgOiBudWxsKTtcclxuICAgICAgaWYgKGZhbGxiYWNrKSB7IHRoaXMuYXBwcm92ZXJzID0gW2ZhbGxiYWNrXTsgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5hcHByb3Zlck9uID0gdGhpcy5hcHByb3ZlcnMubGVuZ3RoID4gMDtcclxuICAgIC8vIFN0b3JlZCBhcyBtaW51dGVzIChudW1iZXJzKTsga2VlcCB0aGUga25vd24gaW50ZXJ2YWxzLCB1bmlxdWUsIGF0IG1vc3QgdGhyZWUuXHJcbiAgICBjb25zdCBzdG9yZWQ6IG51bWJlcltdID0gKEFycmF5LmlzQXJyYXkoZC5yZW1haW5kZXIpID8gZC5yZW1haW5kZXIgOiBbXSkubWFwKChtOiBhbnkpID0+IE51bWJlcihtKSk7XHJcbiAgICB0aGlzLnJlbWluZGVycyA9IHN0b3JlZC5maWx0ZXIoKG0sIGkpID0+IFJFTUlOREVSX01JTlVURVMuaW5jbHVkZXMobSkgJiYgc3RvcmVkLmluZGV4T2YobSkgPT09IGkpLnNsaWNlKDAsIE1BWF9SRU1JTkRFUlMpO1xyXG4gICAgdGhpcy5yZW1pbmRlck9uID0gdGhpcy5yZW1pbmRlcnMubGVuZ3RoID4gMDtcclxuICAgIHRoaXMucmVmcmVzaFJlbWluZGVyT3B0cygpO1xyXG5cclxuICAgIGNvbnN0IG5mID0gZC5ub3RpZnlGbGFncyB8fCB7fTtcclxuICAgIGNvbnN0IG5mVHlwZXM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShuZi5ub3RpZnlUeXBlKSA/IG5mLm5vdGlmeVR5cGUgOiBbXTtcclxuICAgIHRoaXMubm90aWZ5RmxhZ3NPbiA9IG5mVHlwZXMubGVuZ3RoID4gMDtcclxuICAgIHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyID0gbmZUeXBlcy5pbmNsdWRlcygnYXBwcm92ZXInKSB8fCAhdGhpcy5ub3RpZnlGbGFnc09uO1xyXG4gICAgdGhpcy5ub3RpZnlTZW5kQ3VzdG9tID0gbmZUeXBlcy5pbmNsdWRlcygnY3VzdG9tJyk7XHJcbiAgICB0aGlzLm5vdGlmeVVzZXJzID0gdGhpcy5jaGlwcyhuZi51c2Vycyk7XHJcblxyXG4gICAgY29uc3QgcmYgPSBkLnJlY3VycmluZ0ZsYWcgfHwge307XHJcbiAgICBjb25zdCByZlR5cGVzOiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkocmYubm90aWZ5VHlwZSkgPyByZi5ub3RpZnlUeXBlIDogW107XHJcbiAgICB0aGlzLnJlY3VycmluZ0ZsYWdzT24gPSByZlR5cGVzLmxlbmd0aCA+IDA7XHJcbiAgICB0aGlzLnJlY3VycmluZ1NlbmRBcHByb3ZlciA9IHJmVHlwZXMuaW5jbHVkZXMoJ2FwcHJvdmVyJykgfHwgIXRoaXMucmVjdXJyaW5nRmxhZ3NPbjtcclxuICAgIHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSA9IHJmVHlwZXMuaW5jbHVkZXMoJ2N1c3RvbScpO1xyXG4gICAgdGhpcy5yZWN1cnJpbmdTYW1lQXNOb3RpZnkgPSByZlR5cGVzLmluY2x1ZGVzKCdzYW1lQXNOb3RpZnknKTtcclxuICAgIHRoaXMucmVjdXJyaW5nVXNlcnMgPSB0aGlzLmNoaXBzKHJmLnVzZXJzKTtcclxuICAgIHRoaXMucmVjdXJyaW5nVGhyZXNob2xkID0gTnVtYmVyKHJmLnRocmVzaG9sZCkgfHwgMztcclxuXHJcbiAgICBjb25zdCBhZSA9IGQuYXV0b0VtYWlsIHx8IHt9O1xyXG4gICAgY29uc3QgYWVUeXBlczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGFlLnR5cGUpID8gYWUudHlwZSA6IFtdO1xyXG4gICAgdGhpcy5kYWlseVJlcG9ydE9uID0gYWVUeXBlcy5sZW5ndGggPiAwO1xyXG4gICAgdGhpcy5kYWlseVNlbmRBcHByb3ZlciA9IGFlVHlwZXMuaW5jbHVkZXMoJ2FwcHJvdmVyJykgfHwgIXRoaXMuZGFpbHlSZXBvcnRPbjtcclxuICAgIHRoaXMuZGFpbHlTZW5kQ3VzdG9tID0gYWVUeXBlcy5pbmNsdWRlcygnY3VzdG9tJyk7XHJcbiAgICB0aGlzLmRhaWx5VXNlcnMgPSB0aGlzLmNoaXBzKGFlLnVzZXJzKTtcclxuICAgIHRoaXMuc2hhcmVQb3N0QXBwcm92YWwgPSAhIWQuc2hhcmVSZXBvcnRQb3N0QXBwcm92YWw7XHJcblxyXG4gICAgdGhpcy5leHBvcnRTdWJtaXNzaW9uT24gPSAhIWQuZXhwb3J0O1xyXG4gICAgdGhpcy5yZWRvVmFsaWRGb3IgPSBOdW1iZXIoZC5yZWRvVmFsaWRpdHkpIHx8IDc7XHJcbiAgICB0aGlzLmF1dG9DcmVhdGVUYXNrT24gPSAhIWQuYXV0b0NyZWF0ZVRhc2s7XHJcbiAgICAvLyBEZWZhdWx0cyBsaWtlIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2U7IHdpdGhvdXQgYW4gYXNzaWduZWUgdGhlIGFwcHJvdmFsIHJhaXNlcyBubyB0YXNrLlxyXG4gICAgdGhpcy50YXNrQXNzaWduZWUgPSBkLnRhc2tBc3NpZ25lZSA9PT0gJ3N0b3JlJyB8fCBkLnRhc2tBc3NpZ25lZSA9PT0gJ3N0b3JldXNlcicgPyAnc3RvcmUnIDogJ3N1Ym1pdHRlcic7XHJcbiAgICB0aGlzLnRhc2tWYWxpZGl0eSA9IE51bWJlcihkLnRhc2tWYWxpZGl0eSkgfHwgMTA7XHJcbiAgICB0aGlzLnNob3dSZXNwb25zZUluQXBwID0gZC5zaG93QXBwcm92ZWRSZXNwb25zZSAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLnJlc3BvbnNlVmlzaWJpbGl0eSA9IGQucmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncHJlQXBwcm92YWwnID8gJ3ByZScgOiAncG9zdCc7XHJcbiAgICB0aGlzLnJlc3BEZWxheSA9IGQucmVzcG9uc2VWaXNpYmlsaXR5SG91cnMgPz8gMjtcclxuICAgIHRoaXMucmVxdWlyZVBob3RvID0gISFkLnVzZXJWZXJpZmljYXRpb24/LnJlcXVpcmVQaG90b0NhcHR1cmU7XHJcbiAgICB0aGlzLnJlcXVpcmVBY2tub3dsZWRnbWVudCA9ICEhZC51c2VyVmVyaWZpY2F0aW9uPy5yZXF1aXJlVXNlckFja25vd2xlZGdtZW50O1xyXG4gICAgdGhpcy5yZWRvRXh0ZW5zaW9uID0gTnVtYmVyKGQucmVkb0V4dGVuc2lvbikgfHwgMTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlBdWRpdChjZmc6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgcyA9IGNmZz8uc2V0dGluZ3MgfHwge307XHJcbiAgICB0aGlzLnBhc3NUaHJlc2hvbGQgPSBOdW1iZXIoY2ZnPy5wYXNzTWFyaykgfHwgNzU7XHJcbiAgICB0aGlzLnBhc3NGYWlsT24gPSBzLnBhc3NGYWlsT24gIT09IGZhbHNlO1xyXG4gICAgdGhpcy5kaXNwdXRlT24gPSBzLmRpc3B1dGVPbiAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLmRpc3B1dGVXaW5kb3cgPSBOdW1iZXIocy5kaXNwdXRlV2luZG93KSB8fCA0ODtcclxuICAgIHRoaXMucHJlU3VibWlzc2lvbkFjY2Vzc09uID0gISFzLnByZVN1Ym1pc3Npb25BY2Nlc3NPbjtcclxuICAgIHRoaXMucHJlU3VibWlzc2lvblVzZXJzID0gdGhpcy5jaGlwcyhzLnByZVN1Ym1pc3Npb25Vc2Vycyk7XHJcbiAgICB0aGlzLmVkaXRTdWJtaXR0ZWRPbiA9ICEhcy5lZGl0U3VibWl0dGVkT247XHJcbiAgICB0aGlzLmVkaXRVc2VycyA9IHRoaXMuY2hpcHMocy5lZGl0VXNlcnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFjY2VwdHMgYm90aCB0aGUgY2hlY2tsaXN0IHNoYXBlIHsgbmFtZSwgdmFsdWUgfSBhbmQgdGhlIGF1ZGl0IHNoYXBlIHsgbiwgZSB9LiAqL1xyXG4gIHByaXZhdGUgY2hpcHMobGlzdDogYW55KTogQ2hpcFVzZXJbXSB7XHJcbiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0IDogW10pXHJcbiAgICAgIC5tYXAoKHU6IGFueSkgPT4gdGhpcy5jaGlwKHU/Lm5hbWUgPz8gdT8ubiwgdT8udmFsdWUgPz8gdT8uZSA/PyB1Py5lbWFpbCkpXHJcbiAgICAgIC5maWx0ZXIoKHU6IENoaXBVc2VyKSA9PiB1LmUgfHwgdS5uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hpcChuYW1lOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcpOiBDaGlwVXNlciB7XHJcbiAgICBjb25zdCBuID0gU3RyaW5nKG5hbWUgfHwgZW1haWwgfHwgJycpLnRyaW0oKTtcclxuICAgIGNvbnN0IHBhcnRzID0gbi5zcGxpdCgvXFxzKy8pO1xyXG4gICAgY29uc3QgaSA9ICgocGFydHNbMF0/LlswXSB8fCAnJykgKyAocGFydHNbMV0/LlswXSB8fCBwYXJ0c1swXT8uWzFdIHx8ICcnKSkudG9VcHBlckNhc2UoKTtcclxuICAgIHJldHVybiB7IGksIG4sIGU6IFN0cmluZyhlbWFpbCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGl0bGVDYXNlKHY6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdiA/IHYuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2LnNsaWNlKDEpIDogdjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb24oc2VjdGlvbjogQ29uZmlnU2VjdGlvbik6IHZvaWQge1xyXG4gICAgc2VjdGlvbi5vcGVuID0gIXNlY3Rpb24ub3BlbjtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gcmVtaW5kZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBUdXJuaW5nIFJlbWluZGVyIG9uIHN0YXJ0cyB3aXRoIG9uZSAzMC1taW51dGUgcmVtaW5kZXIsIGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UgZG9lcy4gKi9cclxuICB0b2dnbGVSZW1pbmRlcigpOiB2b2lkIHtcclxuICAgIHRoaXMucmVtaW5kZXJPbiA9ICF0aGlzLnJlbWluZGVyT247XHJcbiAgICBpZiAodGhpcy5yZW1pbmRlck9uICYmICF0aGlzLnJlbWluZGVycy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5yZW1pbmRlcnMgPSBbUkVNSU5ERVJfTUlOVVRFU1swXV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZnJlc2hSZW1pbmRlck9wdHMoKTtcclxuICB9XHJcblxyXG4gIHNldFJlbWluZGVyKGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgaWYgKCFSRU1JTkRFUl9NSU5VVEVTLmluY2x1ZGVzKG1pbnV0ZXMpKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5yZW1pbmRlcnMgPSB0aGlzLnJlbWluZGVycy5tYXAoKG0sIGkpID0+IChpID09PSBpbmRleCA/IG1pbnV0ZXMgOiBtKSk7XHJcbiAgICB0aGlzLnJlZnJlc2hSZW1pbmRlck9wdHMoKTtcclxuICB9XHJcblxyXG4gIC8qKiBBZGRzIHRoZSBmaXJzdCBpbnRlcnZhbCBub3QgdXNlZCB5ZXQuICovXHJcbiAgYWRkUmVtaW5kZXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBuZXh0ID0gUkVNSU5ERVJfTUlOVVRFUy5maW5kKG0gPT4gIXRoaXMucmVtaW5kZXJzLmluY2x1ZGVzKG0pKTtcclxuICAgIGlmIChuZXh0ID09PSB1bmRlZmluZWQgfHwgdGhpcy5yZW1pbmRlcnMubGVuZ3RoID49IE1BWF9SRU1JTkRFUlMpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnJlbWluZGVycyA9IFsuLi50aGlzLnJlbWluZGVycywgbmV4dF07XHJcbiAgICB0aGlzLnJlZnJlc2hSZW1pbmRlck9wdHMoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVJlbWluZGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJlbWluZGVycy5sZW5ndGggPD0gMSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucmVtaW5kZXJzID0gdGhpcy5yZW1pbmRlcnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XHJcbiAgICB0aGlzLnJlZnJlc2hSZW1pbmRlck9wdHMoKTtcclxuICB9XHJcblxyXG4gIC8qKiBcIjMwLCA0NSBhbmQgNjAgbWluc1wiIGZvciB0aGUgc3VtbWFyeSBsaW5lLiAqL1xyXG4gIGdldCByZW1pbmRlclN1bW1hcnkoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxpc3QgPSBbLi4udGhpcy5yZW1pbmRlcnNdLnNvcnQoKGEsIGIpID0+IGEgLSBiKS5tYXAoU3RyaW5nKTtcclxuICAgIHJldHVybiBsaXN0Lmxlbmd0aCA+IDEgPyBsaXN0LnNsaWNlKDAsIC0xKS5qb2luKCcsICcpICsgJyBhbmQgJyArIGxpc3RbbGlzdC5sZW5ndGggLSAxXSA6IChsaXN0WzBdIHx8ICcnKTtcclxuICB9XHJcblxyXG4gIC8qKiBFYWNoIHJvdyBvZmZlcnMgaXRzIG93biB2YWx1ZSBwbHVzIGV2ZXJ5IGludGVydmFsIG5vIG90aGVyIHJvdyB1c2VzIChyZWJ1aWx0IG9ubHkgb24gY2hhbmdlKS4gKi9cclxuICBwcml2YXRlIHJlZnJlc2hSZW1pbmRlck9wdHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbWluZGVyT3B0cyA9IHRoaXMucmVtaW5kZXJzLm1hcCgob3duLCBpbmRleCkgPT4gUkVNSU5ERVJfTUlOVVRFU1xyXG4gICAgICAuZmlsdGVyKG0gPT4gbSA9PT0gb3duIHx8ICF0aGlzLnJlbWluZGVycy5zb21lKChvdGhlciwgaSkgPT4gaSAhPT0gaW5kZXggJiYgb3RoZXIgPT09IG0pKVxyXG4gICAgICAubWFwKG0gPT4gKHsgdmFsdWU6IG0sIGxhYmVsOiBtICsgJyBtaW5zJyB9KSkpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBhcHByb3ZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIEFwcHJvdmVyIGlzIG9uIGFuZCBoYXMgYXQgbGVhc3Qgb25lIHVzZXI6IHRoZSBvbmx5IHN0YXRlIGluIHdoaWNoIGFueXRoaW5nIGNhbiBnbyBcInRvIHRoZSBhcHByb3ZlclwiLiAqL1xyXG4gIGdldCBoYXNBcHByb3ZlcnMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHByb3Zlck9uICYmIHRoaXMuYXBwcm92ZXJzLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICAvKiogV2h5IFwiYXBwcm92ZXJcIiBjYW5ub3QgYmUgdXNlZCByaWdodCBub3cgKCcnIHdoZW4gaXQgY2FuKS4gKi9cclxuICBwcml2YXRlIGdldCBhcHByb3Zlck1pc3NpbmdUZXh0KCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuYXBwcm92ZXJPbikgeyByZXR1cm4gJ0FwcHJvdmVyIGlzIHR1cm5lZCBvZmYuIFR1cm4gb24gQXBwcm92ZXIgYW5kIGFkZCBhdCBsZWFzdCBvbmUgYXBwcm92ZXIgZmlyc3QuJzsgfVxyXG4gICAgaWYgKCF0aGlzLmFwcHJvdmVycy5sZW5ndGgpIHsgcmV0dXJuICdObyBhcHByb3ZlciBoYXMgYmVlbiBhZGRlZCB5ZXQuIEFkZCBhdCBsZWFzdCBvbmUgYXBwcm92ZXIgdW5kZXIgQXBwcm92ZXIgZmlyc3QuJzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNob3duIHVuZGVyIHRoZSBhcHByb3ZlciBwaWNrZXIgd2hpbGUgaXQgaXMgb24gYnV0IGVtcHR5IChTYXZlIGFzIERyYWZ0IHN0aWxsIHdvcmtzOyBQdWJsaXNoIGRvZXMgbm90KS4gKi9cclxuICBnZXQgYXBwcm92ZXJFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuYXBwcm92ZXJPbiAmJiAhdGhpcy5hcHByb3ZlcnMubGVuZ3RoID8gJ0FkZCBhdCBsZWFzdCBvbmUgYXBwcm92ZXIsIG9yIHR1cm4gQXBwcm92ZXIgb2ZmIHRvIHB1Ymxpc2ggd2l0aG91dCBhcHByb3ZhbC4nIDogJyc7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHBhcnRzIG9mIHRoZSBwYWdlIHRoYXQgc2VuZCB0byAvIHJlbHkgb24gdGhlIGFwcHJvdmVycyBhbmQgYXJlIHN3aXRjaGVkIG9uIG5vdy4gKi9cclxuICBwcml2YXRlIGdldCBhcHByb3ZlckRlcGVuZGVudHMoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgbGlzdDogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLm5vdGlmeUZsYWdzT24gJiYgdGhpcy5ub3RpZnlTZW5kQXBwcm92ZXIpIHsgbGlzdC5wdXNoKCdOb3RpZnkgRmxhZ3MnKTsgfVxyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nRmxhZ3NPbiAmJiB0aGlzLnJlY3VycmluZ1NlbmRBcHByb3ZlcikgeyBsaXN0LnB1c2goJ05vdGlmeSBvbiBSZWN1cnJpbmcgRmxhZ3MnKTsgfVxyXG4gICAgaWYgKHRoaXMuZGFpbHlSZXBvcnRPbiAmJiB0aGlzLmRhaWx5U2VuZEFwcHJvdmVyKSB7IGxpc3QucHVzaCgnRGFpbHkgUmVwb3J0Jyk7IH1cclxuICAgIGlmICh0aGlzLmVkaXRTdWJtaXR0ZWRPbikgeyBsaXN0LnB1c2goJ0VkaXQgU3VibWl0dGVkIEF1ZGl0Jyk7IH1cclxuICAgIHJldHVybiBsaXN0O1xyXG4gIH1cclxuXHJcbiAgLyoqIFR1cm5pbmcgQXBwcm92ZXIgb2ZmIHdhcm5zIGFib3V0IGV2ZXJ5IHNldHRpbmcgdGhhdCBzdGlsbCBzZW5kcyB0byAvIHJlbGllcyBvbiB0aGUgYXBwcm92ZXJzLiAqL1xyXG4gIHRvZ2dsZUFwcHJvdmVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hcHByb3Zlck9uID0gIXRoaXMuYXBwcm92ZXJPbjtcclxuICAgIGNvbnN0IGRlcGVuZGVudHMgPSB0aGlzLmFwcHJvdmVyRGVwZW5kZW50cztcclxuICAgIGlmICghdGhpcy5hcHByb3Zlck9uICYmIGRlcGVuZGVudHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0V2FybmluZ1RvYXN0KCdBcHByb3ZlciBpcyB0dXJuZWQgb2ZmLCBidXQgJyArIGRlcGVuZGVudHMuam9pbignLCAnKSArICcgc3RpbGwgdXNlIHRoZSBhcHByb3ZlcnMuIFR1cm4gQXBwcm92ZXIgYmFjayBvbiBvciBjaGFuZ2UgdGhvc2Ugc2V0dGluZ3MgYmVmb3JlIHNhdmluZy4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBTZW5kIFRvID4gQXBwcm92ZXIgY2FuIG9ubHkgYmUgdGlja2VkIHdoZW4gdGhlcmUgaXMgYW4gYXBwcm92ZXIgdG8gc2VuZCB0by4gKi9cclxuICB0b2dnbGVTZW5kQXBwcm92ZXIoa2V5OiBTZW5kQXBwcm92ZXJLZXkpOiB2b2lkIHtcclxuICAgIGlmICghdGhpc1trZXldICYmICF0aGlzLmhhc0FwcHJvdmVycykge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QodGhpcy5hcHByb3Zlck1pc3NpbmdUZXh0KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpc1trZXldID0gIXRoaXNba2V5XTtcclxuICB9XHJcblxyXG4gIC8qKiBTd2l0Y2hpbmcgYSBmbGFnIC8gcmVwb3J0IGVtYWlsIG9uIHRpY2tzIEFwcHJvdmVyIG9ubHkgd2hlbiB0aGVyZSBpcyBhbiBhcHByb3ZlciB0byBzZW5kIHRvLiAqL1xyXG4gIHRvZ2dsZU5vdGlmeUZsYWdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ub3RpZnlGbGFnc09uID0gIXRoaXMubm90aWZ5RmxhZ3NPbjtcclxuICAgIGlmICh0aGlzLm5vdGlmeUZsYWdzT24gJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyID0gZmFsc2U7IH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVJlY3VycmluZ0ZsYWdzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWN1cnJpbmdGbGFnc09uID0gIXRoaXMucmVjdXJyaW5nRmxhZ3NPbjtcclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHRoaXMucmVjdXJyaW5nU2VuZEFwcHJvdmVyID0gZmFsc2U7IH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZURhaWx5UmVwb3J0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYWlseVJlcG9ydE9uID0gIXRoaXMuZGFpbHlSZXBvcnRPbjtcclxuICAgIGlmICh0aGlzLmRhaWx5UmVwb3J0T24gJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHRoaXMuZGFpbHlTZW5kQXBwcm92ZXIgPSBmYWxzZTsgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEVkaXQgU3VibWl0dGVkIEF1ZGl0IGxldHMgYXBwcm92ZXJzIGNoYW5nZSBzdWJtaXNzaW9ucyBiZWZvcmUgYXBwcm92aW5nLCBzbyBpdCBuZWVkcyBhcHByb3ZlcnMuICovXHJcbiAgdG9nZ2xlRWRpdFN1Ym1pdHRlZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5lZGl0U3VibWl0dGVkT24gJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnRWRpdCBTdWJtaXR0ZWQgQXVkaXQgaXMgZm9yIGFwcHJvdmVycy4gJyArIHRoaXMuYXBwcm92ZXJNaXNzaW5nVGV4dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZWRpdFN1Ym1pdHRlZE9uID0gIXRoaXMuZWRpdFN1Ym1pdHRlZE9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVkaXRTdWJtaXR0ZWRFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmVkaXRTdWJtaXR0ZWRPbikgeyByZXR1cm4gJyc7IH1cclxuICAgIGlmICghdGhpcy5oYXNBcHByb3ZlcnMpIHsgcmV0dXJuICdFZGl0IFN1Ym1pdHRlZCBBdWRpdCBpcyBmb3IgYXBwcm92ZXJzLiAnICsgdGhpcy5hcHByb3Zlck1pc3NpbmdUZXh0ICsgJyBPciB0dXJuIEVkaXQgU3VibWl0dGVkIEF1ZGl0IG9mZi4nOyB9XHJcbiAgICBpZiAoIXRoaXMuZWRpdFVzZXJzLmxlbmd0aCkgeyByZXR1cm4gJ0FkZCBhdCBsZWFzdCBvbmUgdXNlciB3aG8gY2FuIGVkaXQgc3VibWl0dGVkIGF1ZGl0cyc7IH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gbm90aWZ5IC8gcmVjdXJyaW5nIGZsYWcgcmVjaXBpZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogVGlja2luZyBDdXN0b20gdW5kZXIgUmVjdXJyaW5nIEZsYWdzIHN0YXJ0cyBpdHMgdXNlciBsaXN0IGZyb20gdGhlIE5vdGlmeSBGbGFncyBjdXN0b20gdXNlcnMsXHJcbiAgICogc28gdGhlIHNhbWUgcGVvcGxlIGFyZSB1c2VkIGJ5IGRlZmF1bHQ7IHRoZSBsaXN0IHN0YXlzIGVkaXRhYmxlLlxyXG4gICAqL1xyXG4gIHRvZ2dsZVJlY3VycmluZ0N1c3RvbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSA9ICF0aGlzLnJlY3VycmluZ1NlbmRDdXN0b207XHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdTZW5kQ3VzdG9tICYmICF0aGlzLnJlY3VycmluZ1VzZXJzLmxlbmd0aCAmJiB0aGlzLm5vdGlmeUZsYWdzT24gJiYgdGhpcy5ub3RpZnlTZW5kQ3VzdG9tKSB7XHJcbiAgICAgIHRoaXMucmVjdXJyaW5nVXNlcnMgPSBbLi4udGhpcy5ub3RpZnlVc2Vyc107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogV2hvIFwiVXNlIHNhbWUgdXNlcnMgZnJvbSBOb3RpZnkgRmxhZ3NcIiByZXNvbHZlcyB0byAoc2hvd24gcmVhZC1vbmx5IHVuZGVyIHRoZSBvcHRpb24pLiAqL1xyXG4gIGdldCBub3RpZnlSZWNpcGllbnRzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5ub3RpZnlGbGFnc09uKSB7IHJldHVybiAnTm90aWZ5IEZsYWdzIGlzIG9mZiwgc28gbm8gb25lIGlzIGFkZGVkIGZyb20gaXQnOyB9XHJcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLm5vdGlmeVNlbmRBcHByb3ZlcikgeyBwYXJ0cy5wdXNoKHRoaXMuYXBwcm92ZXJzLmxlbmd0aCA/ICd0aGUgYXBwcm92ZXJzJyA6ICd0aGUgYXBwcm92ZXJzIChub25lIHNldCknKTsgfVxyXG4gICAgaWYgKHRoaXMubm90aWZ5U2VuZEN1c3RvbSAmJiB0aGlzLm5vdGlmeVVzZXJzLmxlbmd0aCkgeyBwYXJ0cy5wdXNoKHRoaXMubm90aWZ5VXNlcnMubWFwKHUgPT4gdS5uKS5qb2luKCcsICcpKTsgfVxyXG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA/ICdBbHNvIHNlbmRzIHRvICcgKyBwYXJ0cy5qb2luKCcgYW5kICcpIDogJ05vdGlmeSBGbGFncyBoYXMgbm8gcmVjaXBpZW50cyB5ZXQnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5vdGlmeUZsYWdzRXJyb3IoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5ub3RpZnlGbGFnc09uKSB7IHJldHVybiAnJzsgfVxyXG4gICAgaWYgKCF0aGlzLm5vdGlmeVNlbmRBcHByb3ZlciAmJiAhdGhpcy5ub3RpZnlTZW5kQ3VzdG9tKSB7IHJldHVybiAnQ2hvb3NlIHdobyByZWNlaXZlcyB0aGUgZmxhZyBlbWFpbHMnOyB9XHJcbiAgICBpZiAodGhpcy5ub3RpZnlTZW5kQXBwcm92ZXIgJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHJldHVybiAnTm90aWZ5IEZsYWdzIHNlbmRzIHRvIHRoZSBhcHByb3Zlci4gJyArIHRoaXMuYXBwcm92ZXJNaXNzaW5nVGV4dCArICcgT3IgdW50aWNrIEFwcHJvdmVyIGhlcmUuJzsgfVxyXG4gICAgaWYgKHRoaXMubm90aWZ5U2VuZEN1c3RvbSAmJiAhdGhpcy5ub3RpZnlVc2Vycy5sZW5ndGgpIHsgcmV0dXJuICdBZGQgYXQgbGVhc3Qgb25lIGN1c3RvbSB1c2VyIGZvciBOb3RpZnkgRmxhZ3MnOyB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVjdXJyaW5nRmxhZ3NFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLnJlY3VycmluZ0ZsYWdzT24pIHsgcmV0dXJuICcnOyB9XHJcbiAgICBpZiAoIXRoaXMucmVjdXJyaW5nU2VuZEFwcHJvdmVyICYmICF0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gJiYgIXRoaXMucmVjdXJyaW5nU2FtZUFzTm90aWZ5KSB7IHJldHVybiAnQ2hvb3NlIHdobyByZWNlaXZlcyB0aGUgcmVjdXJyaW5nIGZsYWcgZW1haWxzJzsgfVxyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nU2VuZEFwcHJvdmVyICYmICF0aGlzLmhhc0FwcHJvdmVycykgeyByZXR1cm4gJ1JlY3VycmluZyBGbGFncyBzZW5kcyB0byB0aGUgYXBwcm92ZXIuICcgKyB0aGlzLmFwcHJvdmVyTWlzc2luZ1RleHQgKyAnIE9yIHVudGljayBBcHByb3ZlciBoZXJlLic7IH1cclxuICAgIGlmICh0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gJiYgIXRoaXMucmVjdXJyaW5nVXNlcnMubGVuZ3RoKSB7IHJldHVybiAnQWRkIGF0IGxlYXN0IG9uZSBjdXN0b20gdXNlciBmb3IgUmVjdXJyaW5nIEZsYWdzJzsgfVxyXG4gICAgLy8gQXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZTogXCJzYW1lIHVzZXJzXCIgbmVlZHMgTm90aWZ5IEZsYWdzIG9uLCBlbHNlIGl0IHdvdWxkIG1haWwgbm8gb25lLlxyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nU2FtZUFzTm90aWZ5ICYmICF0aGlzLm5vdGlmeUZsYWdzT24pIHsgcmV0dXJuICdcIlVzZSBzYW1lIHVzZXJzIGZyb20gTm90aWZ5IEZsYWdzXCIgbmVlZHMgTm90aWZ5IEZsYWdzIG9uLiBUdXJuIE5vdGlmeSBGbGFncyBvbiwgb3IgdW50aWNrIHRoaXMgb3B0aW9uLic7IH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGdldCBkYWlseVJlcG9ydEVycm9yKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuZGFpbHlSZXBvcnRPbikgeyByZXR1cm4gJyc7IH1cclxuICAgIGlmICghdGhpcy5kYWlseVNlbmRBcHByb3ZlciAmJiAhdGhpcy5kYWlseVNlbmRDdXN0b20pIHsgcmV0dXJuICdDaG9vc2Ugd2hvIHJlY2VpdmVzIHRoZSBkYWlseSByZXBvcnQnOyB9XHJcbiAgICBpZiAodGhpcy5kYWlseVNlbmRBcHByb3ZlciAmJiAhdGhpcy5oYXNBcHByb3ZlcnMpIHsgcmV0dXJuICdUaGUgZGFpbHkgcmVwb3J0IGlzIHNlbnQgdG8gdGhlIGFwcHJvdmVyLiAnICsgdGhpcy5hcHByb3Zlck1pc3NpbmdUZXh0ICsgJyBPciB1bnRpY2sgQXBwcm92ZXIgaGVyZS4nOyB9XHJcbiAgICBpZiAodGhpcy5kYWlseVNlbmRDdXN0b20gJiYgIXRoaXMuZGFpbHlVc2Vycy5sZW5ndGgpIHsgcmV0dXJuICdBZGQgYXQgbGVhc3Qgb25lIGN1c3RvbSB1c2VyIGZvciB0aGUgZGFpbHkgcmVwb3J0JzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBkcm9wZG93bnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0KGtleTogU2VsZWN0S2V5LCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5vcGVuU2VsZWN0ID0gdGhpcy5vcGVuU2VsZWN0ID09PSBrZXkgPyBudWxsIDoga2V5O1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcGljayhrZXk6IFNlbGVjdEtleSwgb3B0aW9uOiBTZWxlY3RPcHRpb24sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzW2tleV0gPSBvcHRpb24udmFsdWU7XHJcbiAgICB0aGlzLm9wZW5TZWxlY3QgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0TGFiZWwoa2V5OiBTZWxlY3RLZXksIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xyXG4gICAgcmV0dXJuIG9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT09IHZhbHVlKT8ubGFiZWwgPz8gU3RyaW5nKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGlzUGlja2VkKGtleTogU2VsZWN0S2V5LCBvcHRpb246IFNlbGVjdE9wdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXNba2V5XSA9PT0gb3B0aW9uLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gVHlwZWQgYWNjZXNzb3JzIGZvciB0aGUgc2hhcmVkIHRlbXBsYXRlcyAodGhlaXIgY29udGV4dCB2YXJpYWJsZXMgYXJlIHVudHlwZWQsIGFuZCB0aGVcclxuICAvLyByb290IGFwcCdzIHN0cmljdCB0ZW1wbGF0ZSBjaGVjayByZWplY3RzIGB0aGlzW2xpc3RdYCAvIGBkcmFmdHNbbGlzdF1gKS5cclxuICBjaGlwc09mKGxpc3Q6IENoaXBMaXN0KTogQ2hpcFVzZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpc1tsaXN0XTtcclxuICB9XHJcblxyXG4gIGRyYWZ0T2YobGlzdDogQ2hpcExpc3QpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZHJhZnRzW2xpc3RdO1xyXG4gIH1cclxuXHJcbiAgc2V0RHJhZnQobGlzdDogQ2hpcExpc3QsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZnRzW2xpc3RdID0gdmFsdWUgPz8gJyc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIGNoaXAgcGlja2VycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBDbGllbnQgdXNlcnMgbWF0Y2hpbmcgdGhlIHR5cGVkIHRleHQsIG1pbnVzIHRoZSBvbmVzIGFscmVhZHkgaW4gdGhlIGxpc3QuICovXHJcbiAgc3VnZ2VzdGlvbnMobGlzdDogQ2hpcExpc3QpOiBDaGlwVXNlcltdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLmRyYWZ0c1tsaXN0XS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IGNob3NlbiA9IG5ldyBTZXQodGhpc1tsaXN0XS5tYXAodSA9PiB1LmUpKTtcclxuICAgIHJldHVybiB0aGlzLnVzZXJzXHJcbiAgICAgIC5maWx0ZXIodSA9PiAhY2hvc2VuLmhhcyh1LmUpICYmICghcSB8fCB1Lm4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCB1LmUuaW5jbHVkZXMocSkpKVxyXG4gICAgICAuc2xpY2UoMCwgOCk7XHJcbiAgfVxyXG5cclxuICBmb2N1c0NoaXBzKGxpc3Q6IENoaXBMaXN0LCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBsaXN0O1xyXG4gICAgdGhpcy5vcGVuU2VsZWN0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBBcHByb3ZlcnMgY2FuIG9ubHkgYmUgYWRkZWQgd2hpbGUgQXBwcm92ZXIgaXMgb24gKHRoZSBwaWNrZXIgaXMgaGlkZGVuIG90aGVyd2lzZTsgdGhpcyBndWFyZHMgaXQpLiAqL1xyXG4gIHByaXZhdGUgYXBwcm92ZXJMaXN0TG9ja2VkKGxpc3Q6IENoaXBMaXN0KTogYm9vbGVhbiB7XHJcbiAgICBpZiAobGlzdCAhPT0gJ2FwcHJvdmVycycgfHwgdGhpcy5hcHByb3Zlck9uKSB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdBcHByb3ZlciBpcyB0dXJuZWQgb2ZmLiBUdXJuIG9uIEFwcHJvdmVyIHRvIGFkZCBhcHByb3ZlcnMuJyk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGFkZFN1Z2dlc3Rpb24obGlzdDogQ2hpcExpc3QsIHVzZXI6IENoaXBVc2VyLCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuYXBwcm92ZXJMaXN0TG9ja2VkKGxpc3QpKSB7IHJldHVybjsgfVxyXG4gICAgaWYgKCF0aGlzW2xpc3RdLnNvbWUodSA9PiB1LmUgPT09IHVzZXIuZSkpIHtcclxuICAgICAgdGhpc1tsaXN0XSA9IFsuLi50aGlzW2xpc3RdLCB1c2VyXTtcclxuICAgIH1cclxuICAgIHRoaXMuZHJhZnRzW2xpc3RdID0gJyc7XHJcbiAgICB0aGlzLm9wZW5DaGlwcyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogRW50ZXIgdGFrZXMgdGhlIGZpcnN0IHN1Z2dlc3Rpb247IGFuIGV4YWN0IGVtYWlsIHdvcmtzIGV2ZW4gZm9yIGEgdXNlciBub3QgaW4gdGhlIGxpc3QuICovXHJcbiAgYWRkQ2hpcChsaXN0OiBDaGlwTGlzdCk6IHZvaWQge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuZHJhZnRzW2xpc3RdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKCFxIHx8IHRoaXMuYXBwcm92ZXJMaXN0TG9ja2VkKGxpc3QpKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgdHlwZWQgPSB0aGlzLmVzYyh0aGlzLmRyYWZ0c1tsaXN0XS50cmltKCkpO1xyXG4gICAgY29uc3QgaXNFbWFpbCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QocSk7XHJcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMuc3VnZ2VzdGlvbnMobGlzdClbMF0gfHwgKGlzRW1haWwgPyB0aGlzLmNoaXAocSwgcSkgOiBudWxsKTtcclxuICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHEuaW5jbHVkZXMoJ0AnKVxyXG4gICAgICAgID8gJ1wiJyArIHR5cGVkICsgJ1wiIGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuJ1xyXG4gICAgICAgIDogJ05vIHVzZXIgbWF0Y2hlcyBcIicgKyB0eXBlZCArICdcIi4gUGljayBhIHVzZXIgZnJvbSB0aGUgbGlzdCBvciB0eXBlIHRoZWlyIGZ1bGwgZW1haWwuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzW2xpc3RdLnNvbWUodSA9PiB1LmUgPT09IG1hdGNoLmUpKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCh0aGlzLmVzYyhtYXRjaC5uIHx8IG1hdGNoLmUpICsgJyBpcyBhbHJlYWR5IGFkZGVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzW2xpc3RdID0gWy4uLnRoaXNbbGlzdF0sIG1hdGNoXTtcclxuICAgIHRoaXMuZHJhZnRzW2xpc3RdID0gJyc7XHJcbiAgICB0aGlzLm9wZW5DaGlwcyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICByZW1vdmVDaGlwKGxpc3Q6IENoaXBMaXN0LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzW2xpc3RdID0gdGhpc1tsaXN0XS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gRGFpbHkgUmVwb3J0IGN1c3RvbSB1c2VyczogYnVsayB1cGxvYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBvcGVuRGFpbHlCdWxrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYWlseUJ1bGtFcnJvcnMgPSBbXTtcclxuICAgIHRoaXMuZGFpbHlCdWxrT3BlbiA9IHRydWU7XHJcbiAgICB0aGlzLm9wZW5DaGlwcyA9IG51bGw7XHJcbiAgICB0aGlzLm9wZW5TZWxlY3QgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VEYWlseUJ1bGsoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhaWx5QnVsa09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuZGFpbHlCdWxrRXJyb3JzID0gW107XHJcbiAgfVxyXG5cclxuICAvKiogVXNlcm5hbWUgKyBFbWFpbCB0ZW1wbGF0ZSwgcHJlLWZpbGxlZCB3aXRoIHRoZSBjdXJyZW50IERhaWx5IFJlcG9ydCBjdXN0b20gdXNlcnMgKGFzIHRoZSBDaGVja2xpc3Qgb25lKS4gKi9cclxuICBkb3dubG9hZERhaWx5VGVtcGxhdGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dzID0gdGhpcy5kYWlseVVzZXJzLmxlbmd0aCA/IHRoaXMuZGFpbHlVc2Vycy5tYXAodSA9PiBbdS5uLCB1LmVdKSA6IFtbJycsICcnXV07XHJcbiAgICBjb25zdCBzaGVldCA9IFhMU1gudXRpbHMuYW9hX3RvX3NoZWV0KFtbJ1VzZXJuYW1lJywgJ0VtYWlsJ10sIC4uLnJvd3NdKTtcclxuICAgIHNoZWV0WychY29scyddID0gW3sgd2NoOiAyOCB9LCB7IHdjaDogMzYgfV07XHJcbiAgICBjb25zdCBib29rID0gWExTWC51dGlscy5ib29rX25ldygpO1xyXG4gICAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldChib29rLCBzaGVldCwgJ1VzZXJzJyk7XHJcbiAgICBYTFNYLndyaXRlRmlsZShib29rLCAnZGFpbHlSZXBvcnRUZW1wbGF0ZS54bHN4Jyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXBsYWNlcyB0aGUgRGFpbHkgUmVwb3J0IGN1c3RvbSB1c2VycyB3aXRoIHRoZSB1cGxvYWRlZCBzaGVldCwgYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBkb2VzOlxyXG4gICAqIG9ubHkgdGhlIEVtYWlsIGNvbHVtbiBjb3VudHMgKHRoZSBuYW1lIGNvbWVzIGZyb20gdGhlIGNsaWVudCdzIHVzZXIgbGlzdCksIGFuZCBldmVyeSByb3cgbXVzdCBiZSBhblxyXG4gICAqIGV4aXN0aW5nIHVzZXIuIEFueSBpbnZhbGlkIHJvdyByZWplY3RzIHRoZSB3aG9sZSBmaWxlLlxyXG4gICAqL1xyXG4gIG9uRGFpbHlCdWxrRmlsZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcclxuICAgIGlucHV0LnZhbHVlID0gJyc7XHJcbiAgICBpZiAoIWZpbGUpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmRhaWx5QnVsa0Vycm9ycyA9IFtdO1xyXG4gICAgaWYgKCEvXFwueGxzeCQvaS50ZXN0KGZpbGUubmFtZSkpIHtcclxuICAgICAgdGhpcy5kYWlseUJ1bGtFcnJvcnMgPSBbJ1BsZWFzZSB1cGxvYWQgYSB2YWxpZCAueGxzeCBmaWxlLiddO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnVzZXJzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmRhaWx5QnVsa0Vycm9ycyA9IFsnVGhlIHVzZXJzIG9mIHRoaXMgY2xpZW50IGNvdWxkIG5vdCBiZSBsb2FkZWQuIFJlbG9hZCB0aGUgcGFnZSBhbmQgdHJ5IGFnYWluLiddO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZmlsZS5hcnJheUJ1ZmZlcigpLnRoZW4oYnVmZmVyID0+IHtcclxuICAgICAgdGhpcy5kYWlseUJ1bGtFcnJvcnMgPSB0aGlzLmFwcGx5RGFpbHlCdWxrKGJ1ZmZlcik7XHJcbiAgICAgIGlmICghdGhpcy5kYWlseUJ1bGtFcnJvcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5kYWlseUJ1bGtPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ0ZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5LiAnICsgdGhpcy5kYWlseVVzZXJzLmxlbmd0aFxyXG4gICAgICAgICAgKyAodGhpcy5kYWlseVVzZXJzLmxlbmd0aCA9PT0gMSA/ICcgdXNlcicgOiAnIHVzZXJzJykgKyAnIGFkZGVkIHRvIHRoZSBkYWlseSByZXBvcnQuJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZGFpbHlCdWxrRXJyb3JzID0gWydDb3VsZCBub3QgcmVhZCB0aGlzIGZpbGUuIFVwbG9hZCB0aGUgZG93bmxvYWRlZCB0ZW1wbGF0ZSBhcyAueGxzeC4nXTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBBcHBsaWVzIHRoZSBzaGVldCB0byBkYWlseVVzZXJzIGFuZCByZXR1cm5zIFtdIG9uIHN1Y2Nlc3MsIGVsc2UgdGhlIHJlYXNvbnMgaXQgd2FzIHJlamVjdGVkLiAqL1xyXG4gIHByaXZhdGUgYXBwbHlEYWlseUJ1bGsoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZ1tdIHtcclxuICAgIGxldCByb3dzOiBhbnlbXVtdO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgYm9vayA9IFhMU1gucmVhZChidWZmZXIsIHsgdHlwZTogJ2FycmF5JyB9KTtcclxuICAgICAgcm93cyA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihib29rLlNoZWV0c1tib29rLlNoZWV0TmFtZXNbMF1dLCB7IGhlYWRlcjogMSwgZGVmdmFsOiAnJywgYmxhbmtyb3dzOiB0cnVlIH0pO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBbJ0NvdWxkIG5vdCByZWFkIHRoaXMgZmlsZS4gVXBsb2FkIHRoZSBkb3dubG9hZGVkIHRlbXBsYXRlIGFzIC54bHN4LiddO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZW1haWxDb2wgPSAocm93c1swXSB8fCBbXSkuZmluZEluZGV4KGggPT4gU3RyaW5nKGggPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSAnZW1haWwnKTtcclxuICAgIGlmIChlbWFpbENvbCA8IDApIHsgcmV0dXJuIFtcIlRoZSB0ZW1wbGF0ZSBtdXN0IGNvbnRhaW4gYW4gJ0VtYWlsJyBjb2x1bW4uXCJdOyB9XHJcblxyXG4gICAgY29uc3QgZW1haWxSZWdleCA9IC9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvO1xyXG4gICAgY29uc3QgYnlFbWFpbCA9IG5ldyBNYXAodGhpcy51c2Vycy5tYXAodSA9PiBbdS5lLCB1XSkpO1xyXG4gICAgY29uc3QgbWF0Y2hlZDogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IGRhdGFSb3dzID0gMDtcclxuICAgIHJvd3Muc2xpY2UoMSkuZm9yRWFjaCgocm93LCBpKSA9PiB7XHJcbiAgICAgIC8vIFNraXAgZnVsbHkgYmxhbmsgcm93cyAoYW55IGNvbHVtbiwgbm90IGp1c3QgRW1haWwpLlxyXG4gICAgICBpZiAoIXJvdy5zb21lKHYgPT4gU3RyaW5nKHYgPz8gJycpLnRyaW0oKSAhPT0gJycpKSB7IHJldHVybjsgfVxyXG4gICAgICBkYXRhUm93cysrO1xyXG4gICAgICBjb25zdCByb3dObyA9IGkgKyAyOyAvLyArMSBoZWFkZXIsICsxIHRvIDEtYmFzZWRcclxuICAgICAgY29uc3QgZW1haWwgPSBTdHJpbmcocm93W2VtYWlsQ29sXSA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGlmICghZW1haWwpIHsgZXJyb3JzLnB1c2goJ1JvdyAnICsgcm93Tm8gKyAnOiBFbWFpbCBpcyByZXF1aXJlZCcpOyByZXR1cm47IH1cclxuICAgICAgaWYgKCFlbWFpbFJlZ2V4LnRlc3QoZW1haWwpKSB7IGVycm9ycy5wdXNoKCdSb3cgJyArIHJvd05vICsgJzogXCInICsgZW1haWwgKyAnXCIgaXMgbm90IGEgdmFsaWQgZW1haWwnKTsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IHVzZXIgPSBieUVtYWlsLmdldChlbWFpbCk7XHJcbiAgICAgIGlmICghdXNlcikgeyBlcnJvcnMucHVzaCgnUm93ICcgKyByb3dObyArICc6IFwiJyArIGVtYWlsICsgJ1wiIGlzIG5vdCBhbiBleGlzdGluZyB1c2VyJyk7IHJldHVybjsgfVxyXG4gICAgICBpZiAoIW1hdGNoZWQuc29tZSh1ID0+IHUuZSA9PT0gdXNlci5lKSkgeyBtYXRjaGVkLnB1c2godXNlcik7IH1cclxuICAgIH0pO1xyXG4gICAgaWYgKCFkYXRhUm93cykgeyByZXR1cm4gWydUaGUgdXBsb2FkZWQgZmlsZSBoYXMgbm8gZGF0YSByb3dzLiddOyB9XHJcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkgeyByZXR1cm4gZXJyb3JzOyB9XHJcblxyXG4gICAgdGhpcy5kYWlseVVzZXJzID0gbWF0Y2hlZDtcclxuICAgIHRoaXMuZGFpbHlTZW5kQ3VzdG9tID0gdHJ1ZTtcclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGF0IHRoZSBjaGVja2xpc3Qga2VlcHMgYXMgYXNzaWduZWRVc2VycywgZXhhY3RseSBhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIHNlbmRzIGl0LiAqL1xyXG4gIHByaXZhdGUgYXNzaWduZWRVc2VycygpOiB7IGlkOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9W10ge1xyXG4gICAgY29uc3QgZCA9IHRoaXMuY29uZmlnRGF0YT8uY2hlY2tMaXN0RGV0YWlscyB8fCB7fTtcclxuICAgIHJldHVybiBbLi4uKGQuc2luZ2xlQXNzaWduIHx8IFtdKSwgLi4uKGQuZ3JvdXBBc3NpZ24gfHwgW10pXTtcclxuICB9XHJcblxyXG4gIGdldCBwcmVTdWJtaXNzaW9uRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVTdWJtaXNzaW9uQWNjZXNzT24gJiYgdGhpcy5wcmVTdWJtaXNzaW9uVXNlcnMubGVuZ3RoID09PSAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3B1dGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVZpc2liaWxpdHkgPT09ICdwcmUnICYmIHRoaXMuZGlzcHV0ZU9uO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoeSBQdWJsaXNoIC8gU2F2ZSBhcmUgZGlzYWJsZWQgKGJ1dHRvbiB0aXRsZSksICcnIHdoZW4gdGhleSBhcmUgbm90LiAqL1xyXG4gIGdldCBzYXZlQmxvY2tlZFJlYXNvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmFjY2Vzcy5jYW5FZGl0KSB7IHJldHVybiAnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY2hhbmdlIGF1ZGl0cyc7IH1cclxuICAgIGlmICh0aGlzLmF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkKSB7IHJldHVybiAnVGhlIHNjb3JpbmcgYW5kIGFjY2VzcyBzZXR0aW5ncyBjb3VsZCBub3QgYmUgbG9hZGVkLiBSZWxvYWQgdGhlIHBhZ2UgYmVmb3JlIHNhdmluZy4nOyB9XHJcbiAgICBpZiAodGhpcy5wYXNzRmFpbE9uICYmICh0aGlzLnBhc3NUaHJlc2hvbGQgPCAxIHx8IHRoaXMucGFzc1RocmVzaG9sZCA+IDEwMCkpIHsgcmV0dXJuICdQYXNzIG1hcmsgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMCc7IH1cclxuICAgIGlmICh0aGlzLnByZVN1Ym1pc3Npb25FbXB0eSkgeyByZXR1cm4gJ0FkZCBhdCBsZWFzdCBvbmUgdXNlciBmb3IgcHJlLXN1Ym1pc3Npb24gYWNjZXNzJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZWRpdFN1Ym1pdHRlZEVycm9yIHx8IHRoaXMubm90aWZ5RmxhZ3NFcnJvciB8fCB0aGlzLnJlY3VycmluZ0ZsYWdzRXJyb3IgfHwgdGhpcy5kYWlseVJlcG9ydEVycm9yO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoeSBQdWJsaXNoIHdvdWxkIGJlIHJlZnVzZWQgKCcnIHdoZW4gaXQgd291bGQgbm90KTsgY2hlY2tlZCBvbiBjbGljayBzbyB0aGUgdG9hc3QgY2FuIHNheSBzby4gKi9cclxuICBnZXQgcHVibGlzaEJsb2NrZWRSZWFzb24oKTogc3RyaW5nIHtcclxuICAgIC8vIEFwcHJvdmVycyBhcmUgbmVlZGVkIG9ubHkgd2hpbGUgQXBwcm92ZXIgaXMgb247IHdpdGggaXQgb2ZmIHRoZSBhdWRpdCBwdWJsaXNoZXMgd2l0aG91dCBhcHByb3ZhbC5cclxuICAgIGlmICh0aGlzLmFwcHJvdmVyT24gJiYgIXRoaXMuYXBwcm92ZXJzLmxlbmd0aCkgeyByZXR1cm4gJ0FwcHJvdmVyIGlzIHR1cm5lZCBvbi4gQWRkIGF0IGxlYXN0IG9uZSBhcHByb3Zlciwgb3IgdHVybiBBcHByb3ZlciBvZmYuJzsgfVxyXG4gICAgaWYgKCF0aGlzLnNlY3Rpb25zLnNvbWUocyA9PiBzLml0ZW1zLmxlbmd0aCkpIHsgcmV0dXJuICdUaGlzIGF1ZGl0IGhhcyBubyBxdWVzdGlvbnMuIEFkZCBhdCBsZWFzdCBvbmUgcXVlc3Rpb24gYmVmb3JlIHB1Ymxpc2hpbmcuJzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhblNhdmUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zYXZpbmcgfHwgdGhpcy5sb2FkaW5nIHx8ICF0aGlzLmNoZWNrbGlzdElkIHx8ICF0aGlzLmNvbmZpZ0RhdGEpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICByZXR1cm4gIXRoaXMuc2F2ZUJsb2NrZWRSZWFzb247XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIHNhdmUgLyBwdWJsaXNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHNhdmVEcmFmdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2ZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhblNhdmUpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wdWJsaXNoQmxvY2tlZFJlYXNvbjtcclxuICAgIGlmIChibG9ja2VkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChibG9ja2VkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmFzc2lnbmVkQ291bnQpIHtcclxuICAgICAgLy8gU3RvcmVzIGFuZCBhdWRpdG9ycyBjb21lIGZyb20gc2NoZWR1bGUgcm93czsgcHVibGlzaGluZyB0aGUgc2NoZWR1bGUgcHVibGlzaGVzIHRoZSBhdWRpdC5cclxuICAgICAgdGhpcy5zY2hlZHVsZUFmdGVyU2F2ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2F2ZShmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZShwdWJsaXNoOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU2F2ZSkgeyB0aGlzLnNjaGVkdWxlQWZ0ZXJTYXZlID0gZmFsc2U7IHJldHVybjsgfVxyXG4gICAgdGhpcy53YXNQdWJsaXNoZWQgPSB0aGlzLnB1Ymxpc2hlZDtcclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZUNoZWNrbGlzdChwdWJsaXNoKTtcclxuICB9XHJcblxyXG4gIC8qKiBcInB1Ymxpc2ggU3RvcmUgQXVkaXRcIiAvIFwic2F2ZSBTdG9yZSBBdWRpdFwiLCBmb3IgdGhlIGVycm9yIHRvYXN0cy4gKi9cclxuICBwcml2YXRlIGFjdGlvblRleHQocHVibGlzaDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHB1Ymxpc2ggPyAncHVibGlzaCAnIDogJ3NhdmUgJykgKyB0aGlzLmVzYyh0aGlzLmF1ZGl0TmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQSBzYXZlIHN0ZXAgZmFpbGVkOiBzdG9wLCBhbmQgZG8gbm90IG9wZW4gQ3JlYXRlIHNjaGVkdWxlIG9uIHRoZSBuZXh0IHBsYWluIHNhdmUuICovXHJcbiAgcHJpdmF0ZSBmYWlsU2F2ZShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnNjaGVkdWxlQWZ0ZXJTYXZlID0gZmFsc2U7XHJcbiAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobWVzc2FnZSk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjaGVja2xpc3QgcGFydCAoY2hlY2tsaXN0Q29uZmlndXJldjE6IG5vdGlmaWNhdGlvbnMsIGFwcHJvdmVycywgcHVibGlzaCkgYW5kIHRoZSBhdWRpdC1vbmx5IHNldHRpbmdzXHJcbiAgICogKGNvbmZpZy9zYXZlOiBzY29yaW5nLCBkaXNwdXRlLCBhY2Nlc3MpIGRvIG5vdCBkZXBlbmQgb24gZWFjaCBvdGhlciwgc28gYm90aCBhcmUgc2VudCBhdCBvbmNlIGluc3RlYWQgb2Ygb25lXHJcbiAgICogYWZ0ZXIgdGhlIG90aGVyIChRQTogc2F2ZSAvIHB1Ymxpc2ggdG9vayBsb25nKS4gT3V0Y29tZXMgYXJlIHJlcG9ydGVkIGFzIGJlZm9yZTogdGhlIGNoZWNrbGlzdCBwYXJ0IGZpcnN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2F2ZUNoZWNrbGlzdChwdWJsaXNoOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBmYWxsYmFjayA9ICdDb3VsZCBub3QgJyArIHRoaXMuYWN0aW9uVGV4dChwdWJsaXNoKSArICcuIFBsZWFzZSB0cnkgYWdhaW4uJztcclxuICAgIGNvbnN0IHNldHRsZSA9IChjYWxsOiBPYnNlcnZhYmxlPGFueT4pID0+IGNhbGwucGlwZShtYXAoKHJlczogYW55KSA9PiAoeyByZXMsIGVycjogbnVsbCB9KSksIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiBvZih7IHJlczogbnVsbCwgZXJyIH0pKSk7XHJcbiAgICBmb3JrSm9pbihbXHJcbiAgICAgIHNldHRsZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0Q29uZmlnVXBkYXRlKHRoaXMuY2hlY2tsaXN0UGF5bG9hZChwdWJsaXNoKSkpLFxyXG4gICAgICBzZXR0bGUodGhpcy50cmF4U2VydmljZS5hdWRpdENvbmZpZ1NhdmUodGhpcy5leHRyYXNQYXlsb2FkKCkpKVxyXG4gICAgXSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoW21haW4sIGV4dHJhc10pID0+IHtcclxuICAgICAgaWYgKG1haW4uZXJyKSB7XHJcbiAgICAgICAgdGhpcy5mYWlsU2F2ZSh0aGlzLmFwaUVycm9yKG1haW4uZXJyLCBmYWxsYmFjaywgdHJ1ZSwgJ0NvdWxkIG5vdCAnICsgdGhpcy5hY3Rpb25UZXh0KHB1Ymxpc2gpICsgJzogJykpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWFpbi5yZXM/LmNvZGUgIT09IDIwMCkge1xyXG4gICAgICAgIC8vIDIwNCAobm8gYm9keSkgPSB0aGUgYXVkaXQgbm8gbG9uZ2VyIGV4aXN0cyBmb3IgdGhpcyBjbGllbnQuXHJcbiAgICAgICAgdGhpcy5mYWlsU2F2ZShtYWluLnJlcyA/IGZhbGxiYWNrIDogJ0NvdWxkIG5vdCAnICsgdGhpcy5hY3Rpb25UZXh0KHB1Ymxpc2gpICsgJzogdGhlIGF1ZGl0IHdhcyBub3QgZm91bmQuIEl0IG1heSBoYXZlIGJlZW4gZGVsZXRlZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHB1Ymxpc2gpIHsgdGhpcy5wdWJsaXNoZWQgPSB0cnVlOyB9XHJcbiAgICAgIGlmIChleHRyYXMuZXJyIHx8IGV4dHJhcy5yZXM/LmNvZGUgIT09IDIwMCkge1xyXG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IGV4dHJhcy5lcnIgPyB0aGlzLmFwaUVycm9yKGV4dHJhcy5lcnIsICcnLCB0cnVlKSA6ICcnO1xyXG4gICAgICAgIHRoaXMuZmFpbFNhdmUoKHB1Ymxpc2ggPyB0aGlzLmVzYyh0aGlzLmF1ZGl0TmFtZSkgKyAnIHdhcyBwdWJsaXNoZWQnIDogJ1RoZSBub3RpZmljYXRpb24gYW5kIGFwcHJvdmVyIHNldHRpbmdzIHdlcmUgc2F2ZWQnKVxyXG4gICAgICAgICAgKyAnLCBidXQgdGhlIHNjb3JpbmcsIGRpc3B1dGUgYW5kIGFjY2VzcyBzZXR0aW5ncyB3ZXJlIG5vdCcgKyAocmVhc29uID8gJyAoJyArIHJlYXNvbiArICcpJyA6ICcnKSArICcuIFNhdmUgYWdhaW4gdG8ga2VlcCB0aGVtLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpbmlzaFNhdmUocHVibGlzaCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYXVkaXQtb25seSBzZXR0aW5ncyBzYXZlZCBieSBjb25maWcvc2F2ZS4gKi9cclxuICBwcml2YXRlIGV4dHJhc1BheWxvYWQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBjb25zdCB0b1N0b3JlZCA9IChsaXN0OiBDaGlwVXNlcltdKSA9PiBsaXN0Lm1hcCh1ID0+ICh7IG46IHUubiwgZTogdS5lIH0pKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBjaGVja2xpc3RJZDogdGhpcy5jaGVja2xpc3RJZCxcclxuICAgICAgcGFzc01hcms6IHRoaXMucGFzc0ZhaWxPbiA/IE51bWJlcih0aGlzLnBhc3NUaHJlc2hvbGQpIDogNzUsXHJcbiAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgcGFzc0ZhaWxPbjogdGhpcy5wYXNzRmFpbE9uLFxyXG4gICAgICAgIGRpc3B1dGVPbjogdGhpcy5kaXNwdXRlT24sXHJcbiAgICAgICAgZGlzcHV0ZVdpbmRvdzogdGhpcy5kaXNwdXRlV2luZG93LFxyXG4gICAgICAgIHByZVN1Ym1pc3Npb25BY2Nlc3NPbjogdGhpcy5wcmVTdWJtaXNzaW9uQWNjZXNzT24sXHJcbiAgICAgICAgcHJlU3VibWlzc2lvblVzZXJzOiB0b1N0b3JlZCh0aGlzLnByZVN1Ym1pc3Npb25Vc2VycyksXHJcbiAgICAgICAgZWRpdFN1Ym1pdHRlZE9uOiB0aGlzLmVkaXRTdWJtaXR0ZWRPbixcclxuICAgICAgICBlZGl0VXNlcnM6IHRvU3RvcmVkKHRoaXMuZWRpdFVzZXJzKVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5pc2hTYXZlKHB1Ymxpc2g6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5lc2ModGhpcy5hdWRpdE5hbWUpO1xyXG4gICAgaWYgKHRoaXMuc2NoZWR1bGVBZnRlclNhdmUpIHtcclxuICAgICAgdGhpcy5zY2hlZHVsZUFmdGVyU2F2ZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChuYW1lICsgKHRoaXMucHVibGlzaGVkID8gJyBzYXZlZC4nIDogJyBzYXZlZCBhcyBkcmFmdC4nKSArICcgSXQgaGFzIG5vIHN0b3JlcyB5ZXQ6IGFkZCBzY2hlZHVsZSByb3dzLCB0aGVuIHB1Ymxpc2ggdGhlIHNjaGVkdWxlIHRvIHB1Ymxpc2ggdGhlIGF1ZGl0LicpO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvdHJheC9hdWRpdC12Mi9tYW5hZ2UnXSwgeyBxdWVyeVBhcmFtczogeyB0YWI6ICdzY2hlZHVsZScsIHNjaGVkdWxlOiAnY3JlYXRlJywgYXVkaXQ6IHRoaXMuY2hlY2tsaXN0SWQgfSB9KTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChwdWJsaXNoKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHRoaXMud2FzUHVibGlzaGVkID8gJ0NoYW5nZXMgdG8gJyArIG5hbWUgKyAnIHNhdmVkIGFuZCBwdWJsaXNoZWQuJyA6IG5hbWUgKyAnIGhhcyBiZWVuIHB1Ymxpc2hlZC4nKTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3RyYXgvYXVkaXQtdjIvbWFuYWdlJ10pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gQSBkcmFmdCBzYXZlIG5ldmVyIHVucHVibGlzaGVzICh0aGUgQVBJIGtlZXBzIHRoZSBwdWJsaXNoIHN0YXRlKSwgc28gZG8gbm90IGNhbGwgYSBsaXZlIGF1ZGl0IGEgZHJhZnQuXHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHRoaXMucHVibGlzaGVkID8gJ0NoYW5nZXMgdG8gJyArIG5hbWUgKyAnIHNhdmVkLiBUaGUgYXVkaXQgc3RheXMgcHVibGlzaGVkLicgOiBuYW1lICsgJyBzYXZlZCBhcyBkcmFmdC4nKTtcclxuICAgICAgLy8gUmVsb2FkIHNvIHRoZSBwYWdlIHNob3dzIGV4YWN0bHkgd2hhdCB0aGUgc2VydmVyIGtlcHQuXHJcbiAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbWVzc2FnZSB0byBzaG93IGZvciBhIGZhaWxlZCBjYWxsOiB0aGUgQVBJJ3Mgb3duIHRleHQgZm9yIGEgNHh4IChwcm9kdWN0aW9uIHNlbmRzIGl0IGFzXHJcbiAgICogYGVycm9yYCAodGV4dCBvciB7IG1lc3NhZ2UgfSksIHRoZSBsb2NhbCBkZXYgaGVscGVyIGFzIGBlcnJvcmAgdGV4dCBwbHVzIGBkZXRhaWxzYCksIGVsc2UgYGZhbGxiYWNrYC5cclxuICAgKiA1eHggYm9kaWVzIGNhcnJ5IHJhdyBleGNlcHRpb25zLCBzbyB0aGV5IGdldCB0aGUgZmFsbGJhY2suIGBwcmVmaXhgIGlzIHB1dCBiZWZvcmUgYW4gQVBJIHRleHQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcGlFcnJvcihlOiBhbnksIGZhbGxiYWNrOiBzdHJpbmcsIGVzY2FwZSA9IHRydWUsIHByZWZpeCA9ICcnKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHN0YXR1cyA9IE51bWJlcihlPy5zdGF0dXMpIHx8IDA7XHJcbiAgICBpZiAoc3RhdHVzID09PSA0MDMpIHsgcmV0dXJuICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IG9yIGNoYW5nZSB0aGlzIGF1ZGl0Lic7IH1cclxuICAgIGlmIChzdGF0dXMgPT09IDApIHsgcmV0dXJuIGZhbGxiYWNrID8gJ0NvdWxkIG5vdCByZWFjaCB0aGUgc2VydmVyLiBDaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nIDogJyc7IH1cclxuICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7IHJldHVybiBmYWxsYmFjazsgfVxyXG4gICAgY29uc3QgYm9keSA9IGU/LmVycm9yO1xyXG4gICAgY29uc3QgZXJyID0gYm9keT8uZXJyb3I7XHJcbiAgICBjb25zdCByYXcgPSAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycgPyBlcnIgOiBlcnI/Lm1lc3NhZ2UpIHx8IGJvZHk/LmRldGFpbHM/Lm1lc3NhZ2UgfHwgYm9keT8ubWVzc2FnZSB8fCAnJztcclxuICAgIGNvbnN0IHRleHQgPSBTdHJpbmcocmF3KS50cmltKCk7XHJcbiAgICBpZiAoIXRleHQpIHsgcmV0dXJuIGZhbGxiYWNrOyB9XHJcbiAgICByZXR1cm4gcHJlZml4ICsgKGVzY2FwZSA/IHRoaXMuZXNjKHRleHQpIDogdGV4dCk7XHJcbiAgfVxyXG5cclxuICAvKiogVG9hc3RzIHJlbmRlciB0aGVpciBtZXNzYWdlIGFzIEhUTUwsIHNvIG5hbWVzLCB0eXBlZCB0ZXh0IGFuZCBBUEkgbWVzc2FnZXMgYXJlIGVzY2FwZWQuICovXHJcbiAgcHJpdmF0ZSBlc2ModmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgJ1wiJzogJyZxdW90OycsICdcXCcnOiAnJiMzOTsnIH07XHJcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlID8/ICcnKS5yZXBsYWNlKC9bJjw+XCInXS9nLCBjID0+IG1hcFtjXSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGdldENvbmZpZ0RldGFpbHMgcGF5bG9hZCB3aXRoIHRoaXMgcGFnZSdzIGZpZWxkcyB3cml0dGVuIGJhY2ssIGluIHRoZSBjaGVja2xpc3QncyBvd24gc2hhcGUuICovXHJcbiAgcHJpdmF0ZSBjaGVja2xpc3RQYXlsb2FkKHB1Ymxpc2g6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgY29uc3QgdG9TdG9yZWQgPSAobGlzdDogQ2hpcFVzZXJbXSkgPT4gbGlzdC5tYXAodSA9PiAoeyBuYW1lOiB1Lm4sIHZhbHVlOiB1LmUgfSkpO1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY29uZmlnRGF0YTtcclxuICAgIGNvbnN0IGQgPSBkYXRhLmNoZWNrTGlzdERldGFpbHM7XHJcblxyXG4gICAgZC5jaGVja0xpc3REZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb24udHJpbSgpO1xyXG4gICAgZC5vd25lciA9IHRvU3RvcmVkKHRoaXMub3duZXJzKTtcclxuICAgIGQuYXBwcm92ZXIgPSB0aGlzLmFwcHJvdmVyT24gPyB0b1N0b3JlZCh0aGlzLmFwcHJvdmVycykgOiBbXTtcclxuICAgIC8vIE1pbnV0ZXMgYmVmb3JlIHRoZSBhdWRpdCBlbmQgdGltZSwgYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBzdG9yZXMgdGhlbS5cclxuICAgIGQucmVtYWluZGVyID0gdGhpcy5yZW1pbmRlck9uID8gWy4uLnRoaXMucmVtaW5kZXJzXSA6IFtdO1xyXG5cclxuICAgIGNvbnN0IG5mVHlwZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5ub3RpZnlGbGFnc09uICYmIHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyKSB7IG5mVHlwZXMucHVzaCgnYXBwcm92ZXInKTsgfVxyXG4gICAgaWYgKHRoaXMubm90aWZ5RmxhZ3NPbiAmJiB0aGlzLm5vdGlmeVNlbmRDdXN0b20pIHsgbmZUeXBlcy5wdXNoKCdjdXN0b20nKTsgfVxyXG4gICAgZC5ub3RpZnlGbGFncyA9IHsgbm90aWZ5VHlwZTogbmZUeXBlcywgdXNlcnM6IHRoaXMubm90aWZ5RmxhZ3NPbiAmJiB0aGlzLm5vdGlmeVNlbmRDdXN0b20gPyB0b1N0b3JlZCh0aGlzLm5vdGlmeVVzZXJzKSA6IFtdIH07XHJcblxyXG4gICAgY29uc3QgcmZUeXBlczogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgdGhpcy5yZWN1cnJpbmdTZW5kQXBwcm92ZXIpIHsgcmZUeXBlcy5wdXNoKCdhcHByb3ZlcicpOyB9XHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdGbGFnc09uICYmIHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSkgeyByZlR5cGVzLnB1c2goJ2N1c3RvbScpOyB9XHJcbiAgICAvLyBUaGUgc2VydmVyIHJlc29sdmVzICdzYW1lQXNOb3RpZnknIHRvIHRoZSBOb3RpZnkgRmxhZ3MgcmVjaXBpZW50cyB3aGVuIGl0IHNlbmRzIHRoZSBlbWFpbC5cclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgdGhpcy5yZWN1cnJpbmdTYW1lQXNOb3RpZnkpIHsgcmZUeXBlcy5wdXNoKCdzYW1lQXNOb3RpZnknKTsgfVxyXG4gICAgY29uc3QgcmZVc2VycyA9IHRoaXMucmVjdXJyaW5nRmxhZ3NPbiAmJiB0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gPyB0b1N0b3JlZCh0aGlzLnJlY3VycmluZ1VzZXJzKSA6IFtdO1xyXG4gICAgZC5yZWN1cnJpbmdGbGFnID0geyBub3RpZnlUeXBlOiByZlR5cGVzLCB1c2VyczogcmZVc2VycywgdGhyZXNob2xkOiB0aGlzLnJlY3VycmluZ0ZsYWdzT24gPyB0aGlzLnJlY3VycmluZ1RocmVzaG9sZCA6IDAgfTtcclxuXHJcbiAgICBjb25zdCBhZVR5cGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZGFpbHlSZXBvcnRPbiAmJiB0aGlzLmRhaWx5U2VuZEFwcHJvdmVyKSB7IGFlVHlwZXMucHVzaCgnYXBwcm92ZXInKTsgfVxyXG4gICAgaWYgKHRoaXMuZGFpbHlSZXBvcnRPbiAmJiB0aGlzLmRhaWx5U2VuZEN1c3RvbSkgeyBhZVR5cGVzLnB1c2goJ2N1c3RvbScpOyB9XHJcbiAgICBkLmF1dG9FbWFpbCA9IHsgdHlwZTogYWVUeXBlcywgdXNlcnM6IHRoaXMuZGFpbHlTZW5kQ3VzdG9tID8gdG9TdG9yZWQodGhpcy5kYWlseVVzZXJzKSA6IFtdIH07XHJcbiAgICBkLnNoYXJlUmVwb3J0UG9zdEFwcHJvdmFsID0gdGhpcy5kYWlseVJlcG9ydE9uICYmIHRoaXMuc2hhcmVQb3N0QXBwcm92YWw7XHJcblxyXG4gICAgZC5leHBvcnQgPSB0aGlzLmV4cG9ydFN1Ym1pc3Npb25PbjtcclxuICAgIGQucmVkb1ZhbGlkaXR5ID0gdGhpcy5yZWRvVmFsaWRGb3I7XHJcbiAgICBkLmF1dG9DcmVhdGVUYXNrID0gdGhpcy5hdXRvQ3JlYXRlVGFza09uO1xyXG4gICAgZC50YXNrQXNzaWduZWUgPSB0aGlzLnRhc2tBc3NpZ25lZTtcclxuICAgIGQudGFza1ZhbGlkaXR5ID0gTnVtYmVyKHRoaXMudGFza1ZhbGlkaXR5KSB8fCAxMDtcclxuICAgIGQuc2hvd0FwcHJvdmVkUmVzcG9uc2UgPSB0aGlzLnNob3dSZXNwb25zZUluQXBwO1xyXG4gICAgZC5yZXNwb25zZVZpc2liaWxpdHkgPSB0aGlzLnJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3ByZScgPyAncHJlQXBwcm92YWwnIDogJ3Bvc3RBcHByb3ZhbCc7XHJcbiAgICBkLnJlc3BvbnNlVmlzaWJpbGl0eUhvdXJzID0gdGhpcy5yZXNwRGVsYXk7XHJcbiAgICBkLnVzZXJWZXJpZmljYXRpb24gPSB7IHJlcXVpcmVQaG90b0NhcHR1cmU6IHRoaXMucmVxdWlyZVBob3RvLCByZXF1aXJlVXNlckFja25vd2xlZGdtZW50OiB0aGlzLnJlcXVpcmVBY2tub3dsZWRnbWVudCB9O1xyXG4gICAgZC5yZWRvRXh0ZW5zaW9uID0gdGhpcy5yZWRvRXh0ZW5zaW9uO1xyXG5cclxuICAgIC8vIFdoYXQgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBzZW5kczogZXZlcnlvbmUgY3VycmVudGx5IGFzc2lnbmVkLCBhbmQgdGhlIHB1Ymxpc2ggc3RhdGUuXHJcbiAgICBkLmFzc2lnbmVkVXNlcnMgPSB0aGlzLmFzc2lnbmVkVXNlcnMoKTtcclxuICAgIGQuc3RvcmVDb3VudCA9IGQuYXNzaWduZWRVc2Vycy5sZW5ndGg7XHJcbiAgICBpZiAoIWQuY292ZXJhZ2UpIHsgZC5jb3ZlcmFnZSA9ICdzdG9yZSc7IH1cclxuICAgIGQucHVibGlzaCA9IHB1Ymxpc2ggPyB0cnVlIDogISFkLnB1Ymxpc2g7XHJcblxyXG4gICAgZGF0YS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XHJcbiAgICBkYXRhLnN1Ym1pdFR5cGUgPSBwdWJsaXNoID8gJ3B1Ymxpc2gnIDogJ3NhdmUnO1xyXG4gICAgZGF0YS5zaG93RWRpdCA9IGZhbHNlO1xyXG4gICAgZGF0YS51cGRhdGVDb25maWd1cmUgPSBmYWxzZTtcclxuICAgIGRhdGEudGltZVpvbmUgPSBkYXlqcy50ei5ndWVzcygpO1xyXG4gICAgLy8gQXNzaWdubWVudCBkaWZmIGZvciB0aGUgYWN0aXZpdHkgbG9nOyB0aGlzIHBhZ2UgbmV2ZXIgY2hhbmdlcyBhc3NpZ25tZW50cy5cclxuICAgIGRhdGEuYWRkZWQgPSBbXTtcclxuICAgIGRhdGEucmVtb3ZlZCA9IHsgdXNlcjogW10sIHN0b3JlOiBbXSB9O1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhdjItcGFnZSBhdWRpdC1jb25maWd1cmVcIj5cclxuXHJcbiAgPCEtLSBCYWNrICsgYnJlYWRjcnVtYiAoYXMgdGhlIHNjaGVkdWxlIGVkaXRvcidzIGJhY2sgYmFyKSAtLT5cclxuICA8ZGl2IGNsYXNzPVwiY2YtYmFja2JhclwiPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtIGNmLWJhY2tcIiAoY2xpY2spPVwiYmFjaygpXCI+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDYgOSAxMiAxNSAxOFwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgIHt7IGJhY2tMYWJlbCB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtY3J1bWJcIj5cclxuICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwiYmFjaygkZXZlbnQpXCI+TWFuYWdlIEF1ZGl0PC9hPiDigLogQ29uZmlndXJlXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBUaXRsZSArIGFjdGlvbnMgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNmLWhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNmLWhlYWRlci10ZXh0XCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdGl0bGUgY2Ytc2stdGl0bGVcIiAqbmdJZj1cImxvYWRpbmdcIj48L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi10aXRsZVwiICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBhdWRpdE5hbWUgfHwgJ0F1ZGl0JyB9fTwvZGl2PlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImNmLWRlc2NcIiBwbGFjZWhvbGRlcj1cIkVudGVyIEF1ZGl0IERlc2NyaXB0aW9uXCIgWyhuZ01vZGVsKV09XCJkZXNjcmlwdGlvblwiPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGNmLXB1Ymxpc2hcIiBbZGlzYWJsZWRdPVwiIWNhblNhdmVcIiBbdGl0bGVdPVwic2F2ZUJsb2NrZWRSZWFzb24gfHwgcHVibGlzaEJsb2NrZWRSZWFzb25cIiAoY2xpY2spPVwicHVibGlzaCgpXCI+XHJcbiAgICAgIHt7IHNhdmluZyA/ICdTYXZpbmfigKYnIDogKHB1Ymxpc2hlZCA/ICdTYXZlICYgUHVibGlzaCcgOiAnUHVibGlzaCcpIH19XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBjZi1kcmFmdFwiIFtkaXNhYmxlZF09XCIhY2FuU2F2ZVwiIFt0aXRsZV09XCJzYXZlQmxvY2tlZFJlYXNvblwiIChjbGljayk9XCJzYXZlRHJhZnQoKVwiPlNhdmUgYXMgRHJhZnQ8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImNmLWVycm9yIGNmLWVycm9yLS1wYWdlXCIgKm5nSWY9XCJsb2FkRXJyb3JcIj5cclxuICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgIHt7IGxvYWRFcnJvciB9fVxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIENoaXAgcGlja2VyOiBjaGlwcyArIGlucHV0ICsgc3VnZ2VzdGlvbiBsaXN0IChvbmUgdGVtcGxhdGUsIHVzZWQgZm9yIGV2ZXJ5IHVzZXIgbGlzdCkgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNjaGlwUGlja2VyIGxldC1saXN0PVwibGlzdFwiIGxldC1sYXJnZT1cImxhcmdlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtY2hpcGJveFwiIFtjbGFzcy5jZi1jaGlwYm94LS1sZ109XCJsYXJnZVwiIFtjbGFzcy5pcy1vcGVuXT1cIm9wZW5DaGlwcyA9PT0gbGlzdFwiIChjbGljayk9XCJmb2N1c0NoaXBzKGxpc3QsICRldmVudClcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGlwXCIgW2NsYXNzLmNmLWNoaXAtLWxnXT1cImxhcmdlXCIgKm5nRm9yPVwibGV0IHUgb2YgY2hpcHNPZihsaXN0KTsgbGV0IGkgPSBpbmRleFwiIFt0aXRsZV09XCJ1LmVcIj5cclxuICAgICAgICA8c3BhbiBbY2xhc3NdPVwibGFyZ2UgPyAnY2YtY2hpcC10YWcnIDogJ2NmLWNoaXAtaW5pJ1wiPnt7IHUuaSB9fTwvc3Bhbj57eyB1Lm4gfX1cclxuICAgICAgICA8YSBjbGFzcz1cImNmLWNoaXAteFwiIChjbGljayk9XCJyZW1vdmVDaGlwKGxpc3QsIGkpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImNmLWNoaXAtaW5wdXRcIiBbY2xhc3MuY2YtY2hpcC1pbnB1dC0tbGddPVwibGFyZ2VcIiBwbGFjZWhvbGRlcj1cIkFkZCB1c2VyLi4uXCJcclxuICAgICAgICBbbmdNb2RlbF09XCJkcmFmdE9mKGxpc3QpXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0RHJhZnQobGlzdCwgJGV2ZW50KVwiIChmb2N1cyk9XCJmb2N1c0NoaXBzKGxpc3QsICRldmVudClcIiAoa2V5dXAuZW50ZXIpPVwiYWRkQ2hpcChsaXN0KVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3VnZ2VzdFwiICpuZ0lmPVwib3BlbkNoaXBzID09PSBsaXN0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN1Z2dlc3QtaXRlbVwiICpuZ0Zvcj1cImxldCB1IG9mIHN1Z2dlc3Rpb25zKGxpc3QpXCIgKGNsaWNrKT1cImFkZFN1Z2dlc3Rpb24obGlzdCwgdSwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGlwLWluaVwiPnt7IHUuaSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2Ytc3VnZ2VzdC1uYW1lXCI+e3sgdS5uIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1zdWdnZXN0LW1haWxcIj57eyB1LmUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN1Z2dlc3QtZW1wdHlcIiAqbmdJZj1cIiFzdWdnZXN0aW9ucyhsaXN0KS5sZW5ndGhcIj5cclxuICAgICAgICAgIHt7IHVzZXJzLmxlbmd0aCA/ICdObyBtYXRjaGluZyB1c2VyJyA6ICdObyB1c2VycyBmb3IgdGhpcyBjbGllbnQnIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPCEtLSBEcm9wZG93bjogc3R5bGVkIGxpa2UgdGhlIHByb3RvdHlwZSBpbnN0ZWFkIG9mIHRoZSBicm93c2VyJ3MgbmF0aXZlIHNlbGVjdCAtLT5cclxuICA8bmctdGVtcGxhdGUgI2Ryb3Bkb3duIGxldC1rZXk9XCJrZXlcIiBsZXQtb3B0aW9ucz1cIm9wdGlvbnNcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiY2Ytc2VsZWN0XCIgW2NsYXNzLmlzLW9wZW5dPVwib3BlblNlbGVjdCA9PT0ga2V5XCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc2VsZWN0LWJ0blwiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Qoa2V5LCAkZXZlbnQpXCI+XHJcbiAgICAgICAge3sgc2VsZWN0TGFiZWwoa2V5LCBvcHRpb25zKSB9fVxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNiA5IDEyIDE1IDE4IDlcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJvcGVuU2VsZWN0ID09PSBrZXlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc2VsZWN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgbyBvZiBvcHRpb25zXCIgW2NsYXNzLmlzLW9uXT1cImlzUGlja2VkKGtleSwgbylcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInBpY2soa2V5LCBvLCAkZXZlbnQpXCI+e3sgby5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvc3Bhbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY2YtYm9keVwiICpuZ0lmPVwiIWxvYWRFcnJvclwiPlxyXG4gICAgPCEtLSBTZWN0aW9uIHRyZWUgLS0+XHJcbiAgICA8YXNpZGUgY2xhc3M9XCJjZi1sZWZ0XCI+XHJcbiAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cImxvYWRpbmdcIiBbcm93c109XCIzXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtbGVmdC10aXRsZVwiPnt7IGF1ZGl0TmFtZSB8fCAnQXVkaXQnIH19PC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiICpuZ0lmPVwiIXNlY3Rpb25zLmxlbmd0aFwiPk5vIHF1ZXN0aW9ucyB5ZXQ8L2Rpdj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBzZWN0aW9uc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zZWN0aW9uXCIgW2NsYXNzLmlzLW9wZW5dPVwicy5vcGVuXCIgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24ocylcIj5cclxuICAgICAgICAgIHt7IHMubGFiZWwgfX1cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcnVsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hldlwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIFtjbGFzcy5yb3RhdGVdPVwiIXMub3BlblwiPlxyXG4gICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pdGVtc1wiICpuZ0lmPVwicy5vcGVuICYmIHMuaXRlbXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdCBvZiBzLml0ZW1zXCI+e3sgaXQgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8IS0tIE5vIFNjaGVkdWxlIGJsb2NrIChRQSAxMCBPY3QpOiBhdWRpdHMgaGF2ZSBubyBvbmUtdGltZSAvIHJlcGVhdCBzY2hlZHVsZSBoZXJlOyB2aXNpdHMgY29tZSBmcm9tIFNjaGVkdWxlcy4gLS0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9hc2lkZT5cclxuXHJcbiAgICA8IS0tIENvbmZpZ3VyYXRpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtcmlnaHRcIj5cclxuXHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2YtY2FyZFwiICpuZ0lmPVwibG9hZGluZ1wiPlxyXG4gICAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciBbcm93c109XCI0XCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcblxyXG4gICAgICA8IS0tID09PT09IEFkdmFuY2UgQ29uZmlndXJhdGlvbiA9PT09PSAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjZi1jYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJsb2NrLWhlYWRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5BZHZhbmNlIENvbmZpZ3VyYXRpb248L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJ1bGVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZXZcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNiA5IDEyIDE1IDE4IDlcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEF1ZGl0IE93bmVyIC0tPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWxcIj5BdWRpdCBPd25lcjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5Pd25lcnMgZ2V0IGFjY2VzcyB0byBtYW5hZ2UgdGhlIGF1ZGl0PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1maWVsZFwiPkNhbiBiZSBtYW5hZ2VkIGJ5PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ293bmVycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQXBwcm92ZXIgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5BcHByb3Zlcjwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cImFwcHJvdmVyT25cIiAoY2xpY2spPVwidG9nZ2xlQXBwcm92ZXIoKVwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPkJ5IGVuYWJsaW5nLCB0aGUgdXNlcnMgd2lsbCBiZSBhYmxlIHRvIGFwcHJvdmUgdGhlIGF1ZGl0PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXJvd1wiICpuZ0lmPVwiYXBwcm92ZXJPblwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1maWVsZFwiPlRvIGJlIGFwcHJvdmVkIGJ5PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ2FwcHJvdmVycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJhcHByb3ZlckVycm9yXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICB7eyBhcHByb3ZlckVycm9yIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWluZm8gY2YtaW5mby0td3JhcFwiICpuZ0lmPVwiIWFwcHJvdmVyT24gJiYgYXBwcm92ZXJzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICBBcHByb3ZlciBpcyBvZmYsIHNvIHRoZSB7eyBhcHByb3ZlcnMubGVuZ3RoIH19IGFwcHJvdmVye3sgYXBwcm92ZXJzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnIH19IGFkZGVkIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHlvdSBzYXZlLiBUdXJuIEFwcHJvdmVyIGJhY2sgb24gdG8ga2VlcCB7eyBhcHByb3ZlcnMubGVuZ3RoID09PSAxID8gJ2l0JyA6ICd0aGVtJyB9fS5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mbyBjZi1pbmZvLS13cmFwXCIgKm5nSWY9XCIhYXBwcm92ZXJPbiAmJiAhYXBwcm92ZXJzLmxlbmd0aFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICBBcHByb3ZlciBpcyBvZmYsIHNvIHN1Ym1pdHRlZCBhdWRpdHMgYXJlIG5vdCBzZW50IGZvciBhcHByb3ZhbC4gVHVybiBpdCBvbiB0byBhZGQgYXBwcm92ZXJzIG9yIHRvIHNlbmQgZmxhZ3MgYW5kIHJlcG9ydHMgdG8gdGhlbS5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBSZW1pbmRlciAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPlJlbWluZGVyPC9zcGFuPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwicmVtaW5kZXJPblwiIChjbGljayk9XCJ0b2dnbGVSZW1pbmRlcigpXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+QnkgZW5hYmxpbmcsIHRoZSB1c2VycyB3aWxsIGJlIHJlbWluZGVkIGluIHRoZSBzZWxlY3RlZCBpbnRlcnZhbDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbm5lclwiICpuZ0lmPVwicmVtaW5kZXJPblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubGluZVwiPlxyXG4gICAgICAgICAgICBOb3RpZnkgdXNlciBiZWZvcmVcclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1yZW1pbmRlclwiICpuZ0Zvcj1cImxldCBtIG9mIHJlbWluZGVyczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiY2YtcmVtaW5kZXItc2VsZWN0XCIgW3ZhbHVlXT1cIm1cIiBbb3B0aW9uc109XCJyZW1pbmRlck9wdHNbaV0gfHwgW11cIiBbc2VhcmNoYWJsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidSZW1pbmRlciAnICsgKGkgKyAxKSArICcgaW4gbWludXRlcydcIiAoY2hhbmdlZCk9XCJzZXRSZW1pbmRlcihpLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImNmLWNoaXAteFwiICpuZ0lmPVwicmVtaW5kZXJzLmxlbmd0aCA+IDFcIiB0aXRsZT1cIlJlbW92ZSByZW1pbmRlclwiIChjbGljayk9XCJyZW1vdmVSZW1pbmRlcihpKVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjVcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2YtaWNvbi1idG5cIiAqbmdJZj1cInJlbWluZGVycy5sZW5ndGggPCBtYXhSZW1pbmRlcnNcIiB0aXRsZT1cIkFkZCByZW1pbmRlclwiIChjbGljayk9XCJhZGRSZW1pbmRlcigpXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjVcIiB4Mj1cIjEyXCIgeTI9XCIxOVwiPjwvbGluZT48bGluZSB4MT1cIjVcIiB5MT1cIjEyXCIgeDI9XCIxOVwiIHkyPVwiMTJcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mb1wiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICBTZW5kIGFsZXJ0cyB7eyByZW1pbmRlclN1bW1hcnkgfX0gbWlucyBiZWZvcmUgdGhlIGF1ZGl0IGVuZCB0aW1lXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBOb3RpZnkgRmxhZ3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5Ob3RpZnkgRmxhZ3M8L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJub3RpZnlGbGFnc09uXCIgKGNsaWNrKT1cInRvZ2dsZU5vdGlmeUZsYWdzKClcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5CeSBlbmFibGluZywgYWxsIGZsYWdzIHdpbGwgYmUgc2VudCBhcyBhbiBlbWFpbDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub3RpZnlGbGFnc09uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtY2hlY2tzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2tzLWxhYmVsXCI+U2VuZCBUbzwvc3Bhbj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiBbY2xhc3MuaXMtYmxvY2tlZF09XCIhaGFzQXBwcm92ZXJzICYmICFub3RpZnlTZW5kQXBwcm92ZXJcIiAoY2xpY2spPVwidG9nZ2xlU2VuZEFwcHJvdmVyKCdub3RpZnlTZW5kQXBwcm92ZXInKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cIm5vdGlmeVNlbmRBcHByb3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIm5vdGlmeVNlbmRBcHByb3ZlclwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5BcHByb3ZlclxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIChjbGljayk9XCJub3RpZnlTZW5kQ3VzdG9tID0gIW5vdGlmeVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJub3RpZnlTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwibm90aWZ5U2VuZEN1c3RvbVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5DdXN0b21cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdGlmeVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ25vdGlmeVVzZXJzJywgbGFyZ2U6IGZhbHNlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJub3RpZnlGbGFnc0Vycm9yXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyBub3RpZnlGbGFnc0Vycm9yIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBOb3RpZnkgb24gUmVjdXJyaW5nIEZsYWdzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+Tm90aWZ5IG9uIFJlY3VycmluZyBGbGFnczwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cInJlY3VycmluZ0ZsYWdzT25cIiAoY2xpY2spPVwidG9nZ2xlUmVjdXJyaW5nRmxhZ3MoKVwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPldoZW4gZW5hYmxlZCwgZW1haWxzIGFyZSBzZW50IGZvciByZWN1cnJpbmcgZmxhZ3MgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbm5lclwiICpuZ0lmPVwicmVjdXJyaW5nRmxhZ3NPblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubGluZVwiPlxyXG4gICAgICAgICAgICBTZW5kIEVtYWlsIGlmIHRoZSBzYW1lIHF1ZXN0aW9uIGlzIGZsYWdnZWRcclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3duOyBjb250ZXh0OiB7IGtleTogJ3JlY3VycmluZ1RocmVzaG9sZCcsIG9wdGlvbnM6IHRocmVzaG9sZE9wdHMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICB0aW1lcyBieSB0aGUgc2FtZSBzdG9yZVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mb1wiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICBPbmNlIHRoZSB0aHJlc2hvbGQgaXMgcmVhY2hlZCBhbmQgYW4gZW1haWwgaXMgc2VudCwgdGhlIGZsYWcgY291bnQgcmVzZXRzIHRvIHplcm9cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWN1cnJpbmdGbGFnc09uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtY2hlY2tzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2tzLWxhYmVsXCI+U2VuZCBUbzwvc3Bhbj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiBbY2xhc3MuaXMtYmxvY2tlZF09XCIhaGFzQXBwcm92ZXJzICYmICFyZWN1cnJpbmdTZW5kQXBwcm92ZXJcIiAoY2xpY2spPVwidG9nZ2xlU2VuZEFwcHJvdmVyKCdyZWN1cnJpbmdTZW5kQXBwcm92ZXInKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cInJlY3VycmluZ1NlbmRBcHByb3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInJlY3VycmluZ1NlbmRBcHByb3ZlclwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5BcHByb3ZlclxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIChjbGljayk9XCJ0b2dnbGVSZWN1cnJpbmdDdXN0b20oKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cInJlY3VycmluZ1NlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJyZWN1cnJpbmdTZW5kQ3VzdG9tXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPkN1c3RvbVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIChjbGljayk9XCJyZWN1cnJpbmdTYW1lQXNOb3RpZnkgPSAhcmVjdXJyaW5nU2FtZUFzTm90aWZ5XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVjay1ib3hcIiBbY2xhc3MuaXMtb25dPVwicmVjdXJyaW5nU2FtZUFzTm90aWZ5XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicmVjdXJyaW5nU2FtZUFzTm90aWZ5XCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlVzZSBzYW1lIHVzZXJzIGZyb20gTm90aWZ5IEZsYWdzXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWN1cnJpbmdTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwUGlja2VyOyBjb250ZXh0OiB7IGxpc3Q6ICdyZWN1cnJpbmdVc2VycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmZvXCIgKm5nSWY9XCJyZWN1cnJpbmdTYW1lQXNOb3RpZnlcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgbm90aWZ5UmVjaXBpZW50c0xhYmVsIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1lcnJvclwiICpuZ0lmPVwicmVjdXJyaW5nRmxhZ3NFcnJvclwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgcmVjdXJyaW5nRmxhZ3NFcnJvciB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGFpbHkgcmVwb3J0IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+RW5hYmxlIC0gRGFpbHkgUmVwb3J0PC9zcGFuPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwiZGFpbHlSZXBvcnRPblwiIChjbGljayk9XCJ0b2dnbGVEYWlseVJlcG9ydCgpXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+QnkgRW5hYmxpbmcsIGNvbXBsaWFuY2Ugc2NvcmUgd2lsbCBiZSBzZW50IGFzIGFuIGVtYWlsIHRvIHRoZSBhYm92ZSB1c2VyczwvZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYWlseVJlcG9ydE9uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtY2hlY2tzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2tzLWxhYmVsXCI+U2VuZCBUbzwvc3Bhbj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiBbY2xhc3MuaXMtYmxvY2tlZF09XCIhaGFzQXBwcm92ZXJzICYmICFkYWlseVNlbmRBcHByb3ZlclwiIChjbGljayk9XCJ0b2dnbGVTZW5kQXBwcm92ZXIoJ2RhaWx5U2VuZEFwcHJvdmVyJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJkYWlseVNlbmRBcHByb3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRhaWx5U2VuZEFwcHJvdmVyXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPkFwcHJvdmVyXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLWNoZWNrXCIgKGNsaWNrKT1cImRhaWx5U2VuZEN1c3RvbSA9ICFkYWlseVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJkYWlseVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkYWlseVNlbmRDdXN0b21cIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+Q3VzdG9tXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYWlseVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJ1bGtiYXJcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwib3BlbkRhaWx5QnVsaygpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgQnVsayBVcGxvYWRcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwUGlja2VyOyBjb250ZXh0OiB7IGxpc3Q6ICdkYWlseVVzZXJzJywgbGFyZ2U6IGZhbHNlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiAoY2xpY2spPVwic2hhcmVQb3N0QXBwcm92YWwgPSAhc2hhcmVQb3N0QXBwcm92YWxcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVjay1ib3hcIiBbY2xhc3MuaXMtb25dPVwic2hhcmVQb3N0QXBwcm92YWxcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwic2hhcmVQb3N0QXBwcm92YWxcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5TaGFyZSBSZXBvcnQgUG9zdCBBcHByb3ZhbFxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1lcnJvclwiICpuZ0lmPVwiZGFpbHlSZXBvcnRFcnJvclwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgZGFpbHlSZXBvcnRFcnJvciB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRXhwb3J0IHN1Ym1pc3Npb246IFRhbmdvIHVzZXJzIG9ubHksIGFzIHRoZSB2MSBDb25maWd1cmUgKGl0cyBzdG9yZWQgdmFsdWUgaXMga2VwdCBmb3IgZXZlcnlvbmUgZWxzZSkuIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ncmlkMlwiICpuZ0lmPVwiYWNjZXNzLmlzVGFuZ29cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0tdGlnaHRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+RXhwb3J0IFN1Ym1pc3Npb248L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwiZXhwb3J0U3VibWlzc2lvbk9uXCIgKGNsaWNrKT1cImV4cG9ydFN1Ym1pc3Npb25PbiA9ICFleHBvcnRTdWJtaXNzaW9uT25cIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPkVuYWJsZSB0aGlzIHRvIGFsbG93IGF1ZGl0IHN1Ym1pdHRlcnMgdG8gZG93bmxvYWQgdGhlaXIgc3VibWlzc2lvbiBhcyBhIFBERiBmaWxlPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBSZWRvIHZhbGlkaXR5IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ncmlkMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbFwiPlJlZG8gVmFsaWRpdHk8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubGluZVwiPlxyXG4gICAgICAgICAgICAgIFJlZG8gdmFsaWQgZm9yXHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3duOyBjb250ZXh0OiB7IGtleTogJ3JlZG9WYWxpZEZvcicsIG9wdGlvbnM6IHJlZG9EYXlPcHRzIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICBEYXkgZnJvbSBSZWRvIGNyZWF0aW9uXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQXV0byBjcmVhdGUgdGFzayAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPkF1dG8gQ3JlYXRlIFRhc2sgZm9yIEZsYWdzPC9zcGFuPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwiYXV0b0NyZWF0ZVRhc2tPblwiIChjbGljayk9XCJhdXRvQ3JlYXRlVGFza09uID0gIWF1dG9DcmVhdGVUYXNrT25cIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5CeSBlbmFibGluZywgYSB0YXNrIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgZXZlcnkgZmxhZ2dlZCBxdWVzdGlvbiBpbiB0aGUgYXVkaXQ8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBXaG8gZ2V0cyB0aGUgdGFzayBhbmQgaG93IGxvbmcgaXQgc3RheXMgb3BlbiAoYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWF1dG90YXNrXCIgKm5nSWY9XCJhdXRvQ3JlYXRlVGFza09uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYXV0b3Rhc2stdGl0bGVcIj5UYXNrIEFzc2lnbmVlPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPkNob29zZSB3aG8gdGhlIGZsYWdnZWQgdGFzayBpcyBhc3NpZ25lZCB0bzwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWF1dG90YXNrLWNob2ljZXNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1jaG9pY2VcIiBbY2xhc3MuaXMtb25dPVwidGFza0Fzc2lnbmVlID09PSAnc3VibWl0dGVyJ1wiIChjbGljayk9XCJ0YXNrQXNzaWduZWUgPSAnc3VibWl0dGVyJ1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwidGFza0Fzc2lnbmVlID09PSAnc3VibWl0dGVyJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaG9pY2UtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaG9pY2UtdGl0bGVcIj5BdWRpdCBTdWJtaXR0ZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNob2ljZS1zdWJcIj5UYXNrIGlzIGFzc2lnbmVkIHRvIHRoZSB1c2VyIHdobyBmaWxsZWQgdGhlIGF1ZGl0PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2YtY2hvaWNlXCIgW2NsYXNzLmlzLW9uXT1cInRhc2tBc3NpZ25lZSA9PT0gJ3N0b3JlJ1wiIChjbGljayk9XCJ0YXNrQXNzaWduZWUgPSAnc3RvcmUnXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJ0YXNrQXNzaWduZWUgPT09ICdzdG9yZSdcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hvaWNlLXRleHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hvaWNlLXRpdGxlXCI+U3RvcmUgVXNlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hvaWNlLXN1YlwiPlRhc2sgaXMgYXNzaWduZWQgdG8gdGhlIHVzZXIgbWFwcGVkIHRvIHRoZSBmbGFnZ2VkIHN0b3JlPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1hdXRvdGFzay10aXRsZVwiPlRhc2sgVmFsaWRpdHk8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1hdXRvdGFzay12YWxpZGl0eVwiPlxyXG4gICAgICAgICAgICA8c3Bhbj5UYXNrIHZhbGlkIGZvcjwvc3Bhbj5cclxuICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJjZi12YWxpZGl0eS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cInRhc2tWYWxpZGl0eVwiIFtvcHRpb25zXT1cInRhc2tWYWxpZGl0eU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIFtzZWFyY2hhYmxlXT1cImZhbHNlXCIgYXJpYUxhYmVsPVwiVGFzayB2YWxpZGl0eSBpbiBkYXlzXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8c3Bhbj5kYXlzIGZyb20gdGFzayBjcmVhdGlvbjwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8IS0tID09PT09IEF1ZGl0IENvbmZpZ3VyYXRpb24gPT09PT0gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi1kaXZpZGVyLWhlYWRcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWJsb2NrLXRpdGxlXCI+QXVkaXQgQ29uZmlndXJhdGlvbjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJ1bGVcIj48L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjZi1jYXJkIGNmLWNhcmQtLWxnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJsb2NrLXRpdGxlXCI+U3VibWlzc2lvbiAmYW1wOyBWaXNpYmlsaXR5PC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gY2YtYm94LS1vcGVuOiB0aGUgZGlzcHV0ZS13aW5kb3cgYW5kIHJlc3BvbnNlLWRlbGF5IG1lbnVzIG11c3Qgbm90IGJlIGNsaXBwZWQgYnkgdGhlIGJveCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94IGNmLWJveC0tb3BlblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveC1yb3dcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2ggY2Ytc3dpdGNoLS10b3BcIiBbY2xhc3MuaXMtb25dPVwic2hvd1Jlc3BvbnNlSW5BcHBcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzaG93UmVzcG9uc2VJbkFwcCA9ICFzaG93UmVzcG9uc2VJbkFwcFwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS14c1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbFwiPlNob3cgUmVzcG9uc2UgaW4gTW9iaWxlIEFwcDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+QnkgZW5hYmxpbmcgdGhpcyBvcHRpb24sIHN0b3JlIHVzZXJzIGNhbiB2aWV3IHRoZSBhdWRpdCByZXNwb25zZSBpbiB0aGUgTW9iaWxlIEFwcC48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94LXN1YlwiICpuZ0lmPVwic2hvd1Jlc3BvbnNlSW5BcHBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS14c1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbC1zbVwiPlJlc3BvbnNlIFZpc2liaWxpdHk8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPkNob29zZSB3aGVuIHRoZSByZXNwb25zZSBiZWNvbWVzIHZpc2libGUgdG8gc3RvcmUgdXNlcnM8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytb3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwicmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncHJlJ1wiIChjbGljayk9XCJyZXNwb25zZVZpc2liaWxpdHkgPSAncHJlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJyZXNwb25zZVZpc2liaWxpdHkgPT09ICdwcmUnXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0tc21cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsLXNtXCI+UHJlLWFwcHJvdmFsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+VGhlIGF1ZGl0IHJlc3BvbnNlIHdpbGwgYmUgdmlzaWJsZSB0byBzdG9yZSB1c2VycyBiZWZvcmUgaXQgaXMgYXBwcm92ZWQuPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmxpbmUgY2YtaW5saW5lLS10b3BcIj5cclxuICAgICAgICAgICAgICAgICAgICBTaG93IHJlc3BvbnNlXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3duOyBjb250ZXh0OiB7IGtleTogJ3Jlc3BEZWxheScsIG9wdGlvbnM6IHJlc3BEZWxheU9wdHMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyIHN1Ym1pc3Npb25cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cInJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3Bvc3QnXCIgKGNsaWNrKT1cInJlc3BvbnNlVmlzaWJpbGl0eSA9ICdwb3N0J1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJyZXNwb25zZVZpc2liaWxpdHkgPT09ICdwb3N0J1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXNtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbC1zbVwiIFtjbGFzcy5jZi1tdXRlZF09XCJyZXNwb25zZVZpc2liaWxpdHkgIT09ICdwb3N0J1wiPlBvc3QtYXBwcm92YWw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5PbmNlIHRoZSByZXNwb25zZSBpcyBhcHByb3ZlZCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc3BsYXllZCBpbiB0aGUgTW9iaWxlIEFwcC4gU3RvcmUgdXNlcnMgY2Fubm90IHJhaXNlIGEgZGlzcHV0ZS48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3gtc2VwXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3ByZSdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3gtcm93IGNmLWJveC1yb3ctLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoIGNmLXN3aXRjaC0tdG9wXCIgW2NsYXNzLmlzLW9uXT1cImRpc3B1dGVPblwiIChjbGljayk9XCJkaXNwdXRlT24gPSAhZGlzcHV0ZU9uXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXhzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsLXNtXCI+RGlzcHV0ZSBDb25maWd1cmF0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0td3JhcFwiPldoZW4gZW5hYmxlZCwgdGhlIHN0b3JlIHRlYW0gY2FuIHJhaXNlIGEgZGlzcHV0ZSBhZ2FpbnN0IHRoZSBhdWRpdG9yJ3Mgc3VibWlzc2lvbiBvbmNlIHRoZSByZXNwb25zZSBiZWNvbWVzIHZpc2libGUgdG8gdGhlbS48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3ggY2YtYm94LS1uZXN0ZWRcIiAqbmdJZj1cImRpc3B1dGVPblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5saW5lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgRGlzcHV0ZSB3aW5kb3dcclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd247IGNvbnRleHQ6IHsga2V5OiAnZGlzcHV0ZVdpbmRvdycsIG9wdGlvbnM6IGRpc3BXaW5kb3dPcHRzIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHdoZW4gdGhlIHJlc3BvbnNlIGJlY29tZXMgdmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWluZm8gY2YtaW5mby0td3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBEaXNwdXRlcyByYWlzZWQgaW5zaWRlIHRoaXMgd2luZG93IGdvIHRvIHRoZSBhcHByb3Zlci4gQXBwcm92ZWQgZGlzcHV0ZXMgcmV2aXNlIHRoZSBhbnN3ZXIgYW5kIHRoZSBjb21wbGlhbmNlIHNjb3JlLlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCIhaGFzQXBwcm92ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBObyBhcHByb3ZlciBpcyBzZXQsIHNvIG5vIG9uZSBjYW4gcmV2aWV3IGRpc3B1dGVzLiBUdXJuIG9uIEFwcHJvdmVyIGFuZCBhZGQgYW4gYXBwcm92ZXIuXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3Bvc3QnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXNtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbC1zbSBjZi1tdXRlZFwiPkRpc3B1dGUgQ29uZmlndXJhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mbyBjZi1pbmZvLS13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIERpc3B1dGVzIGFyZSBub3QgYXZhaWxhYmxlIHdoZW4gcmVzcG9uc2VzIGFyZSBzaG93biBwb3N0LWFwcHJvdmFsLlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFByZS1zdWJtaXNzaW9uIGFjY2VzcyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94IGNmLWJveC0tcGFkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+UHJlLVN1Ym1pc3Npb24gQWNjZXNzPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJwcmVTdWJtaXNzaW9uQWNjZXNzT25cIiAoY2xpY2spPVwicHJlU3VibWlzc2lvbkFjY2Vzc09uID0gIXByZVN1Ym1pc3Npb25BY2Nlc3NPblwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0td3JhcFwiPlVzZXJzIGFkZGVkIGhlcmUgY2FuIHZpZXcgT3BlbiBhbmQgSW4gUHJvZ3Jlc3MgYXVkaXRzIHVudGlsIHN1Ym1pc3Npb24uIFRoZSBTY2hlZHVsZSBJbmZvIHRhYiBpcyBhbHNvIHZpc2libGUgb25seSB0byB0aGVzZSB1c2Vycy48L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcmVTdWJtaXNzaW9uQWNjZXNzT25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXJvdyBjZi1yb3ctLXRvcFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtZmllbGRcIj5WaXNpYmxlIHRvPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwUGlja2VyOyBjb250ZXh0OiB7IGxpc3Q6ICdwcmVTdWJtaXNzaW9uVXNlcnMnLCBsYXJnZTogZmFsc2UgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yIGNmLWVycm9yLS1pbmRlbnRcIiAqbmdJZj1cInByZVN1Ym1pc3Npb25FbXB0eVwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgQWRkIGF0IGxlYXN0IG9uZSB1c2VyXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDwhLS0gPT09PT0gU2NvcmluZyA9PT09PSAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjZi1jYXJkIGNmLWNhcmQtLWxnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJsb2NrLXRpdGxlXCI+U2NvcmluZzwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3ggY2YtYm94LS1wYWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5QYXNzL0ZhaWwgU2NvcmUgU2V0dXA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cInBhc3NGYWlsT25cIiAoY2xpY2spPVwicGFzc0ZhaWxPbiA9ICFwYXNzRmFpbE9uXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS13cmFwXCI+U2V0IHRoZSBjb21wbGlhbmNlIHNjb3JlIGFuIGF1ZGl0IG11c3QgcmVhY2ggdG8gYmUgbWFya2VkIHt7IHBhc3NMYWJlbCB9fS4gQW55dGhpbmcgYmVsb3cgaXQgaXMgbWFya2VkIHt7IGZhaWxMYWJlbCB9fS48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1yb3cgY2Ytcm93LS13cmFwIGNmLXJvdy0tdG9wXCIgKm5nSWY9XCJwYXNzRmFpbE9uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtZmllbGRcIj5NaW5pbXVtIHNjb3JlIHRvIHt7IHBhc3NMYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtbnVtXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCIgWyhuZ01vZGVsKV09XCJwYXNzVGhyZXNob2xkXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4+JTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1waWxsIGNmLXBpbGwtLXBhc3NcIj57eyBwYXNzTGFiZWwgfX0g4omlIHt7IHBhc3NUaHJlc2hvbGQgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXBpbGwgY2YtcGlsbC0tZmFpbFwiPnt7IGZhaWxMYWJlbCB9fSAmbHQ7IHt7IHBhc3NUaHJlc2hvbGQgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDwhLS0gPT09PT0gQXBwcm92ZXIgQ29udHJvbHMgPT09PT0gLS0+XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2YtY2FyZCBjZi1jYXJkLS1sZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ibG9jay10aXRsZVwiPkFwcHJvdmVyIENvbnRyb2xzPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+RWRpdCBTdWJtaXR0ZWQgQXVkaXQ8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cImVkaXRTdWJtaXR0ZWRPblwiIChjbGljayk9XCJ0b2dnbGVFZGl0U3VibWl0dGVkKClcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+QWxsb3cgQXBwcm92ZXJzIHRvIGVkaXQgc3VibWl0dGVkIEF1ZGl0PC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdFN1Ym1pdHRlZE9uXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwUGlja2VyOyBjb250ZXh0OiB7IGxpc3Q6ICdlZGl0VXNlcnMnLCBsYXJnZTogdHJ1ZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1lcnJvclwiICpuZ0lmPVwiZWRpdFN1Ym1pdHRlZEVycm9yXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICB7eyBlZGl0U3VibWl0dGVkRXJyb3IgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZ3JpZDJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFja1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWxcIj5SZWRvIEV4dGVuc2lvbjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5saW5lXCI+XHJcbiAgICAgICAgICAgICAgRXh0ZW5kIHJlZG8gdXAgdG9cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd247IGNvbnRleHQ6IHsga2V5OiAncmVkb0V4dGVuc2lvbicsIG9wdGlvbnM6IHJlZG9FeHRlbnNpb25PcHRzIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICBEYXlzIHRpbGwgYXBwcm92YWxcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPCEtLSA9PT09PSBVc2VyIFZlcmlmaWNhdGlvbiA9PT09PSAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjZi1jYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJsb2NrLXRpdGxlXCI+VXNlciBWZXJpZmljYXRpb24gQ29uZmlndXJhdGlvbjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3ggY2YtYm94LS1yb3dcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoIGNmLXN3aXRjaC0tdG9wXCIgW2NsYXNzLmlzLW9uXT1cInJlcXVpcmVQaG90b1wiIChjbGljayk9XCJyZXF1aXJlUGhvdG8gPSAhcmVxdWlyZVBob3RvXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS14c1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWxcIj5SZXF1aXJlIFBob3RvIENhcHR1cmU8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5CeSBlbmFibGluZywgdXNlcnMgbXVzdCBjYXB0dXJlIHRoZWlyIHBob3RvIHRvIGNvbXBsZXRlIHN1Ym1pc3Npb248L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3ggY2YtYm94LS1yb3dcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoIGNmLXN3aXRjaC0tdG9wXCIgW2NsYXNzLmlzLW9uXT1cInJlcXVpcmVBY2tub3dsZWRnbWVudFwiIChjbGljayk9XCJyZXF1aXJlQWNrbm93bGVkZ21lbnQgPSAhcmVxdWlyZUFja25vd2xlZGdtZW50XCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS14c1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWxcIj5SZXF1aXJlIFVzZXIgQWNrbm93bGVkZ21lbnQ8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5CeSBlbmFibGluZywgdXNlcnMgbXVzdCB0eXBlIHRoZWlyIG5hbWUgYXMgYWNrbm93bGVkZ21lbnQgdG8gY29tcGxldGUgc3VibWlzc2lvbjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gRGFpbHkgUmVwb3J0ID4gQ3VzdG9tOiBidWxrIHVwbG9hZCB1c2VycyAoYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSdzIHBvcHVwKSAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGFpbHlCdWxrT3BlblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNmLWRsZy1iYWNrZHJvcFwiIChjbGljayk9XCJjbG9zZURhaWx5QnVsaygpXCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtZGxnXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwiY2YtZGxnLXRpdGxlXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY2YtZGxnLWljb25cIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtZGxnLXRpdGxlXCIgaWQ9XCJjZi1kbGctdGl0bGVcIj5CdWxrIFVwbG9hZDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtZGxnLXN0ZXBzXCI+XHJcbiAgICAgICAgPGRpdj5TdGVwIDEgLSA8YSBocmVmPVwiI1wiIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgZG93bmxvYWREYWlseVRlbXBsYXRlKClcIj5Eb3dubG9hZCB0aGUgdGVtcGxhdGUgaGVyZTwvYT48L2Rpdj5cclxuICAgICAgICA8ZGl2PlN0ZXAgMiAtIEFkZCB0aGUgRW1haWwgb2YgZXhpc3RpbmcgdXNlcnMgdG8gdGhlIHRlbXBsYXRlPC9kaXY+XHJcbiAgICAgICAgPGRpdj5TdGVwIDMgLSBVcGxvYWQgaXQgYmVsb3cgZm9yIHByb2Nlc3Npbmc8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi1kbGctbm90ZVwiPlxyXG4gICAgICAgICoqTm90ZSA6IE9ubHkgdGhlIEVtYWlsIGNvbHVtbiBpcyBjb25zaWRlcmVkIC0gdGhlIFVzZXJuYW1lIGlzIHRha2VuIGZyb20gdGhlIGV4aXN0aW5nIHVzZXIgbGlzdC5cclxuICAgICAgICBPbmx5IGV4aXN0aW5nIHVzZXJzIG9mIHRoaXMgY2xpZW50IGFyZSBhY2NlcHRlZC4gT24gdXBsb2FkLCBhbGwgdGhlIGV4aXN0aW5nIGRhdGEgd2lsbCBiZSByZXBsYWNlZC5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi1lcnJvclwiICpuZ0lmPVwiZGFpbHlCdWxrRXJyb3JzLmxlbmd0aFwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWRsZy1lcnJvcnNcIj5cclxuICAgICAgICAgIDxkaXY+VGhlIGZpbGUgd2FzIG5vdCB1cGxvYWRlZC4gRml4IHt7IGRhaWx5QnVsa0Vycm9ycy5sZW5ndGggPT09IDEgPyAndGhpcyByb3cnIDogJ3RoZXNlIHJvd3MnIH19IGFuZCB1cGxvYWQgYWdhaW46PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlIG9mIGRhaWx5QnVsa0Vycm9ycy5zbGljZSgwLCA1KVwiPnt7IGUgfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYWlseUJ1bGtFcnJvcnMubGVuZ3RoID4gNVwiPit7eyBkYWlseUJ1bGtFcnJvcnMubGVuZ3RoIC0gNSB9fSBtb3JlPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtZGxnLWZvb3RcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwiY2xvc2VEYWlseUJ1bGsoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGF2Mi1idG4tLXNtXCIgKGNsaWNrKT1cImRhaWx5QnVsa0ZpbGUuY2xpY2soKVwiPlVwbG9hZDwvYnV0dG9uPlxyXG4gICAgICAgIDxpbnB1dCAjZGFpbHlCdWxrRmlsZSB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIi54bHN4XCIgaGlkZGVuIChjaGFuZ2UpPVwib25EYWlseUJ1bGtGaWxlKCRldmVudClcIj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=