@sunbird-cb/cbp-ai 0.1.90 → 0.1.91

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.
@@ -1093,11 +1093,11 @@ export class RoleMappingGenerationComponent {
1093
1093
  this.router.navigate(['/ai/upload-documents']);
1094
1094
  }
1095
1095
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingGenerationComponent, deps: [{ token: i1.EventService }, { token: i2.SharedService }, { token: i3.FormBuilder }, { token: i4.MatSnackBar }, { token: i5.MatDialog }, { token: i6.RoleMappingService }, { token: i7.Router }], target: i0.ɵɵFactoryTarget.Component }); }
1096
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RoleMappingGenerationComponent, selector: "app-role-mapping-generation", inputs: { loginStatusFlag: "loginStatusFlag" }, outputs: { successRoleMapping: "successRoleMapping", alreadyAvailableRoleMapping: "alreadyAvailableRoleMapping", loginSuccess: "loginSuccess" }, viewQueries: [{ propertyName: "pdfContent", first: true, predicate: ["pdfContent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n <!-- <div class=\"section-header\">-->\n <!-- <div class=\"sub-heading\">-->\n <!-- <p>Choose Your Department</p>-->\n <!-- </div>-->\n <!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n\n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredList\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\"\n formControlName=\"departments\" style=\"border-radius: 25px; background: white;\"\n (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n\n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\" (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"documents?.length < 1 && !(roleMappingForm?.invalid) || showWorkAllocationOrderDocumentMissing\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity Building Plan (CBP)</span>\n </p>\n </div>\n <!-- <div class=\"mt-2\" *ngIf=\"documents?.length > 0\">\n <p *ngIf=\"workAllocationOrderDocumentMissing\"><span style=\"font-size: .875rem;font-weight: bold;\">Note:\n </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity\n Building Plan (CBP)</span>\n </p>\n </div> -->\n <div class=\"mt-4\">\n <input\n [disabled]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 \"\n [ngClass]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 ? 'btn-disable':'btn-active'\"\n type=\"button\" [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\" />\n </div>\n </div>\n </mat-card>\n\n</div>\n<!-- <div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div> -->\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i10.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i11.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i13.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i14.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i15.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i16.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
1096
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RoleMappingGenerationComponent, selector: "app-role-mapping-generation", inputs: { loginStatusFlag: "loginStatusFlag" }, outputs: { successRoleMapping: "successRoleMapping", alreadyAvailableRoleMapping: "alreadyAvailableRoleMapping", loginSuccess: "loginSuccess" }, viewQueries: [{ propertyName: "pdfContent", first: true, predicate: ["pdfContent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login && roleMappingForm\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n <!-- <div class=\"section-header\">-->\n <!-- <div class=\"sub-heading\">-->\n <!-- <p>Choose Your Department</p>-->\n <!-- </div>-->\n <!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n\n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredList\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\"\n formControlName=\"departments\" style=\"border-radius: 25px; background: white;\"\n (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n\n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\" (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"documents?.length < 1 && !(roleMappingForm?.invalid) || showWorkAllocationOrderDocumentMissing\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity Building Plan (CBP)</span>\n </p>\n </div>\n <!-- <div class=\"mt-2\" *ngIf=\"documents?.length > 0\">\n <p *ngIf=\"workAllocationOrderDocumentMissing\"><span style=\"font-size: .875rem;font-weight: bold;\">Note:\n </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity\n Building Plan (CBP)</span>\n </p>\n </div> -->\n <div class=\"mt-4\">\n <input\n [disabled]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 \"\n [ngClass]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 ? 'btn-disable':'btn-active'\"\n type=\"button\" [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\" />\n </div>\n </div>\n </mat-card>\n\n</div>\n<!-- <div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div> -->\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i10.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i11.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i13.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i14.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i15.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i16.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
1097
1097
  }
1098
1098
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingGenerationComponent, decorators: [{
1099
1099
  type: Component,
1100
- args: [{ selector: 'app-role-mapping-generation', template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n <!-- <div class=\"section-header\">-->\n <!-- <div class=\"sub-heading\">-->\n <!-- <p>Choose Your Department</p>-->\n <!-- </div>-->\n <!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n\n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredList\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\"\n formControlName=\"departments\" style=\"border-radius: 25px; background: white;\"\n (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n\n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\" (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"documents?.length < 1 && !(roleMappingForm?.invalid) || showWorkAllocationOrderDocumentMissing\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity Building Plan (CBP)</span>\n </p>\n </div>\n <!-- <div class=\"mt-2\" *ngIf=\"documents?.length > 0\">\n <p *ngIf=\"workAllocationOrderDocumentMissing\"><span style=\"font-size: .875rem;font-weight: bold;\">Note:\n </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity\n Building Plan (CBP)</span>\n </p>\n </div> -->\n <div class=\"mt-4\">\n <input\n [disabled]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 \"\n [ngClass]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 ? 'btn-disable':'btn-active'\"\n type=\"button\" [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\" />\n </div>\n </div>\n </mat-card>\n\n</div>\n<!-- <div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div> -->\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"] }]
1100
+ args: [{ selector: 'app-role-mapping-generation', template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login && roleMappingForm\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n <!-- <div class=\"section-header\">-->\n <!-- <div class=\"sub-heading\">-->\n <!-- <p>Choose Your Department</p>-->\n <!-- </div>-->\n <!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n\n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredList\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\"\n formControlName=\"departments\" style=\"border-radius: 25px; background: white;\"\n (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n\n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\" (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"documents?.length < 1 && !(roleMappingForm?.invalid) || showWorkAllocationOrderDocumentMissing\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity Building Plan (CBP)</span>\n </p>\n </div>\n <!-- <div class=\"mt-2\" *ngIf=\"documents?.length > 0\">\n <p *ngIf=\"workAllocationOrderDocumentMissing\"><span style=\"font-size: .875rem;font-weight: bold;\">Note:\n </span>\n <span class=\"error\">Please upload the Work Allocation Order document to generate the Capacity\n Building Plan (CBP)</span>\n </p>\n </div> -->\n <div class=\"mt-4\">\n <input\n [disabled]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 \"\n [ngClass]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 ? 'btn-disable':'btn-active'\"\n type=\"button\" [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\" />\n </div>\n </div>\n </mat-card>\n\n</div>\n<!-- <div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div> -->\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"] }]
1101
1101
  }], ctorParameters: function () { return [{ type: i1.EventService }, { type: i2.SharedService }, { type: i3.FormBuilder }, { type: i4.MatSnackBar }, { type: i5.MatDialog }, { type: i6.RoleMappingService }, { type: i7.Router }]; }, propDecorators: { pdfContent: [{
1102
1102
  type: ViewChild,
1103
1103
  args: ['pdfContent', { static: false }]
@@ -1110,4 +1110,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1110
1110
  }], loginSuccess: [{
1111
1111
  type: Output
1112
1112
  }] } });
1113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBdUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakYsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBRW5ILE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBaUIsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVTNDLE1BQU0sT0FBTyw4QkFBOEI7SUFvRnpDLFlBQ1UsUUFBc0IsRUFDdkIsYUFBNEIsRUFDM0IsRUFBZSxFQUNmLFFBQXFCLEVBQ3RCLE1BQWlCLEVB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MkJBQTJCO3NCQUFwQyxNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCBodG1sMnBkZiBmcm9tICdodG1sMnBkZi5qcyc7XG5pbXBvcnQgeyBEZWxldGVSb2xlTWFwcGluZ1BvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vZGVsZXRlLXJvbGUtbWFwcGluZy1wb3B1cC9kZWxldGUtcm9sZS1tYXBwaW5nLXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgaW50ZXJ2YWwsIG9mLCBjb25jYXQsIFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZVdoaWxlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IFJvbGVNYXBwaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3JvbGUtbWFwcGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL2V2ZW50LnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJvbGUtbWFwcGluZy1nZW5lcmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGUtbWFwcGluZy1nZW5lcmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSb2xlTWFwcGluZ0dlbmVyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgncGRmQ29udGVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwZGZDb250ZW50ITogRWxlbWVudFJlZjtcbiAgXG4gIEBJbnB1dCgpIGxvZ2luU3RhdHVzRmxhZyA9IGZhbHNlXG4gIHRpdGxlID0gJ3N1bmJpcmQtY2Itc3RhdGljd2ViJztcbiAgaXNNYWludGVuYW5jZVBhZ2U6IGFueVxuICBzZWxlY3RlZFZhbHVlID0gJydcbiAgc2VhcmNoVGV4dCA9ICcnXG4gIGRhdGFTb3VyY2U6IGFueVxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFsnUmVxdWVzdElkJywgJ3RpdGxlJywgJ3JlcXVlc3RvcicsICdyZXF1ZXN0VHlwZScsXG4gICAgJ3JlcXVlc3RTdGF0dXMnLCAnYXNzaWduZWUnLCAncmVxdWVzdGVkT24nLCAnaW50ZXJlc3RzJywgJ2FjdGlvbiddXG4gIHNlbGVjdGVkTWluaXN0cnlUeXBlOiBzdHJpbmcgPSAnbWluaXN0cnknO1xuICBtaW5pc3RyeURhdGE6IGFueSA9IFtdXG4gIG1pbmlzdHJ5RnVsbERhdGE6IGFueSA9IFtdXG4gIHJvbGVNYXBwaW5nRm9ybSE6IEZvcm1Hcm91cDtcbiAgZGlzYWJsZUJ0biA9IHRydWVcbiAgc2VjdG9yRGF0YSA9IFtcbiAgICB7XG4gICAgICB2YWx1ZTogJ1dvbWVuIGFuZCBjaGlsZCBkZXZlbG9wbWVudCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnUnVyYWwgZGV2ZWxvcG1lbnQnXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogJ1VyYmFuIGRldmVsb3BtZW50J1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdIZWFsdGhjYXJlJ1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdBZ3JpY3VsdHVyZSdcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnT3RoZXJzJ1xuICAgIH1cblxuICBdXG4gIGRlcGFydG1lbnREYXRhID0gW11cbiAgbG9hZGluZyA9IGZhbHNlXG4gIG1heEZpbGVTaXplTUIgPSAyNTtcbiAgYWxsb3dlZFR5cGVzID0gW1xuICAgICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgICdhcHBsaWNhdGlvbi9tc3dvcmQnLFxuICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JyxcbiAgICAndGV4dC9wbGFpbidcbiAgXTtcbiAgdXBsb2FkRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICB1cGxvYWRlZEZpbGU6IEZpbGVbXSB8IG51bGwgPSBudWxsO1xuICBsb2dpbiA9IGZhbHNlXG4gIGNicEZpbmFsT2JqOiBhbnkgPSB7fVxuICBzZWxlY3RlZE1pbmlzdHJ5SWQgPSAnJ1xuICBvcmlnaW5hbEZvcm1WYWx1ZXM6IGFueVxuICBjaHVua3M6IHN0cmluZ1tdID0gW107XG4gIGZ1bGxKc29uOiBzdHJpbmcgPSAnJztcbiAgcGFyc2VkRGF0YTogYW55O1xuICBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlOiBzdHJpbmcgPSAnJztcbiAgcHJvY2Vzc2luZ1N0YWdlcyA9IFtcbiAgICAnSW5pdGlhbGl6aW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nLFxuICAgICdBbmFseXppbmcgZGVwYXJ0bWVudGFsIGNvbXBldGVuY3kgcmVxdWlyZW1lbnRzLi4uJyxcbiAgICAnUHJvY2Vzc2luZyB3b3JrIG9yZGVyIHNwZWNpZmljYXRpb25zIGFuZCByb2xlIGRlZmluaXRpb25zLi4uJyxcbiAgICAnR2VuZXJhdGluZyBkZXRhaWxlZCByb2xlcyAmIHJlc3Bvc2liaWxpdGllcy4uLicsXG4gICAgJ0dlbmVyYXRpbmcgZGV0YWlsZWQgY29tcGV0ZW5jaWVzLi4uJyxcbiAgICAnVmFsaWRhdGluZyByb2xlIG1hcHBpbmcgIGFuZCBmaW5hbGl6aW5nIHRoZSBDQlAgUGxhbidcbiAgXTtcbiAgQE91dHB1dCgpIHN1Y2Nlc3NSb2xlTWFwcGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSBhbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBAT3V0cHV0KCkgbG9naW5TdWNjZXNzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcbiAgc2VsZWN0ZWRNaW5pc3RyeU9iajogYW55ID0gJydcbiAgbG9naW5Vc2VyT3JnSWRzID0gW11cbiAgcGFuZWxPcGVuID0gZmFsc2U7XG4gIGRlcGFydG1lbnRQYW5lbE9wZW4gPSBmYWxzZVxuICBmaWx0ZXJlZExpc3QgPSBbXTtcbiAgZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IFtdO1xuICBvcmlnaW5hbE1pbmlzdHJ5RGF0YSA9IFtdXG4gIGFwaUxvYWRpbmcgPSBmYWxzZVxuICBmaXJzdEFwaVJlc3BvbnNlOiBhbnkgPSBudWxsXG4gIGRvY3VtZW50cyA9IFtdXG4gIGRpc2FibGVVcGxvYWREb2N1bWVudCA9IHRydWVcbiAgZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSB0cnVlXG4gIHdvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICBzaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IGZhbHNlXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGV2ZW50U3ZjOiBFdmVudFNlcnZpY2UsXG4gICAgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHB1YmxpYyByb2xlTWFwcGluZ1NlcnZpY2U6IFJvbGVNYXBwaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICkge1xuICAgIHRoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gKCkgPT4gZmFsc2U7XG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KFtdKVxuICAgIHRoaXMuaXNNYWludGVuYW5jZVBhZ2UgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL21haW50ZW5hbmNlJylcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgdGhpcy5sb2dpbiA9IHRoaXMuc2hhcmVkU2VydmljZS5jaGVja0lmTG9naW4oKVxuXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaiAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeSAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlKSB7XG5cblxuICAgICAgdGhpcy5lZGl0TWluaXN0cnlGb3JtKClcbiAgICAgIC8vIHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubG9naW4pIHtcbiAgICAgICAgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgICAgfVxuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbWluaXN0cnlUeXBlOiBbJ21pbmlzdHJ5JywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG1pbmlzdHJ5OiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHNlY3RvcnM6IFtbXV0sXG4gICAgICAgIGRlcGFydG1lbnRzOiBbJyddLCAvLyBzaG93biBvbmx5IGlmIG1pbmlzdHJ5VHlwZSA9PSAnc3RhdGUnXG4gICAgICAgIGFkZGl0aW9uYWxEZXRhaWxzOiBbJyddLFxuICAgICAgICBhZGRpdGlvbmFsX2RvY3VtZW50OiBbXVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ3NlY3RvcnMnKT8uc2V0VmFsdWUoW10pO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh0eXBlID0+IHtcbiAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0ucmVzZXQoe1xuICAgICAgICAgIG1pbmlzdHJ5VHlwZTogdHlwZSwgLy8gS2VlcCB0aGUgY2hhbmdlZCB2YWx1ZVxuICAgICAgICAgIG1pbmlzdHJ5OiBudWxsLFxuICAgICAgICAgIHNlY3RvcnM6IFtdLFxuICAgICAgICAgIGRlcGFydG1lbnRzOiBbXSxcbiAgICAgICAgICBhZGRpdGlvbmFsRGV0YWlsczogJycsXG4gICAgICAgICAgYWRkaXRpb25hbF9kb2N1bWVudDogW11cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKHN0YXR1czogYW55KSA9PiB7XG4gICAgICAgIGxldCBoYXNVcGxvYWREb2N1bWVudHMgPSBmYWxzZVxuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBoYXNVcGxvYWREb2N1bWVudHMgPVxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCcvdXBsb2FkLWRvY3VtZW50cycpO1xuXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWhhc1VwbG9hZERvY3VtZW50cykge1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jaGVja1JvbGVNYXBwaW5nRm9ybVZhbGlkYXRpb24ubmV4dChzdGF0dXMpO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdHVzID09PSAnVkFMSUQnKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgfSk7XG4gICAgfVxuXG5cblxuXG5cblxuICB9XG5cbiAgZ2V0VXBsb2FkZWREb2N1bWVudHMoKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZTtcbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlXG4gICAgbGV0IHJlcUJvZHkgPSB7XG4gICAgICBzdGF0ZV9jZW50ZXJfaWQ6IGZvcm1EYXRhLm1pbmlzdHJ5LFxuICAgICAgaW5jbHVkZV9zdW1tYXJ5OiB0cnVlLFxuICAgICAgc2tpcDogMCxcbiAgICAgIGxpbWl0OiAyMDBcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmb3JtRGF0YT8uZGVwYXJ0bWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXFCb2R5WydkZXBhcnRtZW50X2lkJ10gPSBmb3JtRGF0YT8uZGVwYXJ0bWVudHNcbiAgICB9XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFVwbG9hZGVkRG9jdW1lbnRzKHJlcUJvZHkpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzICYmIHJlcz8uaXRlbXMgJiYgcmVzPy5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxldCB3QU9Db3VudCA9IDBcbiAgICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSByZXM/Lml0ZW1zXG4gICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gZmFsc2VcbiAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIHRoaXMuZG9jdW1lbnRzLmZvckVhY2goKGl0ZW0pPT57XG4gICAgICAgICAgaWYoaXRlbT8uZG9jdW1lbnRfdHlwZSA9PT0gJ1dvcmsgQWxsb2NhdGlvbiBPcmRlcicpIHtcbiAgICAgICAgICAgIHdBT0NvdW50ID13QU9Db3VudCsxXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmKHdBT0NvdW50IDwgMSkge1xuICAgICAgICAgIHRoaXMud29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kb2N1bWVudHMtLScsIHRoaXMuZG9jdW1lbnRzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXVxuICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSBmYWxzZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBlZGl0TWluaXN0cnlGb3JtKCkge1xuICAgIGlmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGVcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICAgIGlmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDZW50ZXJCYXNlZERlcGFydG1lbnQodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRlcGFydG1lbnREYXRhID0gcmVzXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdObyBEZXBhcnRtZW50IEZvdW5kIGZvciBTZWxlY3RlZCBNaW5pc3RyeScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gJydcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSAnJ1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbWluaXN0cnlUeXBlOiBbdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG1pbmlzdHJ5OiBbdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBzZWN0b3JzOiBbW11dLFxuICAgICAgICBkZXBhcnRtZW50czogW3RoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXSwgLy8gc2hvd24gb25seSBpZiBtaW5pc3RyeVR5cGUgPT0gJ3N0YXRlJ1xuICAgICAgICBhZGRpdGlvbmFsRGV0YWlsczogWycnXVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KHtcbiAgICAgIC8vICAgICBtaW5pc3RyeVR5cGU6IHR5cGUsIC8vIEtlZXAgdGhlIGNoYW5nZWQgdmFsdWVcbiAgICAgIC8vICAgICBtaW5pc3RyeTogbnVsbCxcbiAgICAgIC8vICAgICBzZWN0b3JzOiBbXSxcbiAgICAgIC8vICAgICBkZXBhcnRtZW50czogW10sXG4gICAgICAvLyAgICAgYWRkaXRpb25hbERldGFpbHM6ICcnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gICBpZiAodHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAvLyB9KTtcblxuICAgICAgaWYgKHRoaXMubWluaXN0cnlEYXRhICYmIHRoaXMubWluaXN0cnlEYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICB9XG5cbiAgICAgIC8vdGhpcy5vbkdlbmVyYXRlUm9sZU1hcHBpbmcoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGVcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICAgIGF3YWl0IHRoaXMuc2hhcmVkU2VydmljZS5nZXREZXBhcnRtZW50TGlzdCh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllcikuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IHJlc1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCAtLScsIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdClcbiAgICAgIH0pXG4gICAgICBpZiAodGhpcy5taW5pc3RyeURhdGEgJiYgdGhpcy5taW5pc3RyeURhdGEubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeUlkID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJcbiAgICAgIH1cbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG1pbmlzdHJ5VHlwZTogW3RoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBtaW5pc3RyeTogW3RoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc2VjdG9yczogW1tdXSxcbiAgICAgICAgZGVwYXJ0bWVudHM6IFt0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50c10sIC8vIHNob3duIG9ubHkgaWYgbWluaXN0cnlUeXBlID09ICdzdGF0ZSdcbiAgICAgICAgYWRkaXRpb25hbERldGFpbHM6IFt0aGlzLmNicEZpbmFsT2JqPy5hZGRpdGlvbmFsRGV0YWlsc11cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KHtcbiAgICAgIC8vICAgICBtaW5pc3RyeVR5cGU6IHR5cGUsIC8vIEtlZXAgdGhlIGNoYW5nZWQgdmFsdWVcbiAgICAgIC8vICAgICBtaW5pc3RyeTogbnVsbCxcbiAgICAgIC8vICAgICBzZWN0b3JzOiBbXSxcbiAgICAgIC8vICAgICBkZXBhcnRtZW50czogW10sXG4gICAgICAvLyAgICAgYWRkaXRpb25hbERldGFpbHM6ICcnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gICBpZiAodHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAvLyB9KTtcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLm1pbmlzdHJ5RGF0YScsIHRoaXMubWluaXN0cnlEYXRhKVxuICAgICAgaWYgKHRoaXMubWluaXN0cnlEYXRhICYmIHRoaXMubWluaXN0cnlEYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3JpZ2luYWxGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICB0aGlzLmdldFVwbG9hZGVkRG9jdW1lbnRzKClcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMubG9naW4gPSB0aGlzLmxvZ2luU3RhdHVzRmxhZ1xuXG4gIH1cblxuICBnZXRDaGFuZ2VkRmllbGRzKG9yaWdpbmFsOiBhbnksIGN1cnJlbnQ6IGFueSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjaGFuZ2VkS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9yaWdpbmFsKSB7XG4gICAgICBpZiAoIW9yaWdpbmFsLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gb3JpZ2luYWxba2V5XTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRba2V5XTtcblxuICAgICAgLy8gRm9yIGFycmF5cyBhbmQgb2JqZWN0cywgdXNlIEpTT04uc3RyaW5naWZ5IChvciBsb2Rhc2ggaXNFcXVhbCBmb3IgZGVlcCBjb21wYXJpc29uKVxuICAgICAgY29uc3QgaXNFcXVhbCA9XG4gICAgICAgIHR5cGVvZiBvcmlnaW5hbFZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxWYWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICA6IG9yaWdpbmFsVmFsdWUgPT09IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgaWYgKCFpc0VxdWFsKSB7XG4gICAgICAgIGNoYW5nZWRLZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZEtleXM7XG4gIH1cblxuICBvbkdlbmVyYXRlUm9sZU1hcHBpbmcoKTogYW55IHtcblxuICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBjb25zdCBmb3JtRGF0YTogYW55ID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQoJ21pbmlzdHJ5VHlwZScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5VHlwZSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdtaW5pc3RyeScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5KTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3NlY3RvcnMnLCBKU09OLnN0cmluZ2lmeShjdXJyZW50Rm9ybVZhbHVlcy5zZWN0b3JzKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdkZXBhcnRtZW50cycsIEpTT04uc3RyaW5naWZ5KGN1cnJlbnRGb3JtVmFsdWVzLmRlcGFydG1lbnRzKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdhZGRpdGlvbmFsRGV0YWlscycsIGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzIHx8ICcnKTtcbiAgICBjb25zdCBmaWxlOiBGaWxlID0gdGhpcy51cGxvYWRlZEZpbGUgfHwgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnZhbHVlO1xuICAgIGNvbnNvbGUubG9nKCdmaWxlJywgZmlsZSlcbiAgICBpZiAoZmlsZSkge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdhZGRpdGlvbmFsX2RvY3VtZW50JywgZmlsZSk7XG4gICAgfVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSBjdXJyZW50Rm9ybVZhbHVlcz8uZGVwYXJ0bWVudHNcbiAgICBjb25zdCBkZXBhcnRtZW50TmFtZSA9IHRoaXMuZGVwYXJ0bWVudERhdGEuZmluZCh1ID0+IHUuaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+XG4gICAgICBpdGVtLmlkZW50aWZpZXIgPT09IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5XG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHNlbGVjdGVkTWluaXN0cnk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgY29uc29sZS5sb2coJ3RoaXMucm9sZU1hcHBpbmdGb3JtJywgdGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgY29uc29sZS5sb2coJ2Zvcm1EYXRhLS0nLCBmb3JtRGF0YSlcbiAgICBmb3IgKGNvbnN0IHBhaXIgb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgJHtwYWlyWzBdfTpgLCBwYWlyWzFdKTtcbiAgICB9XG5cblxuICAgIGNvbnN0IGNoYW5nZWRGaWVsZHMgPSB0aGlzLmdldENoYW5nZWRGaWVsZHModGhpcy5vcmlnaW5hbEZvcm1WYWx1ZXMsIGN1cnJlbnRGb3JtVmFsdWVzKTtcblxuICAgIGlmIChjaGFuZ2VkRmllbGRzLmxlbmd0aCA+IDAgfHwgKGZpbGUgJiYgZmlsZS5zaXplID4gMCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdjaGFuZ2VkRmllbGRzJywgY2hhbmdlZEZpZWxkcylcbiAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VkIGZpZWxkczonLCBjaGFuZ2VkRmllbGRzKTtcbiAgICAgIGlmIChjaGFuZ2VkRmllbGRzLmluY2x1ZGVzKCdhZGRpdGlvbmFsRGV0YWlscycpICYmIHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLmFkZGl0aW9uYWxEZXRhaWxzPy50cmltKCkgfHwgKGZpbGUgJiYgZmlsZS5zaXplID4gMCkpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZWxldGVSb2xlTWFwcGluZ1BvcHVwQ29tcG9uZW50LCB7XG4gICAgICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICAgICAgZGF0YToge2RvY3VtZW50czogdGhpcy5kb2N1bWVudHN9LFxuICAgICAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgICAgICB9KTtcblxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5kZWxldGVSb2xlTWFwcGluZ0J5U3RhdGVBbmREZXBhcnRtZW50KHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLm1pbmlzdHJ5LCB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZS5kZXBhcnRtZW50cykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gW11cbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBbXVxuICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgIGNvbnNvbGUubG9nKCdObyBjaGFuZ2VzIGRldGVjdGVkLicpO1xuICAgIH1cblxuICB9XG5cblxuICBnZXRNaW5pc3RyeURhdGEoKSB7XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuICAgIGNvbnN0IHJlcXVlc3RlZFR5cGUgPSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0TWluaXN0cnlEYXRhKHJlcXVlc3RlZFR5cGUpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvLyBJZ25vcmUgc3RhbGUgcmVzcG9uc2VzIGZyb20gYSB0eXBlIHRoYXQgd2FzIGNoYW5nZWQgYWdhaW4gYmVmb3JlIHRoaXMgb25lIHJldHVybmVkXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRUeXBlICE9PSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhID0gZGF0YVxuICAgICAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IFtdXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZFR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtPy5zYk9yZ1R5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgICAgdGhpcy5taW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldFVzZXJQcm9maWxlRGF0YShyZXF1ZXN0ZWRUeXBlLCByZXNvbHZlKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgb25NaW5pc3RyeVR5cGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZygnZXZlbnQnLCBldmVudClcblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5VHlwZSddID0gZXZlbnQudmFsdWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gW11cbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID0gZXZlbnQudmFsdWVcbiAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IFtdXG5cbiAgICBpZiAodGhpcy5sb2dpbikge1xuICAgICAgYXdhaXQgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIH1cblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICBpZiAoZXZlbnQ/LnZhbHVlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5Jyk/LnNldFZhbHVlKG51bGwpO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUoW10pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnZhbHVlID09PSAnbWluaXN0cnknKSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5Jyk/LnNldFZhbHVlKG51bGwpO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUoW10pO1xuICAgIH1cblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5J10gPSAnJ1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gJydcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gJydcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0ucmVzZXQoKVxuICAgIGlmICghdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnkpIHtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAvLyAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgIC8vICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgIH0sIDUwMDApXG4gICAgfVxuICB9XG5cbiAgb25NaW5pc3RyeUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeUlkID0gZXZlbnQudmFsdWU7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5IElEOicsIHNlbGVjdGVkTWluaXN0cnlJZCk7XG4gICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IFtdXG4gICAgLy8gWW91IGNhbiBhY2Nlc3MgdGhlIHNlbGVjdGVkIG9iamVjdCBpZiBuZWVkZWRcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+IGl0ZW0uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRNaW5pc3RyeUlkKTtcbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlPYmogPSBzZWxlY3RlZE1pbmlzdHJ5XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5OicsIHNlbGVjdGVkTWluaXN0cnkpOyBgYFxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5J10gPSBzZWxlY3RlZE1pbmlzdHJ5XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IFtdXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgIGlmIChzZWxlY3RlZE1pbmlzdHJ5SWQgJiYgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldERlcGFydG1lbnRMaXN0KHNlbGVjdGVkTWluaXN0cnlJZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IHJlc1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChzZWxlY3RlZE1pbmlzdHJ5SWQgJiYgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENlbnRlckJhc2VkRGVwYXJ0bWVudChzZWxlY3RlZE1pbmlzdHJ5SWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudERhdGEgPSByZXNcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ05vIERlcGFydG1lbnQgRm91bmQgZm9yIFNlbGVjdGVkIE1pbmlzdHJ5JywgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gJydcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gJydcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgICAgIH1cblxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLmdldFVwbG9hZGVkRG9jdW1lbnRzKClcbiAgfVxuXG4gIHNlYXJjaERhdGEoKSB7XG5cbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCkge1xuXG4gIH1cblxuICBkb3dubG9hZFBERigpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wZGZDb250ZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbWFyZ2luOiAwLjUsXG4gICAgICBmaWxlbmFtZTogJ0NCUF9QbGFuLnBkZicsXG4gICAgICBpbWFnZTogeyB0eXBlOiAnanBlZycsIHF1YWxpdHk6IDAuOTggfSxcbiAgICAgIGh0bWwyY2FudmFzOiB7XG4gICAgICAgIHNjYWxlOiAyLFxuICAgICAgICB1c2VDT1JTOiB0cnVlLCAgLy8gSW1wb3J0YW50IGZvciBleHRlcm5hbCBpbWFnZXMvaWNvbnNcbiAgICAgIH0sXG4gICAgICBqc1BERjoge1xuICAgICAgICB1bml0OiAnaW4nLFxuICAgICAgICBmb3JtYXQ6ICdhNCcsXG4gICAgICAgIG9yaWVudGF0aW9uOiAncG9ydHJhaXQnXG4gICAgICB9XG4gICAgfTtcblxuICAgIGh0bWwycGRmKCkuZnJvbShlbGVtZW50KS5zZXQob3B0aW9ucykuc2F2ZSgpO1xuXG4gIH1cblxuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgICBjb25zdCBtYXhGaWxlcyA9IDM7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnYWRkaXRpb25hbF9kb2N1bWVudCcpO1xuXG4gICAgLy8gQWx3YXlzIGNsZWFyIGNvbnRyb2wgZmlyc3QgKHByZXZlbnRzIG9sZCB2YWxpZCB2YWx1ZSlcbiAgICBjb250cm9sPy5yZXNldCgpO1xuICAgIGNvbnRyb2w/LnNldEVycm9ycyhudWxsKTtcbiAgICB0aGlzLnVwbG9hZGVkRmlsZSA9IFtdO1xuICAgIHRoaXMudXBsb2FkRXJyb3IgPSBudWxsO1xuXG4gICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIExpbWl0IGNoZWNrXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IG1heEZpbGVzKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gYFlvdSBjYW4gdXBsb2FkIGEgbWF4aW11bSBvZiAke21heEZpbGVzfSBmaWxlc2A7XG4gICAgICBjb250cm9sPy5zZXRFcnJvcnMoeyBtYXhGaWxlczogdHJ1ZSB9KTtcbiAgICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICBjb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRGaWxlczogRmlsZVtdID0gW107XG4gICAgY29uc3QgaW52YWxpZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1heEJ5dGVzID0gdGhpcy5tYXhGaWxlU2l6ZU1CICogMTAyNCAqIDEwMjQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbaV07XG5cbiAgICAgIC8vIFNpemUgY2hlY2tcbiAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhCeXRlcykge1xuICAgICAgICBpbnZhbGlkRmlsZXMucHVzaChgJHtmaWxlLm5hbWV9IChleGNlZWRzICR7dGhpcy5tYXhGaWxlU2l6ZU1CfU1CKWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZSBjaGVja1xuICAgICAgaWYgKCF0aGlzLmFsbG93ZWRUeXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XG4gICAgICAgIGludmFsaWRGaWxlcy5wdXNoKGAke2ZpbGUubmFtZX0gKGludmFsaWQgdHlwZSlgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkRmlsZXMucHVzaChmaWxlKTtcbiAgICB9XG5cbiAgICAvLyDinYwgTk8gdmFsaWQgZmlsZXMg4oaSIGZvcm0gTVVTVCBCRSBpbnZhbGlkXG4gICAgaWYgKHZhbGlkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gYEludmFsaWQgZmlsZShzKTogJHtpbnZhbGlkRmlsZXMuam9pbignLCAnKX1gO1xuXG4gICAgICBjb250cm9sPy5zZXRWYWx1ZShudWxsKTtcbiAgICAgIGNvbnRyb2w/LnNldEVycm9ycyh7IGludmFsaWRGaWxlczogdHJ1ZSB9KTtcbiAgICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICBjb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSwgNTAwMClcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOKclCBBdCBsZWFzdCBPTkUgdmFsaWQgZmlsZSDihpIgZm9ybSBzaG91bGQgYmUgVkFMSURcbiAgICB0aGlzLnVwbG9hZGVkRmlsZSA9IHZhbGlkRmlsZXM7XG5cbiAgICBpZiAoaW52YWxpZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudXBsb2FkRXJyb3IgPSBgU29tZSBmaWxlcyB3ZXJlIHNraXBwZWQ6ICR7aW52YWxpZEZpbGVzLmpvaW4oJywgJyl9YDtcbiAgICB9XG5cbiAgICBjb250cm9sPy5zZXRWYWx1ZSh2YWxpZEZpbGVzKTtcbiAgICBjb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgY29udHJvbD8ubWFya0FzRGlydHkoKTtcbiAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gIH1cblxuXG5cblxuXG5cbiAgbG9naW5TdGF0dXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMubG9naW4gPSB0cnVlXG4gICAgICB0aGlzLmxvZ2luU3VjY2Vzcy5lbWl0KHRydWUpXG4gICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID0gJ21pbmlzdHJ5J1xuXG4gICAgICB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9naW4gPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpIHtcbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlO1xuXG4gICAgaWYgKCF0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBsZXQgZm9ybVVwbG9hZERhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgIC8vIE1pbmlzdHJ5IHNlbGVjdGlvblxuICAgIGNvbnN0IHNlbGVjdGVkTWluaXN0cnkgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maW5kKGl0ZW0gPT5cbiAgICAgIGl0ZW0uaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnlcbiAgICApO1xuXG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5T2JqID0gc2VsZWN0ZWRNaW5pc3RyeTtcblxuICAgIC8vIEFwcGVuZCBiYXNlIGZpZWxkc1xuICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnc3RhdGVfY2VudGVyX2lkJywgY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnkgfHwgJycpO1xuICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnc3RhdGVfY2VudGVyX25hbWUnLCBzZWxlY3RlZE1pbmlzdHJ5Py5vcmdOYW1lIHx8ICcnKTtcblxuICAgIGlmIChjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50cykge1xuICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdkZXBhcnRtZW50X2lkJywgY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Rm9ybVZhbHVlcy5hZGRpdGlvbmFsRGV0YWlscykge1xuICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdpbnN0cnVjdGlvbicsIGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdXBsb2FkZWQgZmlsZShzKVxuICAgIGNvbnN0IGZpbGVzOiBGaWxlIHwgRmlsZVtdID1cbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlIHx8IHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnYWRkaXRpb25hbF9kb2N1bWVudCcpPy52YWx1ZTtcblxuICAgIGNvbnNvbGUubG9nKCdGaWxlcyBzZWxlY3RlZDonLCBmaWxlcyk7XG5cbiAgICAvLyBBcHBlbmQgc2luZ2xlIG9yIG11bHRpcGxlIGZpbGVzXG4gICAgaWYgKGZpbGVzKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWxlcykpIHtcbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZTogRmlsZSkgPT4ge1xuICAgICAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnYWRkaXRpb25hbF9kb2N1bWVudCcsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdhZGRpdGlvbmFsX2RvY3VtZW50JywgZmlsZXMsIGZpbGVzLm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlYnVnOiBwcmludCBGb3JtRGF0YVxuICAgIGNvbnNvbGUubG9nKFwiRm9ybURhdGEgRGVidWc6XCIpO1xuICAgIGZvcm1VcGxvYWREYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7a2V5fTogRklMRSAtPiAke3ZhbHVlLm5hbWV9ICgke3ZhbHVlLnNpemV9IGJ5dGVzKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7a2V5fTogJHt2YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgLy8gQnVpbGQgcmVxdWVzdCBib2R5IGZvciBwb2xsaW5nIEFQSVxuICAgIGxldCByZXE6IGFueSA9IHtcbiAgICAgIHN0YXRlX2NlbnRlcl9pZDogY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnksXG4gICAgICBpbnN0cnVjdGlvbjogY3VycmVudEZvcm1WYWx1ZXMuYWRkaXRpb25hbERldGFpbHMsXG4gICAgICBzdGF0ZV9jZW50ZXJfbmFtZTogc2VsZWN0ZWRNaW5pc3RyeT8ub3JnTmFtZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJyB8fCBjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50cykge1xuICAgICAgY29uc3QgZGVwYXJ0bWVudE5hbWUgPSB0aGlzLmRlcGFydG1lbnREYXRhLmZpbmQoXG4gICAgICAgIGQgPT4gZC5pZGVudGlmaWVyID09PSBjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50c1xuICAgICAgKTtcblxuICAgICAgcmVxLmRlcGFydG1lbnRfaWQgPSBjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50cyB8fCAnJztcbiAgICAgIHJlcS5kZXBhcnRtZW50X25hbWUgPSBkZXBhcnRtZW50TmFtZT8ub3JnTmFtZSB8fCAnJztcbiAgICB9XG5cblxuXG4gICAgLy8gUG9sbGluZyBBUElcbiAgICBjb25jYXQoXG4gICAgICBvZihudWxsKSwgICAgICAgICAgICAgIC8vIPCflKUgaW1tZWRpYXRlIGZpcnN0IGVtaXNzaW9uXG4gICAgICBpbnRlcnZhbCg1MDAwKSAgICAgICAgIC8vIOKPsSBzdWJzZXF1ZW50IHBvbGxpbmcgZXZlcnkgNXNcbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zaGFyZWRTZXJ2aWNlLmdlbmVyYXRlUm9sZU1hcHBpbmcocmVxLCBmaWxlcykpLFxuICAgICAgICB0YXAoZGF0YSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZpcnN0QXBpUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IGRhdGE7IC8vIPCfkYggc3RvcmUgZmlyc3QgcmVzcG9uc2VcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGaXJzdCBBUEkgcmVzcG9uc2U6JywgdGhpcy5maXJzdEFwaVJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHRha2VXaGlsZSgoZGF0YTogYW55KSA9PiBkYXRhPy5zdGF0dXMgIT09ICdDT01QTEVURUQnLCB0cnVlKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JvbGUgbWFwcGluZyBkYXRhLS0nLCBkYXRhKVxuICAgICAgICBpZiAodGhpcy5maXJzdEFwaVJlc3BvbnNlPy5pc19leGlzdGluZykge1xuICAgICAgICAgIHRoaXMuc2hvd1dvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpOyAgIC8vIPCfm5Egc3RvcCBwb2xsaW5nXG4gICAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVsZXRlUm9sZU1hcHBpbmdQb3B1cENvbXBvbmVudCwge1xuICAgICAgICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICAgICAgICBkYXRhOiB7ZG9jdW1lbnRzOiB0aGlzLmRvY3VtZW50c30sXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICAgICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcblxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5kZWxldGVSb2xlTWFwcGluZ0J5U3RhdGVBbmREZXBhcnRtZW50KHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLm1pbmlzdHJ5LCB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZS5kZXBhcnRtZW50cykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IFtdXG4gICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3I/LmVycm9yPy5kZXRhaWwsICdYJywge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IFtdXG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSB0aGlzLnJvdXRlci51cmw7XG5cbiAgICAgICAgICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAvLyAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoY3VycmVudFVybCk7XG4gICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID1cbiAgICAgICAgICAgICAgICBkYXRhPy5yb2xlX21hcHBpbmdzO1xuXG4gICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICdjYnBQbGFuRmluYWxPYmonLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FpL2xpc3QnXSwge1xuICAgICAgICAgICAgICAgIG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAvLyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcpIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5zaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IHRydWVcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YT8uc3RhdHVzID09PSAnQ09NUExFVEVEJykge1xuICAgICAgICAgIHRoaXMuc2hvd1dvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9XG4gICAgICAgICAgICBkYXRhPy5yb2xlX21hcHBpbmdzO1xuXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAnY2JwUGxhbkZpbmFsT2JqJyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pO1xuXG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdDQlAgUGxhbiBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IScsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvbGlzdCddKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuXG4gIGdlbmVyYXRlRmluYWxSb2xlTWFwcGluZ1dpdGhTdHJlYW0oKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZygncm9sZU1hcHBpbmdGb3JtJywgdGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgaWYgKHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlO1xuICAgICAgY29uc3QgY3VycmVudEZvcm1WYWx1ZXMgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgICAgbGV0IGZvcm1VcGxvYWREYXRhOiBhbnkgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgICAgLy8gZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdtaW5pc3RyeVR5cGUnLCBjdXJyZW50Rm9ybVZhbHVlcy5taW5pc3RyeVR5cGUpO1xuICAgICAgLy8gZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdtaW5pc3RyeScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5KTtcbiAgICAgIC8vIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnc2VjdG9ycycsIEpTT04uc3RyaW5naWZ5KGN1cnJlbnRGb3JtVmFsdWVzLnNlY3RvcnMpKTtcbiAgICAgIC8vIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnZGVwYXJ0bWVudHMnLCBKU09OLnN0cmluZ2lmeShjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50cykpO1xuICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdzdGF0ZV9jZW50ZXJfaWQnLCBjdXJyZW50Rm9ybVZhbHVlcy5taW5pc3RyeSB8fCAnJyk7XG4gICAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ3N0YXRlX2NlbnRlcl9uYW1lJywgY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnkgfHwgJycpO1xuXG4gICAgICBpZiAoY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpIHtcbiAgICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdkZXBhcnRtZW50X2lkJywgY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMgfHwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzKSB7XG4gICAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnaW5zdHJ1Y3Rpb24nLCBjdXJyZW50Rm9ybVZhbHVlcy5hZGRpdGlvbmFsRGV0YWlscyB8fCAnJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlOiBGaWxlID0gdGhpcy51cGxvYWRlZEZpbGUgfHwgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2ZpbGUnLCBmaWxlKVxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdhZGRpdGlvbmFsX2RvY3VtZW50JywgZmlsZSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygndGhpcy5yb2xlTWFwcGluZ0Zvcm0nLCB0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgIGNvbnNvbGUubG9nKCdmb3JtVXBsb2FkRGF0YS0tJywgZm9ybVVwbG9hZERhdGEpXG4gICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgZm9ybVVwbG9hZERhdGEuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3BhaXJbMF19OmAsIHBhaXJbMV0pO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJ0Zvcm0gc3VibWl0dGVkOicsIGZvcm1EYXRhKTtcbiAgICAgIGxldCBzZWN0b3JzID0gQXJyYXkuaXNBcnJheShmb3JtRGF0YS5zZWN0b3JzKSA/IGZvcm1EYXRhLnNlY3RvcnMuam9pbignLCAnKSA6ICcnXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydzZWN0b3JzJ10gPSBmb3JtRGF0YS5zZWN0b3JzXG4gICAgICAvLyBTdWJtaXQgbG9naWMgaGVyZVxuICAgICAgbGV0IHJlcSA9IHtcbiAgICAgICAgXCJzdGF0ZV9jZW50ZXJfaWRcIjogZm9ybURhdGEubWluaXN0cnksXG4gICAgICAgIFwiaW5zdHJ1Y3Rpb25cIjogZm9ybURhdGEuYWRkaXRpb25hbERldGFpbHNcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnIHx8IGZvcm1EYXRhLmRlcGFydG1lbnRzKSB7XG4gICAgICAgIHJlcVsnZGVwYXJ0bWVudF9pZCddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSBmb3JtRGF0YS5kZXBhcnRtZW50cyA/IGZvcm1EYXRhLmRlcGFydG1lbnRzIDogJydcblxuXG4gICAgICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKHUgPT4gdS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5kZXBhcnRtZW50cyk7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWVcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnYWRkaXRpb25hbERldGFpbHMnXSA9IGZvcm1EYXRhLmFkZGl0aW9uYWxEZXRhaWxzXG4gICAgICAgIGNvbnNvbGUubG9nKGRlcGFydG1lbnROYW1lKTtcblxuICAgICAgfVxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnlUeXBlJ10gPSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlXG5cbiAgICAgIGlmIChyZXEpIHtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5mdWxsSnNvbiA9ICcnO1xuICAgICAgICB0aGlzLnBhcnNlZERhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSB0aGlzLnByb2Nlc3NpbmdTdGFnZXNbMF07XG4gICAgICAgIHRoaXMucm9sZU1hcHBpbmdTZXJ2aWNlLmdlbmVyYXRlUm9sZU1hcHBpbmcoXG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlIHx8IG51bGwsXG4gICAgICAgICAgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKVxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIGNodW5rOicsIGNodW5rLCAnVG90YWwgY2h1bmtzOicsIHRoaXMuY2h1bmtzLmxlbmd0aClcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHByb2Nlc3Npbmcgc3RhZ2UgYmFzZWQgb24gY2h1bmsgY291bnRcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJvY2Vzc2luZ1N0YWdlKCk7XG5cbiAgICAgICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIFVJXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgfSwgMCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU3RyZWFtIHN0YXJ0ZWQnKVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzWzBdO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4gdGhpcy5vblN0cmVhbUVuZCgpLFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0cmVhbSBmYWlsZWQ6JywgZXJyKVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdHJlYW1FcnJvcihlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVQcm9jZXNzaW5nU3RhZ2UoKSB7XG4gICAgY29uc3QgY2h1bmtDb3VudCA9IHRoaXMuY2h1bmtzLmxlbmd0aDtcbiAgICBsZXQgc3RhZ2VJbmRleCA9IDA7XG5cbiAgICAvLyBNdWNoIHNsb3dlciBzdGFnZSBwcm9ncmVzc2lvbiAtIHN0YWdlcyBzdGF5IG11Y2ggbG9uZ2VyXG4gICAgaWYgKGNodW5rQ291bnQgPD0gOCkge1xuICAgICAgc3RhZ2VJbmRleCA9IDA7IC8vIEluaXRpYWxpemluZyAtIHN0YXlzIGZvciBmaXJzdCA4IGNodW5rc1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSAyMCkge1xuICAgICAgc3RhZ2VJbmRleCA9IDE7IC8vIEFuYWx5emluZyBjb21wZXRlbmN5IHJlcXVpcmVtZW50cyAtIDEyIGNodW5rc1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSAzNSkge1xuICAgICAgc3RhZ2VJbmRleCA9IDI7IC8vIFByb2Nlc3Npbmcgd29yayBvcmRlciAtIDE1IGNodW5rc1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSA1NSkge1xuICAgICAgc3RhZ2VJbmRleCA9IDM7IC8vIEdlbmVyYXRpbmcgcm9sZSBtYXBwaW5ncyAtIDIwIGNodW5rc1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSA3NSkge1xuICAgICAgc3RhZ2VJbmRleCA9IDQ7IC8vIENvbXB1dGluZyBmaW5hbCByZWNvbW1lbmRhdGlvbnMgLSAyMCBjaHVua3NcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhZ2VJbmRleCA9IDU7IC8vIEZpbmFsaXppbmcgQ0JQIFBsYW4gLSA3NSsgY2h1bmtzXG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzW3N0YWdlSW5kZXhdO1xuICB9XG5cbiAgZ2V0UHJvZ3Jlc3NQZXJjZW50YWdlKCk6IG51bWJlciB7XG4gICAgY29uc3QgY2h1bmtDb3VudCA9IHRoaXMuY2h1bmtzLmxlbmd0aDtcbiAgICBpZiAoY2h1bmtDb3VudCA9PT0gMCkgcmV0dXJuIDA7XG5cbiAgICAvLyBNdWNoIHNsb3dlciBhbmQgc21vb3RoZXIgcHJvZ3Jlc3MgY2FsY3VsYXRpb25cbiAgICBsZXQgcGVyY2VudGFnZSA9IDA7XG5cbiAgICBpZiAoY2h1bmtDb3VudCA8PSAxNSkge1xuICAgICAgLy8gRmlyc3QgMTUgY2h1bmtzID0gMC0yNSUgKHZlcnkgc2xvdyBzdGFydClcbiAgICAgIHBlcmNlbnRhZ2UgPSAoY2h1bmtDb3VudCAvIDE1KSAqIDI1O1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSAzNSkge1xuICAgICAgLy8gTmV4dCAyMCBjaHVua3MgPSAyNS01MCUgKHNsb3cgZWFybHkgcHJvZ3Jlc3MpXG4gICAgICBwZXJjZW50YWdlID0gMjUgKyAoKGNodW5rQ291bnQgLSAxNSkgLyAyMCkgKiAyNTtcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gNjApIHtcbiAgICAgIC8vIE5leHQgMjUgY2h1bmtzID0gNTAtNzUlIChzdGVhZHkgbWlkZGxlIHByb2dyZXNzKVxuICAgICAgcGVyY2VudGFnZSA9IDUwICsgKChjaHVua0NvdW50IC0gMzUpIC8gMjUpICogMjU7XG4gICAgfSBlbHNlIGlmIChjaHVua0NvdW50IDw9IDEwMCkge1xuICAgICAgLy8gTmV4dCA0MCBjaHVua3MgPSA3NS05MCUgKHNsb3dlciBmaW5hbCBhcHByb2FjaClcbiAgICAgIHBlcmNlbnRhZ2UgPSA3NSArICgoY2h1bmtDb3VudCAtIDYwKSAvIDQwKSAqIDE1O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCZXlvbmQgMTAwIGNodW5rcyA9IDkwLTk1JSAodmVyeSBzbG93IGZpbmFsIHByb2dyZXNzaW9uKVxuICAgICAgcGVyY2VudGFnZSA9IDkwICsgTWF0aC5taW4oKChjaHVua0NvdW50IC0gMTAwKSAvIDUwKSAqIDUsIDUpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLnJvdW5kKHBlcmNlbnRhZ2UpO1xuICB9XG5cbiAgb25TdHJlYW1FbmQoKSB7XG4gICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0NvbXBsZXRpbmcgQ0JQIFBsYW4gZ2VuZXJhdGlvbi4uLic7XG5cbiAgICAvLyBTaG93IDEwMCUgY29tcGxldGlvbiBicmllZmx5IGJlZm9yZSBmaW5pc2hpbmdcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZnVsbEpzb24gPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICAgIGNvbnN0IGNsZWFuZWQgPSB0aGlzLmZ1bGxKc29uLnJlcGxhY2UoL15gYGBqc29uXFxuLywgJycpLnJlcGxhY2UoL2BgYCQvLCAnJyk7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnBhcnNlZERhdGEgPSBKU09OLnBhcnNlKGNsZWFuZWQpO1xuICAgICAgICBjb25zb2xlLmxvZygnUGFyc2VkIGRhdGE6JywgdGhpcy5wYXJzZWREYXRhKTtcblxuICAgICAgICAvLyBIYW5kbGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gdGhpcy5wYXJzZWREYXRhO1xuICAgICAgICB0aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKTtcblxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NCUCBQbGFuIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHkhJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0pTT04gcGFyc2UgZXJyb3I6JywgZSk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ZhaWxlZCB0byBnZW5lcmF0ZSBDQlAgUGxhbi4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHByb2dyZXNzIHBlcmNlbnRhZ2UgaW5jbHVkaW5nIGNvbXBsZXRpb24gc3RhdGVcbiAgZ2V0RGlzcGxheVByb2dyZXNzUGVyY2VudGFnZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPT09ICdDb21wbGV0aW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nKSB7XG4gICAgICByZXR1cm4gMTAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9ncmVzc1BlcmNlbnRhZ2UoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdHJlYW1pbmcgZXJyb3JzLCBlc3BlY2lhbGx5IFwiUm9sZSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzXCJcbiAgaGFuZGxlU3RyZWFtRXJyb3IoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnRXJyb3IgZGV0YWlsczonLCBlcnIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgXCJSb2xlIG1hcHBpbmcgYWxyZWFkeSBleGlzdHNcIiBlcnJvclxuICAgIGlmIChlcnI/LmlzRXhpc3RpbmdSb2xlTWFwcGluZyB8fCAoZXJyPy5kZXRhaWwgJiYgZXJyLmRldGFpbC5pbmNsdWRlcygnUm9sZSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzJykpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGluZyBleGlzdGluZyByb2xlIG1hcHBpbmcuLi4nO1xuXG4gICAgICAvLyBDYWxsIHRoZSBhcHByb3ByaWF0ZSBHZXQgcm9sZSBtYXBwaW5nIEFQSSBiYXNlZCBvbiBtaW5pc3RyeSB0eXBlXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlO1xuICAgICAgY29uc3Qgc3RhdGVDZW50ZXIgPSBmb3JtRGF0YS5taW5pc3RyeTtcbiAgICAgIGNvbnN0IGRlcGFydG1lbnRJZCA9IGZvcm1EYXRhLmRlcGFydG1lbnRzO1xuXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJyAmJiBkZXBhcnRtZW50SWQpIHtcbiAgICAgICAgLy8gQ2FsbCBHZXQgcm9sZSBtYXBwaW5nIGJ5IHN0YXRlIGNlbnRlciBhbmQgZGVwYXJ0bWVudFxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudChzdGF0ZUNlbnRlciwgZGVwYXJ0bWVudElkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFeGlzdGluZyByb2xlIG1hcHBpbmcgbG9hZGVkOicsIHJlcyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXM7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0V4aXN0aW5nIHJvbGUgbWFwcGluZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5IScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyByb2xlIG1hcHBpbmc6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ZhaWxlZCB0byBsb2FkIGV4aXN0aW5nIHJvbGUgbWFwcGluZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnWCcsIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENhbGwgR2V0IHJvbGUgbWFwcGluZyBieSBzdGF0ZSBjZW50ZXIgb25seVxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyKHN0YXRlQ2VudGVyKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFeGlzdGluZyByb2xlIG1hcHBpbmcgbG9hZGVkOicsIHJlcyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXM7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0V4aXN0aW5nIHJvbGUgbWFwcGluZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5IScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyByb2xlIG1hcHBpbmc6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ZhaWxlZCB0byBsb2FkIGV4aXN0aW5nIHJvbGUgbWFwcGluZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnWCcsIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIG90aGVyIHN0cmVhbWluZyBlcnJvcnNcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyPy5kZXRhaWwgfHwgJ1N0cmVhbSBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJztcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvck1lc3NhZ2UsICdYJywge1xuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnVwbG9hZGVkRmlsZSB8fCB0aGlzLnVwbG9hZGVkRmlsZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBvbmUgZmlsZSBhdCB0aGUgZ2l2ZW4gaW5kZXhcbiAgICB0aGlzLnVwbG9hZGVkRmlsZS5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZVxuICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnYWRkaXRpb25hbF9kb2N1bWVudCcpPy5zZXRWYWx1ZSh0aGlzLnVwbG9hZGVkRmlsZSk7XG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblxuICAgIC8vIENsZWFyIGVycm9ycyBpZiBubyBmaWxlcyBsZWZ0XG4gICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy51cGxvYWRFcnJvciA9ICcnO1xuICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkRG9jJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgIGlmIChpbnB1dCkgaW5wdXQudmFsdWUgPSAnJztcbiAgICB9XG4gIH1cblxuXG4gIGdldFVzZXJQcm9maWxlRGF0YShyZXF1ZXN0ZWRUeXBlPzogc3RyaW5nLCBkb25lPzogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRVc2VyUHJvZmlsZSgpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ2RhdGEtLScsIGRhdGEpXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndXNlclByb2ZpbGUnLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICAgIHRoaXMubG9naW5Vc2VyT3JnSWRzID0gZGF0YT8ub3JnYW5pemF0aW9uX2lkc1xuICAgICAgLy8gSWdub3JlIHN0YWxlIHJlc3BvbnNlcyBmcm9tIGEgdHlwZSB0aGF0IHdhcyBjaGFuZ2VkIGFnYWluIGJlZm9yZSB0aGlzIG9uZSByZXR1cm5lZFxuICAgICAgaWYgKHJlcXVlc3RlZFR5cGUgJiYgcmVxdWVzdGVkVHlwZSAhPT0gdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSkge1xuICAgICAgICBkb25lPy4oKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGxldCBmaWx0ZXJlZE1pbmlzdHJ5RGF0YSA9IFtdXG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luVXNlck9yZ0lkcy5pbmRleE9mKGl0ZW0/LmlkZW50aWZpZXIpID4gLTEgJiYgaXRlbT8uc2JPcmdUeXBlID09PSAocmVxdWVzdGVkVHlwZSB8fCB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlKSkge1xuICAgICAgICAgIGZpbHRlcmVkTWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgdGhpcy5taW5pc3RyeURhdGEgPSBmaWx0ZXJlZE1pbmlzdHJ5RGF0YVxuICAgICAgdGhpcy5vcmlnaW5hbE1pbmlzdHJ5RGF0YSA9IGZpbHRlcmVkTWluaXN0cnlEYXRhXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IGZpbHRlcmVkTWluaXN0cnlEYXRhO1xuICAgICAgZG9uZT8uKClcbiAgICB9KVxuICB9XG5cbiAgb25PcGVuZWQob3BlbmVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5wYW5lbE9wZW4gPSBvcGVuZWQ7XG4gIH1cblxuICBvbk9wZW5lZERlcGFydG1lbnQob3BlbmVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kZXBhcnRtZW50UGFuZWxPcGVuID0gb3BlbmVkXG4gIH1cblxuICBmaWx0ZXJEYXRhKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgIGNvbnN0IHMgPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maWx0ZXIoeCA9PlxuICAgICAgICB4Lm9yZ05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLm1pbmlzdHJ5RGF0YVxuICAgIH1cblxuICB9XG5cbiAgZmlsdGVyRGVwYXJ0bWVudERhdGEoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC52YWx1ZSkge1xuICAgICAgY29uc3QgcyA9IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSB0aGlzLmRlcGFydG1lbnREYXRhLmZpbHRlcih4ID0+XG4gICAgICAgIHgub3JnTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHMpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSB0aGlzLmRlcGFydG1lbnREYXRhXG4gICAgfVxuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9ICcnXG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0ucmVzZXQoKVxuICB9XG5cbiAgb25EZXBhcnRtZW50Q2hhbmdlKCkge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWU7XG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaiAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeSAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlKSB7XG4gICAgICB0aGlzLmNicEZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeSA9IHRoaXMubWluaXN0cnlEYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlkZW50aWZpZXIgPT09IGZvcm1EYXRhLm1pbmlzdHJ5KTtcblxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcblxuICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKHUgPT4gdS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5kZXBhcnRtZW50cyk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudF9uYW1lJ10gPSBkZXBhcnRtZW50TmFtZT8ub3JnTmFtZVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICB0aGlzLmdldFVwbG9hZGVkRG9jdW1lbnRzKClcbiAgfVxuXG4gICBnb1RvVXBsb2FkRG9jdW1lbnQoKSB7XG4gICBcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9haS91cGxvYWQtZG9jdW1lbnRzJ10pO1xuICAgIFxuICB9XG5cblxuXG59XG5cblxuXG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgPCEtLSA8aW5wdXQgY2xhc3M9XCJidG4tYWN0aXZlXCIgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiRG93bmxvYWQgYXMgUERGXCIgKGNsaWNrKT1cImRvd25sb2FkUERGKClcIiAvPiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIiAqbmdJZj1cImxvZ2luXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uLW1lZGl1bVwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgyIGNsYXNzPVwiaGlnaGxpZ2h0LWFpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+aUdPVCBBSSBEcml2ZW4gQ0JQPC9zcGFuPlxuICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICA8cD5CdWlsZCBZb3VyIENhcGFjaXR5IFdpdGggQ3VzdG9taXplZCBSb2xlIE1hcHBpbmc8L3A+XG4gICAgICAgIDwvZGl2PiAtLT5cbiAgICA8L2Rpdj5cbiAgICA8bWF0LWNhcmQgKm5nSWY9XCJsb2dpblwiIGNsYXNzPVwibXQtMlwiIFtmb3JtR3JvdXBdPVwicm9sZU1hcHBpbmdGb3JtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZXBhdG1lbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+LS0+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgPHA+Q2hvb3NlIFlvdXIgRGVwYXJ0bWVudDwvcD4tLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgPC9kaXY+LS0+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgPC9kaXY+LS0+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1ncm91cCBtdC00XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cInJhZGlvLWJ0bi1ncm91cFwiIGZvcm1Db250cm9sTmFtZT1cIm1pbmlzdHJ5VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGVcIiAoY2hhbmdlKT1cIm9uTWluaXN0cnlUeXBlQ2hhbmdlKCRldmVudClcIj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIExlZnQgcmFkaW8gYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cIm1pbmlzdHJ5XCIgY2xhc3M9XCJyYWRpby1idG4gbGVmdC1yYWRpb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYWRpby1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1pY29uIGNsYXNzPVwicmFkaW8taWNvblwiIFtuZ0NsYXNzXT1cInNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnY2VudGVyJz8gJ2NoZWNrZWQtbGFiZWwnOicnXCI+ZG9tYWluPC9tYXQtaWNvbj4gIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknPyAnY2hlY2tlZC1sYWJlbCc6JydcIj5DZW50cmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFJpZ2h0IHJhZGlvIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJzdGF0ZVwiIGNsYXNzPVwicmFkaW8tYnRuIHJpZ2h0LXJhZGlvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJhZGlvLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWljb24gY2xhc3M9XCJyYWRpby1pY29uXCIgW25nQ2xhc3NdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZSc/ICdjaGVja2VkLWxhYmVsJzonJ1wiPmxvY2F0aW9uX29uPC9tYXQtaWNvbj4gIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnPyAnY2hlY2tlZC1sYWJlbCc6JydcIj5TdGF0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknXCI+TWluaXN0cnk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZSdcIj5TdGF0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHNlYXJjaC1ib3gtd2l0aC1zZWxlY3RcIj5cblxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjO3dpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGFuZWxDbGFzcz1cInNlbGVjdC13aXRoLXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknID8gJ1NlbGVjdCBNaW5pc3RyeS8gRGVwYXJ0bWVudCc6J1NlbGVjdCBTdGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25NaW5pc3RyeUNoYW5nZSgkZXZlbnQpXCIgZm9ybUNvbnRyb2xOYW1lPVwibWluaXN0cnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweDsgYmFja2dyb3VuZDogd2hpdGU7IHdpZHRoOjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib25PcGVuZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiICpuZ0lmPVwicGFuZWxPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgKGlucHV0KT1cImZpbHRlckRhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFtzZWxlY3RlZF09XCJzZWxlY3RlZE1pbmlzdHJ5SWQgPT09IGl0ZW0/LmlkZW50aWZpZXJcIiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbT8uaWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkTGlzdFwiPnt7aXRlbT8ub3JnTmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiICpuZ0lmPVwiZGVwYXJ0bWVudERhdGE/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+RGVwYXJ0bWVudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDI1cHg7IHBhZGRpbmc6IDAgMTJweDtib3JkZXI6IDFweCBzb2xpZCAjY2NjO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGFuZWxDbGFzcz1cInNlbGVjdC13aXRoLXNlYXJjaFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IERlcGFydG1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlcGFydG1lbnRzXCIgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25EZXBhcnRtZW50Q2hhbmdlKClcIiAob3BlbmVkQ2hhbmdlKT1cIm9uT3BlbmVkRGVwYXJ0bWVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC13cmFwcGVyXCIgKm5nSWY9XCJkZXBhcnRtZW50UGFuZWxPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgKGlucHV0KT1cImZpbHRlckRlcGFydG1lbnREYXRhKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIiAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0/LmlkZW50aWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZERlcGFydG1lbnRMaXN0XCI+e3tpdGVtPy5vcmdOYW1lfX08L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPlNlY3RvcjwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIHN0eWxlPVwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDI1cHg7IHBhZGRpbmc6IDAgMTJweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJTZWxlY3QgU2VjdG9yXCIgbXVsdGlwbGUgZm9ybUNvbnRyb2xOYW1lPVwic2VjdG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWN0b3JEYXRhXCI+e3tpdGVtPy52YWx1ZX19PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cInJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZSA9PT0gJ3N0YXRlJ1wiIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgYWRkaXRpb25hbC1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIHJvd3M9XCI1XCIgcGxhY2Vob2xkZXI9XCJBZGRpdGlvbmFsIGRldGFpbHNcIiBmb3JtQ29udHJvbE5hbWU9XCJhZGRpdGlvbmFsRGV0YWlsc1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIFtuZ0NsYXNzXT1cImRpc2FibGVVcGxvYWREb2N1bWVudCA/ICdidG4tYWN0aXZlLXByaW1hcnktZGlzYWJsZSc6J2J0bi1hY3RpdmUtcHJpbWFyeSdcIiBjbGFzcz1cIlwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlVXBsb2FkRG9jdW1lbnRcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZ29Ub1VwbG9hZERvY3VtZW50KClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnVwbG9hZDwvbWF0LWljb24+IE1hbmFnZSBEb2N1bWVudHNcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSAqbmdJZj1cInJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZSA9PT0gJ3N0YXRlJ1wiIC0tPlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXQtNCBzZWN0aW9uXCIgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8cD5VcGxvYWQgRG9jdW1lbnQgKFBERik8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtdXBsb2FkLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVwbG9hZERvY1wiIGNsYXNzPVwiZmlsZS11cGxvYWQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS11cGxvYWQtaWNvblwiPvCfk448L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF1cGxvYWRlZEZpbGUgfHwgdXBsb2FkZWRGaWxlLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9vc2UgdXAgdG8gMyBmaWxlcyAoUERGL1RYVClcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ1cGxvYWRlZEZpbGU/Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImZpbGUtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlIG9mIHVwbG9hZGVkRmlsZTsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZmlsZS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZW1vdmUtZmlsZS1pY29uXCIgKGNsaWNrKT1cInJlbW92ZUZpbGUoaSk7JGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInVwbG9hZERvY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAvPiAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJmaWxlLXVwbG9hZC1oaW50XCI+TWF4IGZpbGUgc2l6ZToge3ttYXhGaWxlU2l6ZU1CfX1NQjwvc21hbGw+XG5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwidXBsb2FkRG9jXCIgbXVsdGlwbGUgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdD1cIi5wZGYsLmRvYywuZG9jeCwueGxzLC54bHN4LC50eHRcIiBjbGFzcz1cImZpbGUtdXBsb2FkLWlucHV0XCIgLz5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkRXJyb3JcIiBjbGFzcz1cImVycm9yXCI+e3sgdXBsb2FkRXJyb3IgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJyb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWUgPT09ICdzdGF0ZSdcIiAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjbGFpbWVyLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+RGlzY2xhaW1lcjogUGxlYXNlIGRvIG5vdCB1cGxvYWQgYW55IGNvbmZpZGVudGlhbCBkb2N1bWVudHMuIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJkb2N1bWVudHM/Lmxlbmd0aCA8IDEgJiYgIShyb2xlTWFwcGluZ0Zvcm0/LmludmFsaWQpICB8fCBzaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZ1wiPlxuICAgICAgICAgICAgICAgIDxwPjxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAuODc1cmVtO2ZvbnQtd2VpZ2h0OiBib2xkO1wiPk5vdGU6IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiPlBsZWFzZSB1cGxvYWQgdGhlIFdvcmsgQWxsb2NhdGlvbiBPcmRlciBkb2N1bWVudCB0byBnZW5lcmF0ZSB0aGUgQ2FwYWNpdHkgQnVpbGRpbmcgUGxhbiAoQ0JQKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJkb2N1bWVudHM/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIndvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmdcIj48c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogLjg3NXJlbTtmb250LXdlaWdodDogYm9sZDtcIj5Ob3RlOlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QbGVhc2UgdXBsb2FkIHRoZSBXb3JrIEFsbG9jYXRpb24gT3JkZXIgZG9jdW1lbnQgdG8gZ2VuZXJhdGUgdGhlIENhcGFjaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGluZyBQbGFuIChDQlApPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb2xlTWFwcGluZ0Zvcm0/LmludmFsaWQgfHwgKHJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZSA9PT0gJ3N0YXRlJyAmJiAhcm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8udmFsdWUpIHx8IGxvYWRpbmcgfHwgZG9jdW1lbnRzPy5sZW5ndGggPCAxIFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvbGVNYXBwaW5nRm9ybT8uaW52YWxpZCB8fCAocm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlID09PSAnc3RhdGUnICYmICFyb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy52YWx1ZSkgfHwgbG9hZGluZyB8fCBkb2N1bWVudHM/Lmxlbmd0aCA8IDEgPyAnYnRuLWRpc2FibGUnOididG4tYWN0aXZlJ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBbdmFsdWVdPVwibG9hZGluZyA/ICdHZW5lcmF0aW5nIENCUC4uLicgOiAnR2VuZXJhdGUgQ0JQJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkdlbmVyYXRlUm9sZU1hcHBpbmcoKVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtY2FyZD5cblxuPC9kaXY+XG48IS0tIDxkaXYgKm5nSWY9XCIhbG9naW5cIj5cbiAgICAgICAgPGFwcC1sb2dpbiAoc3VjY2Vzcyk9XCJsb2dpblN0YXR1cygkZXZlbnQpXCI+PC9hcHAtbG9naW4+XG4gICAgPC9kaXY+IC0tPlxuXG48ZGl2IGNsYXNzPVwib3ZlcmxheS1sb2FkZXJcIiAqbmdJZj1cImFwaUxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGVudFwiPlxuICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXRleHQgbXQtM1wiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYWluLW1lc3NhZ2VcIj57eyBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlIHx8ICdQcmVwYXJpbmcgQ0JQIFBsYW4gZ2VuZXJhdGlvbi4uLicgfX08L3A+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1pbmRpY2F0b3JcIiAqbmdJZj1cImNodW5rcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgW3N0eWxlLndpZHRoLiVdPVwiZ2V0RGlzcGxheVByb2dyZXNzUGVyY2VudGFnZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInByb2dyZXNzLXRleHRcIj57eyBnZXREaXNwbGF5UHJvZ3Jlc3NQZXJjZW50YWdlKCkgfX0lIENvbXBsZXRlPC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0aW1lLWVzdGltYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIFJlYWwtdGltZSBzdHJlYW1pbmcgaW4gcHJvZ3Jlc3MuIFRoaXMgbWF5IHRha2UgMi0zIG1pbnV0ZXMuXG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
1113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBdUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakYsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBRW5ILE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBaUIsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVTNDLE1BQU0sT0FBTyw4QkFBOEI7SUFvRnpDLFlBQ1UsUUFBc0IsRUFDdkIsYUFBNEIsRUFDM0IsRUFBZSxFQUNmLFFBQXFCLEVBQ3RCLE1BQWlCLEVB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MkJBQTJCO3NCQUFwQyxNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCBodG1sMnBkZiBmcm9tICdodG1sMnBkZi5qcyc7XG5pbXBvcnQgeyBEZWxldGVSb2xlTWFwcGluZ1BvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vZGVsZXRlLXJvbGUtbWFwcGluZy1wb3B1cC9kZWxldGUtcm9sZS1tYXBwaW5nLXBvcHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgaW50ZXJ2YWwsIG9mLCBjb25jYXQsIFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZVdoaWxlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IFJvbGVNYXBwaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3JvbGUtbWFwcGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL2V2ZW50LnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJvbGUtbWFwcGluZy1nZW5lcmF0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGUtbWFwcGluZy1nZW5lcmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBSb2xlTWFwcGluZ0dlbmVyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgncGRmQ29udGVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwZGZDb250ZW50ITogRWxlbWVudFJlZjtcbiAgXG4gIEBJbnB1dCgpIGxvZ2luU3RhdHVzRmxhZyA9IGZhbHNlXG4gIHRpdGxlID0gJ3N1bmJpcmQtY2Itc3RhdGljd2ViJztcbiAgaXNNYWludGVuYW5jZVBhZ2U6IGFueVxuICBzZWxlY3RlZFZhbHVlID0gJydcbiAgc2VhcmNoVGV4dCA9ICcnXG4gIGRhdGFTb3VyY2U6IGFueVxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFsnUmVxdWVzdElkJywgJ3RpdGxlJywgJ3JlcXVlc3RvcicsICdyZXF1ZXN0VHlwZScsXG4gICAgJ3JlcXVlc3RTdGF0dXMnLCAnYXNzaWduZWUnLCAncmVxdWVzdGVkT24nLCAnaW50ZXJlc3RzJywgJ2FjdGlvbiddXG4gIHNlbGVjdGVkTWluaXN0cnlUeXBlOiBzdHJpbmcgPSAnbWluaXN0cnknO1xuICBtaW5pc3RyeURhdGE6IGFueSA9IFtdXG4gIG1pbmlzdHJ5RnVsbERhdGE6IGFueSA9IFtdXG4gIHJvbGVNYXBwaW5nRm9ybSE6IEZvcm1Hcm91cDtcbiAgZGlzYWJsZUJ0biA9IHRydWVcbiAgc2VjdG9yRGF0YSA9IFtcbiAgICB7XG4gICAgICB2YWx1ZTogJ1dvbWVuIGFuZCBjaGlsZCBkZXZlbG9wbWVudCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnUnVyYWwgZGV2ZWxvcG1lbnQnXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogJ1VyYmFuIGRldmVsb3BtZW50J1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdIZWFsdGhjYXJlJ1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdBZ3JpY3VsdHVyZSdcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnT3RoZXJzJ1xuICAgIH1cblxuICBdXG4gIGRlcGFydG1lbnREYXRhID0gW11cbiAgbG9hZGluZyA9IGZhbHNlXG4gIG1heEZpbGVTaXplTUIgPSAyNTtcbiAgYWxsb3dlZFR5cGVzID0gW1xuICAgICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgICdhcHBsaWNhdGlvbi9tc3dvcmQnLFxuICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JyxcbiAgICAndGV4dC9wbGFpbidcbiAgXTtcbiAgdXBsb2FkRXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICB1cGxvYWRlZEZpbGU6IEZpbGVbXSB8IG51bGwgPSBudWxsO1xuICBsb2dpbiA9IGZhbHNlXG4gIGNicEZpbmFsT2JqOiBhbnkgPSB7fVxuICBzZWxlY3RlZE1pbmlzdHJ5SWQgPSAnJ1xuICBvcmlnaW5hbEZvcm1WYWx1ZXM6IGFueVxuICBjaHVua3M6IHN0cmluZ1tdID0gW107XG4gIGZ1bGxKc29uOiBzdHJpbmcgPSAnJztcbiAgcGFyc2VkRGF0YTogYW55O1xuICBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlOiBzdHJpbmcgPSAnJztcbiAgcHJvY2Vzc2luZ1N0YWdlcyA9IFtcbiAgICAnSW5pdGlhbGl6aW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nLFxuICAgICdBbmFseXppbmcgZGVwYXJ0bWVudGFsIGNvbXBldGVuY3kgcmVxdWlyZW1lbnRzLi4uJyxcbiAgICAnUHJvY2Vzc2luZyB3b3JrIG9yZGVyIHNwZWNpZmljYXRpb25zIGFuZCByb2xlIGRlZmluaXRpb25zLi4uJyxcbiAgICAnR2VuZXJhdGluZyBkZXRhaWxlZCByb2xlcyAmIHJlc3Bvc2liaWxpdGllcy4uLicsXG4gICAgJ0dlbmVyYXRpbmcgZGV0YWlsZWQgY29tcGV0ZW5jaWVzLi4uJyxcbiAgICAnVmFsaWRhdGluZyByb2xlIG1hcHBpbmcgIGFuZCBmaW5hbGl6aW5nIHRoZSBDQlAgUGxhbidcbiAgXTtcbiAgQE91dHB1dCgpIHN1Y2Nlc3NSb2xlTWFwcGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSBhbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBAT3V0cHV0KCkgbG9naW5TdWNjZXNzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcbiAgc2VsZWN0ZWRNaW5pc3RyeU9iajogYW55ID0gJydcbiAgbG9naW5Vc2VyT3JnSWRzID0gW11cbiAgcGFuZWxPcGVuID0gZmFsc2U7XG4gIGRlcGFydG1lbnRQYW5lbE9wZW4gPSBmYWxzZVxuICBmaWx0ZXJlZExpc3QgPSBbXTtcbiAgZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IFtdO1xuICBvcmlnaW5hbE1pbmlzdHJ5RGF0YSA9IFtdXG4gIGFwaUxvYWRpbmcgPSBmYWxzZVxuICBmaXJzdEFwaVJlc3BvbnNlOiBhbnkgPSBudWxsXG4gIGRvY3VtZW50cyA9IFtdXG4gIGRpc2FibGVVcGxvYWREb2N1bWVudCA9IHRydWVcbiAgZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSB0cnVlXG4gIHdvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICBzaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IGZhbHNlXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGV2ZW50U3ZjOiBFdmVudFNlcnZpY2UsXG4gICAgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHB1YmxpYyByb2xlTWFwcGluZ1NlcnZpY2U6IFJvbGVNYXBwaW5nU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICkge1xuICAgIHRoaXMucm91dGVyLnJvdXRlUmV1c2VTdHJhdGVneS5zaG91bGRSZXVzZVJvdXRlID0gKCkgPT4gZmFsc2U7XG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KFtdKVxuICAgIHRoaXMuaXNNYWludGVuYW5jZVBhZ2UgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL21haW50ZW5hbmNlJylcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgdGhpcy5sb2dpbiA9IHRoaXMuc2hhcmVkU2VydmljZS5jaGVja0lmTG9naW4oKVxuXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaiAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeSAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlKSB7XG5cblxuICAgICAgdGhpcy5lZGl0TWluaXN0cnlGb3JtKClcbiAgICAgIC8vIHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubG9naW4pIHtcbiAgICAgICAgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgICAgfVxuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbWluaXN0cnlUeXBlOiBbJ21pbmlzdHJ5JywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG1pbmlzdHJ5OiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHNlY3RvcnM6IFtbXV0sXG4gICAgICAgIGRlcGFydG1lbnRzOiBbJyddLCAvLyBzaG93biBvbmx5IGlmIG1pbmlzdHJ5VHlwZSA9PSAnc3RhdGUnXG4gICAgICAgIGFkZGl0aW9uYWxEZXRhaWxzOiBbJyddLFxuICAgICAgICBhZGRpdGlvbmFsX2RvY3VtZW50OiBbXVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ3NlY3RvcnMnKT8uc2V0VmFsdWUoW10pO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh0eXBlID0+IHtcbiAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0ucmVzZXQoe1xuICAgICAgICAgIG1pbmlzdHJ5VHlwZTogdHlwZSwgLy8gS2VlcCB0aGUgY2hhbmdlZCB2YWx1ZVxuICAgICAgICAgIG1pbmlzdHJ5OiBudWxsLFxuICAgICAgICAgIHNlY3RvcnM6IFtdLFxuICAgICAgICAgIGRlcGFydG1lbnRzOiBbXSxcbiAgICAgICAgICBhZGRpdGlvbmFsRGV0YWlsczogJycsXG4gICAgICAgICAgYWRkaXRpb25hbF9kb2N1bWVudDogW11cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKHN0YXR1czogYW55KSA9PiB7XG4gICAgICAgIGxldCBoYXNVcGxvYWREb2N1bWVudHMgPSBmYWxzZVxuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBoYXNVcGxvYWREb2N1bWVudHMgPVxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCcvdXBsb2FkLWRvY3VtZW50cycpO1xuXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWhhc1VwbG9hZERvY3VtZW50cykge1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jaGVja1JvbGVNYXBwaW5nRm9ybVZhbGlkYXRpb24ubmV4dChzdGF0dXMpO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdHVzID09PSAnVkFMSUQnKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgfSk7XG4gICAgfVxuXG5cblxuXG5cblxuICB9XG5cbiAgZ2V0VXBsb2FkZWREb2N1bWVudHMoKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZTtcbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlXG4gICAgbGV0IHJlcUJvZHkgPSB7XG4gICAgICBzdGF0ZV9jZW50ZXJfaWQ6IGZvcm1EYXRhLm1pbmlzdHJ5LFxuICAgICAgaW5jbHVkZV9zdW1tYXJ5OiB0cnVlLFxuICAgICAgc2tpcDogMCxcbiAgICAgIGxpbWl0OiAyMDBcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmb3JtRGF0YT8uZGVwYXJ0bWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXFCb2R5WydkZXBhcnRtZW50X2lkJ10gPSBmb3JtRGF0YT8uZGVwYXJ0bWVudHNcbiAgICB9XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFVwbG9hZGVkRG9jdW1lbnRzKHJlcUJvZHkpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzICYmIHJlcz8uaXRlbXMgJiYgcmVzPy5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxldCB3QU9Db3VudCA9IDBcbiAgICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSByZXM/Lml0ZW1zXG4gICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gZmFsc2VcbiAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIHRoaXMuZG9jdW1lbnRzLmZvckVhY2goKGl0ZW0pPT57XG4gICAgICAgICAgaWYoaXRlbT8uZG9jdW1lbnRfdHlwZSA9PT0gJ1dvcmsgQWxsb2NhdGlvbiBPcmRlcicpIHtcbiAgICAgICAgICAgIHdBT0NvdW50ID13QU9Db3VudCsxXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmKHdBT0NvdW50IDwgMSkge1xuICAgICAgICAgIHRoaXMud29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLndvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kb2N1bWVudHMtLScsIHRoaXMuZG9jdW1lbnRzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXVxuICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSBmYWxzZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBlZGl0TWluaXN0cnlGb3JtKCkge1xuICAgIGlmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGVcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICAgIGlmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDZW50ZXJCYXNlZERlcGFydG1lbnQodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRlcGFydG1lbnREYXRhID0gcmVzXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdObyBEZXBhcnRtZW50IEZvdW5kIGZvciBTZWxlY3RlZCBNaW5pc3RyeScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gJydcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSAnJ1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbWluaXN0cnlUeXBlOiBbdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG1pbmlzdHJ5OiBbdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBzZWN0b3JzOiBbW11dLFxuICAgICAgICBkZXBhcnRtZW50czogW3RoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXSwgLy8gc2hvd24gb25seSBpZiBtaW5pc3RyeVR5cGUgPT0gJ3N0YXRlJ1xuICAgICAgICBhZGRpdGlvbmFsRGV0YWlsczogWycnXVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KHtcbiAgICAgIC8vICAgICBtaW5pc3RyeVR5cGU6IHR5cGUsIC8vIEtlZXAgdGhlIGNoYW5nZWQgdmFsdWVcbiAgICAgIC8vICAgICBtaW5pc3RyeTogbnVsbCxcbiAgICAgIC8vICAgICBzZWN0b3JzOiBbXSxcbiAgICAgIC8vICAgICBkZXBhcnRtZW50czogW10sXG4gICAgICAvLyAgICAgYWRkaXRpb25hbERldGFpbHM6ICcnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gICBpZiAodHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAvLyB9KTtcblxuICAgICAgaWYgKHRoaXMubWluaXN0cnlEYXRhICYmIHRoaXMubWluaXN0cnlEYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICB9XG5cbiAgICAgIC8vdGhpcy5vbkdlbmVyYXRlUm9sZU1hcHBpbmcoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGVcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICAgIGF3YWl0IHRoaXMuc2hhcmVkU2VydmljZS5nZXREZXBhcnRtZW50TGlzdCh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllcikuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IHJlc1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCAtLScsIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdClcbiAgICAgIH0pXG4gICAgICBpZiAodGhpcy5taW5pc3RyeURhdGEgJiYgdGhpcy5taW5pc3RyeURhdGEubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeUlkID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJcbiAgICAgIH1cbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG1pbmlzdHJ5VHlwZTogW3RoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBtaW5pc3RyeTogW3RoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc2VjdG9yczogW1tdXSxcbiAgICAgICAgZGVwYXJ0bWVudHM6IFt0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50c10sIC8vIHNob3duIG9ubHkgaWYgbWluaXN0cnlUeXBlID09ICdzdGF0ZSdcbiAgICAgICAgYWRkaXRpb25hbERldGFpbHM6IFt0aGlzLmNicEZpbmFsT2JqPy5hZGRpdGlvbmFsRGV0YWlsc11cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KHtcbiAgICAgIC8vICAgICBtaW5pc3RyeVR5cGU6IHR5cGUsIC8vIEtlZXAgdGhlIGNoYW5nZWQgdmFsdWVcbiAgICAgIC8vICAgICBtaW5pc3RyeTogbnVsbCxcbiAgICAgIC8vICAgICBzZWN0b3JzOiBbXSxcbiAgICAgIC8vICAgICBkZXBhcnRtZW50czogW10sXG4gICAgICAvLyAgICAgYWRkaXRpb25hbERldGFpbHM6ICcnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gICBpZiAodHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAvLyB9KTtcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLm1pbmlzdHJ5RGF0YScsIHRoaXMubWluaXN0cnlEYXRhKVxuICAgICAgaWYgKHRoaXMubWluaXN0cnlEYXRhICYmIHRoaXMubWluaXN0cnlEYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3JpZ2luYWxGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICB0aGlzLmdldFVwbG9hZGVkRG9jdW1lbnRzKClcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMubG9naW4gPSB0aGlzLmxvZ2luU3RhdHVzRmxhZ1xuXG4gIH1cblxuICBnZXRDaGFuZ2VkRmllbGRzKG9yaWdpbmFsOiBhbnksIGN1cnJlbnQ6IGFueSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjaGFuZ2VkS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9yaWdpbmFsKSB7XG4gICAgICBpZiAoIW9yaWdpbmFsLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gb3JpZ2luYWxba2V5XTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRba2V5XTtcblxuICAgICAgLy8gRm9yIGFycmF5cyBhbmQgb2JqZWN0cywgdXNlIEpTT04uc3RyaW5naWZ5IChvciBsb2Rhc2ggaXNFcXVhbCBmb3IgZGVlcCBjb21wYXJpc29uKVxuICAgICAgY29uc3QgaXNFcXVhbCA9XG4gICAgICAgIHR5cGVvZiBvcmlnaW5hbFZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxWYWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICA6IG9yaWdpbmFsVmFsdWUgPT09IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgaWYgKCFpc0VxdWFsKSB7XG4gICAgICAgIGNoYW5nZWRLZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZEtleXM7XG4gIH1cblxuICBvbkdlbmVyYXRlUm9sZU1hcHBpbmcoKTogYW55IHtcblxuICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBjb25zdCBmb3JtRGF0YTogYW55ID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQoJ21pbmlzdHJ5VHlwZScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5VHlwZSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdtaW5pc3RyeScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5KTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3NlY3RvcnMnLCBKU09OLnN0cmluZ2lmeShjdXJyZW50Rm9ybVZhbHVlcy5zZWN0b3JzKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdkZXBhcnRtZW50cycsIEpTT04uc3RyaW5naWZ5KGN1cnJlbnRGb3JtVmFsdWVzLmRlcGFydG1lbnRzKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdhZGRpdGlvbmFsRGV0YWlscycsIGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzIHx8ICcnKTtcbiAgICBjb25zdCBmaWxlOiBGaWxlID0gdGhpcy51cGxvYWRlZEZpbGUgfHwgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnZhbHVlO1xuICAgIGNvbnNvbGUubG9nKCdmaWxlJywgZmlsZSlcbiAgICBpZiAoZmlsZSkge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdhZGRpdGlvbmFsX2RvY3VtZW50JywgZmlsZSk7XG4gICAgfVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSBjdXJyZW50Rm9ybVZhbHVlcz8uZGVwYXJ0bWVudHNcbiAgICBjb25zdCBkZXBhcnRtZW50TmFtZSA9IHRoaXMuZGVwYXJ0bWVudERhdGEuZmluZCh1ID0+IHUuaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+XG4gICAgICBpdGVtLmlkZW50aWZpZXIgPT09IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5XG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHNlbGVjdGVkTWluaXN0cnk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgY29uc29sZS5sb2coJ3RoaXMucm9sZU1hcHBpbmdGb3JtJywgdGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgY29uc29sZS5sb2coJ2Zvcm1EYXRhLS0nLCBmb3JtRGF0YSlcbiAgICBmb3IgKGNvbnN0IHBhaXIgb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgJHtwYWlyWzBdfTpgLCBwYWlyWzFdKTtcbiAgICB9XG5cblxuICAgIGNvbnN0IGNoYW5nZWRGaWVsZHMgPSB0aGlzLmdldENoYW5nZWRGaWVsZHModGhpcy5vcmlnaW5hbEZvcm1WYWx1ZXMsIGN1cnJlbnRGb3JtVmFsdWVzKTtcblxuICAgIGlmIChjaGFuZ2VkRmllbGRzLmxlbmd0aCA+IDAgfHwgKGZpbGUgJiYgZmlsZS5zaXplID4gMCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdjaGFuZ2VkRmllbGRzJywgY2hhbmdlZEZpZWxkcylcbiAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VkIGZpZWxkczonLCBjaGFuZ2VkRmllbGRzKTtcbiAgICAgIGlmIChjaGFuZ2VkRmllbGRzLmluY2x1ZGVzKCdhZGRpdGlvbmFsRGV0YWlscycpICYmIHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLmFkZGl0aW9uYWxEZXRhaWxzPy50cmltKCkgfHwgKGZpbGUgJiYgZmlsZS5zaXplID4gMCkpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZWxldGVSb2xlTWFwcGluZ1BvcHVwQ29tcG9uZW50LCB7XG4gICAgICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICAgICAgZGF0YToge2RvY3VtZW50czogdGhpcy5kb2N1bWVudHN9LFxuICAgICAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgICAgICB9KTtcblxuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5kZWxldGVSb2xlTWFwcGluZ0J5U3RhdGVBbmREZXBhcnRtZW50KHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLm1pbmlzdHJ5LCB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZS5kZXBhcnRtZW50cykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gW11cbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBbXVxuICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgIGNvbnNvbGUubG9nKCdObyBjaGFuZ2VzIGRldGVjdGVkLicpO1xuICAgIH1cblxuICB9XG5cblxuICBnZXRNaW5pc3RyeURhdGEoKSB7XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuICAgIGNvbnN0IHJlcXVlc3RlZFR5cGUgPSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0TWluaXN0cnlEYXRhKHJlcXVlc3RlZFR5cGUpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvLyBJZ25vcmUgc3RhbGUgcmVzcG9uc2VzIGZyb20gYSB0eXBlIHRoYXQgd2FzIGNoYW5nZWQgYWdhaW4gYmVmb3JlIHRoaXMgb25lIHJldHVybmVkXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRUeXBlICE9PSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhID0gZGF0YVxuICAgICAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IFtdXG4gICAgICAgIGlmIChyZXF1ZXN0ZWRUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZFR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtPy5zYk9yZ1R5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgICAgdGhpcy5taW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldFVzZXJQcm9maWxlRGF0YShyZXF1ZXN0ZWRUeXBlLCByZXNvbHZlKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgb25NaW5pc3RyeVR5cGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZygnZXZlbnQnLCBldmVudClcblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5VHlwZSddID0gZXZlbnQudmFsdWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gW11cbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID0gZXZlbnQudmFsdWVcbiAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IFtdXG5cbiAgICBpZiAodGhpcy5sb2dpbikge1xuICAgICAgYXdhaXQgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIH1cblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICBpZiAoZXZlbnQ/LnZhbHVlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5Jyk/LnNldFZhbHVlKG51bGwpO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUoW10pO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnZhbHVlID09PSAnbWluaXN0cnknKSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5Jyk/LnNldFZhbHVlKG51bGwpO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUoW10pO1xuICAgIH1cblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5J10gPSAnJ1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gJydcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gJydcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0ucmVzZXQoKVxuICAgIGlmICghdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnkpIHtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAvLyAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgIC8vICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgIH0sIDUwMDApXG4gICAgfVxuICB9XG5cbiAgb25NaW5pc3RyeUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeUlkID0gZXZlbnQudmFsdWU7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5IElEOicsIHNlbGVjdGVkTWluaXN0cnlJZCk7XG4gICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IFtdXG4gICAgLy8gWW91IGNhbiBhY2Nlc3MgdGhlIHNlbGVjdGVkIG9iamVjdCBpZiBuZWVkZWRcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+IGl0ZW0uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRNaW5pc3RyeUlkKTtcbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlPYmogPSBzZWxlY3RlZE1pbmlzdHJ5XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5OicsIHNlbGVjdGVkTWluaXN0cnkpOyBgYFxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5J10gPSBzZWxlY3RlZE1pbmlzdHJ5XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IFtdXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgIGlmIChzZWxlY3RlZE1pbmlzdHJ5SWQgJiYgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldERlcGFydG1lbnRMaXN0KHNlbGVjdGVkTWluaXN0cnlJZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IHJlc1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChzZWxlY3RlZE1pbmlzdHJ5SWQgJiYgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENlbnRlckJhc2VkRGVwYXJ0bWVudChzZWxlY3RlZE1pbmlzdHJ5SWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZGVwYXJ0bWVudERhdGEgPSByZXNcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ05vIERlcGFydG1lbnQgRm91bmQgZm9yIFNlbGVjdGVkIE1pbmlzdHJ5JywgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gJydcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gJydcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgICAgIH1cblxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLmdldFVwbG9hZGVkRG9jdW1lbnRzKClcbiAgfVxuXG4gIHNlYXJjaERhdGEoKSB7XG5cbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCkge1xuXG4gIH1cblxuICBkb3dubG9hZFBERigpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wZGZDb250ZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbWFyZ2luOiAwLjUsXG4gICAgICBmaWxlbmFtZTogJ0NCUF9QbGFuLnBkZicsXG4gICAgICBpbWFnZTogeyB0eXBlOiAnanBlZycsIHF1YWxpdHk6IDAuOTggfSxcbiAgICAgIGh0bWwyY2FudmFzOiB7XG4gICAgICAgIHNjYWxlOiAyLFxuICAgICAgICB1c2VDT1JTOiB0cnVlLCAgLy8gSW1wb3J0YW50IGZvciBleHRlcm5hbCBpbWFnZXMvaWNvbnNcbiAgICAgIH0sXG4gICAgICBqc1BERjoge1xuICAgICAgICB1bml0OiAnaW4nLFxuICAgICAgICBmb3JtYXQ6ICdhNCcsXG4gICAgICAgIG9yaWVudGF0aW9uOiAncG9ydHJhaXQnXG4gICAgICB9XG4gICAgfTtcblxuICAgIGh0bWwycGRmKCkuZnJvbShlbGVtZW50KS5zZXQob3B0aW9ucykuc2F2ZSgpO1xuXG4gIH1cblxuICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcbiAgICBjb25zdCBtYXhGaWxlcyA9IDM7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnYWRkaXRpb25hbF9kb2N1bWVudCcpO1xuXG4gICAgLy8gQWx3YXlzIGNsZWFyIGNvbnRyb2wgZmlyc3QgKHByZXZlbnRzIG9sZCB2YWxpZCB2YWx1ZSlcbiAgICBjb250cm9sPy5yZXNldCgpO1xuICAgIGNvbnRyb2w/LnNldEVycm9ycyhudWxsKTtcbiAgICB0aGlzLnVwbG9hZGVkRmlsZSA9IFtdO1xuICAgIHRoaXMudXBsb2FkRXJyb3IgPSBudWxsO1xuXG4gICAgaWYgKCFmaWxlcyB8fCBmaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIExpbWl0IGNoZWNrXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IG1heEZpbGVzKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gYFlvdSBjYW4gdXBsb2FkIGEgbWF4aW11bSBvZiAke21heEZpbGVzfSBmaWxlc2A7XG4gICAgICBjb250cm9sPy5zZXRFcnJvcnMoeyBtYXhGaWxlczogdHJ1ZSB9KTtcbiAgICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICBjb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRGaWxlczogRmlsZVtdID0gW107XG4gICAgY29uc3QgaW52YWxpZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG1heEJ5dGVzID0gdGhpcy5tYXhGaWxlU2l6ZU1CICogMTAyNCAqIDEwMjQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbaV07XG5cbiAgICAgIC8vIFNpemUgY2hlY2tcbiAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhCeXRlcykge1xuICAgICAgICBpbnZhbGlkRmlsZXMucHVzaChgJHtmaWxlLm5hbWV9IChleGNlZWRzICR7dGhpcy5tYXhGaWxlU2l6ZU1CfU1CKWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVHlwZSBjaGVja1xuICAgICAgaWYgKCF0aGlzLmFsbG93ZWRUeXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XG4gICAgICAgIGludmFsaWRGaWxlcy5wdXNoKGAke2ZpbGUubmFtZX0gKGludmFsaWQgdHlwZSlgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkRmlsZXMucHVzaChmaWxlKTtcbiAgICB9XG5cbiAgICAvLyDinYwgTk8gdmFsaWQgZmlsZXMg4oaSIGZvcm0gTVVTVCBCRSBpbnZhbGlkXG4gICAgaWYgKHZhbGlkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gYEludmFsaWQgZmlsZShzKTogJHtpbnZhbGlkRmlsZXMuam9pbignLCAnKX1gO1xuXG4gICAgICBjb250cm9sPy5zZXRWYWx1ZShudWxsKTtcbiAgICAgIGNvbnRyb2w/LnNldEVycm9ycyh7IGludmFsaWRGaWxlczogdHJ1ZSB9KTtcbiAgICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICBjb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSwgNTAwMClcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOKclCBBdCBsZWFzdCBPTkUgdmFsaWQgZmlsZSDihpIgZm9ybSBzaG91bGQgYmUgVkFMSURcbiAgICB0aGlzLnVwbG9hZGVkRmlsZSA9IHZhbGlkRmlsZXM7XG5cbiAgICBpZiAoaW52YWxpZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudXBsb2FkRXJyb3IgPSBgU29tZSBmaWxlcyB3ZXJlIHNraXBwZWQ6ICR7aW52YWxpZEZpbGVzLmpvaW4oJywgJyl9YDtcbiAgICB9XG5cbiAgICBjb250cm9sPy5zZXRWYWx1ZSh2YWxpZEZpbGVzKTtcbiAgICBjb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgY29udHJvbD8ubWFya0FzRGlydHkoKTtcbiAgICBjb250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gIH1cblxuXG5cblxuXG5cbiAgbG9naW5TdGF0dXMoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMubG9naW4gPSB0cnVlXG4gICAgICB0aGlzLmxvZ2luU3VjY2Vzcy5lbWl0KHRydWUpXG4gICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID0gJ21pbmlzdHJ5J1xuXG4gICAgICB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9naW4gPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpIHtcbiAgICB0aGlzLmFwaUxvYWRpbmcgPSB0cnVlO1xuXG4gICAgaWYgKCF0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBsZXQgZm9ybVVwbG9hZERhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgIC8vIE1pbmlzdHJ5IHNlbGVjdGlvblxuICAgIGNvbnN0IHNlbGVjdGVkTWluaXN0cnkgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maW5kKGl0ZW0gPT5cbiAgICAgIGl0ZW0uaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnlcbiAgICApO1xuXG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5T2JqID0gc2VsZWN0ZWRNaW5pc3RyeTtcblxuICAgIC8vIEFwcGVuZCBiYXNlIGZpZWxkc1xuICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnc3RhdGVfY2VudGVyX2lkJywgY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnkgfHwgJycpO1xuICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnc3RhdGVfY2VudGVyX25hbWUnLCBzZWxlY3RlZE1pbmlzdHJ5Py5vcmdOYW1lIHx8ICcnKTtcblxuICAgIGlmIChjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50cykge1xuICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdkZXBhcnRtZW50X2lkJywgY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Rm9ybVZhbHVlcy5hZGRpdGlvbmFsRGV0YWlscykge1xuICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdpbnN0cnVjdGlvbicsIGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdXBsb2FkZWQgZmlsZShzKVxuICAgIGNvbnN0IGZpbGVzOiBGaWxlIHwgRmlsZVtdID1cbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlIHx8IHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnYWRkaXRpb25hbF9kb2N1bWVudCcpPy52YWx1ZTtcblxuICAgIGNvbnNvbGUubG9nKCdGaWxlcyBzZWxlY3RlZDonLCBmaWxlcyk7XG5cbiAgICAvLyBBcHBlbmQgc2luZ2xlIG9yIG11bHRpcGxlIGZpbGVzXG4gICAgaWYgKGZpbGVzKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWxlcykpIHtcbiAgICAgICAgZmlsZXMuZm9yRWFjaCgoZmlsZTogRmlsZSkgPT4ge1xuICAgICAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnYWRkaXRpb25hbF9kb2N1bWVudCcsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdhZGRpdGlvbmFsX2RvY3VtZW50JywgZmlsZXMsIGZpbGVzLm5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlYnVnOiBwcmludCBGb3JtRGF0YVxuICAgIGNvbnNvbGUubG9nKFwiRm9ybURhdGEgRGVidWc6XCIpO1xuICAgIGZvcm1VcGxvYWREYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7a2V5fTogRklMRSAtPiAke3ZhbHVlLm5hbWV9ICgke3ZhbHVlLnNpemV9IGJ5dGVzKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7a2V5fTogJHt2YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgLy8gQnVpbGQgcmVxdWVzdCBib2R5IGZvciBwb2xsaW5nIEFQSVxuICAgIGxldCByZXE6IGFueSA9IHtcbiAgICAgIHN0YXRlX2NlbnRlcl9pZDogY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnksXG4gICAgICBpbnN0cnVjdGlvbjogY3VycmVudEZvcm1WYWx1ZXMuYWRkaXRpb25hbERldGFpbHMsXG4gICAgICBzdGF0ZV9jZW50ZXJfbmFtZTogc2VsZWN0ZWRNaW5pc3RyeT8ub3JnTmFtZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJyB8fCBjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50cykge1xuICAgICAgY29uc3QgZGVwYXJ0bWVudE5hbWUgPSB0aGlzLmRlcGFydG1lbnREYXRhLmZpbmQoXG4gICAgICAgIGQgPT4gZC5pZGVudGlmaWVyID09PSBjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50c1xuICAgICAgKTtcblxuICAgICAgcmVxLmRlcGFydG1lbnRfaWQgPSBjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50cyB8fCAnJztcbiAgICAgIHJlcS5kZXBhcnRtZW50X25hbWUgPSBkZXBhcnRtZW50TmFtZT8ub3JnTmFtZSB8fCAnJztcbiAgICB9XG5cblxuXG4gICAgLy8gUG9sbGluZyBBUElcbiAgICBjb25jYXQoXG4gICAgICBvZihudWxsKSwgICAgICAgICAgICAgIC8vIPCflKUgaW1tZWRpYXRlIGZpcnN0IGVtaXNzaW9uXG4gICAgICBpbnRlcnZhbCg1MDAwKSAgICAgICAgIC8vIOKPsSBzdWJzZXF1ZW50IHBvbGxpbmcgZXZlcnkgNXNcbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zaGFyZWRTZXJ2aWNlLmdlbmVyYXRlUm9sZU1hcHBpbmcocmVxLCBmaWxlcykpLFxuICAgICAgICB0YXAoZGF0YSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZpcnN0QXBpUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IGRhdGE7IC8vIPCfkYggc3RvcmUgZmlyc3QgcmVzcG9uc2VcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGaXJzdCBBUEkgcmVzcG9uc2U6JywgdGhpcy5maXJzdEFwaVJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHRha2VXaGlsZSgoZGF0YTogYW55KSA9PiBkYXRhPy5zdGF0dXMgIT09ICdDT01QTEVURUQnLCB0cnVlKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JvbGUgbWFwcGluZyBkYXRhLS0nLCBkYXRhKVxuICAgICAgICBpZiAodGhpcy5maXJzdEFwaVJlc3BvbnNlPy5pc19leGlzdGluZykge1xuICAgICAgICAgIHRoaXMuc2hvd1dvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpOyAgIC8vIPCfm5Egc3RvcCBwb2xsaW5nXG4gICAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVsZXRlUm9sZU1hcHBpbmdQb3B1cENvbXBvbmVudCwge1xuICAgICAgICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICAgICAgICBkYXRhOiB7ZG9jdW1lbnRzOiB0aGlzLmRvY3VtZW50c30sXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICAgICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcblxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5kZWxldGVSb2xlTWFwcGluZ0J5U3RhdGVBbmREZXBhcnRtZW50KHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLm1pbmlzdHJ5LCB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZS5kZXBhcnRtZW50cykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IFtdXG4gICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3I/LmVycm9yPy5kZXRhaWwsICdYJywge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IFtdXG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSB0aGlzLnJvdXRlci51cmw7XG5cbiAgICAgICAgICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAvLyAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoY3VycmVudFVybCk7XG4gICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID1cbiAgICAgICAgICAgICAgICBkYXRhPy5yb2xlX21hcHBpbmdzO1xuXG4gICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICdjYnBQbGFuRmluYWxPYmonLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FpL2xpc3QnXSwge1xuICAgICAgICAgICAgICAgIG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAvLyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcpIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5zaG93V29ya0FsbG9jYXRpb25PcmRlckRvY3VtZW50TWlzc2luZyA9IHRydWVcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YT8uc3RhdHVzID09PSAnQ09NUExFVEVEJykge1xuICAgICAgICAgIHRoaXMuc2hvd1dvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9XG4gICAgICAgICAgICBkYXRhPy5yb2xlX21hcHBpbmdzO1xuXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAnY2JwUGxhbkZpbmFsT2JqJyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pO1xuXG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdDQlAgUGxhbiBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IScsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvbGlzdCddKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuXG4gIGdlbmVyYXRlRmluYWxSb2xlTWFwcGluZ1dpdGhTdHJlYW0oKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZygncm9sZU1hcHBpbmdGb3JtJywgdGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgaWYgKHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlO1xuICAgICAgY29uc3QgY3VycmVudEZvcm1WYWx1ZXMgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgICAgbGV0IGZvcm1VcGxvYWREYXRhOiBhbnkgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgICAgLy8gZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdtaW5pc3RyeVR5cGUnLCBjdXJyZW50Rm9ybVZhbHVlcy5taW5pc3RyeVR5cGUpO1xuICAgICAgLy8gZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdtaW5pc3RyeScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5KTtcbiAgICAgIC8vIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnc2VjdG9ycycsIEpTT04uc3RyaW5naWZ5KGN1cnJlbnRGb3JtVmFsdWVzLnNlY3RvcnMpKTtcbiAgICAgIC8vIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnZGVwYXJ0bWVudHMnLCBKU09OLnN0cmluZ2lmeShjdXJyZW50Rm9ybVZhbHVlcy5kZXBhcnRtZW50cykpO1xuICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdzdGF0ZV9jZW50ZXJfaWQnLCBjdXJyZW50Rm9ybVZhbHVlcy5taW5pc3RyeSB8fCAnJyk7XG4gICAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ3N0YXRlX2NlbnRlcl9uYW1lJywgY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnkgfHwgJycpO1xuXG4gICAgICBpZiAoY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpIHtcbiAgICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdkZXBhcnRtZW50X2lkJywgY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMgfHwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzKSB7XG4gICAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnaW5zdHJ1Y3Rpb24nLCBjdXJyZW50Rm9ybVZhbHVlcy5hZGRpdGlvbmFsRGV0YWlscyB8fCAnJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlOiBGaWxlID0gdGhpcy51cGxvYWRlZEZpbGUgfHwgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnZhbHVlO1xuICAgICAgY29uc29sZS5sb2coJ2ZpbGUnLCBmaWxlKVxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdhZGRpdGlvbmFsX2RvY3VtZW50JywgZmlsZSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZygndGhpcy5yb2xlTWFwcGluZ0Zvcm0nLCB0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgIGNvbnNvbGUubG9nKCdmb3JtVXBsb2FkRGF0YS0tJywgZm9ybVVwbG9hZERhdGEpXG4gICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgZm9ybVVwbG9hZERhdGEuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3BhaXJbMF19OmAsIHBhaXJbMV0pO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJ0Zvcm0gc3VibWl0dGVkOicsIGZvcm1EYXRhKTtcbiAgICAgIGxldCBzZWN0b3JzID0gQXJyYXkuaXNBcnJheShmb3JtRGF0YS5zZWN0b3JzKSA/IGZvcm1EYXRhLnNlY3RvcnMuam9pbignLCAnKSA6ICcnXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydzZWN0b3JzJ10gPSBmb3JtRGF0YS5zZWN0b3JzXG4gICAgICAvLyBTdWJtaXQgbG9naWMgaGVyZVxuICAgICAgbGV0IHJlcSA9IHtcbiAgICAgICAgXCJzdGF0ZV9jZW50ZXJfaWRcIjogZm9ybURhdGEubWluaXN0cnksXG4gICAgICAgIFwiaW5zdHJ1Y3Rpb25cIjogZm9ybURhdGEuYWRkaXRpb25hbERldGFpbHNcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnIHx8IGZvcm1EYXRhLmRlcGFydG1lbnRzKSB7XG4gICAgICAgIHJlcVsnZGVwYXJ0bWVudF9pZCddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSBmb3JtRGF0YS5kZXBhcnRtZW50cyA/IGZvcm1EYXRhLmRlcGFydG1lbnRzIDogJydcblxuXG4gICAgICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKHUgPT4gdS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5kZXBhcnRtZW50cyk7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWVcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnYWRkaXRpb25hbERldGFpbHMnXSA9IGZvcm1EYXRhLmFkZGl0aW9uYWxEZXRhaWxzXG4gICAgICAgIGNvbnNvbGUubG9nKGRlcGFydG1lbnROYW1lKTtcblxuICAgICAgfVxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnlUeXBlJ10gPSB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlXG5cbiAgICAgIGlmIChyZXEpIHtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5mdWxsSnNvbiA9ICcnO1xuICAgICAgICB0aGlzLnBhcnNlZERhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSB0aGlzLnByb2Nlc3NpbmdTdGFnZXNbMF07XG4gICAgICAgIHRoaXMucm9sZU1hcHBpbmdTZXJ2aWNlLmdlbmVyYXRlUm9sZU1hcHBpbmcoXG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlIHx8IG51bGwsXG4gICAgICAgICAgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKVxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIGNodW5rOicsIGNodW5rLCAnVG90YWwgY2h1bmtzOicsIHRoaXMuY2h1bmtzLmxlbmd0aClcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHByb2Nlc3Npbmcgc3RhZ2UgYmFzZWQgb24gY2h1bmsgY291bnRcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJvY2Vzc2luZ1N0YWdlKCk7XG5cbiAgICAgICAgICAgIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIFVJXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgfSwgMCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU3RyZWFtIHN0YXJ0ZWQnKVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzWzBdO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4gdGhpcy5vblN0cmVhbUVuZCgpLFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1N0cmVhbSBmYWlsZWQ6JywgZXJyKVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdHJlYW1FcnJvcihlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVQcm9jZXNzaW5nU3RhZ2UoKSB7XG4gICAgY29uc3QgY2h1bmtDb3VudCA9IHRoaXMuY2h1bmtzLmxlbmd0aDtcbiAgICBsZXQgc3RhZ2VJbmRleCA9IDA7XG5cbiAgICAvLyBNdWNoIHNsb3dlciBzdGFnZSBwcm9ncmVzc2lvbiAtIHN0YWdlcyBzdGF5IG11Y2ggbG9uZ2VyXG4gICAgaWYgKGNodW5rQ291bnQgPD0gOCkge1xuICAgICAgc3RhZ2VJbmRleCA9IDA7IC8vIEluaXRpYWxpemluZyAtIHN0YXlzIGZvciBmaXJzdCA4IGNodW5rc1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSAyMCkge1xuICAgICAgc3RhZ2VJbmRleCA9IDE7IC8vIEFuYWx5emluZyBjb21wZXRlbmN5IHJlcXVpcmVtZW50cyAtIDEyIGNodW5rc1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSAzNSkge1xuICAgICAgc3RhZ2VJbmRleCA9IDI7IC8vIFByb2Nlc3Npbmcgd29yayBvcmRlciAtIDE1IGNodW5rc1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSA1NSkge1xuICAgICAgc3RhZ2VJbmRleCA9IDM7IC8vIEdlbmVyYXRpbmcgcm9sZSBtYXBwaW5ncyAtIDIwIGNodW5rc1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSA3NSkge1xuICAgICAgc3RhZ2VJbmRleCA9IDQ7IC8vIENvbXB1dGluZyBmaW5hbCByZWNvbW1lbmRhdGlvbnMgLSAyMCBjaHVua3NcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhZ2VJbmRleCA9IDU7IC8vIEZpbmFsaXppbmcgQ0JQIFBsYW4gLSA3NSsgY2h1bmtzXG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzW3N0YWdlSW5kZXhdO1xuICB9XG5cbiAgZ2V0UHJvZ3Jlc3NQZXJjZW50YWdlKCk6IG51bWJlciB7XG4gICAgY29uc3QgY2h1bmtDb3VudCA9IHRoaXMuY2h1bmtzLmxlbmd0aDtcbiAgICBpZiAoY2h1bmtDb3VudCA9PT0gMCkgcmV0dXJuIDA7XG5cbiAgICAvLyBNdWNoIHNsb3dlciBhbmQgc21vb3RoZXIgcHJvZ3Jlc3MgY2FsY3VsYXRpb25cbiAgICBsZXQgcGVyY2VudGFnZSA9IDA7XG5cbiAgICBpZiAoY2h1bmtDb3VudCA8PSAxNSkge1xuICAgICAgLy8gRmlyc3QgMTUgY2h1bmtzID0gMC0yNSUgKHZlcnkgc2xvdyBzdGFydClcbiAgICAgIHBlcmNlbnRhZ2UgPSAoY2h1bmtDb3VudCAvIDE1KSAqIDI1O1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSAzNSkge1xuICAgICAgLy8gTmV4dCAyMCBjaHVua3MgPSAyNS01MCUgKHNsb3cgZWFybHkgcHJvZ3Jlc3MpXG4gICAgICBwZXJjZW50YWdlID0gMjUgKyAoKGNodW5rQ291bnQgLSAxNSkgLyAyMCkgKiAyNTtcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gNjApIHtcbiAgICAgIC8vIE5leHQgMjUgY2h1bmtzID0gNTAtNzUlIChzdGVhZHkgbWlkZGxlIHByb2dyZXNzKVxuICAgICAgcGVyY2VudGFnZSA9IDUwICsgKChjaHVua0NvdW50IC0gMzUpIC8gMjUpICogMjU7XG4gICAgfSBlbHNlIGlmIChjaHVua0NvdW50IDw9IDEwMCkge1xuICAgICAgLy8gTmV4dCA0MCBjaHVua3MgPSA3NS05MCUgKHNsb3dlciBmaW5hbCBhcHByb2FjaClcbiAgICAgIHBlcmNlbnRhZ2UgPSA3NSArICgoY2h1bmtDb3VudCAtIDYwKSAvIDQwKSAqIDE1O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCZXlvbmQgMTAwIGNodW5rcyA9IDkwLTk1JSAodmVyeSBzbG93IGZpbmFsIHByb2dyZXNzaW9uKVxuICAgICAgcGVyY2VudGFnZSA9IDkwICsgTWF0aC5taW4oKChjaHVua0NvdW50IC0gMTAwKSAvIDUwKSAqIDUsIDUpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLnJvdW5kKHBlcmNlbnRhZ2UpO1xuICB9XG5cbiAgb25TdHJlYW1FbmQoKSB7XG4gICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0NvbXBsZXRpbmcgQ0JQIFBsYW4gZ2VuZXJhdGlvbi4uLic7XG5cbiAgICAvLyBTaG93IDEwMCUgY29tcGxldGlvbiBicmllZmx5IGJlZm9yZSBmaW5pc2hpbmdcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZnVsbEpzb24gPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICAgIGNvbnN0IGNsZWFuZWQgPSB0aGlzLmZ1bGxKc29uLnJlcGxhY2UoL15gYGBqc29uXFxuLywgJycpLnJlcGxhY2UoL2BgYCQvLCAnJyk7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnBhcnNlZERhdGEgPSBKU09OLnBhcnNlKGNsZWFuZWQpO1xuICAgICAgICBjb25zb2xlLmxvZygnUGFyc2VkIGRhdGE6JywgdGhpcy5wYXJzZWREYXRhKTtcblxuICAgICAgICAvLyBIYW5kbGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gdGhpcy5wYXJzZWREYXRhO1xuICAgICAgICB0aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKTtcblxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NCUCBQbGFuIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHkhJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0pTT04gcGFyc2UgZXJyb3I6JywgZSk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ZhaWxlZCB0byBnZW5lcmF0ZSBDQlAgUGxhbi4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHByb2dyZXNzIHBlcmNlbnRhZ2UgaW5jbHVkaW5nIGNvbXBsZXRpb24gc3RhdGVcbiAgZ2V0RGlzcGxheVByb2dyZXNzUGVyY2VudGFnZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPT09ICdDb21wbGV0aW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nKSB7XG4gICAgICByZXR1cm4gMTAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9ncmVzc1BlcmNlbnRhZ2UoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdHJlYW1pbmcgZXJyb3JzLCBlc3BlY2lhbGx5IFwiUm9sZSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzXCJcbiAgaGFuZGxlU3RyZWFtRXJyb3IoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnRXJyb3IgZGV0YWlsczonLCBlcnIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgXCJSb2xlIG1hcHBpbmcgYWxyZWFkeSBleGlzdHNcIiBlcnJvclxuICAgIGlmIChlcnI/LmlzRXhpc3RpbmdSb2xlTWFwcGluZyB8fCAoZXJyPy5kZXRhaWwgJiYgZXJyLmRldGFpbC5pbmNsdWRlcygnUm9sZSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzJykpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGluZyBleGlzdGluZyByb2xlIG1hcHBpbmcuLi4nO1xuXG4gICAgICAvLyBDYWxsIHRoZSBhcHByb3ByaWF0ZSBHZXQgcm9sZSBtYXBwaW5nIEFQSSBiYXNlZCBvbiBtaW5pc3RyeSB0eXBlXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlO1xuICAgICAgY29uc3Qgc3RhdGVDZW50ZXIgPSBmb3JtRGF0YS5taW5pc3RyeTtcbiAgICAgIGNvbnN0IGRlcGFydG1lbnRJZCA9IGZvcm1EYXRhLmRlcGFydG1lbnRzO1xuXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJyAmJiBkZXBhcnRtZW50SWQpIHtcbiAgICAgICAgLy8gQ2FsbCBHZXQgcm9sZSBtYXBwaW5nIGJ5IHN0YXRlIGNlbnRlciBhbmQgZGVwYXJ0bWVudFxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudChzdGF0ZUNlbnRlciwgZGVwYXJ0bWVudElkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFeGlzdGluZyByb2xlIG1hcHBpbmcgbG9hZGVkOicsIHJlcyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXM7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0V4aXN0aW5nIHJvbGUgbWFwcGluZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5IScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyByb2xlIG1hcHBpbmc6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ZhaWxlZCB0byBsb2FkIGV4aXN0aW5nIHJvbGUgbWFwcGluZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnWCcsIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENhbGwgR2V0IHJvbGUgbWFwcGluZyBieSBzdGF0ZSBjZW50ZXIgb25seVxuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyKHN0YXRlQ2VudGVyKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFeGlzdGluZyByb2xlIG1hcHBpbmcgbG9hZGVkOicsIHJlcyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXM7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0V4aXN0aW5nIHJvbGUgbWFwcGluZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5IScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyByb2xlIG1hcHBpbmc6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ZhaWxlZCB0byBsb2FkIGV4aXN0aW5nIHJvbGUgbWFwcGluZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nLCAnWCcsIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIG90aGVyIHN0cmVhbWluZyBlcnJvcnNcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyPy5kZXRhaWwgfHwgJ1N0cmVhbSBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJztcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvck1lc3NhZ2UsICdYJywge1xuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnVwbG9hZGVkRmlsZSB8fCB0aGlzLnVwbG9hZGVkRmlsZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBvbmUgZmlsZSBhdCB0aGUgZ2l2ZW4gaW5kZXhcbiAgICB0aGlzLnVwbG9hZGVkRmlsZS5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCB2YWx1ZVxuICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnYWRkaXRpb25hbF9kb2N1bWVudCcpPy5zZXRWYWx1ZSh0aGlzLnVwbG9hZGVkRmlsZSk7XG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblxuICAgIC8vIENsZWFyIGVycm9ycyBpZiBubyBmaWxlcyBsZWZ0XG4gICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy51cGxvYWRFcnJvciA9ICcnO1xuICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkRG9jJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgIGlmIChpbnB1dCkgaW5wdXQudmFsdWUgPSAnJztcbiAgICB9XG4gIH1cblxuXG4gIGdldFVzZXJQcm9maWxlRGF0YShyZXF1ZXN0ZWRUeXBlPzogc3RyaW5nLCBkb25lPzogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRVc2VyUHJvZmlsZSgpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ2RhdGEtLScsIGRhdGEpXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndXNlclByb2ZpbGUnLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICAgIHRoaXMubG9naW5Vc2VyT3JnSWRzID0gZGF0YT8ub3JnYW5pemF0aW9uX2lkc1xuICAgICAgLy8gSWdub3JlIHN0YWxlIHJlc3BvbnNlcyBmcm9tIGEgdHlwZSB0aGF0IHdhcyBjaGFuZ2VkIGFnYWluIGJlZm9yZSB0aGlzIG9uZSByZXR1cm5lZFxuICAgICAgaWYgKHJlcXVlc3RlZFR5cGUgJiYgcmVxdWVzdGVkVHlwZSAhPT0gdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSkge1xuICAgICAgICBkb25lPy4oKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGxldCBmaWx0ZXJlZE1pbmlzdHJ5RGF0YSA9IFtdXG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luVXNlck9yZ0lkcy5pbmRleE9mKGl0ZW0/LmlkZW50aWZpZXIpID4gLTEgJiYgaXRlbT8uc2JPcmdUeXBlID09PSAocmVxdWVzdGVkVHlwZSB8fCB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlKSkge1xuICAgICAgICAgIGZpbHRlcmVkTWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgdGhpcy5taW5pc3RyeURhdGEgPSBmaWx0ZXJlZE1pbmlzdHJ5RGF0YVxuICAgICAgdGhpcy5vcmlnaW5hbE1pbmlzdHJ5RGF0YSA9IGZpbHRlcmVkTWluaXN0cnlEYXRhXG4gICAgICB0aGlzLmZpbHRlcmVkTGlzdCA9IGZpbHRlcmVkTWluaXN0cnlEYXRhO1xuICAgICAgZG9uZT8uKClcbiAgICB9KVxuICB9XG5cbiAgb25PcGVuZWQob3BlbmVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5wYW5lbE9wZW4gPSBvcGVuZWQ7XG4gIH1cblxuICBvbk9wZW5lZERlcGFydG1lbnQob3BlbmVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kZXBhcnRtZW50UGFuZWxPcGVuID0gb3BlbmVkXG4gIH1cblxuICBmaWx0ZXJEYXRhKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgIGNvbnN0IHMgPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maWx0ZXIoeCA9PlxuICAgICAgICB4Lm9yZ05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSB0aGlzLm1pbmlzdHJ5RGF0YVxuICAgIH1cblxuICB9XG5cbiAgZmlsdGVyRGVwYXJ0bWVudERhdGEoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC52YWx1ZSkge1xuICAgICAgY29uc3QgcyA9IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSB0aGlzLmRlcGFydG1lbnREYXRhLmZpbHRlcih4ID0+XG4gICAgICAgIHgub3JnTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHMpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSB0aGlzLmRlcGFydG1lbnREYXRhXG4gICAgfVxuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9ICcnXG4gICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0ucmVzZXQoKVxuICB9XG5cbiAgb25EZXBhcnRtZW50Q2hhbmdlKCkge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsdWU7XG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaiAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeSAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlKSB7XG4gICAgICB0aGlzLmNicEZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeSA9IHRoaXMubWluaXN0cnlEYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlkZW50aWZpZXIgPT09IGZvcm1EYXRhLm1pbmlzdHJ5KTtcblxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcblxuICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKHUgPT4gdS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5kZXBhcnRtZW50cyk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudF9uYW1lJ10gPSBkZXBhcnRtZW50TmFtZT8ub3JnTmFtZVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICB0aGlzLmdldFVwbG9hZGVkRG9jdW1lbnRzKClcbiAgfVxuXG4gICBnb1RvVXBsb2FkRG9jdW1lbnQoKSB7XG4gICBcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9haS91cGxvYWQtZG9jdW1lbnRzJ10pO1xuICAgIFxuICB9XG5cblxuXG59XG5cblxuXG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgPCEtLSA8aW5wdXQgY2xhc3M9XCJidG4tYWN0aXZlXCIgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiRG93bmxvYWQgYXMgUERGXCIgKGNsaWNrKT1cImRvd25sb2FkUERGKClcIiAvPiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibG9nby1jb250YWluZXJcIiAqbmdJZj1cImxvZ2luXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uLW1lZGl1bVwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGgyIGNsYXNzPVwiaGlnaGxpZ2h0LWFpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+aUdPVCBBSSBEcml2ZW4gQ0JQPC9zcGFuPlxuICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICA8cD5CdWlsZCBZb3VyIENhcGFjaXR5IFdpdGggQ3VzdG9taXplZCBSb2xlIE1hcHBpbmc8L3A+XG4gICAgICAgIDwvZGl2PiAtLT5cbiAgICA8L2Rpdj5cbiAgICA8bWF0LWNhcmQgKm5nSWY9XCJsb2dpbiAmJiByb2xlTWFwcGluZ0Zvcm1cIiBjbGFzcz1cIm10LTJcIiBbZm9ybUdyb3VwXT1cInJvbGVNYXBwaW5nRm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGVwYXRtZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj4tLT5cbiAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgIDxwPkNob29zZSBZb3VyIERlcGFydG1lbnQ8L3A+LS0+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgIDwvZGl2Pi0tPlxuICAgICAgICAgICAgPCEtLSAgICAgICAgICAgIDwvZGl2Pi0tPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZ3JvdXAgbXQtNFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgY2xhc3M9XCJyYWRpby1idG4tZ3JvdXBcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pc3RyeVR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkTWluaXN0cnlUeXBlXCIgKGNoYW5nZSk9XCJvbk1pbmlzdHJ5VHlwZUNoYW5nZSgkZXZlbnQpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMZWZ0IHJhZGlvIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJtaW5pc3RyeVwiIGNsYXNzPVwicmFkaW8tYnRuIGxlZnQtcmFkaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFkaW8tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cInJhZGlvLWljb25cIiBbbmdDbGFzc109XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ2NlbnRlcic/ICdjaGVja2VkLWxhYmVsJzonJ1wiPmRvbWFpbjwvbWF0LWljb24+ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jz8gJ2NoZWNrZWQtbGFiZWwnOicnXCI+Q2VudHJlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBSaWdodCByYWRpbyBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwic3RhdGVcIiBjbGFzcz1cInJhZGlvLWJ0biByaWdodC1yYWRpb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYWRpby1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1pY29uIGNsYXNzPVwicmFkaW8taWNvblwiIFtuZ0NsYXNzXT1cInNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnPyAnY2hlY2tlZC1sYWJlbCc6JydcIj5sb2NhdGlvbl9vbjwvbWF0LWljb24+ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJz8gJ2NoZWNrZWQtbGFiZWwnOicnXCI+U3RhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5J1wiPk1pbmlzdHJ5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnXCI+U3RhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBzZWFyY2gtYm94LXdpdGgtc2VsZWN0XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDI1cHg7IHBhZGRpbmc6IDAgMTJweDsgYm9yZGVyOiAxcHggc29saWQgI2NjYzt3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBhbmVsQ2xhc3M9XCJzZWxlY3Qtd2l0aC1zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5JyA/ICdTZWxlY3QgTWluaXN0cnkvIERlcGFydG1lbnQnOidTZWxlY3QgU3RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uTWluaXN0cnlDaGFuZ2UoJGV2ZW50KVwiIGZvcm1Db250cm9sTmFtZT1cIm1pbmlzdHJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlOyB3aWR0aDoxMDAlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BlbmVkQ2hhbmdlKT1cIm9uT3BlbmVkKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXJcIiAqbmdJZj1cInBhbmVsT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIChpbnB1dCk9XCJmaWx0ZXJEYXRhKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIiAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRNaW5pc3RyeUlkID09PSBpdGVtPy5pZGVudGlmaWVyXCIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0/LmlkZW50aWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZExpc3RcIj57e2l0ZW0/Lm9yZ05hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImRlcGFydG1lbnREYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPkRlcGFydG1lbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyNXB4OyBwYWRkaW5nOiAwIDEycHg7Ym9yZGVyOiAxcHggc29saWQgI2NjYztcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBhbmVsQ2xhc3M9XCJzZWxlY3Qtd2l0aC1zZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBEZXBhcnRtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZXBhcnRtZW50c1wiIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweDsgYmFja2dyb3VuZDogd2hpdGU7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uRGVwYXJ0bWVudENoYW5nZSgpXCIgKG9wZW5lZENoYW5nZSk9XCJvbk9wZW5lZERlcGFydG1lbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiICpuZ0lmPVwiZGVwYXJ0bWVudFBhbmVsT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIChpbnB1dCk9XCJmaWx0ZXJEZXBhcnRtZW50RGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCIgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtPy5pZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWREZXBhcnRtZW50TGlzdFwiPnt7aXRlbT8ub3JnTmFtZX19PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5TZWN0b3I8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBzdHlsZT1cImJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyNXB4OyBwYWRkaW5nOiAwIDEycHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiU2VsZWN0IFNlY3RvclwiIG11bHRpcGxlIGZvcm1Db250cm9sTmFtZT1cInNlY3RvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtPy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VjdG9yRGF0YVwiPnt7aXRlbT8udmFsdWV9fTwvbWF0LW9wdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJyb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWUgPT09ICdzdGF0ZSdcIiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IGFkZGl0aW9uYWwtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSByb3dzPVwiNVwiIHBsYWNlaG9sZGVyPVwiQWRkaXRpb25hbCBkZXRhaWxzXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkaXRpb25hbERldGFpbHNcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBbbmdDbGFzc109XCJkaXNhYmxlVXBsb2FkRG9jdW1lbnQgPyAnYnRuLWFjdGl2ZS1wcmltYXJ5LWRpc2FibGUnOididG4tYWN0aXZlLXByaW1hcnknXCIgY2xhc3M9XCJcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZVVwbG9hZERvY3VtZW50XCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImdvVG9VcGxvYWREb2N1bWVudCgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj51cGxvYWQ8L21hdC1pY29uPiBNYW5hZ2UgRG9jdW1lbnRzXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJyb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWUgPT09ICdzdGF0ZSdcIiAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm10LTQgc2VjdGlvblwiID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+VXBsb2FkIERvY3VtZW50IChQREYpPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLXVwbG9hZC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1cGxvYWREb2NcIiBjbGFzcz1cImZpbGUtdXBsb2FkLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtdXBsb2FkLWljb25cIj7wn5OOPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdXBsb2FkZWRGaWxlIHx8IHVwbG9hZGVkRmlsZS5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hvb3NlIHVwIHRvIDMgZmlsZXMgKFBERi9UWFQpXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkZWRGaWxlPy5sZW5ndGggPiAwXCIgY2xhc3M9XCJmaWxlLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsZSBvZiB1cGxvYWRlZEZpbGU7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImZpbGUtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbGUubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVtb3ZlLWZpbGUtaWNvblwiIChjbGljayk9XCJyZW1vdmVGaWxlKGkpOyRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ1cGxvYWREb2NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgLz4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZmlsZS11cGxvYWQtaGludFwiPk1heCBmaWxlIHNpemU6IHt7bWF4RmlsZVNpemVNQn19TUI8L3NtYWxsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInVwbG9hZERvY1wiIG11bHRpcGxlIHR5cGU9XCJmaWxlXCIgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCIucGRmLC5kb2MsLmRvY3gsLnhscywueGxzeCwudHh0XCIgY2xhc3M9XCJmaWxlLXVwbG9hZC1pbnB1dFwiIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVwbG9hZEVycm9yXCIgY2xhc3M9XCJlcnJvclwiPnt7IHVwbG9hZEVycm9yIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8IS0tICpuZ0lmPVwicm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlID09PSAnc3RhdGUnXCIgLS0+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC0yIHNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY2xhaW1lci10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwPkRpc2NsYWltZXI6IFBsZWFzZSBkbyBub3QgdXBsb2FkIGFueSBjb25maWRlbnRpYWwgZG9jdW1lbnRzLiA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZG9jdW1lbnRzPy5sZW5ndGggPCAxICYmICEocm9sZU1hcHBpbmdGb3JtPy5pbnZhbGlkKSAgfHwgc2hvd1dvcmtBbGxvY2F0aW9uT3JkZXJEb2N1bWVudE1pc3NpbmdcIj5cbiAgICAgICAgICAgICAgICA8cD48c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogLjg3NXJlbTtmb250LXdlaWdodDogYm9sZDtcIj5Ob3RlOiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QbGVhc2UgdXBsb2FkIHRoZSBXb3JrIEFsbG9jYXRpb24gT3JkZXIgZG9jdW1lbnQgdG8gZ2VuZXJhdGUgdGhlIENhcGFjaXR5IEJ1aWxkaW5nIFBsYW4gKENCUCk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZG9jdW1lbnRzPy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJ3b3JrQWxsb2NhdGlvbk9yZGVyRG9jdW1lbnRNaXNzaW5nXCI+PHNwYW4gc3R5bGU9XCJmb250LXNpemU6IC44NzVyZW07Zm9udC13ZWlnaHQ6IGJvbGQ7XCI+Tm90ZTpcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yXCI+UGxlYXNlIHVwbG9hZCB0aGUgV29yayBBbGxvY2F0aW9uIE9yZGVyIGRvY3VtZW50IHRvIGdlbmVyYXRlIHRoZSBDYXBhY2l0eVxuICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRpbmcgUGxhbiAoQ0JQKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm9sZU1hcHBpbmdGb3JtPy5pbnZhbGlkIHx8IChyb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWUgPT09ICdzdGF0ZScgJiYgIXJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnZhbHVlKSB8fCBsb2FkaW5nIHx8IGRvY3VtZW50cz8ubGVuZ3RoIDwgMSBcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb2xlTWFwcGluZ0Zvcm0/LmludmFsaWQgfHwgKHJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZSA9PT0gJ3N0YXRlJyAmJiAhcm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8udmFsdWUpIHx8IGxvYWRpbmcgfHwgZG9jdW1lbnRzPy5sZW5ndGggPCAxID8gJ2J0bi1kaXNhYmxlJzonYnRuLWFjdGl2ZSdcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgW3ZhbHVlXT1cImxvYWRpbmcgPyAnR2VuZXJhdGluZyBDQlAuLi4nIDogJ0dlbmVyYXRlIENCUCdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25HZW5lcmF0ZVJvbGVNYXBwaW5nKClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWNhcmQ+XG5cbjwvZGl2PlxuPCEtLSA8ZGl2ICpuZ0lmPVwiIWxvZ2luXCI+XG4gICAgICAgIDxhcHAtbG9naW4gKHN1Y2Nlc3MpPVwibG9naW5TdGF0dXMoJGV2ZW50KVwiPjwvYXBwLWxvZ2luPlxuICAgIDwvZGl2PiAtLT5cblxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJhcGlMb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRlbnRcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0IG10LTNcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWFpbi1tZXNzYWdlXCI+e3sgY3VycmVudFByb2Nlc3NpbmdTdGFnZSB8fCAnUHJlcGFyaW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nIH19PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtaW5kaWNhdG9yXCIgKm5nSWY9XCJjaHVua3MubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIFtzdHlsZS53aWR0aC4lXT1cImdldERpc3BsYXlQcm9ncmVzc1BlcmNlbnRhZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJwcm9ncmVzcy10ZXh0XCI+e3sgZ2V0RGlzcGxheVByb2dyZXNzUGVyY2VudGFnZSgpIH19JSBDb21wbGV0ZTwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGltZS1lc3RpbWF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICBSZWFsLXRpbWUgc3RyZWFtaW5nIGluIHByb2dyZXNzLiBUaGlzIG1heSB0YWtlIDItMyBtaW51dGVzLlxuICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=