@piserve-tech/form-submission 1.3.223 → 1.3.225

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.
@@ -10,6 +10,7 @@ export class NavigationTabsComponent {
10
10
  this.cdr = cdr;
11
11
  this.pages = [];
12
12
  this.currentPageIndex = 0;
13
+ this.skipValidation = false;
13
14
  this.pageChanged = new EventEmitter();
14
15
  this.submitEmit = new EventEmitter();
15
16
  this.edit = false;
@@ -52,8 +53,11 @@ export class NavigationTabsComponent {
52
53
  setCurrentPage(index) {
53
54
  if (this.markAllQuestionsAsRequired) {
54
55
  const currentPageData = this.pages[this.currentPageIndex];
55
- const validationResponse = this.formValidationService.validateRequiredQuestions(currentPageData);
56
- if (validationResponse.isValid) {
56
+ let validationResponse = true;
57
+ if (!this.skipValidation) {
58
+ validationResponse = this.formValidationService.validateRequiredQuestions(currentPageData).isValid;
59
+ }
60
+ if (validationResponse) {
57
61
  this.pageChanged.emit(index);
58
62
  this.currentPageIndex = index;
59
63
  // Mark this page as loaded to avoid reloading
@@ -97,7 +101,7 @@ export class NavigationTabsComponent {
97
101
  }
98
102
  }
99
103
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NavigationTabsComponent, deps: [{ token: i1.FormValidationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
100
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NavigationTabsComponent, selector: "lib-navigation-tabs", inputs: { pages: "pages", currentPageIndex: "currentPageIndex", edit: "edit", acceptedLanguage: "acceptedLanguage", eligibleForSubmission: "eligibleForSubmission", pageDetails: "pageDetails", markAllQuestionsAsRequired: "markAllQuestionsAsRequired", skipMargin: "skipMargin", primaryColor: "primaryColor", secondaryColor: "secondaryColor", isActionTriggered: "isActionTriggered", submissionInProgress: "submissionInProgress" }, outputs: { pageChanged: "pageChanged", submitEmit: "submitEmit", subFormChange: "subFormChange", rowSetIndex: "rowSetIndex" }, ngImport: i0, template: "<div class=\"tab-inner-container\" [ngClass]=\"{ 'skip-margin': skipMargin}\">\n <div class=\"d-flex gap-2\">\n <div class=\"tab-navigation\" *ngIf=\"!hideTabs\">\n <ul class=\"nav nav-tabs navTabs\" id=\"myTab\" role=\"tablist\">\n <li\n class=\"nav-item\"\n role=\"presentation\"\n *ngFor=\"let page of pageDetails; let i = index; trackBy: trackByIndex\"\n [ngClass]=\"{'nav-item-ara': acceptedLanguage === 'ara', 'nav-item-default': acceptedLanguage !== 'ara'}\"\n >\n <button\n class=\"nav-link\"\n [title]=\"page.name\"\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n data-bs-custom-class=\"custom-tooltip\"\n [class.active]=\"i === currentPageIndex\"\n id=\"tab-{{ i }}\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-controls]=\"'content-' + i\"\n [attr.aria-selected]=\"i === currentPageIndex\"\n (click)=\"setCurrentPage(i)\"\n >\n {{ page.name }}\n </button>\n </li>\n </ul>\n </div>\n <div class=\"d-flex align-items-center\" *ngIf=\"showNavArrows\">\n <button class=\"nav-arrow\">\n <img src=\"assets/icons/left_arrow.svg\" alt=\"left arrow\"\n (click)=\"scrollTabs(-1)\">\n <img src=\"assets/icons/right_arrow.svg\" alt=\"right arrow\"\n (click)=\"scrollTabs(1)\">\n </button>\n </div>\n </div>\n\n\n\n <div class=\"tab-content pt-5 pb-3 px-1\" [attr.name]=\"pages[currentPageIndex].testElementName\">\n <ng-container *ngIf=\"pages[currentPageIndex]\">\n <div\n class=\"tab-pane fade show active\"\n id=\"content-{{ currentPageIndex }}\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"'tab-' + currentPageIndex\"\n >\n <div *ngIf=\"loadedPages[currentPageIndex]\">\n <div class=\"data-container\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"200\"\n (scrolled)=\"loadMoreData()\">\n <div *ngFor=\"let row of pages[currentPageIndex].rows\">\n <div class=\"margin d-flex\">\n <div *ngFor=\"let grid of row.grid\"\n [ngStyle]=\"{'width.%': (grid.element.count) * (100 / 12)}\">\n <lib-form-elements\n [grid]=\"grid\"\n [edit]=\"edit\"\n [acceptedLanguage]=\"acceptedLanguage\"\n [pages]=\"pages\"\n (subFormChange)=\"updateSubFormWithSubmissions($event)\"\n ></lib-form-elements>\n </div>\n </div>\n </div>\n </div>\n <div class=\"footerButton d-flex justify-content-between align-items-center me-4 ms-4 position-relative\">\n <!-- Hover detection container -->\n <div [ngStyle]=\"{ display: currentPageIndex === pageDetails.length - 1 ? 'block' : 'none' }\" id=\"captcha-container\"></div>\n <div\n class=\"button-container position-relative\"\n (mouseenter)=\"showTooltip = true\"\n (mouseleave)=\"showTooltip = false\"\n >\n\n <div *ngIf=\"currentPageIndex == pageDetails.length - 1\">\n <button\n *ngIf=\"!isActionTriggered\"\n class=\"btn rounded-pill submitButton text-white\"\n [ngStyle]=\"{ 'background-color': primaryColor ? primaryColor: '#084fff' }\"\n type=\"button\"\n (click)=\"submitForm()\"\n [disabled]=\"!eligibleForSubmission.status || submissionInProgress\"\n >\n <ng-container *ngIf=\"submissionInProgress; else showSubmitText\">\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>\n Submitting...\n </ng-container>\n <ng-template #showSubmitText>\n Submit\n </ng-template>\n </button>\n\n <div *ngIf=\"showTooltip && !eligibleForSubmission.status\" class=\"custom-tooltip\">\n {{eligibleForSubmission.message}}\n </div>\n </div>\n </div>\n\n </div>\n\n\n </div>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".tab-inner-container{width:100%;position:relative;padding:3rem}@media (max-width: 1024px){.tab-inner-container{padding-left:1rem;padding-right:1rem}}@media (max-width: 576px){.tab-inner-container{padding:2rem .5rem}}.skip-margin{padding:0}.custom-tooltip{visibility:hidden;position:absolute;top:-40px;right:0;background:#efefef;color:#7b7878;padding:8px 12px;border-radius:12px;box-shadow:0 4px 8px #00000026;font-size:14px;white-space:nowrap;z-index:10}.custom-tooltip.warning{background:linear-gradient(135deg,gold,#ffb400)}.fade-in{animation:fadeIn .3s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.footerButton:hover .custom-tooltip{visibility:visible}.navTabs{overflow-x:auto;overflow-y:hidden;flex-wrap:unset;margin:0 0 -1px!important;padding-right:0}.nav-item{background-color:#fff;border-radius:5px}.nav-item.nav-item-default{margin-right:.5%}.nav-item.nav-item-ara{margin-left:.5%}.nav-link{position:relative;margin-bottom:-2px;padding-left:25px;padding-right:25px}.nav-link:after{content:\"\";position:absolute;left:0;bottom:0;width:101%;height:6px;background:#efefef}.nav-link.active:after{display:none}.tab-content{background-color:#fff}.custom-tooltip{--bs-tooltip-bg: var(--bd-violet-bg);--bs-tooltip-color: var(--bs-white)}.tab-navigation{position:relative;display:flex;align-items:center;width:95%}.navTabs{display:flex;overflow-x:auto;scroll-behavior:smooth;white-space:nowrap;width:100%;padding:0;margin:0;scrollbar-width:none;-ms-overflow-style:none}.navTabs::-webkit-scrollbar{display:none}.nav-arrow{position:absolute;background:#fff;border:none;cursor:pointer;font-size:20px;font-weight:700;padding:5px 10px;z-index:1000;box-shadow:0 2px 5px #0003;width:45px;height:27px;gap:13px;display:flex;justify-content:center;align-items:center;border-radius:6px}.nav-arrow img{width:8px;height:15px}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:text-bottom;border:.15em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}@keyframes spinner-border{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.FormElementsComponent, selector: "lib-form-elements", inputs: ["currentPageIndex", "edit", "acceptedLanguage", "answer", "grid", "state", "pages"], outputs: ["subFormChange"] }, { kind: "directive", type: i4.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }] }); }
104
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NavigationTabsComponent, selector: "lib-navigation-tabs", inputs: { pages: "pages", currentPageIndex: "currentPageIndex", skipValidation: "skipValidation", edit: "edit", acceptedLanguage: "acceptedLanguage", eligibleForSubmission: "eligibleForSubmission", pageDetails: "pageDetails", markAllQuestionsAsRequired: "markAllQuestionsAsRequired", skipMargin: "skipMargin", primaryColor: "primaryColor", secondaryColor: "secondaryColor", isActionTriggered: "isActionTriggered", submissionInProgress: "submissionInProgress" }, outputs: { pageChanged: "pageChanged", submitEmit: "submitEmit", subFormChange: "subFormChange", rowSetIndex: "rowSetIndex" }, ngImport: i0, template: "<div class=\"tab-inner-container\" [ngClass]=\"{ 'skip-margin': skipMargin}\">\n <div class=\"d-flex gap-2\">\n <div class=\"tab-navigation\" *ngIf=\"!hideTabs\">\n <ul class=\"nav nav-tabs navTabs\" id=\"myTab\" role=\"tablist\">\n <li\n class=\"nav-item\"\n role=\"presentation\"\n *ngFor=\"let page of pageDetails; let i = index; trackBy: trackByIndex\"\n [ngClass]=\"{'nav-item-ara': acceptedLanguage === 'ara', 'nav-item-default': acceptedLanguage !== 'ara'}\"\n >\n <button\n class=\"nav-link\"\n [title]=\"page.name\"\n data-bs-toggle=\"tooltip\"\n data-bs-placement=\"top\"\n data-bs-custom-class=\"custom-tooltip\"\n [class.active]=\"i === currentPageIndex\"\n id=\"tab-{{ i }}\"\n type=\"button\"\n role=\"tab\"\n [attr.aria-controls]=\"'content-' + i\"\n [attr.aria-selected]=\"i === currentPageIndex\"\n (click)=\"setCurrentPage(i)\"\n >\n {{ page.name }}\n </button>\n </li>\n </ul>\n </div>\n <div class=\"d-flex align-items-center\" *ngIf=\"showNavArrows\">\n <button class=\"nav-arrow\">\n <img src=\"assets/icons/left_arrow.svg\" alt=\"left arrow\"\n (click)=\"scrollTabs(-1)\">\n <img src=\"assets/icons/right_arrow.svg\" alt=\"right arrow\"\n (click)=\"scrollTabs(1)\">\n </button>\n </div>\n </div>\n\n\n\n <div class=\"tab-content pt-5 pb-3 px-1\" [attr.name]=\"pages[currentPageIndex].testElementName\">\n <ng-container *ngIf=\"pages[currentPageIndex]\">\n <div\n class=\"tab-pane fade show active\"\n id=\"content-{{ currentPageIndex }}\"\n role=\"tabpanel\"\n [attr.aria-labelledby]=\"'tab-' + currentPageIndex\"\n >\n <div *ngIf=\"loadedPages[currentPageIndex]\">\n <div class=\"data-container\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"200\"\n (scrolled)=\"loadMoreData()\">\n <div *ngFor=\"let row of pages[currentPageIndex].rows\">\n <div class=\"margin d-flex\">\n <div *ngFor=\"let grid of row.grid\"\n [ngStyle]=\"{'width.%': (grid.element.count) * (100 / 12)}\">\n <lib-form-elements\n [grid]=\"grid\"\n [edit]=\"edit\"\n [acceptedLanguage]=\"acceptedLanguage\"\n [pages]=\"pages\"\n (subFormChange)=\"updateSubFormWithSubmissions($event)\"\n ></lib-form-elements>\n </div>\n </div>\n </div>\n </div>\n <div class=\"footerButton d-flex justify-content-between align-items-center me-4 ms-4 position-relative\">\n <!-- Hover detection container -->\n <div [ngStyle]=\"{ display: currentPageIndex === pageDetails.length - 1 ? 'block' : 'none' }\" id=\"captcha-container\"></div>\n <div\n class=\"button-container position-relative\"\n (mouseenter)=\"showTooltip = true\"\n (mouseleave)=\"showTooltip = false\"\n >\n\n <div *ngIf=\"currentPageIndex == pageDetails.length - 1\">\n <button\n *ngIf=\"!isActionTriggered\"\n class=\"btn rounded-pill submitButton text-white\"\n [ngStyle]=\"{ 'background-color': primaryColor ? primaryColor: '#084fff' }\"\n type=\"button\"\n (click)=\"submitForm()\"\n [disabled]=\"!eligibleForSubmission.status || submissionInProgress\"\n >\n <ng-container *ngIf=\"submissionInProgress; else showSubmitText\">\n <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>\n Submitting...\n </ng-container>\n <ng-template #showSubmitText>\n Submit\n </ng-template>\n </button>\n\n <div *ngIf=\"showTooltip && !eligibleForSubmission.status\" class=\"custom-tooltip\">\n {{eligibleForSubmission.message}}\n </div>\n </div>\n </div>\n\n </div>\n\n\n </div>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".tab-inner-container{width:100%;position:relative;padding:3rem}@media (max-width: 1024px){.tab-inner-container{padding-left:1rem;padding-right:1rem}}@media (max-width: 576px){.tab-inner-container{padding:2rem .5rem}}.skip-margin{padding:0}.custom-tooltip{visibility:hidden;position:absolute;top:-40px;right:0;background:#efefef;color:#7b7878;padding:8px 12px;border-radius:12px;box-shadow:0 4px 8px #00000026;font-size:14px;white-space:nowrap;z-index:10}.custom-tooltip.warning{background:linear-gradient(135deg,gold,#ffb400)}.fade-in{animation:fadeIn .3s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.footerButton:hover .custom-tooltip{visibility:visible}.navTabs{overflow-x:auto;overflow-y:hidden;flex-wrap:unset;margin:0 0 -1px!important;padding-right:0}.nav-item{background-color:#fff;border-radius:5px}.nav-item.nav-item-default{margin-right:.5%}.nav-item.nav-item-ara{margin-left:.5%}.nav-link{position:relative;margin-bottom:-2px;padding-left:25px;padding-right:25px}.nav-link:after{content:\"\";position:absolute;left:0;bottom:0;width:101%;height:6px;background:#efefef}.nav-link.active:after{display:none}.tab-content{background-color:#fff}.custom-tooltip{--bs-tooltip-bg: var(--bd-violet-bg);--bs-tooltip-color: var(--bs-white)}.tab-navigation{position:relative;display:flex;align-items:center;width:95%}.navTabs{display:flex;overflow-x:auto;scroll-behavior:smooth;white-space:nowrap;width:100%;padding:0;margin:0;scrollbar-width:none;-ms-overflow-style:none}.navTabs::-webkit-scrollbar{display:none}.nav-arrow{position:absolute;background:#fff;border:none;cursor:pointer;font-size:20px;font-weight:700;padding:5px 10px;z-index:1000;box-shadow:0 2px 5px #0003;width:45px;height:27px;gap:13px;display:flex;justify-content:center;align-items:center;border-radius:6px}.nav-arrow img{width:8px;height:15px}.spinner-border{display:inline-block;width:1rem;height:1rem;vertical-align:text-bottom;border:.15em solid currentColor;border-right-color:transparent;border-radius:50%;animation:spinner-border .75s linear infinite}@keyframes spinner-border{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.FormElementsComponent, selector: "lib-form-elements", inputs: ["currentPageIndex", "edit", "acceptedLanguage", "answer", "grid", "state", "pages"], outputs: ["subFormChange"] }, { kind: "directive", type: i4.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }] }); }
101
105
  }
102
106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NavigationTabsComponent, decorators: [{
103
107
  type: Component,
@@ -106,6 +110,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
106
110
  type: Input
107
111
  }], currentPageIndex: [{
108
112
  type: Input
113
+ }], skipValidation: [{
114
+ type: Input
109
115
  }], pageChanged: [{
110
116
  type: Output
111
117
  }], submitEmit: [{
@@ -135,4 +141,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
135
141
  }], submissionInProgress: [{
136
142
  type: Input
137
143
  }] } });
138
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi10YWJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tc3VibWlzc2lvbi9zcmMvZm9ybS1zdWJtaXNzaW9uL25hdmlnYXRpb24tdGFicy9uYXZpZ2F0aW9uLXRhYnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1zdWJtaXNzaW9uL3NyYy9mb3JtLXN1Ym1pc3Npb24vbmF2aWdhdGlvbi10YWJzL25hdmlnYXRpb24tdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBUTFGLE1BQU0sT0FBTyx1QkFBdUI7SUFzQmxDLFlBQ1UscUJBQTRDLEVBQzVDLEdBQXNCO1FBRHRCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF2QnZCLFVBQUssR0FBVSxFQUFFLENBQUM7UUFDbEIscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBQzVCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN6QyxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekQsU0FBSSxHQUFhLEtBQUssQ0FBQztRQUN2QixxQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFDNUIsMEJBQXFCLEdBQXdDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDM0Ysa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3pDLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBQ3hCLCtCQUEwQixHQUFhLEtBQUssQ0FBQztRQUM3QyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzNCLGdCQUFXLEdBQUcsSUFBSSxZ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QUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb3JtLXZhbGlkYXRpb24uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1uYXZpZ2F0aW9uLXRhYnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmF2aWdhdGlvbi10YWJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmF2aWdhdGlvbi10YWJzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE5hdmlnYXRpb25UYWJzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgcGFnZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlSW5kZXg6IG51bWJlciA9IDA7XG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgc3VibWl0RW1pdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQElucHV0KCkgZWRpdCA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYWNjZXB0ZWRMYW5ndWFnZTogc3RyaW5nID0nJztcbiAgQElucHV0KCkgIGVsaWdpYmxlRm9yU3VibWlzc2lvbjp7IHN0YXR1czogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nIH0gPSB7IHN0YXR1czogdHJ1ZSwgbWVzc2FnZTogJycgfTtcbiAgQE91dHB1dCgpIHN1YkZvcm1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQElucHV0KCkgcGFnZURldGFpbHM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIG1hcmtBbGxRdWVzdGlvbnNBc1JlcXVpcmVkIDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBza2lwTWFyZ2luOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSByb3dTZXRJbmRleCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBASW5wdXQoKSBwcmltYXJ5Q29sb3I6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzZWNvbmRhcnlDb2xvcjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGlzQWN0aW9uVHJpZ2dlcmVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pc3Npb25JblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG4gIGxvYWRlZFBhZ2VzOiB7IFtrZXk6IG51bWJlcl06IGJvb2xlYW4gfSA9IHt9O1xuICBzaG93VG9vbHRpcDogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93TmF2QXJyb3dzOiBib29sZWFuID0gZmFsc2U7XG4gIGhpZGVUYWJzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtVmFsaWRhdGlvblNlcnZpY2U6IEZvcm1WYWxpZGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgLy8gTG9hZCB0aGUgZmlyc3QgcGFnZSBpbml0aWFsbHlcbiAgICB0aGlzLmxvYWRlZFBhZ2VzW3RoaXMuY3VycmVudFBhZ2VJbmRleF0gPSB0cnVlO1xuICB9XG5cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNoZWNrUGFnZURldGFpbHMoKVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGVja092ZXJmbG93KCkpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGNoZWNrUGFnZURldGFpbHMoKXtcbiAgICBpZih0aGlzLnBhZ2VEZXRhaWxzICYmIHRoaXMucGFnZURldGFpbHM/Lmxlbmd0aD09MSAmJiB0aGlzLnBhZ2VEZXRhaWxzWzBdPy5uYW1lPT0nJyl7XG4gICAgICB0aGlzLmhpZGVUYWJzPXRydWU7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlU3ViRm9ybVdpdGhTdWJtaXNzaW9ucyhldmVudDphbnkpe1xuICAgIHRoaXMuc3ViRm9ybUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHRyaWdnZXJGdW5jdGlvbihldmVudDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRDdXJyZW50UGFnZShldmVudCk7IFxuICB9XG5cbiAgc2V0Q3VycmVudFBhZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIGlmKHRoaXMubWFya0FsbFF1ZXN0aW9uc0FzUmVxdWlyZWQpe1xuICAgICAgY29uc3QgY3VycmVudFBhZ2VEYXRhID0gdGhpcy5wYWdlc1t0aGlzLmN1cnJlbnRQYWdlSW5kZXhdO1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3BvbnNlID0gdGhpcy5mb3JtVmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVSZXF1aXJlZFF1ZXN0aW9ucyhjdXJyZW50UGFnZURhdGEpO1xuICAgICAgaWYgKHZhbGlkYXRpb25SZXNwb25zZS5pc1ZhbGlkKSB7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdChpbmRleCk7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBNYXJrIHRoaXMgcGFnZSBhcyBsb2FkZWQgdG8gYXZvaWQgcmVsb2FkaW5nXG4gICAgICAgIGlmICghdGhpcy5sb2FkZWRQYWdlc1tpbmRleF0pIHtcbiAgICAgICAgICB0aGlzLmxvYWRlZFBhZ2VzW2luZGV4XSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gXG4gICAgfWVsc2V7XG4gICAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQoaW5kZXgpO1xuICAgICAgdGhpcy5jdXJyZW50UGFnZUluZGV4ID0gaW5kZXg7XG4gICAgICAvLyBNYXJrIHRoaXMgcGFnZSBhcyBsb2FkZWQgdG8gYXZvaWQgcmVsb2FkaW5nXG4gICAgICBpZiAoIXRoaXMubG9hZGVkUGFnZXNbaW5kZXhdKSB7XG4gICAgICAgIHRoaXMubG9hZGVkUGFnZXNbaW5kZXhdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdWJtaXRGb3JtKCkge1xuICAgIHRoaXMuc3VibWl0RW1pdC5lbWl0KCk7XG4gIH1cblxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBsb2FkTW9yZURhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5yb3dTZXRJbmRleC5lbWl0KHRoaXMuY3VycmVudFBhZ2VJbmRleCk7XG4gfVxuXG4gdG9nZ2xlVG9vbHRpcCgpIHtcbiAgdGhpcy5zaG93VG9vbHRpcCA9ICF0aGlzLmVsaWdpYmxlRm9yU3VibWlzc2lvbi5zdGF0dXM7XG59XG5cbnNjcm9sbFRhYnMoZGlyZWN0aW9uOiBudW1iZXIpIHtcbiAgY29uc3QgdGFiQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hdlRhYnMnKSBhcyBIVE1MRWxlbWVudDtcbiAgaWYgKHRhYkNvbnRhaW5lcikge1xuICAgIHRhYkNvbnRhaW5lci5zY3JvbGxCeSh7IGxlZnQ6IGRpcmVjdGlvbiAqIDEwMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jaGVja092ZXJmbG93KCksIDMwMCk7XG4gIH1cbn1cblxuY2hlY2tPdmVyZmxvdygpIHtcbiAgY29uc3QgdGFiQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hdlRhYnMnKSBhcyBIVE1MRWxlbWVudDtcbiAgaWYgKHRhYkNvbnRhaW5lcikge1xuICAgIHRoaXMuc2hvd05hdkFycm93cyA9ICh0YWJDb250YWluZXIuc2Nyb2xsV2lkdGggPiB0YWJDb250YWluZXIuY2xpZW50V2lkdGgpO1xuICB9XG59XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFiLWlubmVyLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsgJ3NraXAtbWFyZ2luJzogc2tpcE1hcmdpbn1cIj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWItbmF2aWdhdGlvblwiICpuZ0lmPVwiIWhpZGVUYWJzXCI+XG4gICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgbmF2VGFic1wiIGlkPVwibXlUYWJcIiByb2xlPVwidGFibGlzdFwiPlxuICAgICAgICA8bGlcbiAgICAgICAgICBjbGFzcz1cIm5hdi1pdGVtXCJcbiAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgcGFnZSBvZiBwYWdlRGV0YWlsczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J25hdi1pdGVtLWFyYSc6IGFjY2VwdGVkTGFuZ3VhZ2UgPT09ICdhcmEnLCAnbmF2LWl0ZW0tZGVmYXVsdCc6IGFjY2VwdGVkTGFuZ3VhZ2UgIT09ICdhcmEnfVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJwYWdlLm5hbWVcIlxuICAgICAgICAgICAgZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCJcbiAgICAgICAgICAgIGRhdGEtYnMtcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgIGRhdGEtYnMtY3VzdG9tLWNsYXNzPVwiY3VzdG9tLXRvb2x0aXBcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBjdXJyZW50UGFnZUluZGV4XCJcbiAgICAgICAgICAgIGlkPVwidGFiLXt7IGkgfX1cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICByb2xlPVwidGFiXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ2NvbnRlbnQtJyArIGlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpID09PSBjdXJyZW50UGFnZUluZGV4XCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRDdXJyZW50UGFnZShpKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgcGFnZS5uYW1lIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgKm5nSWY9XCJzaG93TmF2QXJyb3dzXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwibmF2LWFycm93XCI+XG4gICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2xlZnRfYXJyb3cuc3ZnXCIgYWx0PVwibGVmdCBhcnJvd1wiXG4gICAgICAgIChjbGljayk9XCJzY3JvbGxUYWJzKC0xKVwiPlxuICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy9yaWdodF9hcnJvdy5zdmdcIiBhbHQ9XCJyaWdodCBhcnJvd1wiXG4gICAgICAgIChjbGljayk9XCJzY3JvbGxUYWJzKDEpXCI+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cblxuXG4gIDxkaXYgY2xhc3M9XCJ0YWItY29udGVudCBwdC01IHBiLTMgcHgtMVwiIFthdHRyLm5hbWVdPVwicGFnZXNbY3VycmVudFBhZ2VJbmRleF0udGVzdEVsZW1lbnROYW1lXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhZ2VzW2N1cnJlbnRQYWdlSW5kZXhdXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwidGFiLXBhbmUgZmFkZSBzaG93IGFjdGl2ZVwiXG4gICAgICAgIGlkPVwiY29udGVudC17eyBjdXJyZW50UGFnZUluZGV4IH19XCJcbiAgICAgICAgcm9sZT1cInRhYnBhbmVsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIid0YWItJyArIGN1cnJlbnRQYWdlSW5kZXhcIlxuICAgICAgPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGVkUGFnZXNbY3VycmVudFBhZ2VJbmRleF1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1jb250YWluZXJcIlxuICAgICAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgICAgICAgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiMjAwXCJcbiAgICAgICAgICAoc2Nyb2xsZWQpPVwibG9hZE1vcmVEYXRhKClcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgcGFnZXNbY3VycmVudFBhZ2VJbmRleF0ucm93c1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcmdpbiBkLWZsZXhcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZ3JpZCBvZiByb3cuZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aC4lJzogKGdyaWQuZWxlbWVudC5jb3VudCkgKiAoMTAwIC8gMTIpfVwiPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1lbGVtZW50c1xuICAgICAgICAgICAgICAgICAgW2dyaWRdPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICBbZWRpdF09XCJlZGl0XCJcbiAgICAgICAgICAgICAgICAgIFthY2NlcHRlZExhbmd1YWdlXT1cImFjY2VwdGVkTGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgW3BhZ2VzXT1cInBhZ2VzXCJcbiAgICAgICAgICAgICAgICAgIChzdWJGb3JtQ2hhbmdlKT1cInVwZGF0ZVN1YkZvcm1XaXRoU3VibWlzc2lvbnMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPjwvbGliLWZvcm0tZWxlbWVudHM+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlckJ1dHRvbiBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1lLTQgbXMtNCBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxuICAgICAgICAgIDwhLS0gSG92ZXIgZGV0ZWN0aW9uIGNvbnRhaW5lciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAgW25nU3R5bGVdPVwieyBkaXNwbGF5OiBjdXJyZW50UGFnZUluZGV4ID09PSBwYWdlRGV0YWlscy5sZW5ndGggLSAxID8gJ2Jsb2NrJyA6ICdub25lJyB9XCIgaWQ9XCJjYXB0Y2hhLWNvbnRhaW5lclwiPjwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lciBwb3NpdGlvbi1yZWxhdGl2ZVwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJzaG93VG9vbHRpcCA9IHRydWVcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwic2hvd1Rvb2x0aXAgPSBmYWxzZVwiXG4gICAgICAgICAgPlxuXG4gICAgICAgICAgPGRpdiAgKm5nSWY9XCJjdXJyZW50UGFnZUluZGV4ID09IHBhZ2VEZXRhaWxzLmxlbmd0aCAtIDFcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiIWlzQWN0aW9uVHJpZ2dlcmVkXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gcm91bmRlZC1waWxsIHN1Ym1pdEJ1dHRvbiB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnYmFja2dyb3VuZC1jb2xvcic6IHByaW1hcnlDb2xvciA/IHByaW1hcnlDb2xvcjogJyMwODRmZmYnIH1cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInN1Ym1pdEZvcm0oKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWxpZ2libGVGb3JTdWJtaXNzaW9uLnN0YXR1cyB8fCBzdWJtaXNzaW9uSW5Qcm9ncmVzc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3VibWlzc2lvbkluUHJvZ3Jlc3M7IGVsc2Ugc2hvd1N1Ym1pdFRleHRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0yXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgU3VibWl0dGluZy4uLlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3Nob3dTdWJtaXRUZXh0PlxuICAgICAgICAgICAgICBTdWJtaXRcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dUb29sdGlwICYmICFlbGlnaWJsZUZvclN1Ym1pc3Npb24uc3RhdHVzXCIgY2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiPlxuICAgICAgICAgICAgICB7e2VsaWdpYmxlRm9yU3VibWlzc2lvbi5tZXNzYWdlfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi10YWJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tc3VibWlzc2lvbi9zcmMvZm9ybS1zdWJtaXNzaW9uL25hdmlnYXRpb24tdGFicy9uYXZpZ2F0aW9uLXRhYnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1zdWJtaXNzaW9uL3NyYy9mb3JtLXN1Ym1pc3Npb24vbmF2aWdhdGlvbi10YWJzL25hdmlnYXRpb24tdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBUTFGLE1BQU0sT0FBTyx1QkFBdUI7SUF1QmxDLFlBQ1UscUJBQTRDLEVBQzVDLEdBQXNCO1FBRHRCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF4QnZCLFVBQUssR0FBVSxFQUFFLENBQUM7UUFDbEIscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBQzVCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN6QyxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekQsU0FBSSxHQUFhLEtBQUssQ0FBQztRQUN2QixxQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFDNUIsMEJBQXFCLEdBQXdDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDM0Ysa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3pDLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBQ3hCLCtCQUEwQixHQUFhLEtBQUssQ0FBQztRQUM3QyxlQUFVLEdBQVksS0FBSyxD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LEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNFLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb3JtLXZhbGlkYXRpb24uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1uYXZpZ2F0aW9uLXRhYnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmF2aWdhdGlvbi10YWJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmF2aWdhdGlvbi10YWJzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE5hdmlnYXRpb25UYWJzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgcGFnZXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlSW5kZXg6IG51bWJlciA9IDA7XG4gICBASW5wdXQoKSBza2lwVmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcGFnZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHN1Ym1pdEVtaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBJbnB1dCgpIGVkaXQgOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFjY2VwdGVkTGFuZ3VhZ2U6IHN0cmluZyA9Jyc7XG4gIEBJbnB1dCgpICBlbGlnaWJsZUZvclN1Ym1pc3Npb246eyBzdGF0dXM6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9ID0geyBzdGF0dXM6IHRydWUsIG1lc3NhZ2U6ICcnIH07XG4gIEBPdXRwdXQoKSBzdWJGb3JtQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBJbnB1dCgpIHBhZ2VEZXRhaWxzOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBtYXJrQWxsUXVlc3Rpb25zQXNSZXF1aXJlZCA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2tpcE1hcmdpbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcm93U2V0SW5kZXggPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQElucHV0KCkgcHJpbWFyeUNvbG9yOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2Vjb25kYXJ5Q29sb3I6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc0FjdGlvblRyaWdnZXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzdWJtaXNzaW9uSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xuICBsb2FkZWRQYWdlczogeyBba2V5OiBudW1iZXJdOiBib29sZWFuIH0gPSB7fTtcbiAgc2hvd1Rvb2x0aXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd05hdkFycm93czogYm9vbGVhbiA9IGZhbHNlO1xuICBoaWRlVGFiczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybVZhbGlkYXRpb25TZXJ2aWNlOiBGb3JtVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIC8vIExvYWQgdGhlIGZpcnN0IHBhZ2UgaW5pdGlhbGx5XG4gICAgdGhpcy5sb2FkZWRQYWdlc1t0aGlzLmN1cnJlbnRQYWdlSW5kZXhdID0gdHJ1ZTtcbiAgfVxuXG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jaGVja1BhZ2VEZXRhaWxzKClcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hlY2tPdmVyZmxvdygpKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBjaGVja1BhZ2VEZXRhaWxzKCl7XG4gICAgaWYodGhpcy5wYWdlRGV0YWlscyAmJiB0aGlzLnBhZ2VEZXRhaWxzPy5sZW5ndGg9PTEgJiYgdGhpcy5wYWdlRGV0YWlsc1swXT8ubmFtZT09Jycpe1xuICAgICAgdGhpcy5oaWRlVGFicz10cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVN1YkZvcm1XaXRoU3VibWlzc2lvbnMoZXZlbnQ6YW55KXtcbiAgICB0aGlzLnN1YkZvcm1DaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICB0cmlnZ2VyRnVuY3Rpb24oZXZlbnQ6IG51bWJlcikge1xuICAgIHRoaXMuc2V0Q3VycmVudFBhZ2UoZXZlbnQpO1xuICB9XG5cbiAgc2V0Q3VycmVudFBhZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIGlmKHRoaXMubWFya0FsbFF1ZXN0aW9uc0FzUmVxdWlyZWQpe1xuICAgICAgY29uc3QgY3VycmVudFBhZ2VEYXRhID0gdGhpcy5wYWdlc1t0aGlzLmN1cnJlbnRQYWdlSW5kZXhdO1xuICAgICAgbGV0IHZhbGlkYXRpb25SZXNwb25zZT10cnVlO1xuICAgICAgaWYoIXRoaXMuc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb25SZXNwb25zZSA9IHRoaXMuZm9ybVZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlUmVxdWlyZWRRdWVzdGlvbnMoY3VycmVudFBhZ2VEYXRhKS5pc1ZhbGlkO1xuICAgICAgIH1cbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KGluZGV4KTtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZUluZGV4ID0gaW5kZXg7XG4gICAgICAgIC8vIE1hcmsgdGhpcyBwYWdlIGFzIGxvYWRlZCB0byBhdm9pZCByZWxvYWRpbmdcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRlZFBhZ2VzW2luZGV4XSkge1xuICAgICAgICAgIHRoaXMubG9hZGVkUGFnZXNbaW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1lbHNle1xuICAgICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KGluZGV4KTtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VJbmRleCA9IGluZGV4O1xuICAgICAgLy8gTWFyayB0aGlzIHBhZ2UgYXMgbG9hZGVkIHRvIGF2b2lkIHJlbG9hZGluZ1xuICAgICAgaWYgKCF0aGlzLmxvYWRlZFBhZ2VzW2luZGV4XSkge1xuICAgICAgICB0aGlzLmxvYWRlZFBhZ2VzW2luZGV4XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3VibWl0Rm9ybSgpIHtcbiAgICB0aGlzLnN1Ym1pdEVtaXQuZW1pdCgpO1xuICB9XG5cbiAgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgbG9hZE1vcmVEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMucm93U2V0SW5kZXguZW1pdCh0aGlzLmN1cnJlbnRQYWdlSW5kZXgpO1xuIH1cblxuIHRvZ2dsZVRvb2x0aXAoKSB7XG4gIHRoaXMuc2hvd1Rvb2x0aXAgPSAhdGhpcy5lbGlnaWJsZUZvclN1Ym1pc3Npb24uc3RhdHVzO1xufVxuXG5zY3JvbGxUYWJzKGRpcmVjdGlvbjogbnVtYmVyKSB7XG4gIGNvbnN0IHRhYkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uYXZUYWJzJykgYXMgSFRNTEVsZW1lbnQ7XG4gIGlmICh0YWJDb250YWluZXIpIHtcbiAgICB0YWJDb250YWluZXIuc2Nyb2xsQnkoeyBsZWZ0OiBkaXJlY3Rpb24gKiAxMDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY2hlY2tPdmVyZmxvdygpLCAzMDApO1xuICB9XG59XG5cbmNoZWNrT3ZlcmZsb3coKSB7XG4gIGNvbnN0IHRhYkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uYXZUYWJzJykgYXMgSFRNTEVsZW1lbnQ7XG4gIGlmICh0YWJDb250YWluZXIpIHtcbiAgICB0aGlzLnNob3dOYXZBcnJvd3MgPSAodGFiQ29udGFpbmVyLnNjcm9sbFdpZHRoID4gdGFiQ29udGFpbmVyLmNsaWVudFdpZHRoKTtcbiAgfVxufVxufVxuIiwiPGRpdiBjbGFzcz1cInRhYi1pbm5lci1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7ICdza2lwLW1hcmdpbic6IHNraXBNYXJnaW59XCI+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGFiLW5hdmlnYXRpb25cIiAqbmdJZj1cIiFoaWRlVGFic1wiPlxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIG5hdlRhYnNcIiBpZD1cIm15VGFiXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICAgICAgPGxpXG4gICAgICAgICAgY2xhc3M9XCJuYXYtaXRlbVwiXG4gICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHBhZ2Ugb2YgcGFnZURldGFpbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyduYXYtaXRlbS1hcmEnOiBhY2NlcHRlZExhbmd1YWdlID09PSAnYXJhJywgJ25hdi1pdGVtLWRlZmF1bHQnOiBhY2NlcHRlZExhbmd1YWdlICE9PSAnYXJhJ31cIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJuYXYtbGlua1wiXG4gICAgICAgICAgICBbdGl0bGVdPVwicGFnZS5uYW1lXCJcbiAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiXG4gICAgICAgICAgICBkYXRhLWJzLXBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICBkYXRhLWJzLWN1c3RvbS1jbGFzcz1cImN1c3RvbS10b29sdGlwXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaSA9PT0gY3VycmVudFBhZ2VJbmRleFwiXG4gICAgICAgICAgICBpZD1cInRhYi17eyBpIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgcm9sZT1cInRhYlwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidjb250ZW50LScgKyBpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaSA9PT0gY3VycmVudFBhZ2VJbmRleFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0Q3VycmVudFBhZ2UoaSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHBhZ2UubmFtZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiICpuZ0lmPVwic2hvd05hdkFycm93c1wiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5hdi1hcnJvd1wiPlxuICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pY29ucy9sZWZ0X2Fycm93LnN2Z1wiIGFsdD1cImxlZnQgYXJyb3dcIlxuICAgICAgICAoY2xpY2spPVwic2Nyb2xsVGFicygtMSlcIj5cbiAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvcmlnaHRfYXJyb3cuc3ZnXCIgYWx0PVwicmlnaHQgYXJyb3dcIlxuICAgICAgICAoY2xpY2spPVwic2Nyb2xsVGFicygxKVwiPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG5cblxuICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnQgcHQtNSBwYi0zIHB4LTFcIiBbYXR0ci5uYW1lXT1cInBhZ2VzW2N1cnJlbnRQYWdlSW5kZXhdLnRlc3RFbGVtZW50TmFtZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYWdlc1tjdXJyZW50UGFnZUluZGV4XVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInRhYi1wYW5lIGZhZGUgc2hvdyBhY3RpdmVcIlxuICAgICAgICBpZD1cImNvbnRlbnQte3sgY3VycmVudFBhZ2VJbmRleCB9fVwiXG4gICAgICAgIHJvbGU9XCJ0YWJwYW5lbFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCIndGFiLScgKyBjdXJyZW50UGFnZUluZGV4XCJcbiAgICAgID5cbiAgICAgICAgPGRpdiAqbmdJZj1cImxvYWRlZFBhZ2VzW2N1cnJlbnRQYWdlSW5kZXhdXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtY29udGFpbmVyXCJcbiAgICAgICAgICBpbmZpbml0ZVNjcm9sbFxuICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIlxuICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjIwMFwiXG4gICAgICAgICAgKHNjcm9sbGVkKT1cImxvYWRNb3JlRGF0YSgpXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHBhZ2VzW2N1cnJlbnRQYWdlSW5kZXhdLnJvd3NcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXJnaW4gZC1mbGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGdyaWQgb2Ygcm93LmdyaWRcIlxuICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGguJSc6IChncmlkLmVsZW1lbnQuY291bnQpICogKDEwMCAvIDEyKX1cIj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgIFtncmlkXT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgW2VkaXRdPVwiZWRpdFwiXG4gICAgICAgICAgICAgICAgICBbYWNjZXB0ZWRMYW5ndWFnZV09XCJhY2NlcHRlZExhbmd1YWdlXCJcbiAgICAgICAgICAgICAgICAgIFtwYWdlc109XCJwYWdlc1wiXG4gICAgICAgICAgICAgICAgICAoc3ViRm9ybUNoYW5nZSk9XCJ1cGRhdGVTdWJGb3JtV2l0aFN1Ym1pc3Npb25zKCRldmVudClcIlxuICAgICAgICAgICAgICAgID48L2xpYi1mb3JtLWVsZW1lbnRzPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJCdXR0b24gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtZS00IG1zLTQgcG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgICAgICAgICA8IS0tIEhvdmVyIGRldGVjdGlvbiBjb250YWluZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgIFtuZ1N0eWxlXT1cInsgZGlzcGxheTogY3VycmVudFBhZ2VJbmRleCA9PT0gcGFnZURldGFpbHMubGVuZ3RoIC0gMSA/ICdibG9jaycgOiAnbm9uZScgfVwiIGlkPVwiY2FwdGNoYS1jb250YWluZXJcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1jb250YWluZXIgcG9zaXRpb24tcmVsYXRpdmVcIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2hvd1Rvb2x0aXAgPSB0cnVlXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cInNob3dUb29sdGlwID0gZmFsc2VcIlxuICAgICAgICAgID5cblxuICAgICAgICAgIDxkaXYgICpuZ0lmPVwiY3VycmVudFBhZ2VJbmRleCA9PSBwYWdlRGV0YWlscy5sZW5ndGggLSAxXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIiFpc0FjdGlvblRyaWdnZXJlZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIHJvdW5kZWQtcGlsbCBzdWJtaXRCdXR0b24gdGV4dC13aGl0ZVwiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiBwcmltYXJ5Q29sb3IgPyBwcmltYXJ5Q29sb3I6ICcjMDg0ZmZmJyB9XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzdWJtaXRGb3JtKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVsaWdpYmxlRm9yU3VibWlzc2lvbi5zdGF0dXMgfHwgc3VibWlzc2lvbkluUHJvZ3Jlc3NcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN1Ym1pc3Npb25JblByb2dyZXNzOyBlbHNlIHNob3dTdWJtaXRUZXh0XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gbWUtMlwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgIFN1Ym1pdHRpbmcuLi5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaG93U3VibWl0VGV4dD5cbiAgICAgICAgICAgICAgU3VibWl0XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93VG9vbHRpcCAmJiAhZWxpZ2libGVGb3JTdWJtaXNzaW9uLnN0YXR1c1wiIGNsYXNzPVwiY3VzdG9tLXRvb2x0aXBcIj5cbiAgICAgICAgICAgICAge3tlbGlnaWJsZUZvclN1Ym1pc3Npb24ubWVzc2FnZX19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19