@sunbird-cb/cbp-ai 0.1.97 → 0.1.98

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.
@@ -2005,11 +2005,11 @@ export class GenerateCourseRecommendationComponent {
2005
2005
  });
2006
2006
  }
2007
2007
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GenerateCourseRecommendationComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.SharedService }, { token: i3.MatSnackBar }, { token: i1.MatDialog }, { token: i4.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
2008
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GenerateCourseRecommendationComponent, selector: "app-generate-course-recommendation", viewQueries: [{ propertyName: "pdfContent", first: true, predicate: ["pdfContent"], descendants: true }], ngImport: i0, template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n \n <!-- Initial Loading Screen (for initial load and regeneration) -->\n <div class=\"initial-loading-container\" *ngIf=\"!dataLoaded || isRegeneratingWithProgress\">\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 || (isRegeneratingWithProgress ? 'Regenerating course recommendations...' : 'Loading course recommendations...') }}</p>\n <div class=\"progress-details\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-indicator\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"main-content\" *ngIf=\"dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"popup-header\">\n <div class=\"header-left\">\n <div class=\"heading\">Save Courses (<span>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span></span>)</div>\n </div>\n <div class=\"header-actions\">\n <button class=\"regenerate-btn\" (click)=\"regenerateCourseRecommendations()\"\n [disabled]=\"isRegenerating\"\n mat-raised-button color=\"primary\">\n <mat-icon *ngIf=\"!isRegenerating\">refresh</mat-icon>\n <mat-spinner *ngIf=\"isRegenerating\" diameter=\"20\"></mat-spinner>\n <span>{{isRegenerating ? 'Regenerating...' : 'Regenerate Recommendations'}}</span>\n </button>\n <div class=\"cursor-pointer close-btn\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <mat-tab-group (selectedTabChange)=\"onOuterTabChange($event)\">\n <!-- First Main Tab -->\n <mat-tab label=\"course recommendation\">\n <!-- Nested Tabs -->\n <!-- <mat-tab-group (selectedTabChange)=\"onInnerTabChange($event)\">\n <mat-tab label=\"all\">\n\n </mat-tab>\n <mat-tab label=\"behavioural\">\n\n </mat-tab>\n <mat-tab label=\"functional\">\n\n </mat-tab>\n <mat-tab label=\"domain\">\n\n </mat-tab>\n </mat-tab-group> -->\n </mat-tab>\n\n <!-- Second Main Tab -->\n <mat-tab label=\"gap analysis\">\n <!-- <p>Gap analysis content goes here</p> -->\n </mat-tab>\n </mat-tab-group>\n <form [formGroup]=\"filterForm\" class=\"filters-container\">\n <div class=\"role-mapping-container\"\n *ngIf=\"outerTabActiveIndex === 0 && (innerTabActiveIndex === 0 || innerTabActiveIndex === 1 || innerTabActiveIndex === 2 || innerTabActiveIndex === 3 )\">\n <div class=\"container\">\n <div class=\"section-header-improved mt-3\">\n <div class=\"search-and-buttons-container\">\n <div>\n <label>Search Courses</label>\n </div> \n <div class=\"search-container-compact\">\n <div class=\"rsearch\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input class=\"sinput-compact\" [(ngModel)]=\"searchText\"\n (input)=\"applyFilter($event.target.value);\"\n placeholder=\"Search Courses\" type=\"text\">\n </div>\n </div>\n \n </div>\n \n\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Competency</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.competency?.length ? '' : 'Competency' }}\n </mat-label>\n \n <mat-select\n formControlName=\"competency\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Competency\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'competency')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredCompetency\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div> \n \n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Rating</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.rating?.length ? '' : 'Rating' }}\n </mat-label>\n \n <mat-select\n formControlName=\"rating\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Reatings\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'rating')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredRatings\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n \n \n \n \n </div>\n <div class=\"section-header-improved-sec-2 mt-4\">\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Language</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.language?.length ? '' : 'Language' }}\n </mat-label>\n \n <mat-select\n formControlName=\"language\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Languages\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'language')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredLanguages\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Duration</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.duration?.length ? '' : 'Duration' }}\n </mat-label>\n \n <mat-select\n formControlName=\"duration\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Duration\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'duration')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredDurations\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Provider</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.provider?.length ? '' : 'Provider' }}\n </mat-label>\n \n <mat-select\n formControlName=\"provider\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Provider\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'provider')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredProviders\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div style=\"margin-top: 45px;margin-left: 20px;\">\n <input class=\"btn-active\" type=\"button\" value=\"Reset All Filters\"\n (click)=\"resetFilters()\" />\n </div>\n </div>\n <div class=\"mt-4\">\n <div style=\"font-size:16px;font-weight:bold;color:#000\">\n Filtered Course Count : {{filterdCourses?.length}}\n </div>\n </div>\n <div class=\"mt-5 sub-heading select-all-container\" *ngIf=\"filterdCourses?.length\">\n <div style=\"margin-left: 16px;\">\n <mat-checkbox [checked]=\"false\" (change)=\"selectAllCourses($event)\">Select All\n Courses</mat-checkbox>\n </div>\n <div class=\"btn-group-compact\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Add More Course From iGOT\"\n (click)=\"suggestMoreCourses()\" />\n </div>\n <div class=\"pl-2\">\n <input [disabled]=\"selectFilterCourses?.length > 0 ? false : true\"\n [ngClass]=\"selectFilterCourses?.length > 0 ? 'btn-active' : 'btn-disable'\"\n type=\"button\" [value]=\"mode === 'add' ? 'Save Courses' : 'Update Courses'\"\n (click)=\"saveCourses()\" />\n </div>\n </div>\n </div>\n <div class=\"disclaimer-container mt-2\" *ngIf=\"filterdCourses?.length\">\n <div class=\"disclaimer-message mt-4\">\n <strong>Disclaimer:</strong> Please verify the public course URL before adding it to the plan.\n </div>\n </div>\n <div class=\"mt-2\">\n\n <div class=\"course-list-container\">\n <div\n [ngClass]=\"innerTabActiveIndex > 0 ? 'course-list-container-flex':'course-list-container-right-flex' \">\n <div *ngIf=\"innerTabActiveIndex > 0\"\n [ngClass]=\"innerTabActiveIndex > 0 ? 'left-panel':''\">\n <ng-container *ngIf=\"innerTabActiveIndex === 1\">\n <div class=\"sub-heading\">\n <p>Competencies in Behavioural</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 2\">\n <div class=\"sub-heading\">\n <p>Competencies in Functional</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 3\">\n <div class=\"sub-heading\">\n <p>Competencies in Domain</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n </div>\n <div [ngClass]=\"innerTabActiveIndex > 0 ? 'right-panel':'right-panel-flex'\">\n <!-- No Course Found Message in Right Panel -->\n <div class=\"no-course-found-container\"\n *ngIf=\"filterdCourses?.length === 0 && selectedThemeFilter\">\n <div class=\"no-course-card\">\n <div class=\"no-course-icon\">\n <mat-icon>search_off</mat-icon>\n </div>\n <div class=\"no-course-content\">\n <h4>No Courses Found</h4>\n <p>No courses found for the selected theme:\n <strong>{{selectedThemeFilter}}</strong></p>\n <p>Would you like to add a course for this competency?</p>\n <button class=\"suggest-course-btn\"\n (click)=\"addCourseForSelectedTheme()\">\n <mat-icon>add_circle</mat-icon>\n Add Course\n </button>\n </div>\n </div>\n </div>\n\n <!-- Courses List -->\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n\n <div class=\"course-content\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n <div>\n <mat-checkbox [checked]=\"checkIfCourseExists(item)\"\n (change)=\"selectedFilterCourses($event, item)\"></mat-checkbox>\n </div>\n <div class=\"ml-2\">\n <div class=\"course-pill-container\">\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img\n src=\"assets/icons/course.svg\"></span>&nbsp;<span>Course</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span *ngIf=\"item?.rationale\">AI Recommended\n <span *ngIf=\"item?.is_public\"> - Public</span>\n <span *ngIf=\"!item?.is_public\"> - iGOT</span>\n </span>\n <span *ngIf=\"!item?.rationale\">Manually Suggested - iGOT</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"course-title mt-3 cursor-pointer\" (click)=\"redirectToToc(item)\">\n <span *ngIf=\"item?.course\">{{item?.course}}</span>\n <!-- <span *ngIf=\"item?.name\">{{item?.name}}****</span> -->\n <span style=\"margin-left:10px;\" (click)=\"redirectToToc(item)\"><img\n height=\"18px\" width=\"18px\"\n src=\"assets/icons/redirect.png\" /></span>\n </div>\n <div class=\"course-desc mt-2\">\n <!-- <span *ngIf=\"item?.rationale\">{{item?.rationale}}</span> -->\n <span *ngIf=\"item?.description\">{{item?.description}}</span>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioural Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n\n\n </div>\n\n <!-- Relevancy and Duration section -->\n <div class=\"course-footer\" *ngIf=\"item?.relevancy\">\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">{{item?.relevancy}}%</div>\n </div>\n </div>\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Duration</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">\n <span\n *ngIf=\"item?.duration\">{{getDuration(item?.duration)}}</span>\n <span *ngIf=\"!(item?.duration)\">N/A</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- General No Data Message (only when no theme filter is active) -->\n <div class=\"mt-2 sub-heading\" *ngIf=\"filterdCourses?.length === 0 && !selectedThemeFilter\">\n <p>No Data Found</p>\n </div>\n </div>\n </div>\n </form>\n <div class=\"role-mapping-container\" *ngIf=\"outerTabActiveIndex === 1\">\n <div id=\"gap-analysis-content\">\n\n <div class=\"download-pdf mt-4 mb-2\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Download\" (click)=\"downloadPDF()\" />\n </div>\n </div>\n <div>\n <!-- <div *ngIf=\"isPDFDownload\">\n <div class=\"pdf-heading\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}} <span\n *ngIf=\"planData?.designation_name \">_{{planData?.designation_name}}_Gap_Analysis</span>\n </div>\n </div> -->\n <div class=\"d-flex vh-100\" [ngClass]=\"isPDFDownload ? 'mt-4':''\">\n <!-- Sidebar -->\n <div class=\"d-flex flex-column p-3 bg-light border-end\" style=\"width: 250px;\">\n <h5 class=\"mb-4\">Analyze by Category</h5>\n <button *ngFor=\"let item of menuItems\"\n class=\"btn btn-outline-primary mb-2 text-start menu-list-item\"\n [class.active]=\"selectedCategory === item.key\" (click)=\"selectCategory(item.key)\">\n {{ item.label }}\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"flex-grow-1 p-4\">\n <div class=\"d-flex justify-content-between gap-3 \">\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p>Competencies Covered</p>\n </div>\n <div class=\"div-count\">{{competencyCoveredCount}}</div>\n </div>\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p *ngIf=\"selectedCategory === 'all'\">Total Competencies</p>\n <p *ngIf=\"selectedCategory === 'behavioral'\">Total Behavioural Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'functional'\">Total Functional Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'domain'\">Total Domain Competencies</p>\n </div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'all'\">\n {{this.planData?.competencies?.length}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainTotalCompetencies}}</div>\n </div>\n <div class=\"p-3 green-bg\">\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'all'\">Overall Coverage\n </div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'behavioral'\">\n Behavioural Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'functional'\">\n Functional Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'domain'\">Domain\n Coverage</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'all'\">\n {{overallCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainCoverage}}</div>\n </div>\n </div>\n <div class=\"mt-4 all-category-list\" [ngSwitch]=\"selectedCategory\">\n <div *ngSwitchCase=\"'all'\">\n <h4>All Categories</h4>\n\n <!-- Show Behavioural section only if there are unmatched behavioural competencies -->\n <div class=\"mt-4\"\n *ngIf=\"behaviouralNotMatched && behaviouralNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show Functional section only if there are unmatched functional competencies -->\n <div class=\"mt-4\"\n *ngIf=\"functionalNotMatched && functionalNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Functional</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show Domain section only if there are unmatched domain competencies -->\n <div class=\"mt-4\" *ngIf=\"domainNotMatched && domainNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Domain</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show message when all competencies are covered -->\n <div class=\"mt-4 text-center\"\n *ngIf=\"(!behaviouralNotMatched || behaviouralNotMatched.length === 0) && \n (!functionalNotMatched || functionalNotMatched.length === 0) && \n (!domainNotMatched || domainNotMatched.length === 0)\">\n <div class=\"no-gaps-message\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <h4>Excellent! All competencies are covered</h4>\n <p>All required competencies have been addressed by the selected\n courses.</p>\n </div>\n </div>\n\n </div>\n\n <div *ngSwitchCase=\"'behavioral'\">\n <h4>Behavioural</h4>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All behavioral competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'functional'\">\n <h4>Functional</h4>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Functional</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course</span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All functional competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'domain'\">\n <h4>Domain</h4>\n <div class=\"mt-4\" *ngIf=\"domainCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Domain</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"domainCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All domain competencies are covered by the selected\n courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchDefault>\n <p>Please select a category.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div> <!-- Close main-content div -->\n\n </div>\n</div>\n\n\n<div [hidden]=\"!isPDFDownload\" class=\"gap-analysis-pdf-container\" #pdfContent>\n <div class=\"gap-analysis-pdf-header\">\n <img src=\"assets/icons/karmayogiLogo-min.png\" alt=\"Karmayogi Bharat Logo\" class=\"logo\" />\n <h1><span>\n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'state'\">{{sharedService?.cbpPlanFinalObj?.department_name?.name}}</span> \n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry'\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}}</span> \n <span *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span>\n </span></h1>\n <p class=\"subtitle\">A detailed breakdown of competencies Gap Analysis</p>\n \n </div>\n \n <div class=\"competency-snapshot\">\n <h2>Competency Snapshot</h2>\n <div class=\"snapshot-content\">\n <div class=\"circle-wrapper\">\n <svg class=\"progress-ring\" width=\"120\" height=\"120\">\n <circle class=\"progress-ring-bg\" cx=\"60\" cy=\"60\" r=\"52\" />\n <circle class=\"progress-ring-circle\" cx=\"60\" cy=\"60\" r=\"52\" />\n </svg>\n <div class=\"percentage-text\">{{overallCoverage}}<br /><span>Overall Coverage</span></div>\n </div>\n \n <div class=\"competency-container\">\n <!-- Total Competencies Box -->\n <div class=\"total-box\">\n <div class=\"title\">Total Competencies</div>\n <div class=\"count\">{{this.planData?.competencies?.length}}</div>\n </div>\n \n <!-- Progress Bars -->\n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text behavioral\">Behavioural</span>\n <span class=\"covered-text\">{{behavioralCompetencyCoveredCount}} / {{behavioralTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill behavioral\" [style.width.%]=\"(behavioralCompetencyCoveredCount / behavioralTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text functional\">Functional</span>\n <span class=\"covered-text\">{{functionalCompetencyCoveredCount}} / {{functionalTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill functional\" [style.width.%]=\"(functionalCompetencyCoveredCount / functionalTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text domain\">Domain</span>\n <span class=\"covered-text\">{{domainCompetencyCoveredCount}} / {{domainTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill domain\" [style.width.%]=\"(domainCompetencyCoveredCount / domainTotalCompetencies) * 100\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"gap-section mb-4\">\n <h2>Detailed Competency Analysis</h2>\n <div class=\"gap-box\">\n Bridge Your Competencies Gap\n <p class=\"subtitle\">Here are {{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}} key areas for development.</p>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Gap to Address <span *ngIf=\"(this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)) > 0\">({{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}})</span></p>\n \n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n &nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Covered Competencies <span>({{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}})</span></p> \n </div>\n <div class=\"gap-section mb-4\">\n \n <div class=\"green-bg\">\n <div class=\"div-green-label mb-2\">\n Congratulations!\n </div> \n <p>You have successfully covered </p>\n <p class=\"subtitle\">{{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}} key competencies, forming a strong professional foundation.</p>\n </div>\n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"gap-section mb-4\">\n <h2>Recommended Courses</h2>\n </div>\n <app-gap-analysis-recommended-course [planData]=\"planData\"></app-gap-analysis-recommended-course>\n</div>\n \n\n\n<div class=\"overlay-loader\" *ngIf=\"loading && dataLoaded && !isRegeneratingWithProgress\">\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 course recommendation generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:16px;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:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.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:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;align-items:flex-start;width:100%;gap:8px}.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-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.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:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;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;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.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;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{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}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.initial-loading-container{display:flex;justify-content:center;align-items:center;min-height:400px;width:100%}.initial-loading-container .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;padding:3rem 2rem}.initial-loading-container .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.initial-loading-container .loading-content .loading-text .main-message{font-size:16px;font-weight:600;margin-bottom:1rem;color:#1b4ca1}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:300px;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#4caf50);border-radius:4px;transition:width .3s ease-in-out}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:12px;color:#666;font-weight:500}.initial-loading-container .loading-content .loading-text .progress-details .time-estimate{font-size:12px;color:#888;font-style:italic}.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:320px}.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}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved,.section-header-improved-sec-2{display:flex;flex-direction:row;gap:0px;width:100%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:5px;flex-direction:column;flex-wrap:wrap;width:37%;margin:0 5px}.search-container-compact{flex:0 0 auto;min-width:180px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:2px solid #ccc;padding:20px 12px 20px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}.gap-analysis-pdf-container{font-family:Lato;max-width:900px;margin:auto;color:#212121}.gap-analysis-pdf-header{text-align:center;margin-bottom:2rem}.gap-analysis-pdf-header .logo{height:60px;margin-bottom:.5rem}.gap-analysis-pdf-header h1{font-size:1.8rem;font-weight:600;margin:.5rem 0}.gap-analysis-pdf-header .subtitle{color:#555;font-size:.95rem}.gap-analysis-pdf-header .download-btn{background:#5e00ff;color:#fff;border:none;padding:10px 20px;border-radius:6px;margin-top:1rem;font-weight:500;cursor:pointer}.competency-snapshot{background:#fafafa;border-radius:12px;padding:2rem;margin-bottom:2rem}.competency-snapshot h2{font-size:1.4rem;font-weight:600;margin-bottom:1.5rem}.competency-snapshot .snapshot-content{display:flex;gap:2rem;align-items:center;justify-content:space-between}.competency-snapshot .snapshot-content .circle-wrapper{position:relative;width:120px;height:120px}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-bg{fill:none;stroke:#eee;stroke-width:10}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-circle{fill:none;stroke:#6c63ff;stroke-width:10;stroke-linecap:round;stroke-dasharray:326.72;stroke-dashoffset:117.6192;transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset .35s}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-weight:600;font-size:1.4rem;text-align:center}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text span{display:block;font-size:.75rem;font-weight:400;color:#555}.competency-snapshot .snapshot-content .details{flex-grow:1}.competency-snapshot .snapshot-content .details .total-competencies{font-size:1.2rem;margin-bottom:1rem}.competency-snapshot .snapshot-content .details .bar{margin:.5rem 0;padding:.6rem 1rem;border-radius:6px;font-weight:500;display:flex;justify-content:space-between;color:#fff}.competency-snapshot .snapshot-content .details .bar.behavioral{background:#7b1fa2}.competency-snapshot .snapshot-content .details .bar.functional{background:#0288d1}.competency-snapshot .snapshot-content .details .bar.domain{background:#f57c00}.gap-section{margin-top:2rem}.gap-section h2{font-size:1.3rem;margin-bottom:1rem}.gap-section .gap-box{background:#eef1ff;border-left:5px solid #6c63ff;padding:1rem;border-radius:6px;font-weight:500;color:#333}.gap-section .green-bg{background-color:#0080001c;border-left:5px solid #2d9b2d;padding:1rem;border-radius:6px;font-weight:500;color:#006400}.competency-container{width:100%;margin:0 auto;font-family:Segoe UI,sans-serif;color:#212121;display:flex;flex-direction:column}.total-box{background:#f8f9fc;border-radius:10px;padding:1.5rem;text-align:center;border:1px solid #e0e0e0;margin-bottom:1.5rem}.total-box .title{font-size:1rem;color:#666}.total-box .count{font-size:2rem;font-weight:700;color:#111;margin-top:.5rem}.progress-group{margin-bottom:1.5rem}.progress-group .progress-label{display:flex;justify-content:space-between;margin-bottom:6px}.progress-group .progress-label .label-text{font-weight:600}.progress-group .progress-label .covered-text{font-size:.9rem;color:#444}.progress-group .progress-label .behavioral{color:#f8b861}.progress-group .progress-label .functional{color:#e24577}.progress-group .progress-label .domain{color:#7b47a4}.progress-group .progress-bar{height:10px;background-color:#e0e0e0;border-radius:5px;overflow:hidden}.progress-group .progress-bar .progress-fill{height:100%;border-radius:5px;transition:width .5s ease-in-out}.progress-group .progress-bar .progress-fill.behavioral{background:#f8b861}.progress-group .progress-bar .progress-fill.functional{background:#e24577}.progress-group .progress-bar .progress-fill.domain{background:#7b47a4}.competency-card{border-radius:8px;padding:1rem 1.5rem;margin-bottom:1rem;border:1px solid transparent}.competency-card .title{font-weight:600;font-size:1.1rem;color:#222;margin-bottom:.4rem}.competency-card .subtitle{font-size:.95rem;color:#555}.competency-card .subtitle .tag{font-weight:500}.competency-card .subtitle .behavioral,.competency-card .subtitle .domain,.competency-card .subtitle .functional{color:#000}.competency-card.behavioral{background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;border-color:#f8b861}.competency-card.functional{background:linear-gradient(0deg,#e245773d 0% 100%),#fff;border-color:#e24577}.competency-card.domain{background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;border-color:#7b47a4}.disclaimer-container{margin:8px 16px 0}.disclaimer-message{background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:20px;padding:8px 16px;font-family:Lato;font-size:14px;color:#333;line-height:1.2}.disclaimer-message strong{color:#000;font-weight:600}.select-all-container{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .search-and-buttons-container .mat-form-field-infix{padding:10px!important}::ng-deep .search-and-buttons-container .mat-form-field-wrapper{width:100%!important}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i8.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: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i12.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i13.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i14.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i14.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i15.GapAnalysisRecommendedCourseComponent, selector: "app-gap-analysis-recommended-course", inputs: ["planData"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }] }); }
2008
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GenerateCourseRecommendationComponent, selector: "app-generate-course-recommendation", viewQueries: [{ propertyName: "pdfContent", first: true, predicate: ["pdfContent"], descendants: true }], ngImport: i0, template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n \n <!-- Initial Loading Screen (for initial load and regeneration) -->\n <div class=\"initial-loading-container\" *ngIf=\"!dataLoaded || isRegeneratingWithProgress\">\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 || (isRegeneratingWithProgress ? 'Regenerating course recommendations...' : 'Loading course recommendations...') }}</p>\n <div class=\"progress-details\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-indicator\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"main-content\" *ngIf=\"dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"popup-header\">\n <div class=\"header-left\">\n <div class=\"heading\">Save Courses (<span>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span></span>)</div>\n </div>\n <div class=\"header-actions\">\n <button class=\"regenerate-btn\" (click)=\"regenerateCourseRecommendations()\"\n [disabled]=\"isRegenerating\"\n mat-raised-button color=\"primary\">\n <mat-icon *ngIf=\"!isRegenerating\">refresh</mat-icon>\n <mat-spinner *ngIf=\"isRegenerating\" diameter=\"20\"></mat-spinner>\n <span>{{isRegenerating ? 'Regenerating...' : 'Regenerate Recommendations'}}</span>\n </button>\n <div class=\"cursor-pointer close-btn\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <mat-tab-group (selectedTabChange)=\"onOuterTabChange($event)\">\n <!-- First Main Tab -->\n <mat-tab label=\"course recommendation\">\n <!-- Nested Tabs -->\n <!-- <mat-tab-group (selectedTabChange)=\"onInnerTabChange($event)\">\n <mat-tab label=\"all\">\n\n </mat-tab>\n <mat-tab label=\"behavioural\">\n\n </mat-tab>\n <mat-tab label=\"functional\">\n\n </mat-tab>\n <mat-tab label=\"domain\">\n\n </mat-tab>\n </mat-tab-group> -->\n </mat-tab>\n\n <!-- Second Main Tab -->\n <mat-tab label=\"gap analysis\">\n <!-- <p>Gap analysis content goes here</p> -->\n </mat-tab>\n </mat-tab-group>\n <form [formGroup]=\"filterForm\" class=\"filters-container\">\n <div class=\"role-mapping-container\"\n *ngIf=\"outerTabActiveIndex === 0 && (innerTabActiveIndex === 0 || innerTabActiveIndex === 1 || innerTabActiveIndex === 2 || innerTabActiveIndex === 3 )\">\n <div class=\"container\">\n <div class=\"section-header-improved mt-3\">\n <div class=\"search-and-buttons-container\">\n <div>\n <label>Search Courses</label>\n </div> \n <div class=\"search-container-compact\">\n <div class=\"rsearch\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input class=\"sinput-compact\" [(ngModel)]=\"searchText\"\n (input)=\"applyFilter($event.target.value);\"\n placeholder=\"Search Courses\" type=\"text\">\n </div>\n </div>\n \n </div>\n \n\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Competency</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.competency?.length ? '' : 'Competency' }}\n </mat-label>\n \n <mat-select\n formControlName=\"competency\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Competency\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'competency')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredCompetency\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div> \n \n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Rating</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.rating?.length ? '' : 'Rating' }}\n </mat-label>\n \n <mat-select\n formControlName=\"rating\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Reatings\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'rating')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredRatings\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n \n \n \n \n </div>\n <div class=\"section-header-improved-sec-2 mt-4\">\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Language</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.language?.length ? '' : 'Language' }}\n </mat-label>\n \n <mat-select\n formControlName=\"language\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Languages\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'language')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredLanguages\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Duration</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.duration?.length ? '' : 'Duration' }}\n </mat-label>\n \n <mat-select\n formControlName=\"duration\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Duration\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'duration')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredDurations\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Provider</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.provider?.length ? '' : 'Provider' }}\n </mat-label>\n \n <mat-select\n formControlName=\"provider\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Provider\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'provider')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredProviders\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div style=\"margin-top: 45px;margin-left: 20px;\">\n <input class=\"btn-active\" type=\"button\" value=\"Reset All Filters\"\n (click)=\"resetFilters()\" />\n </div>\n </div>\n <div class=\"mt-4\">\n <div style=\"font-size:16px;font-weight:bold;color:#000\">\n Filtered Course Count : {{filterdCourses?.length}}\n </div>\n </div>\n <div class=\"mt-5 sub-heading select-all-container\" *ngIf=\"filterdCourses?.length\">\n <div style=\"margin-left: 16px;\">\n <mat-checkbox [checked]=\"false\" (change)=\"selectAllCourses($event)\">Select All\n Courses</mat-checkbox>\n </div>\n <div class=\"btn-group-compact\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Add More Course From iGOT\"\n (click)=\"suggestMoreCourses()\" />\n </div>\n <div class=\"pl-2\">\n <input [disabled]=\"selectFilterCourses?.length > 0 ? false : true\"\n [ngClass]=\"selectFilterCourses?.length > 0 ? 'btn-active' : 'btn-disable'\"\n type=\"button\" [value]=\"mode === 'add' ? 'Save Courses' : 'Update Courses'\"\n (click)=\"saveCourses()\" />\n </div>\n </div>\n </div>\n <!-- <div class=\"disclaimer-container mt-2\" *ngIf=\"filterdCourses?.length\">\n <div class=\"disclaimer-message mt-4\">\n <strong>Disclaimer:</strong> Please verify the public course URL before adding it to the plan.\n </div>\n </div> -->\n <div class=\"mt-2\">\n\n <div class=\"course-list-container\">\n <div\n [ngClass]=\"innerTabActiveIndex > 0 ? 'course-list-container-flex':'course-list-container-right-flex' \">\n <div *ngIf=\"innerTabActiveIndex > 0\"\n [ngClass]=\"innerTabActiveIndex > 0 ? 'left-panel':''\">\n <ng-container *ngIf=\"innerTabActiveIndex === 1\">\n <div class=\"sub-heading\">\n <p>Competencies in Behavioural</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 2\">\n <div class=\"sub-heading\">\n <p>Competencies in Functional</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 3\">\n <div class=\"sub-heading\">\n <p>Competencies in Domain</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n </div>\n <div [ngClass]=\"innerTabActiveIndex > 0 ? 'right-panel':'right-panel-flex'\">\n <!-- No Course Found Message in Right Panel -->\n <div class=\"no-course-found-container\"\n *ngIf=\"filterdCourses?.length === 0 && selectedThemeFilter\">\n <div class=\"no-course-card\">\n <div class=\"no-course-icon\">\n <mat-icon>search_off</mat-icon>\n </div>\n <div class=\"no-course-content\">\n <h4>No Courses Found</h4>\n <p>No courses found for the selected theme:\n <strong>{{selectedThemeFilter}}</strong></p>\n <p>Would you like to add a course for this competency?</p>\n <button class=\"suggest-course-btn\"\n (click)=\"addCourseForSelectedTheme()\">\n <mat-icon>add_circle</mat-icon>\n Add Course\n </button>\n </div>\n </div>\n </div>\n\n <!-- Courses List -->\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n\n <div class=\"course-content\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n <div>\n <mat-checkbox [checked]=\"checkIfCourseExists(item)\"\n (change)=\"selectedFilterCourses($event, item)\"></mat-checkbox>\n </div>\n <div class=\"ml-2\">\n <div class=\"course-pill-container\">\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img\n src=\"assets/icons/course.svg\"></span>&nbsp;<span>Course</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span *ngIf=\"item?.rationale\">AI Recommended\n <span *ngIf=\"item?.is_public\"> - Public</span>\n <span *ngIf=\"!item?.is_public\"> - iGOT</span>\n </span>\n <span *ngIf=\"!item?.rationale\">Manually Suggested - iGOT</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"course-title mt-3 cursor-pointer\" (click)=\"redirectToToc(item)\">\n <span *ngIf=\"item?.course\">{{item?.course}}</span>\n <!-- <span *ngIf=\"item?.name\">{{item?.name}}****</span> -->\n <span style=\"margin-left:10px;\" (click)=\"redirectToToc(item)\"><img\n height=\"18px\" width=\"18px\"\n src=\"assets/icons/redirect.png\" /></span>\n </div>\n <div class=\"course-desc mt-2\">\n <!-- <span *ngIf=\"item?.rationale\">{{item?.rationale}}</span> -->\n <span *ngIf=\"item?.description\">{{item?.description}}</span>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioural Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n\n\n </div>\n\n <!-- Relevancy and Duration section -->\n <div class=\"course-footer\" *ngIf=\"item?.relevancy\">\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">{{item?.relevancy}}%</div>\n </div>\n </div>\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Duration</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">\n <span\n *ngIf=\"item?.duration\">{{getDuration(item?.duration)}}</span>\n <span *ngIf=\"!(item?.duration)\">N/A</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- General No Data Message (only when no theme filter is active) -->\n <div class=\"mt-2 sub-heading\" *ngIf=\"filterdCourses?.length === 0 && !selectedThemeFilter\">\n <p>No Data Found</p>\n </div>\n </div>\n </div>\n </form>\n <div class=\"role-mapping-container\" *ngIf=\"outerTabActiveIndex === 1\">\n <div id=\"gap-analysis-content\">\n\n <div class=\"download-pdf mt-4 mb-2\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Download\" (click)=\"downloadPDF()\" />\n </div>\n </div>\n <div>\n <!-- <div *ngIf=\"isPDFDownload\">\n <div class=\"pdf-heading\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}} <span\n *ngIf=\"planData?.designation_name \">_{{planData?.designation_name}}_Gap_Analysis</span>\n </div>\n </div> -->\n <div class=\"d-flex vh-100\" [ngClass]=\"isPDFDownload ? 'mt-4':''\">\n <!-- Sidebar -->\n <div class=\"d-flex flex-column p-3 bg-light border-end\" style=\"width: 250px;\">\n <h5 class=\"mb-4\">Analyze by Category</h5>\n <button *ngFor=\"let item of menuItems\"\n class=\"btn btn-outline-primary mb-2 text-start menu-list-item\"\n [class.active]=\"selectedCategory === item.key\" (click)=\"selectCategory(item.key)\">\n {{ item.label }}\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"flex-grow-1 p-4\">\n <div class=\"d-flex justify-content-between gap-3 \">\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p>Competencies Covered</p>\n </div>\n <div class=\"div-count\">{{competencyCoveredCount}}</div>\n </div>\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p *ngIf=\"selectedCategory === 'all'\">Total Competencies</p>\n <p *ngIf=\"selectedCategory === 'behavioral'\">Total Behavioural Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'functional'\">Total Functional Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'domain'\">Total Domain Competencies</p>\n </div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'all'\">\n {{this.planData?.competencies?.length}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainTotalCompetencies}}</div>\n </div>\n <div class=\"p-3 green-bg\">\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'all'\">Overall Coverage\n </div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'behavioral'\">\n Behavioural Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'functional'\">\n Functional Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'domain'\">Domain\n Coverage</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'all'\">\n {{overallCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainCoverage}}</div>\n </div>\n </div>\n <div class=\"mt-4 all-category-list\" [ngSwitch]=\"selectedCategory\">\n <div *ngSwitchCase=\"'all'\">\n <h4>All Categories</h4>\n\n <!-- Show Behavioural section only if there are unmatched behavioural competencies -->\n <div class=\"mt-4\"\n *ngIf=\"behaviouralNotMatched && behaviouralNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show Functional section only if there are unmatched functional competencies -->\n <div class=\"mt-4\"\n *ngIf=\"functionalNotMatched && functionalNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Functional</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show Domain section only if there are unmatched domain competencies -->\n <div class=\"mt-4\" *ngIf=\"domainNotMatched && domainNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Domain</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show message when all competencies are covered -->\n <div class=\"mt-4 text-center\"\n *ngIf=\"(!behaviouralNotMatched || behaviouralNotMatched.length === 0) && \n (!functionalNotMatched || functionalNotMatched.length === 0) && \n (!domainNotMatched || domainNotMatched.length === 0)\">\n <div class=\"no-gaps-message\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <h4>Excellent! All competencies are covered</h4>\n <p>All required competencies have been addressed by the selected\n courses.</p>\n </div>\n </div>\n\n </div>\n\n <div *ngSwitchCase=\"'behavioral'\">\n <h4>Behavioural</h4>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All behavioral competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'functional'\">\n <h4>Functional</h4>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Functional</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course</span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All functional competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'domain'\">\n <h4>Domain</h4>\n <div class=\"mt-4\" *ngIf=\"domainCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Domain</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"domainCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All domain competencies are covered by the selected\n courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchDefault>\n <p>Please select a category.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div> <!-- Close main-content div -->\n\n </div>\n</div>\n\n\n<div [hidden]=\"!isPDFDownload\" class=\"gap-analysis-pdf-container\" #pdfContent>\n <div class=\"gap-analysis-pdf-header\">\n <img src=\"assets/icons/karmayogiLogo-min.png\" alt=\"Karmayogi Bharat Logo\" class=\"logo\" />\n <h1><span>\n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'state'\">{{sharedService?.cbpPlanFinalObj?.department_name?.name}}</span> \n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry'\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}}</span> \n <span *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span>\n </span></h1>\n <p class=\"subtitle\">A detailed breakdown of competencies Gap Analysis</p>\n \n </div>\n \n <div class=\"competency-snapshot\">\n <h2>Competency Snapshot</h2>\n <div class=\"snapshot-content\">\n <div class=\"circle-wrapper\">\n <svg class=\"progress-ring\" width=\"120\" height=\"120\">\n <circle class=\"progress-ring-bg\" cx=\"60\" cy=\"60\" r=\"52\" />\n <circle class=\"progress-ring-circle\" cx=\"60\" cy=\"60\" r=\"52\" />\n </svg>\n <div class=\"percentage-text\">{{overallCoverage}}<br /><span>Overall Coverage</span></div>\n </div>\n \n <div class=\"competency-container\">\n <!-- Total Competencies Box -->\n <div class=\"total-box\">\n <div class=\"title\">Total Competencies</div>\n <div class=\"count\">{{this.planData?.competencies?.length}}</div>\n </div>\n \n <!-- Progress Bars -->\n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text behavioral\">Behavioural</span>\n <span class=\"covered-text\">{{behavioralCompetencyCoveredCount}} / {{behavioralTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill behavioral\" [style.width.%]=\"(behavioralCompetencyCoveredCount / behavioralTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text functional\">Functional</span>\n <span class=\"covered-text\">{{functionalCompetencyCoveredCount}} / {{functionalTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill functional\" [style.width.%]=\"(functionalCompetencyCoveredCount / functionalTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text domain\">Domain</span>\n <span class=\"covered-text\">{{domainCompetencyCoveredCount}} / {{domainTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill domain\" [style.width.%]=\"(domainCompetencyCoveredCount / domainTotalCompetencies) * 100\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"gap-section mb-4\">\n <h2>Detailed Competency Analysis</h2>\n <div class=\"gap-box\">\n Bridge Your Competencies Gap\n <p class=\"subtitle\">Here are {{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}} key areas for development.</p>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Gap to Address <span *ngIf=\"(this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)) > 0\">({{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}})</span></p>\n \n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n &nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Covered Competencies <span>({{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}})</span></p> \n </div>\n <div class=\"gap-section mb-4\">\n \n <div class=\"green-bg\">\n <div class=\"div-green-label mb-2\">\n Congratulations!\n </div> \n <p>You have successfully covered </p>\n <p class=\"subtitle\">{{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}} key competencies, forming a strong professional foundation.</p>\n </div>\n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"gap-section mb-4\">\n <h2>Recommended Courses</h2>\n </div>\n <app-gap-analysis-recommended-course [planData]=\"planData\"></app-gap-analysis-recommended-course>\n</div>\n \n\n\n<div class=\"overlay-loader\" *ngIf=\"loading && dataLoaded && !isRegeneratingWithProgress\">\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 course recommendation generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:16px;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:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.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:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;align-items:flex-start;width:100%;gap:8px}.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-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.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:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;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;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.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;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{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}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.initial-loading-container{display:flex;justify-content:center;align-items:center;min-height:400px;width:100%}.initial-loading-container .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;padding:3rem 2rem}.initial-loading-container .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.initial-loading-container .loading-content .loading-text .main-message{font-size:16px;font-weight:600;margin-bottom:1rem;color:#1b4ca1}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:300px;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#4caf50);border-radius:4px;transition:width .3s ease-in-out}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:12px;color:#666;font-weight:500}.initial-loading-container .loading-content .loading-text .progress-details .time-estimate{font-size:12px;color:#888;font-style:italic}.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:320px}.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}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved,.section-header-improved-sec-2{display:flex;flex-direction:row;gap:0px;width:100%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:5px;flex-direction:column;flex-wrap:wrap;width:37%;margin:0 5px}.search-container-compact{flex:0 0 auto;min-width:180px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:2px solid #ccc;padding:20px 12px 20px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}.gap-analysis-pdf-container{font-family:Lato;max-width:900px;margin:auto;color:#212121}.gap-analysis-pdf-header{text-align:center;margin-bottom:2rem}.gap-analysis-pdf-header .logo{height:60px;margin-bottom:.5rem}.gap-analysis-pdf-header h1{font-size:1.8rem;font-weight:600;margin:.5rem 0}.gap-analysis-pdf-header .subtitle{color:#555;font-size:.95rem}.gap-analysis-pdf-header .download-btn{background:#5e00ff;color:#fff;border:none;padding:10px 20px;border-radius:6px;margin-top:1rem;font-weight:500;cursor:pointer}.competency-snapshot{background:#fafafa;border-radius:12px;padding:2rem;margin-bottom:2rem}.competency-snapshot h2{font-size:1.4rem;font-weight:600;margin-bottom:1.5rem}.competency-snapshot .snapshot-content{display:flex;gap:2rem;align-items:center;justify-content:space-between}.competency-snapshot .snapshot-content .circle-wrapper{position:relative;width:120px;height:120px}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-bg{fill:none;stroke:#eee;stroke-width:10}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-circle{fill:none;stroke:#6c63ff;stroke-width:10;stroke-linecap:round;stroke-dasharray:326.72;stroke-dashoffset:117.6192;transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset .35s}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-weight:600;font-size:1.4rem;text-align:center}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text span{display:block;font-size:.75rem;font-weight:400;color:#555}.competency-snapshot .snapshot-content .details{flex-grow:1}.competency-snapshot .snapshot-content .details .total-competencies{font-size:1.2rem;margin-bottom:1rem}.competency-snapshot .snapshot-content .details .bar{margin:.5rem 0;padding:.6rem 1rem;border-radius:6px;font-weight:500;display:flex;justify-content:space-between;color:#fff}.competency-snapshot .snapshot-content .details .bar.behavioral{background:#7b1fa2}.competency-snapshot .snapshot-content .details .bar.functional{background:#0288d1}.competency-snapshot .snapshot-content .details .bar.domain{background:#f57c00}.gap-section{margin-top:2rem}.gap-section h2{font-size:1.3rem;margin-bottom:1rem}.gap-section .gap-box{background:#eef1ff;border-left:5px solid #6c63ff;padding:1rem;border-radius:6px;font-weight:500;color:#333}.gap-section .green-bg{background-color:#0080001c;border-left:5px solid #2d9b2d;padding:1rem;border-radius:6px;font-weight:500;color:#006400}.competency-container{width:100%;margin:0 auto;font-family:Segoe UI,sans-serif;color:#212121;display:flex;flex-direction:column}.total-box{background:#f8f9fc;border-radius:10px;padding:1.5rem;text-align:center;border:1px solid #e0e0e0;margin-bottom:1.5rem}.total-box .title{font-size:1rem;color:#666}.total-box .count{font-size:2rem;font-weight:700;color:#111;margin-top:.5rem}.progress-group{margin-bottom:1.5rem}.progress-group .progress-label{display:flex;justify-content:space-between;margin-bottom:6px}.progress-group .progress-label .label-text{font-weight:600}.progress-group .progress-label .covered-text{font-size:.9rem;color:#444}.progress-group .progress-label .behavioral{color:#f8b861}.progress-group .progress-label .functional{color:#e24577}.progress-group .progress-label .domain{color:#7b47a4}.progress-group .progress-bar{height:10px;background-color:#e0e0e0;border-radius:5px;overflow:hidden}.progress-group .progress-bar .progress-fill{height:100%;border-radius:5px;transition:width .5s ease-in-out}.progress-group .progress-bar .progress-fill.behavioral{background:#f8b861}.progress-group .progress-bar .progress-fill.functional{background:#e24577}.progress-group .progress-bar .progress-fill.domain{background:#7b47a4}.competency-card{border-radius:8px;padding:1rem 1.5rem;margin-bottom:1rem;border:1px solid transparent}.competency-card .title{font-weight:600;font-size:1.1rem;color:#222;margin-bottom:.4rem}.competency-card .subtitle{font-size:.95rem;color:#555}.competency-card .subtitle .tag{font-weight:500}.competency-card .subtitle .behavioral,.competency-card .subtitle .domain,.competency-card .subtitle .functional{color:#000}.competency-card.behavioral{background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;border-color:#f8b861}.competency-card.functional{background:linear-gradient(0deg,#e245773d 0% 100%),#fff;border-color:#e24577}.competency-card.domain{background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;border-color:#7b47a4}.disclaimer-container{margin:8px 16px 0}.disclaimer-message{background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:20px;padding:8px 16px;font-family:Lato;font-size:14px;color:#333;line-height:1.2}.disclaimer-message strong{color:#000;font-weight:600}.select-all-container{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .search-and-buttons-container .mat-form-field-infix{padding:10px!important}::ng-deep .search-and-buttons-container .mat-form-field-wrapper{width:100%!important}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i8.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: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i12.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i13.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i14.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i14.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i15.GapAnalysisRecommendedCourseComponent, selector: "app-gap-analysis-recommended-course", inputs: ["planData"] }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }] }); }
2009
2009
  }
2010
2010
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GenerateCourseRecommendationComponent, decorators: [{
2011
2011
  type: Component,
2012
- args: [{ selector: 'app-generate-course-recommendation', template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n \n <!-- Initial Loading Screen (for initial load and regeneration) -->\n <div class=\"initial-loading-container\" *ngIf=\"!dataLoaded || isRegeneratingWithProgress\">\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 || (isRegeneratingWithProgress ? 'Regenerating course recommendations...' : 'Loading course recommendations...') }}</p>\n <div class=\"progress-details\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-indicator\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"main-content\" *ngIf=\"dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"popup-header\">\n <div class=\"header-left\">\n <div class=\"heading\">Save Courses (<span>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span></span>)</div>\n </div>\n <div class=\"header-actions\">\n <button class=\"regenerate-btn\" (click)=\"regenerateCourseRecommendations()\"\n [disabled]=\"isRegenerating\"\n mat-raised-button color=\"primary\">\n <mat-icon *ngIf=\"!isRegenerating\">refresh</mat-icon>\n <mat-spinner *ngIf=\"isRegenerating\" diameter=\"20\"></mat-spinner>\n <span>{{isRegenerating ? 'Regenerating...' : 'Regenerate Recommendations'}}</span>\n </button>\n <div class=\"cursor-pointer close-btn\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <mat-tab-group (selectedTabChange)=\"onOuterTabChange($event)\">\n <!-- First Main Tab -->\n <mat-tab label=\"course recommendation\">\n <!-- Nested Tabs -->\n <!-- <mat-tab-group (selectedTabChange)=\"onInnerTabChange($event)\">\n <mat-tab label=\"all\">\n\n </mat-tab>\n <mat-tab label=\"behavioural\">\n\n </mat-tab>\n <mat-tab label=\"functional\">\n\n </mat-tab>\n <mat-tab label=\"domain\">\n\n </mat-tab>\n </mat-tab-group> -->\n </mat-tab>\n\n <!-- Second Main Tab -->\n <mat-tab label=\"gap analysis\">\n <!-- <p>Gap analysis content goes here</p> -->\n </mat-tab>\n </mat-tab-group>\n <form [formGroup]=\"filterForm\" class=\"filters-container\">\n <div class=\"role-mapping-container\"\n *ngIf=\"outerTabActiveIndex === 0 && (innerTabActiveIndex === 0 || innerTabActiveIndex === 1 || innerTabActiveIndex === 2 || innerTabActiveIndex === 3 )\">\n <div class=\"container\">\n <div class=\"section-header-improved mt-3\">\n <div class=\"search-and-buttons-container\">\n <div>\n <label>Search Courses</label>\n </div> \n <div class=\"search-container-compact\">\n <div class=\"rsearch\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input class=\"sinput-compact\" [(ngModel)]=\"searchText\"\n (input)=\"applyFilter($event.target.value);\"\n placeholder=\"Search Courses\" type=\"text\">\n </div>\n </div>\n \n </div>\n \n\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Competency</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.competency?.length ? '' : 'Competency' }}\n </mat-label>\n \n <mat-select\n formControlName=\"competency\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Competency\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'competency')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredCompetency\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div> \n \n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Rating</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.rating?.length ? '' : 'Rating' }}\n </mat-label>\n \n <mat-select\n formControlName=\"rating\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Reatings\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'rating')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredRatings\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n \n \n \n \n </div>\n <div class=\"section-header-improved-sec-2 mt-4\">\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Language</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.language?.length ? '' : 'Language' }}\n </mat-label>\n \n <mat-select\n formControlName=\"language\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Languages\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'language')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredLanguages\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Duration</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.duration?.length ? '' : 'Duration' }}\n </mat-label>\n \n <mat-select\n formControlName=\"duration\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Duration\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'duration')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredDurations\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Provider</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.provider?.length ? '' : 'Provider' }}\n </mat-label>\n \n <mat-select\n formControlName=\"provider\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Provider\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'provider')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredProviders\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div style=\"margin-top: 45px;margin-left: 20px;\">\n <input class=\"btn-active\" type=\"button\" value=\"Reset All Filters\"\n (click)=\"resetFilters()\" />\n </div>\n </div>\n <div class=\"mt-4\">\n <div style=\"font-size:16px;font-weight:bold;color:#000\">\n Filtered Course Count : {{filterdCourses?.length}}\n </div>\n </div>\n <div class=\"mt-5 sub-heading select-all-container\" *ngIf=\"filterdCourses?.length\">\n <div style=\"margin-left: 16px;\">\n <mat-checkbox [checked]=\"false\" (change)=\"selectAllCourses($event)\">Select All\n Courses</mat-checkbox>\n </div>\n <div class=\"btn-group-compact\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Add More Course From iGOT\"\n (click)=\"suggestMoreCourses()\" />\n </div>\n <div class=\"pl-2\">\n <input [disabled]=\"selectFilterCourses?.length > 0 ? false : true\"\n [ngClass]=\"selectFilterCourses?.length > 0 ? 'btn-active' : 'btn-disable'\"\n type=\"button\" [value]=\"mode === 'add' ? 'Save Courses' : 'Update Courses'\"\n (click)=\"saveCourses()\" />\n </div>\n </div>\n </div>\n <div class=\"disclaimer-container mt-2\" *ngIf=\"filterdCourses?.length\">\n <div class=\"disclaimer-message mt-4\">\n <strong>Disclaimer:</strong> Please verify the public course URL before adding it to the plan.\n </div>\n </div>\n <div class=\"mt-2\">\n\n <div class=\"course-list-container\">\n <div\n [ngClass]=\"innerTabActiveIndex > 0 ? 'course-list-container-flex':'course-list-container-right-flex' \">\n <div *ngIf=\"innerTabActiveIndex > 0\"\n [ngClass]=\"innerTabActiveIndex > 0 ? 'left-panel':''\">\n <ng-container *ngIf=\"innerTabActiveIndex === 1\">\n <div class=\"sub-heading\">\n <p>Competencies in Behavioural</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 2\">\n <div class=\"sub-heading\">\n <p>Competencies in Functional</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 3\">\n <div class=\"sub-heading\">\n <p>Competencies in Domain</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n </div>\n <div [ngClass]=\"innerTabActiveIndex > 0 ? 'right-panel':'right-panel-flex'\">\n <!-- No Course Found Message in Right Panel -->\n <div class=\"no-course-found-container\"\n *ngIf=\"filterdCourses?.length === 0 && selectedThemeFilter\">\n <div class=\"no-course-card\">\n <div class=\"no-course-icon\">\n <mat-icon>search_off</mat-icon>\n </div>\n <div class=\"no-course-content\">\n <h4>No Courses Found</h4>\n <p>No courses found for the selected theme:\n <strong>{{selectedThemeFilter}}</strong></p>\n <p>Would you like to add a course for this competency?</p>\n <button class=\"suggest-course-btn\"\n (click)=\"addCourseForSelectedTheme()\">\n <mat-icon>add_circle</mat-icon>\n Add Course\n </button>\n </div>\n </div>\n </div>\n\n <!-- Courses List -->\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n\n <div class=\"course-content\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n <div>\n <mat-checkbox [checked]=\"checkIfCourseExists(item)\"\n (change)=\"selectedFilterCourses($event, item)\"></mat-checkbox>\n </div>\n <div class=\"ml-2\">\n <div class=\"course-pill-container\">\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img\n src=\"assets/icons/course.svg\"></span>&nbsp;<span>Course</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span *ngIf=\"item?.rationale\">AI Recommended\n <span *ngIf=\"item?.is_public\"> - Public</span>\n <span *ngIf=\"!item?.is_public\"> - iGOT</span>\n </span>\n <span *ngIf=\"!item?.rationale\">Manually Suggested - iGOT</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"course-title mt-3 cursor-pointer\" (click)=\"redirectToToc(item)\">\n <span *ngIf=\"item?.course\">{{item?.course}}</span>\n <!-- <span *ngIf=\"item?.name\">{{item?.name}}****</span> -->\n <span style=\"margin-left:10px;\" (click)=\"redirectToToc(item)\"><img\n height=\"18px\" width=\"18px\"\n src=\"assets/icons/redirect.png\" /></span>\n </div>\n <div class=\"course-desc mt-2\">\n <!-- <span *ngIf=\"item?.rationale\">{{item?.rationale}}</span> -->\n <span *ngIf=\"item?.description\">{{item?.description}}</span>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioural Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n\n\n </div>\n\n <!-- Relevancy and Duration section -->\n <div class=\"course-footer\" *ngIf=\"item?.relevancy\">\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">{{item?.relevancy}}%</div>\n </div>\n </div>\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Duration</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">\n <span\n *ngIf=\"item?.duration\">{{getDuration(item?.duration)}}</span>\n <span *ngIf=\"!(item?.duration)\">N/A</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- General No Data Message (only when no theme filter is active) -->\n <div class=\"mt-2 sub-heading\" *ngIf=\"filterdCourses?.length === 0 && !selectedThemeFilter\">\n <p>No Data Found</p>\n </div>\n </div>\n </div>\n </form>\n <div class=\"role-mapping-container\" *ngIf=\"outerTabActiveIndex === 1\">\n <div id=\"gap-analysis-content\">\n\n <div class=\"download-pdf mt-4 mb-2\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Download\" (click)=\"downloadPDF()\" />\n </div>\n </div>\n <div>\n <!-- <div *ngIf=\"isPDFDownload\">\n <div class=\"pdf-heading\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}} <span\n *ngIf=\"planData?.designation_name \">_{{planData?.designation_name}}_Gap_Analysis</span>\n </div>\n </div> -->\n <div class=\"d-flex vh-100\" [ngClass]=\"isPDFDownload ? 'mt-4':''\">\n <!-- Sidebar -->\n <div class=\"d-flex flex-column p-3 bg-light border-end\" style=\"width: 250px;\">\n <h5 class=\"mb-4\">Analyze by Category</h5>\n <button *ngFor=\"let item of menuItems\"\n class=\"btn btn-outline-primary mb-2 text-start menu-list-item\"\n [class.active]=\"selectedCategory === item.key\" (click)=\"selectCategory(item.key)\">\n {{ item.label }}\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"flex-grow-1 p-4\">\n <div class=\"d-flex justify-content-between gap-3 \">\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p>Competencies Covered</p>\n </div>\n <div class=\"div-count\">{{competencyCoveredCount}}</div>\n </div>\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p *ngIf=\"selectedCategory === 'all'\">Total Competencies</p>\n <p *ngIf=\"selectedCategory === 'behavioral'\">Total Behavioural Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'functional'\">Total Functional Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'domain'\">Total Domain Competencies</p>\n </div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'all'\">\n {{this.planData?.competencies?.length}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainTotalCompetencies}}</div>\n </div>\n <div class=\"p-3 green-bg\">\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'all'\">Overall Coverage\n </div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'behavioral'\">\n Behavioural Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'functional'\">\n Functional Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'domain'\">Domain\n Coverage</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'all'\">\n {{overallCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainCoverage}}</div>\n </div>\n </div>\n <div class=\"mt-4 all-category-list\" [ngSwitch]=\"selectedCategory\">\n <div *ngSwitchCase=\"'all'\">\n <h4>All Categories</h4>\n\n <!-- Show Behavioural section only if there are unmatched behavioural competencies -->\n <div class=\"mt-4\"\n *ngIf=\"behaviouralNotMatched && behaviouralNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show Functional section only if there are unmatched functional competencies -->\n <div class=\"mt-4\"\n *ngIf=\"functionalNotMatched && functionalNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Functional</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show Domain section only if there are unmatched domain competencies -->\n <div class=\"mt-4\" *ngIf=\"domainNotMatched && domainNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Domain</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show message when all competencies are covered -->\n <div class=\"mt-4 text-center\"\n *ngIf=\"(!behaviouralNotMatched || behaviouralNotMatched.length === 0) && \n (!functionalNotMatched || functionalNotMatched.length === 0) && \n (!domainNotMatched || domainNotMatched.length === 0)\">\n <div class=\"no-gaps-message\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <h4>Excellent! All competencies are covered</h4>\n <p>All required competencies have been addressed by the selected\n courses.</p>\n </div>\n </div>\n\n </div>\n\n <div *ngSwitchCase=\"'behavioral'\">\n <h4>Behavioural</h4>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All behavioral competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'functional'\">\n <h4>Functional</h4>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Functional</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course</span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All functional competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'domain'\">\n <h4>Domain</h4>\n <div class=\"mt-4\" *ngIf=\"domainCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Domain</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"domainCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All domain competencies are covered by the selected\n courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchDefault>\n <p>Please select a category.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div> <!-- Close main-content div -->\n\n </div>\n</div>\n\n\n<div [hidden]=\"!isPDFDownload\" class=\"gap-analysis-pdf-container\" #pdfContent>\n <div class=\"gap-analysis-pdf-header\">\n <img src=\"assets/icons/karmayogiLogo-min.png\" alt=\"Karmayogi Bharat Logo\" class=\"logo\" />\n <h1><span>\n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'state'\">{{sharedService?.cbpPlanFinalObj?.department_name?.name}}</span> \n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry'\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}}</span> \n <span *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span>\n </span></h1>\n <p class=\"subtitle\">A detailed breakdown of competencies Gap Analysis</p>\n \n </div>\n \n <div class=\"competency-snapshot\">\n <h2>Competency Snapshot</h2>\n <div class=\"snapshot-content\">\n <div class=\"circle-wrapper\">\n <svg class=\"progress-ring\" width=\"120\" height=\"120\">\n <circle class=\"progress-ring-bg\" cx=\"60\" cy=\"60\" r=\"52\" />\n <circle class=\"progress-ring-circle\" cx=\"60\" cy=\"60\" r=\"52\" />\n </svg>\n <div class=\"percentage-text\">{{overallCoverage}}<br /><span>Overall Coverage</span></div>\n </div>\n \n <div class=\"competency-container\">\n <!-- Total Competencies Box -->\n <div class=\"total-box\">\n <div class=\"title\">Total Competencies</div>\n <div class=\"count\">{{this.planData?.competencies?.length}}</div>\n </div>\n \n <!-- Progress Bars -->\n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text behavioral\">Behavioural</span>\n <span class=\"covered-text\">{{behavioralCompetencyCoveredCount}} / {{behavioralTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill behavioral\" [style.width.%]=\"(behavioralCompetencyCoveredCount / behavioralTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text functional\">Functional</span>\n <span class=\"covered-text\">{{functionalCompetencyCoveredCount}} / {{functionalTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill functional\" [style.width.%]=\"(functionalCompetencyCoveredCount / functionalTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text domain\">Domain</span>\n <span class=\"covered-text\">{{domainCompetencyCoveredCount}} / {{domainTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill domain\" [style.width.%]=\"(domainCompetencyCoveredCount / domainTotalCompetencies) * 100\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"gap-section mb-4\">\n <h2>Detailed Competency Analysis</h2>\n <div class=\"gap-box\">\n Bridge Your Competencies Gap\n <p class=\"subtitle\">Here are {{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}} key areas for development.</p>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Gap to Address <span *ngIf=\"(this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)) > 0\">({{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}})</span></p>\n \n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n &nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Covered Competencies <span>({{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}})</span></p> \n </div>\n <div class=\"gap-section mb-4\">\n \n <div class=\"green-bg\">\n <div class=\"div-green-label mb-2\">\n Congratulations!\n </div> \n <p>You have successfully covered </p>\n <p class=\"subtitle\">{{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}} key competencies, forming a strong professional foundation.</p>\n </div>\n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"gap-section mb-4\">\n <h2>Recommended Courses</h2>\n </div>\n <app-gap-analysis-recommended-course [planData]=\"planData\"></app-gap-analysis-recommended-course>\n</div>\n \n\n\n<div class=\"overlay-loader\" *ngIf=\"loading && dataLoaded && !isRegeneratingWithProgress\">\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 course recommendation generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:16px;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:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.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:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;align-items:flex-start;width:100%;gap:8px}.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-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.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:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;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;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.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;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{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}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.initial-loading-container{display:flex;justify-content:center;align-items:center;min-height:400px;width:100%}.initial-loading-container .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;padding:3rem 2rem}.initial-loading-container .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.initial-loading-container .loading-content .loading-text .main-message{font-size:16px;font-weight:600;margin-bottom:1rem;color:#1b4ca1}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:300px;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#4caf50);border-radius:4px;transition:width .3s ease-in-out}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:12px;color:#666;font-weight:500}.initial-loading-container .loading-content .loading-text .progress-details .time-estimate{font-size:12px;color:#888;font-style:italic}.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:320px}.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}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved,.section-header-improved-sec-2{display:flex;flex-direction:row;gap:0px;width:100%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:5px;flex-direction:column;flex-wrap:wrap;width:37%;margin:0 5px}.search-container-compact{flex:0 0 auto;min-width:180px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:2px solid #ccc;padding:20px 12px 20px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}.gap-analysis-pdf-container{font-family:Lato;max-width:900px;margin:auto;color:#212121}.gap-analysis-pdf-header{text-align:center;margin-bottom:2rem}.gap-analysis-pdf-header .logo{height:60px;margin-bottom:.5rem}.gap-analysis-pdf-header h1{font-size:1.8rem;font-weight:600;margin:.5rem 0}.gap-analysis-pdf-header .subtitle{color:#555;font-size:.95rem}.gap-analysis-pdf-header .download-btn{background:#5e00ff;color:#fff;border:none;padding:10px 20px;border-radius:6px;margin-top:1rem;font-weight:500;cursor:pointer}.competency-snapshot{background:#fafafa;border-radius:12px;padding:2rem;margin-bottom:2rem}.competency-snapshot h2{font-size:1.4rem;font-weight:600;margin-bottom:1.5rem}.competency-snapshot .snapshot-content{display:flex;gap:2rem;align-items:center;justify-content:space-between}.competency-snapshot .snapshot-content .circle-wrapper{position:relative;width:120px;height:120px}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-bg{fill:none;stroke:#eee;stroke-width:10}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-circle{fill:none;stroke:#6c63ff;stroke-width:10;stroke-linecap:round;stroke-dasharray:326.72;stroke-dashoffset:117.6192;transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset .35s}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-weight:600;font-size:1.4rem;text-align:center}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text span{display:block;font-size:.75rem;font-weight:400;color:#555}.competency-snapshot .snapshot-content .details{flex-grow:1}.competency-snapshot .snapshot-content .details .total-competencies{font-size:1.2rem;margin-bottom:1rem}.competency-snapshot .snapshot-content .details .bar{margin:.5rem 0;padding:.6rem 1rem;border-radius:6px;font-weight:500;display:flex;justify-content:space-between;color:#fff}.competency-snapshot .snapshot-content .details .bar.behavioral{background:#7b1fa2}.competency-snapshot .snapshot-content .details .bar.functional{background:#0288d1}.competency-snapshot .snapshot-content .details .bar.domain{background:#f57c00}.gap-section{margin-top:2rem}.gap-section h2{font-size:1.3rem;margin-bottom:1rem}.gap-section .gap-box{background:#eef1ff;border-left:5px solid #6c63ff;padding:1rem;border-radius:6px;font-weight:500;color:#333}.gap-section .green-bg{background-color:#0080001c;border-left:5px solid #2d9b2d;padding:1rem;border-radius:6px;font-weight:500;color:#006400}.competency-container{width:100%;margin:0 auto;font-family:Segoe UI,sans-serif;color:#212121;display:flex;flex-direction:column}.total-box{background:#f8f9fc;border-radius:10px;padding:1.5rem;text-align:center;border:1px solid #e0e0e0;margin-bottom:1.5rem}.total-box .title{font-size:1rem;color:#666}.total-box .count{font-size:2rem;font-weight:700;color:#111;margin-top:.5rem}.progress-group{margin-bottom:1.5rem}.progress-group .progress-label{display:flex;justify-content:space-between;margin-bottom:6px}.progress-group .progress-label .label-text{font-weight:600}.progress-group .progress-label .covered-text{font-size:.9rem;color:#444}.progress-group .progress-label .behavioral{color:#f8b861}.progress-group .progress-label .functional{color:#e24577}.progress-group .progress-label .domain{color:#7b47a4}.progress-group .progress-bar{height:10px;background-color:#e0e0e0;border-radius:5px;overflow:hidden}.progress-group .progress-bar .progress-fill{height:100%;border-radius:5px;transition:width .5s ease-in-out}.progress-group .progress-bar .progress-fill.behavioral{background:#f8b861}.progress-group .progress-bar .progress-fill.functional{background:#e24577}.progress-group .progress-bar .progress-fill.domain{background:#7b47a4}.competency-card{border-radius:8px;padding:1rem 1.5rem;margin-bottom:1rem;border:1px solid transparent}.competency-card .title{font-weight:600;font-size:1.1rem;color:#222;margin-bottom:.4rem}.competency-card .subtitle{font-size:.95rem;color:#555}.competency-card .subtitle .tag{font-weight:500}.competency-card .subtitle .behavioral,.competency-card .subtitle .domain,.competency-card .subtitle .functional{color:#000}.competency-card.behavioral{background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;border-color:#f8b861}.competency-card.functional{background:linear-gradient(0deg,#e245773d 0% 100%),#fff;border-color:#e24577}.competency-card.domain{background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;border-color:#7b47a4}.disclaimer-container{margin:8px 16px 0}.disclaimer-message{background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:20px;padding:8px 16px;font-family:Lato;font-size:14px;color:#333;line-height:1.2}.disclaimer-message strong{color:#000;font-weight:600}.select-all-container{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .search-and-buttons-container .mat-form-field-infix{padding:10px!important}::ng-deep .search-and-buttons-container .mat-form-field-wrapper{width:100%!important}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!important}\n"] }]
2012
+ args: [{ selector: 'app-generate-course-recommendation', template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n \n <!-- Initial Loading Screen (for initial load and regeneration) -->\n <div class=\"initial-loading-container\" *ngIf=\"!dataLoaded || isRegeneratingWithProgress\">\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 || (isRegeneratingWithProgress ? 'Regenerating course recommendations...' : 'Loading course recommendations...') }}</p>\n <div class=\"progress-details\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-indicator\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"main-content\" *ngIf=\"dataLoaded && !isRegeneratingWithProgress\">\n <div class=\"popup-header\">\n <div class=\"header-left\">\n <div class=\"heading\">Save Courses (<span>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span\n *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span></span>)</div>\n </div>\n <div class=\"header-actions\">\n <button class=\"regenerate-btn\" (click)=\"regenerateCourseRecommendations()\"\n [disabled]=\"isRegenerating\"\n mat-raised-button color=\"primary\">\n <mat-icon *ngIf=\"!isRegenerating\">refresh</mat-icon>\n <mat-spinner *ngIf=\"isRegenerating\" diameter=\"20\"></mat-spinner>\n <span>{{isRegenerating ? 'Regenerating...' : 'Regenerate Recommendations'}}</span>\n </button>\n <div class=\"cursor-pointer close-btn\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <mat-tab-group (selectedTabChange)=\"onOuterTabChange($event)\">\n <!-- First Main Tab -->\n <mat-tab label=\"course recommendation\">\n <!-- Nested Tabs -->\n <!-- <mat-tab-group (selectedTabChange)=\"onInnerTabChange($event)\">\n <mat-tab label=\"all\">\n\n </mat-tab>\n <mat-tab label=\"behavioural\">\n\n </mat-tab>\n <mat-tab label=\"functional\">\n\n </mat-tab>\n <mat-tab label=\"domain\">\n\n </mat-tab>\n </mat-tab-group> -->\n </mat-tab>\n\n <!-- Second Main Tab -->\n <mat-tab label=\"gap analysis\">\n <!-- <p>Gap analysis content goes here</p> -->\n </mat-tab>\n </mat-tab-group>\n <form [formGroup]=\"filterForm\" class=\"filters-container\">\n <div class=\"role-mapping-container\"\n *ngIf=\"outerTabActiveIndex === 0 && (innerTabActiveIndex === 0 || innerTabActiveIndex === 1 || innerTabActiveIndex === 2 || innerTabActiveIndex === 3 )\">\n <div class=\"container\">\n <div class=\"section-header-improved mt-3\">\n <div class=\"search-and-buttons-container\">\n <div>\n <label>Search Courses</label>\n </div> \n <div class=\"search-container-compact\">\n <div class=\"rsearch\">\n <mat-icon class=\"search-icon\">search</mat-icon>\n <input class=\"sinput-compact\" [(ngModel)]=\"searchText\"\n (input)=\"applyFilter($event.target.value);\"\n placeholder=\"Search Courses\" type=\"text\">\n </div>\n </div>\n \n </div>\n \n\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Competency</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.competency?.length ? '' : 'Competency' }}\n </mat-label>\n \n <mat-select\n formControlName=\"competency\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Competency\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'competency')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredCompetency\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div> \n \n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Rating</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.rating?.length ? '' : 'Rating' }}\n </mat-label>\n \n <mat-select\n formControlName=\"rating\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Reatings\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'rating')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredRatings\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n \n \n \n \n </div>\n <div class=\"section-header-improved-sec-2 mt-4\">\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Language</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.language?.length ? '' : 'Language' }}\n </mat-label>\n \n <mat-select\n formControlName=\"language\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Languages\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'language')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredLanguages\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Duration</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.duration?.length ? '' : 'Duration' }}\n </mat-label>\n \n <mat-select\n formControlName=\"duration\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Duration\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'duration')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredDurations\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"search-and-buttons-container\">\n <div style=\"margin-left: 10px;\">\n <label>Select Provider</label>\n </div> \n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>\n {{ filterForm.value.provider?.length ? '' : 'Provider' }}\n </mat-label>\n \n <mat-select\n formControlName=\"provider\"\n multiple\n panelClass=\"select-search-panel\"\n (selectionChange)=\"applyFilters()\">\n \n <!-- Search box -->\n <input style=\"border:1px solid #ccc; padding: 5px;width: 92%;margin: 5px;\"\n matInput\n placeholder=\"Search Provider\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (keyup)=\"filterList($any($event.target).value, 'provider')\" />\n \n <!-- Values -->\n <mat-option\n *ngFor=\"let r of filteredProviders\"\n [value]=\"r\">\n {{ r }}\n </mat-option>\n \n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div style=\"margin-top: 45px;margin-left: 20px;\">\n <input class=\"btn-active\" type=\"button\" value=\"Reset All Filters\"\n (click)=\"resetFilters()\" />\n </div>\n </div>\n <div class=\"mt-4\">\n <div style=\"font-size:16px;font-weight:bold;color:#000\">\n Filtered Course Count : {{filterdCourses?.length}}\n </div>\n </div>\n <div class=\"mt-5 sub-heading select-all-container\" *ngIf=\"filterdCourses?.length\">\n <div style=\"margin-left: 16px;\">\n <mat-checkbox [checked]=\"false\" (change)=\"selectAllCourses($event)\">Select All\n Courses</mat-checkbox>\n </div>\n <div class=\"btn-group-compact\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Add More Course From iGOT\"\n (click)=\"suggestMoreCourses()\" />\n </div>\n <div class=\"pl-2\">\n <input [disabled]=\"selectFilterCourses?.length > 0 ? false : true\"\n [ngClass]=\"selectFilterCourses?.length > 0 ? 'btn-active' : 'btn-disable'\"\n type=\"button\" [value]=\"mode === 'add' ? 'Save Courses' : 'Update Courses'\"\n (click)=\"saveCourses()\" />\n </div>\n </div>\n </div>\n <!-- <div class=\"disclaimer-container mt-2\" *ngIf=\"filterdCourses?.length\">\n <div class=\"disclaimer-message mt-4\">\n <strong>Disclaimer:</strong> Please verify the public course URL before adding it to the plan.\n </div>\n </div> -->\n <div class=\"mt-2\">\n\n <div class=\"course-list-container\">\n <div\n [ngClass]=\"innerTabActiveIndex > 0 ? 'course-list-container-flex':'course-list-container-right-flex' \">\n <div *ngIf=\"innerTabActiveIndex > 0\"\n [ngClass]=\"innerTabActiveIndex > 0 ? 'left-panel':''\">\n <ng-container *ngIf=\"innerTabActiveIndex === 1\">\n <div class=\"sub-heading\">\n <p>Competencies in Behavioural</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 2\">\n <div class=\"sub-heading\">\n <p>Competencies in Functional</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n <ng-container *ngIf=\"innerTabActiveIndex === 3\">\n <div class=\"sub-heading\">\n <p>Competencies in Domain</p>\n </div>\n <div class=\"theme-filter-controls mb-2\" *ngIf=\"selectedThemeFilter\">\n <button class=\"clear-filter-btn\" (click)=\"clearThemeFilter()\">\n <mat-icon>clear</mat-icon> Clear Filter\n </button>\n </div>\n <div (click)=\"filterOnCompetencyTheme(item)\"\n class=\"category-list-item cursor-pointer mt-2\"\n [ngClass]=\"{'selected-theme': isThemeSelected(item)}\"\n *ngFor=\"let item of competencyMatchedByCategory\">\n {{item}}\n </div>\n </ng-container>\n </div>\n <div [ngClass]=\"innerTabActiveIndex > 0 ? 'right-panel':'right-panel-flex'\">\n <!-- No Course Found Message in Right Panel -->\n <div class=\"no-course-found-container\"\n *ngIf=\"filterdCourses?.length === 0 && selectedThemeFilter\">\n <div class=\"no-course-card\">\n <div class=\"no-course-icon\">\n <mat-icon>search_off</mat-icon>\n </div>\n <div class=\"no-course-content\">\n <h4>No Courses Found</h4>\n <p>No courses found for the selected theme:\n <strong>{{selectedThemeFilter}}</strong></p>\n <p>Would you like to add a course for this competency?</p>\n <button class=\"suggest-course-btn\"\n (click)=\"addCourseForSelectedTheme()\">\n <mat-icon>add_circle</mat-icon>\n Add Course\n </button>\n </div>\n </div>\n </div>\n\n <!-- Courses List -->\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n\n <div class=\"course-content\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n <div>\n <mat-checkbox [checked]=\"checkIfCourseExists(item)\"\n (change)=\"selectedFilterCourses($event, item)\"></mat-checkbox>\n </div>\n <div class=\"ml-2\">\n <div class=\"course-pill-container\">\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img\n src=\"assets/icons/course.svg\"></span>&nbsp;<span>Course</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span *ngIf=\"item?.rationale\">AI Recommended\n <span *ngIf=\"item?.is_public\"> - Public</span>\n <span *ngIf=\"!item?.is_public\"> - iGOT</span>\n </span>\n <span *ngIf=\"!item?.rationale\">Manually Suggested - iGOT</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\"\n target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation}}</span>\n </div>\n </div>\n </div>\n\n </div>\n <div class=\"course-title mt-3 cursor-pointer\" (click)=\"redirectToToc(item)\">\n <span *ngIf=\"item?.course\">{{item?.course}}</span>\n <!-- <span *ngIf=\"item?.name\">{{item?.name}}****</span> -->\n <span style=\"margin-left:10px;\" (click)=\"redirectToToc(item)\"><img\n height=\"18px\" width=\"18px\"\n src=\"assets/icons/redirect.png\" /></span>\n </div>\n <div class=\"course-desc mt-2\">\n <!-- <span *ngIf=\"item?.rationale\">{{item?.rationale}}</span> -->\n <span *ngIf=\"item?.description\">{{item?.description}}</span>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioural Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\"\n class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\"\n (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n\n\n </div>\n\n <!-- Relevancy and Duration section -->\n <div class=\"course-footer\" *ngIf=\"item?.relevancy\">\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">{{item?.relevancy}}%</div>\n </div>\n </div>\n <div class=\"relevancy-pill-green\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Duration</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">\n <span\n *ngIf=\"item?.duration\">{{getDuration(item?.duration)}}</span>\n <span *ngIf=\"!(item?.duration)\">N/A</span>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- General No Data Message (only when no theme filter is active) -->\n <div class=\"mt-2 sub-heading\" *ngIf=\"filterdCourses?.length === 0 && !selectedThemeFilter\">\n <p>No Data Found</p>\n </div>\n </div>\n </div>\n </form>\n <div class=\"role-mapping-container\" *ngIf=\"outerTabActiveIndex === 1\">\n <div id=\"gap-analysis-content\">\n\n <div class=\"download-pdf mt-4 mb-2\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Download\" (click)=\"downloadPDF()\" />\n </div>\n </div>\n <div>\n <!-- <div *ngIf=\"isPDFDownload\">\n <div class=\"pdf-heading\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}} <span\n *ngIf=\"planData?.designation_name \">_{{planData?.designation_name}}_Gap_Analysis</span>\n </div>\n </div> -->\n <div class=\"d-flex vh-100\" [ngClass]=\"isPDFDownload ? 'mt-4':''\">\n <!-- Sidebar -->\n <div class=\"d-flex flex-column p-3 bg-light border-end\" style=\"width: 250px;\">\n <h5 class=\"mb-4\">Analyze by Category</h5>\n <button *ngFor=\"let item of menuItems\"\n class=\"btn btn-outline-primary mb-2 text-start menu-list-item\"\n [class.active]=\"selectedCategory === item.key\" (click)=\"selectCategory(item.key)\">\n {{ item.label }}\n </button>\n </div>\n\n <!-- Main Content -->\n <div class=\"flex-grow-1 p-4\">\n <div class=\"d-flex justify-content-between gap-3 \">\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p>Competencies Covered</p>\n </div>\n <div class=\"div-count\">{{competencyCoveredCount}}</div>\n </div>\n <div class=\"p-3 gray-bg\">\n <div class=\"div-label sub-heading\">\n <p *ngIf=\"selectedCategory === 'all'\">Total Competencies</p>\n <p *ngIf=\"selectedCategory === 'behavioral'\">Total Behavioural Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'functional'\">Total Functional Competencies\n </p>\n <p *ngIf=\"selectedCategory === 'domain'\">Total Domain Competencies</p>\n </div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'all'\">\n {{this.planData?.competencies?.length}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalTotalCompetencies}}</div>\n <div class=\"div-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainTotalCompetencies}}</div>\n </div>\n <div class=\"p-3 green-bg\">\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'all'\">Overall Coverage\n </div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'behavioral'\">\n Behavioural Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'functional'\">\n Functional Coverage</div>\n <div class=\"div-green-label\" *ngIf=\"selectedCategory === 'domain'\">Domain\n Coverage</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'all'\">\n {{overallCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'behavioral'\">\n {{behavioralCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'functional'\">\n {{functionalCoverage}}</div>\n <div class=\"div-green-count\" *ngIf=\"selectedCategory === 'domain'\">\n {{domainCoverage}}</div>\n </div>\n </div>\n <div class=\"mt-4 all-category-list\" [ngSwitch]=\"selectedCategory\">\n <div *ngSwitchCase=\"'all'\">\n <h4>All Categories</h4>\n\n <!-- Show Behavioural section only if there are unmatched behavioural competencies -->\n <div class=\"mt-4\"\n *ngIf=\"behaviouralNotMatched && behaviouralNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show Functional section only if there are unmatched functional competencies -->\n <div class=\"mt-4\"\n *ngIf=\"functionalNotMatched && functionalNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Functional</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show Domain section only if there are unmatched domain competencies -->\n <div class=\"mt-4\" *ngIf=\"domainNotMatched && domainNotMatched.length > 0\">\n <div class=\"sub-heading\">\n <p>Domain</p>\n </div>\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item | titlecase}}</span></div>\n <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New\n Course</span></div>\n </div>\n </div>\n </div>\n\n <!-- Show message when all competencies are covered -->\n <div class=\"mt-4 text-center\"\n *ngIf=\"(!behaviouralNotMatched || behaviouralNotMatched.length === 0) && \n (!functionalNotMatched || functionalNotMatched.length === 0) && \n (!domainNotMatched || domainNotMatched.length === 0)\">\n <div class=\"no-gaps-message\">\n <mat-icon class=\"success-icon\">check_circle</mat-icon>\n <h4>Excellent! All competencies are covered</h4>\n <p>All required competencies have been addressed by the selected\n courses.</p>\n </div>\n </div>\n\n </div>\n\n <div *ngSwitchCase=\"'behavioral'\">\n <h4>Behavioural</h4>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Behavioural</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Behavioral')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"behavioralCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All behavioral competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'functional'\">\n <h4>Functional</h4>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Functional</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Functional')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course</span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"functionalCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All functional competencies are covered by the\n selected courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'domain'\">\n <h4>Domain</h4>\n <div class=\"mt-4\" *ngIf=\"domainCoverage !== '100%'\">\n <!-- <div class=\"sub-heading\">\n <p>Domain</p>\n </div> -->\n <div class=\"gray-bg-item\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"list-flex\">\n <div><span>{{item}}</span></div>\n <!-- <div class=\"cursor-pointer\" (click)=\"addCourse(item, 'Domain')\">\n <span class=\"add-btn\"><mat-icon>add</mat-icon> Add New Course </span></div> -->\n </div>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"domainCoverage === '100%'\">\n <div class=\"p-3\"\n style=\"background-color: #e8f5e8; border: 1px solid #4caf50; border-radius: 8px; text-align: center;\">\n <div style=\"color: #2e7d32; font-weight: 600; font-size: 16px;\">\n \uD83C\uDF89 Excellent! All domain competencies are covered by the selected\n courses.\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchDefault>\n <p>Please select a category.</p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div> <!-- Close main-content div -->\n\n </div>\n</div>\n\n\n<div [hidden]=\"!isPDFDownload\" class=\"gap-analysis-pdf-container\" #pdfContent>\n <div class=\"gap-analysis-pdf-header\">\n <img src=\"assets/icons/karmayogiLogo-min.png\" alt=\"Karmayogi Bharat Logo\" class=\"logo\" />\n <h1><span>\n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'state'\">{{sharedService?.cbpPlanFinalObj?.department_name?.name}}</span> \n <span *ngIf=\"sharedService?.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry'\">{{sharedService?.cbpPlanFinalObj?.ministry?.name}}</span> \n <span *ngIf=\"planData?.designation_name \">/ {{planData?.designation_name}}</span>\n </span></h1>\n <p class=\"subtitle\">A detailed breakdown of competencies Gap Analysis</p>\n \n </div>\n \n <div class=\"competency-snapshot\">\n <h2>Competency Snapshot</h2>\n <div class=\"snapshot-content\">\n <div class=\"circle-wrapper\">\n <svg class=\"progress-ring\" width=\"120\" height=\"120\">\n <circle class=\"progress-ring-bg\" cx=\"60\" cy=\"60\" r=\"52\" />\n <circle class=\"progress-ring-circle\" cx=\"60\" cy=\"60\" r=\"52\" />\n </svg>\n <div class=\"percentage-text\">{{overallCoverage}}<br /><span>Overall Coverage</span></div>\n </div>\n \n <div class=\"competency-container\">\n <!-- Total Competencies Box -->\n <div class=\"total-box\">\n <div class=\"title\">Total Competencies</div>\n <div class=\"count\">{{this.planData?.competencies?.length}}</div>\n </div>\n \n <!-- Progress Bars -->\n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text behavioral\">Behavioural</span>\n <span class=\"covered-text\">{{behavioralCompetencyCoveredCount}} / {{behavioralTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill behavioral\" [style.width.%]=\"(behavioralCompetencyCoveredCount / behavioralTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text functional\">Functional</span>\n <span class=\"covered-text\">{{functionalCompetencyCoveredCount}} / {{functionalTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill functional\" [style.width.%]=\"(functionalCompetencyCoveredCount / functionalTotalCompetencies) * 100\"></div>\n </div>\n </div>\n \n <div class=\"progress-group\">\n <div class=\"progress-label\">\n <span class=\"label-text domain\">Domain</span>\n <span class=\"covered-text\">{{domainCompetencyCoveredCount}} / {{domainTotalCompetencies}} Covered</span>\n </div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill domain\" [style.width.%]=\"(domainCompetencyCoveredCount / domainTotalCompetencies) * 100\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n \n <div class=\"gap-section mb-4\">\n <h2>Detailed Competency Analysis</h2>\n <div class=\"gap-box\">\n Bridge Your Competencies Gap\n <p class=\"subtitle\">Here are {{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}} key areas for development.</p>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Gap to Address <span *ngIf=\"(this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)) > 0\">({{this.planData?.competencies?.length - (behavioralCompetencyCoveredCount + functionalCompetencyCoveredCount + domainCompetencyCoveredCount)}})</span></p>\n \n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n &nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainNotMatched\">\n <div class=\"title\">{{item | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n &nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"sub-heading mb-4\">\n <p>Covered Competencies <span>({{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}})</span></p> \n </div>\n <div class=\"gap-section mb-4\">\n \n <div class=\"green-bg\">\n <div class=\"div-green-label mb-2\">\n Congratulations!\n </div> \n <p>You have successfully covered </p>\n <p class=\"subtitle\">{{this.planData?.competencies?.length - (behaviouralNotMatched?.length + functionalNotMatched?.length + domainNotMatched?.length)}} key competencies, forming a strong professional foundation.</p>\n </div>\n </div>\n <div class=\"competency-card behavioral\" *ngFor=\"let item of behaviouralMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag behavioral\">Behavioural</span>\n </div>\n </div>\n \n <div class=\"competency-card functional\" *ngFor=\"let item of functionalMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag functional\">Functional</span>\n </div>\n </div>\n \n <div class=\"competency-card domain\" *ngFor=\"let item of domainMatched\">\n <div class=\"title\">{{item?.theme | titlecase}}</div>\n <div class=\"subtitle\">\n <!-- Project Management -->\n {{item?.sub_theme}}&nbsp; \u2022 &nbsp;\n <span class=\"tag domain\">Domain</span>\n </div>\n </div>\n <div class=\"gap-section mb-4\">\n <h2>Recommended Courses</h2>\n </div>\n <app-gap-analysis-recommended-course [planData]=\"planData\"></app-gap-analysis-recommended-course>\n</div>\n \n\n\n<div class=\"overlay-loader\" *ngIf=\"loading && dataLoaded && !isRegeneratingWithProgress\">\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 course recommendation generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"progressPercentage > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"progressPercentage\">\n </div>\n </div>\n <small class=\"progress-text\">{{ progressPercentage }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time course generation in progress. This may take 1-2 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:16px;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:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.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:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;align-items:flex-start;width:100%;gap:8px}.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-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.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:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;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;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.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;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{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}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.initial-loading-container{display:flex;justify-content:center;align-items:center;min-height:400px;width:100%}.initial-loading-container .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;padding:3rem 2rem}.initial-loading-container .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:320px}.initial-loading-container .loading-content .loading-text .main-message{font-size:16px;font-weight:600;margin-bottom:1rem;color:#1b4ca1}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:300px;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:.5rem}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#4caf50);border-radius:4px;transition:width .3s ease-in-out}.initial-loading-container .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:12px;color:#666;font-weight:500}.initial-loading-container .loading-content .loading-text .progress-details .time-estimate{font-size:12px;color:#888;font-style:italic}.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:320px}.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}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved,.section-header-improved-sec-2{display:flex;flex-direction:row;gap:0px;width:100%}.search-and-buttons-container{display:flex;justify-content:space-between;gap:5px;flex-direction:column;flex-wrap:wrap;width:37%;margin:0 5px}.search-container-compact{flex:0 0 auto;min-width:180px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:2px solid #ccc;padding:20px 12px 20px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}.gap-analysis-pdf-container{font-family:Lato;max-width:900px;margin:auto;color:#212121}.gap-analysis-pdf-header{text-align:center;margin-bottom:2rem}.gap-analysis-pdf-header .logo{height:60px;margin-bottom:.5rem}.gap-analysis-pdf-header h1{font-size:1.8rem;font-weight:600;margin:.5rem 0}.gap-analysis-pdf-header .subtitle{color:#555;font-size:.95rem}.gap-analysis-pdf-header .download-btn{background:#5e00ff;color:#fff;border:none;padding:10px 20px;border-radius:6px;margin-top:1rem;font-weight:500;cursor:pointer}.competency-snapshot{background:#fafafa;border-radius:12px;padding:2rem;margin-bottom:2rem}.competency-snapshot h2{font-size:1.4rem;font-weight:600;margin-bottom:1.5rem}.competency-snapshot .snapshot-content{display:flex;gap:2rem;align-items:center;justify-content:space-between}.competency-snapshot .snapshot-content .circle-wrapper{position:relative;width:120px;height:120px}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-bg{fill:none;stroke:#eee;stroke-width:10}.competency-snapshot .snapshot-content .circle-wrapper .progress-ring-circle{fill:none;stroke:#6c63ff;stroke-width:10;stroke-linecap:round;stroke-dasharray:326.72;stroke-dashoffset:117.6192;transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset .35s}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-weight:600;font-size:1.4rem;text-align:center}.competency-snapshot .snapshot-content .circle-wrapper .percentage-text span{display:block;font-size:.75rem;font-weight:400;color:#555}.competency-snapshot .snapshot-content .details{flex-grow:1}.competency-snapshot .snapshot-content .details .total-competencies{font-size:1.2rem;margin-bottom:1rem}.competency-snapshot .snapshot-content .details .bar{margin:.5rem 0;padding:.6rem 1rem;border-radius:6px;font-weight:500;display:flex;justify-content:space-between;color:#fff}.competency-snapshot .snapshot-content .details .bar.behavioral{background:#7b1fa2}.competency-snapshot .snapshot-content .details .bar.functional{background:#0288d1}.competency-snapshot .snapshot-content .details .bar.domain{background:#f57c00}.gap-section{margin-top:2rem}.gap-section h2{font-size:1.3rem;margin-bottom:1rem}.gap-section .gap-box{background:#eef1ff;border-left:5px solid #6c63ff;padding:1rem;border-radius:6px;font-weight:500;color:#333}.gap-section .green-bg{background-color:#0080001c;border-left:5px solid #2d9b2d;padding:1rem;border-radius:6px;font-weight:500;color:#006400}.competency-container{width:100%;margin:0 auto;font-family:Segoe UI,sans-serif;color:#212121;display:flex;flex-direction:column}.total-box{background:#f8f9fc;border-radius:10px;padding:1.5rem;text-align:center;border:1px solid #e0e0e0;margin-bottom:1.5rem}.total-box .title{font-size:1rem;color:#666}.total-box .count{font-size:2rem;font-weight:700;color:#111;margin-top:.5rem}.progress-group{margin-bottom:1.5rem}.progress-group .progress-label{display:flex;justify-content:space-between;margin-bottom:6px}.progress-group .progress-label .label-text{font-weight:600}.progress-group .progress-label .covered-text{font-size:.9rem;color:#444}.progress-group .progress-label .behavioral{color:#f8b861}.progress-group .progress-label .functional{color:#e24577}.progress-group .progress-label .domain{color:#7b47a4}.progress-group .progress-bar{height:10px;background-color:#e0e0e0;border-radius:5px;overflow:hidden}.progress-group .progress-bar .progress-fill{height:100%;border-radius:5px;transition:width .5s ease-in-out}.progress-group .progress-bar .progress-fill.behavioral{background:#f8b861}.progress-group .progress-bar .progress-fill.functional{background:#e24577}.progress-group .progress-bar .progress-fill.domain{background:#7b47a4}.competency-card{border-radius:8px;padding:1rem 1.5rem;margin-bottom:1rem;border:1px solid transparent}.competency-card .title{font-weight:600;font-size:1.1rem;color:#222;margin-bottom:.4rem}.competency-card .subtitle{font-size:.95rem;color:#555}.competency-card .subtitle .tag{font-weight:500}.competency-card .subtitle .behavioral,.competency-card .subtitle .domain,.competency-card .subtitle .functional{color:#000}.competency-card.behavioral{background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;border-color:#f8b861}.competency-card.functional{background:linear-gradient(0deg,#e245773d 0% 100%),#fff;border-color:#e24577}.competency-card.domain{background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;border-color:#7b47a4}.disclaimer-container{margin:8px 16px 0}.disclaimer-message{background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:20px;padding:8px 16px;font-family:Lato;font-size:14px;color:#333;line-height:1.2}.disclaimer-message strong{color:#000;font-weight:600}.select-all-container{display:flex;flex-direction:row;justify-content:space-between}::ng-deep .search-and-buttons-container .mat-form-field-infix{padding:10px!important}::ng-deep .search-and-buttons-container .mat-form-field-wrapper{width:100%!important}::ng-deep .select-search-panel{border:1px solid #ccc!important;border-radius:12px!important;box-shadow:0 8px 20px #0000001f}:host ::ng-deep .mat-select-arrow-wrapper{margin-top:5px!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}:host ::ng-deep .search-and-buttons-container .mat-option-text{color:#fff!important}\n"] }]
2013
2013
  }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
2014
2014
  type: Inject,
2015
2015
  args: [MAT_DIALOG_DATA]
@@ -2087,4 +2087,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2087
2087
  </div>
2088
2088
  `, styles: [".confirmation-dialog-container{padding:0}.dialog-header{display:flex;align-items:center;gap:12px;padding:24px 24px 16px;border-bottom:1px solid #e0e0e0}.warning-icon{font-size:24px;width:24px;height:24px;color:#ff9800}h2{margin:0;font-size:18px;font-weight:600;color:#333}.dialog-content{padding:24px}.main-message{font-size:16px;color:#333;margin:0 0 12px;line-height:1.5}.sub-message{font-size:14px;color:#666;margin:0;font-weight:500}.dialog-actions{padding:16px 24px 24px;gap:12px;justify-content:flex-end}.cancel-btn{color:#666}.confirm-btn{display:flex;align-items:center;gap:8px;.mat-icon{font-size:18px;width:18px;height:18px;margin:0}}\n"] }]
2089
2089
  }], ctorParameters: function () { return [{ type: i1.MatDialogRef }]; } });
2090
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9jb21wb25lbnRzL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi9nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUEyQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBcUIsU0FBUyxFQUFjLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHcEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFFckcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQU9uSCxNQUFNLE9BQU8scUNBQXFDO0lBb0JoRCxZQUFtQixTQUE4RCxFQUMvQyxJQUFTLEVBQVMsYUFBNEIs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LFFBQVEsS0FBSyxFQUFFO2dCQUNiLEtBQUssVUFBVTtvQkFDYixPQUFPLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ25CLEtBQUssV0FBVztvQkFDZCxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsS0FBSyxVQUFVO29CQUNiLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDbkI7b0JBQ0UsT0FBTyxJQUFJLENBQUM7YUFDZjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FseUVVLHFDQUFxQyw4Q0FxQnRDLGVBQWU7bUdBckJkLHFDQUFxQyxvTENqQmxELG80aUVBNitCTTs7NEZENTlCTyxxQ0FBcUM7a0JBTGpELFNBQVM7K0JBQ0Usb0NBQW9DOzswQkF5QjNDLE1BQU07MkJBQUMsZUFBZTtvSkFwQm1CLFVBQVU7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7QUFveUU1QyxnQ0FBZ0M7QUFtR2hDLE1BQU0sT0FBTyw0QkFBNEI7SUFDdkMsWUFDUyxTQUFxRDtRQUFyRCxjQUFTLEdBQVQsU0FBUyxDQUE0QztJQUMxRCxDQUFDO0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQzsrR0FYVSw0QkFBNEI7bUdBQTVCLDRCQUE0QixzRUFoRzdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVDs7NEZBc0VVLDRCQUE0QjtrQkFsR3hDLFNBQVM7K0JBQ0UsZ0NBQWdDLFlBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IFN1Z2dlc3RNb3JlQ291cnNlc0NvbXBvbmVudCB9IGZyb20gJy4uL3N1Z2dlc3QtbW9yZS1jb3Vyc2VzL3N1Z2dlc3QtbW9yZS1jb3Vyc2VzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRUYWJDaGFuZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHsgQWRkQ291cnNlQ29tcG9uZW50IH0gZnJvbSAnLi4vYWRkLWNvdXJzZS9hZGQtY291cnNlLmNvbXBvbmVudCc7XG5pbXBvcnQgaHRtbDJwZGYgZnJvbSAnaHRtbDJwZGYuanMnO1xuaW1wb3J0IHsgY29uY2F0LCBpbnRlcnZhbCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZVdoaWxlLCB0YXAsIGNhdGNoRXJyb3IsIGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGVsZXRlUm9sZU1hcHBpbmdQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL2RlbGV0ZS1yb2xlLW1hcHBpbmctcG9wdXAvZGVsZXRlLXJvbGUtbWFwcGluZy1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudCB7XG4gIEBWaWV3Q2hpbGQoJ3BkZkNvbnRlbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgcGRmQ29udGVudCE6IEVsZW1lbnRSZWY7XG4gIHBsYW5EYXRhOiBhbnlcbiAgbG9hZGluZyA9IGZhbHNlXG4gIGRhdGFMb2FkZWQgPSBmYWxzZSAvLyBUcmFjayBpZiBpbml0aWFsIGRhdGEgaGFzIGJlZW4gbG9hZGVkXG4gIGlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gZmFsc2UgLy8gVHJhY2sgcmVnZW5lcmF0aW9uIHdpdGggcHJvZ3Jlc3MgbG9hZGluZ1xuICByZWNvbW1lbmRlZF9jb3Vyc2VfaWQgPSAnJ1xuXG4gIC8vIFByb2dyZXNzaXZlIGxvYWRpbmcgZm9yIGNvdXJzZSBnZW5lcmF0aW9uXG4gIGN1cnJlbnRQcm9jZXNzaW5nU3RhZ2U6IHN0cmluZyA9ICcnO1xuICBwcm9ncmVzc1BlcmNlbnRhZ2U6IG51bWJlciA9IDA7XG4gIHByb2Nlc3NpbmdTdGFnZXMgPSBbXG4gICAgJ0FuYWx5emluZyByb2xlcyBhbmQgcmVzcG9uc2liaWxpdGllcy4uLicsXG4gICAgJ0RldGFpbGluZyBjb21wZXRlbmN5IHJlcXVpcmVtZW50cy4uLicsXG4gICAgJ1ByZXBhcmluZyBpR09UIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMuLi4nLFxuICAgICdHZW5lcmF0aW5nIHB1YmxpYyBjb3Vyc2Ugc3VnZ2VzdGlvbnMuLi4nLFxuICAgICdDb21wdXRpbmcgY29tcHJlaGVuc2l2ZSBnYXAgYW5hbHlzaXMuLi4nLFxuICAgICdGaW5hbGl6aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiBwbGFuLi4uJ1xuICBdO1xuICBzdGFnZVN0YXJ0VGltZTogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IocHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LCBwdWJsaWMgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhciwgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5wbGFuRGF0YSA9IGRhdGFcbiAgfVxuICBzZWFyY2hUZXh0ID0gJydcbiAgZmlsdGVyZENvdXJzZXM6IGFueSA9IFtdXG4gIG9yaWdpbmFsRGF0YTogYW55ID0gW11cbiAgc2VsZWN0RmlsdGVyQ291cnNlczogYW55ID0gW11cbiAgc3VnZ2VzdGVkQ291cnNlczogYW55ID0gW10gLy8gVHJhY2sgaUdPVCBzdWdnZXN0ZWQgY291cnNlcyBzZXBhcmF0ZWx5XG4gIHVzZXJBZGRlZENvdXJzZXM6IGFueSA9IFtdIC8vIFRyYWNrIHVzZXItYWRkZWQgY291cnNlcyBzZXBhcmF0ZWx5XG4gIG1vZGUgPSAnYWRkJ1xuICBjYnBfcGxhbl9pZCA9ICcnXG4gIGV4cGFuZGVkQ29tcGV0ZW5jaWVzOiBhbnkgPSB7fTsgLy8gVHJhY2sgZXhwYW5kZWQgc3RhdGUgZm9yIGVhY2ggY291cnNlIGFuZCBjb21wZXRlbmN5IHR5cGVcbiAgb3V0ZXJUYWJBY3RpdmVJbmRleCA9IDBcbiAgaW5uZXJUYWJBY3RpdmVJbmRleCA9IDBcbiAgb3V0ZXJUYWJBY3RpdmVUZXh0ID0gJ2FsbCdcbiAgaW5uZXJUYWJBY3RpdmVUZXh0ID0gJ2FsbCdcbiAgc2VsZWN0ZWRDYXRlZ29yeSA9ICdhbGwnO1xuICBjb21wZXRlbmN5Q292ZXJlZENvdW50ID0gMFxuICBvdmVyYWxsQ292ZXJhZ2U6IGFueSA9IDBcbiAgYmVoYXZpb3JhbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSAwXG4gIGJlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llcyA9IDBcbiAgYmVoYXZpb3JhbENvdmVyYWdlOiBhbnkgPSAwXG4gIGZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ID0gMFxuICBmdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXMgPSAwXG4gIGZ1bmN0aW9uYWxDb3ZlcmFnZTogYW55ID0gMFxuICBkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50ID0gMFxuICBkb21haW5Ub3RhbENvbXBldGVuY2llcyA9IDBcbiAgZG9tYWluQ292ZXJhZ2U6IGFueSA9IDBcbiAgY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5ID0gW11cbiAgY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5ID0gW11cbiAgbWVudUl0ZW1zID0gW1xuICAgIHsga2V5OiAnYWxsJywgbGFiZWw6ICdBbGwgQ2F0ZWdvcmllcycgfSxcbiAgICB7IGtleTogJ2JlaGF2aW9yYWwnLCBsYWJlbDogJ0JlaGF2aW91cmFsJyB9LFxuICAgIHsga2V5OiAnZnVuY3Rpb25hbCcsIGxhYmVsOiAnRnVuY3Rpb25hbCcgfSxcbiAgICB7IGtleTogJ2RvbWFpbicsIGxhYmVsOiAnRG9tYWluJyB9XG4gIF07XG4gIGJlaGF2aW91cmFsTm90TWF0Y2hlZCA9IFtdXG4gIGZ1bmN0aW9uYWxOb3RNYXRjaGVkID0gW11cbiAgZG9tYWluTm90TWF0Y2hlZCA9IFtdXG4gIHNlbGVjdGVkVGhlbWVGaWx0ZXIgPSAnJ1xuICBvcmlnaW5hbEZpbHRlcmVkQ291cnNlcyA9IFtdXG4gIGlzUmVnZW5lcmF0aW5nID0gZmFsc2VcbiAgaXNQREZEb3dubG9hZCA9IGZhbHNlXG4gIGJlaGF2aW91cmFsTWF0Y2hlZCA9IFtdXG4gIGZ1bmN0aW9uYWxNYXRjaGVkID0gW11cbiAgZG9tYWluTWF0Y2hlZCA9IFtdXG4gIGZpbHRlckZvcm0hOiBGb3JtR3JvdXA7XG4gIGNvbXBldGVuY2llc1R5cGUgPSBbJ0FsbCcsICdCZWhhdmlvdXJhbCcsICdGdW5jdGlvbmFsJywgJ0RvbWFpbiddXG4gIHJhdGluZ3MgPSBbJzQuNSBhbmQgYWJvdmUnLCAnNC4wIGFuZCBhYm92ZScsICczLjUgYW5kIGFib3ZlJywgJzIuNSBhbmQgYWJvdmUnLCAnMSBhbmQgYWJvdmUnXTtcbiAgbGFuZ3VhZ2VzID0gWydFbmdsaXNoJywgJ0hpbmRpJywgJ1RhbWlsJywgJ0thbm5hZGEnLCAnVGVsdWd1JywgJ01hbGF5YWxhbScsICdBc3NhbWVzZScsICdCZW5nYWxpJywgJ0d1amFyYXRpJywgJ01hcmF0aGknLCAnT2RpYScsICdQdW5qYWJpJywgJ0tvbmthbmknLCAnQm9kbycsICdEb2dyaScsICdLYXNobWlyaScsICdNYWl0aGlsaScsICdNYW5pcHVyaScsICdOZXBhbGknLCAnU2Fuc2tyaXQnLCAnU2FudGFsaScsICdTaW5kaGknLCAnVXJkdSddO1xuICBkdXJhdGlvbnMgPSBbJzwgMSBIb3VyJywgJzEtNSBIb3VycycsICc1KyBIb3VycyddO1xuICBwcm92aWRlcnMgPSBbXTtcbiAgZmlsdGVyZWRDb21wZXRlbmN5ID0gWy4uLnRoaXMuY29tcGV0ZW5jaWVzVHlwZV07XG4gIGZpbHRlcmVkUmF0aW5ncyA9IFsuLi50aGlzLnJhdGluZ3NdO1xuICBmaWx0ZXJlZExhbmd1YWdlcyA9IFsuLi50aGlzLmxhbmd1YWdlc107XG4gIGZpbHRlcmVkRHVyYXRpb25zID0gWy4uLnRoaXMuZHVyYXRpb25zXTtcbiAgZmlsdGVyZWRQcm92aWRlcnMgPSBbLi4udGhpcy5wcm92aWRlcnNdO1xuICBmdWxsQ291cnNlTGlzdCA9IFtdXG4gIC8vIFNlbGVjdGVkIGZpbHRlcnNcbiAgc2VsZWN0ZWRDb21wZXRlbmN5ID0gJ0FsbCc7XG4gIHNlbGVjdGVkUmF0aW5nOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0ZWRMYW5ndWFnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkRHVyYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzZWxlY3RlZFByb3ZpZGVyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZmlyc3RBcGlSZXNwb25zZTogYW55ID0gbnVsbFxuICBleGlzdGluZ1JlY29tbWVuZGF0aW9uRm91bmQgPSBmYWxzZTtcbiAgc2VsZWN0Q2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMuZ2FwQW5hbHlzaXNTdGF0cygpXG4gIH1cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb21wZXRlbmN5OiBbW11dLFxuICAgICAgcmF0aW5nOiBbW11dLFxuICAgICAgbGFuZ3VhZ2U6IFtbXV0sXG4gICAgICBkdXJhdGlvbjogW1tdXSxcbiAgICAgIHByb3ZpZGVyOiBbW11dXG4gICAgfSk7XG4gICAgdGhpcy5sb2FkQ29tcG9uZW50RGF0YSgpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIodmFsdWU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCd0aGlzLnNlYXJjaFRleHQnLCB2YWx1ZSlcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB2YWx1ZVxuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLmZpbHRlckRhdGEodGhpcy5zZWFyY2hUZXh0KTtcbiAgfVxuXG4gIHNlYXJjaERhdGEoKSB7XG4gICAgLy8gIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLmZpbHRlckRhdGEodGhpcy5zZWFyY2hUZXh0KTtcbiAgfVxuXG4gIHNlbGVjdGVkRmlsdGVyQ291cnNlcyhldmVudCwgaXRlbSkge1xuICAgIGNvbnNvbGUubG9nKCdldmVudCcsIGV2ZW50KVxuICAgIGNvbnNvbGUubG9nKCdpdGVtJywgaXRlbSlcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5pbmRleE9mKGl0ZW0/LmlkZW50aWZpZXIpIDwgMCkge1xuICAgICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMucHVzaChpdGVtPy5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5maW5kSW5kZXgoXG4gICAgICAgIGNvbnRyb2wgPT4gY29udHJvbCA9PT0gaXRlbS5pZGVudGlmaWVyXG4gICAgICApO1xuXG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzJywgdGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzKVxuICB9XG5cbiAgY2xvc2VEaWFsb2coKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICB9XG5cbiAgc2F2ZUNvdXJzZXMoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLnBsYW5EYXRhJywgdGhpcy5wbGFuRGF0YSlcbiAgICBsZXQgcmVxQm9keSA9IHtcbiAgICAgIFwicm9sZV9tYXBwaW5nX2lkXCI6IHRoaXMucGxhbkRhdGEuaWQsXG4gICAgICBcInJlY29tbWVuZGVkX2NvdXJzZV9pZFwiOiB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCxcbiAgICAgIFwiY291cnNlX2lkZW50aWZpZXJzXCI6IHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlc1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygncmVxQm9keSwgJywgcmVxQm9keSlcbiAgICBpZiAodGhpcy5tb2RlID09PSAnYWRkJykge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNhdmVDb3Vyc2UocmVxQm9keSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3NhdmVkJylcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NvdXJzZXMgU2F2ZWQgU3VjY2Vzc2Z1bGx5JywgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICAgICAgICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgaGVyZVxuICAgICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgICAgLy90aGlzLmdldFxuICAgICAgICAgIC8vIE9yIHlvdSBjYW4gc2V0IGEgVUkgZXJyb3IgbWVzc2FnZSB2YXJpYWJsZVxuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY2JwX3BsYW5faWQpIHtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwZGF0ZUNvdXJzZShyZXFCb2R5LCB0aGlzLmNicF9wbGFuX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIHJlcyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3NhdmVkJylcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignQ291cnNlcyBVcGRhdGVkIFN1Y2Nlc3NmdWxseScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpXG4gICAgICAgICAgICAvLyBIYW5kbGUgNDA5IENvbmZsaWN0IGhlcmVcbiAgICAgICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgICAgICAvL3RoaXMuZ2V0XG4gICAgICAgICAgICAvLyBPciB5b3UgY2FuIHNldCBhIFVJIGVycm9yIG1lc3NhZ2UgdmFyaWFibGVcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIC8vdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiBjYnBfcGxhbl9pZCBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NicF9wbGFuX2lkIGlzIG5vdCBhdmFpbGFibGUgZm9yIHVwZGF0ZSBvcGVyYXRpb24nKTtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gdXBkYXRlIGNvdXJzZXM6IG1pc3NpbmcgcGxhbiBJRCcsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIH1cblxuICB9XG5cbiAgZ2V0Q291cnNlcygpIHtcbiAgICBsZXQgcm9sZV9tYXBwaW5nX2lkID0gdGhpcy5wbGFuRGF0YS5pZFxuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Q291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgLy8gU3VjY2VzcyBoYW5kbGluZ1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICB0aGlzLmNicF9wbGFuX2lkID0gcmVzPy5pZFxuICAgICAgICBpZiAocmVzICYmIHJlcz8uc2VsZWN0ZWRfY291cnNlcyAmJiByZXM/LnNlbGVjdGVkX2NvdXJzZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMubW9kZSA9ICdlZGl0J1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzPy5zZWxlY3RlZF9jb3Vyc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMucHVzaChyZXMuc2VsZWN0ZWRfY291cnNlc1tpXT8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgaGVyZVxuICAgICAgICAvLyBhbGVydCgnQ29uZmxpY3QgZGV0ZWN0ZWQ6IFRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBvciBhY3Rpb24gY29uZmxpY3RzLicpO1xuICAgICAgICAvL3RoaXMuZ2V0XG4gICAgICAgIC8vIE9yIHlvdSBjYW4gc2V0IGEgVUkgZXJyb3IgbWVzc2FnZSB2YXJpYWJsZVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIC8vdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgIH1cblxuXG4gICAgfSlcbiAgfVxuICBnZXRTdWdnZXN0ZWRDb3Vyc2UoKSB7XG4gICAgbGV0IHJvbGVfbWFwcGluZ19pZCA9IHRoaXMucGxhbkRhdGEuaWRcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFN1Z2dlc3RlZENvdXJzZXMocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAvLyBTdWNjZXNzIGhhbmRsaW5nXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKCdnZXRTdWdnZXN0ZWRDb3Vyc2VzIHJlcycsIHJlcylcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZmlsdGVyZENvdXJzZXMnLCB0aGlzLmZpbHRlcmRDb3Vyc2VzKVxuICAgICAgICAvLyBTdG9yZSBzdWdnZXN0ZWQgY291cnNlcyBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuc3VnZ2VzdGVkQ291cnNlcyA9IFsuLi5yZXNdO1xuXG4gICAgICAgIC8vIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgdG8gaW5jbHVkZSBhbGwgY291cnNlIHR5cGVzXG4gICAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkQ291cnNlcygpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBnYXAgYW5hbHlzaXMgc3RhdHMgYWZ0ZXIgc3VnZ2VzdGVkIGNvdXJzZXMgYXJlIGFkZGVkXG4gICAgICAgIHRoaXMudXBkYXRlR2FwQW5hbHlzaXNBZnRlckNvdXJzZXNVcGRhdGUoKVxuICAgICAgICAvL3RoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcilcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1VuYXV0aG9yaXplZCBhY2Nlc3MgLSB1c2VyIHdpbGwgYmUgcmVkaXJlY3RlZCB0byBsb2dpbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnMgZ3JhY2VmdWxseVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHN1Z2dlc3RlZCBjb3Vyc2VzJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3IgeW91IGNhbiBzZXQgYSBVSSBlcnJvciBtZXNzYWdlIHZhcmlhYmxlXG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfVxuXG5cbiAgICB9KVxuICB9XG5cbiAgZ2V0VXNlckNvdXJzZSgpIHtcbiAgICBsZXQgcm9sZV9tYXBwaW5nX2lkID0gdGhpcy5wbGFuRGF0YS5pZFxuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0VXNlckNvdXJzZShyb2xlX21hcHBpbmdfaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgY29uc29sZS5sb2coJ2dldFVzZXJDb3Vyc2UgQVBJIHJlc3BvbnNlOicsIHJlcylcbiAgICAgICAgY29uc29sZS5sb2coJ0N1cnJlbnQgZmlsdGVyZENvdXJzZXMgYmVmb3JlIGFkZGluZyB1c2VyIGNvdXJzZXM6JywgdGhpcy5maWx0ZXJkQ291cnNlcylcblxuICAgICAgICAvLyBTdG9yZSB1c2VyLWFkZGVkIGNvdXJzZXMgc2VwYXJhdGVseSAocmVzZXQgdG8gYXZvaWQgZHVwbGljYXRlcylcbiAgICAgICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzID0gWy4uLnJlc107XG5cbiAgICAgICAgLy8gUHJvY2VzcyB1c2VyLWFkZGVkIGNvdXJzZXMgdG8gZW5zdXJlIHByb3BlciBzdHJ1Y3R1cmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyQ291cnNlID0gcmVzW2ldO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBVc2VyIGNvdXJzZSAke2l9IGNvbXBldGVuY2llczpgLCB1c2VyQ291cnNlLmNvbXBldGVuY2llcyk7XG5cbiAgICAgICAgICAvLyBFbnN1cmUgdXNlci1hZGRlZCBjb3Vyc2VzIGhhdmUgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZSBmb3IgZGlzcGxheVxuICAgICAgICAgIGlmICh1c2VyQ291cnNlICYmICF1c2VyQ291cnNlLmNvdXJzZV90eXBlKSB7XG4gICAgICAgICAgICB1c2VyQ291cnNlLmNvdXJzZV90eXBlID0gJ1VzZXIgQWRkZWQnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCBpZGVudGlmaWVyIGlmIG1pc3NpbmcgKG5lZWRlZCBmb3IgY291cnNlIHNlbGVjdGlvbiBsb2dpYylcbiAgICAgICAgICBpZiAodXNlckNvdXJzZSAmJiAhdXNlckNvdXJzZS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICB1c2VyQ291cnNlLmlkZW50aWZpZXIgPSB1c2VyQ291cnNlLmlkIHx8IGB1c2VyX2NvdXJzZV8ke2l9XyR7RGF0ZS5ub3coKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgdG8gaW5jbHVkZSBhbGwgY291cnNlIHR5cGVzXG4gICAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkQ291cnNlcygpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdmaWx0ZXJkQ291cnNlcyBhZnRlciBhZGRpbmcgdXNlciBjb3Vyc2VzOicsIHRoaXMuZmlsdGVyZENvdXJzZXMpO1xuICAgICAgICAvL3RoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcilcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy8gSGFuZGxlIDQwOSBDb25mbGljdCBoZXJlXG4gICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgIC8vdGhpcy5nZXRcbiAgICAgICAgLy8gT3IgeW91IGNhbiBzZXQgYSBVSSBlcnJvciBtZXNzYWdlIHZhcmlhYmxlXG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfVxuXG5cbiAgICB9KVxuICB9XG5cbiAgY2hlY2tJZkNvdXJzZUV4aXN0cyhpdGVtKSB7XG4gICAgbGV0IGZsYWcgPSBmYWxzZVxuICAgIGlmICh0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMuaW5kZXhPZihpdGVtPy5pZGVudGlmaWVyKSA+IC0xKSB7XG4gICAgICBmbGFnID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmxhZ1xuICB9XG5cbiAgc2VsZWN0QWxsQ291cnNlcyhldmVudCkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVyZENvdXJzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzLnB1c2godGhpcy5maWx0ZXJkQ291cnNlc1tpXS5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMgPSBbXVxuXG4gICAgfVxuICAgIGlmICh0aGlzLmNicF9wbGFuX2lkKSB7XG4gICAgICB0aGlzLm1vZGUgPSAndXBkYXRlJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGUgPSAnYWRkJ1xuICAgIH1cblxuXG4gIH1cbiAgZ2V0U2VjdG9ycyhzZWN0b3IpIHtcbiAgICBpZiAoc2VjdG9yICYmIHNlY3Rvci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNlY3RvcikgPyBzZWN0b3Iuam9pbignLyAnKSA6ICcnXG4gICAgfVxuXG4gIH1cblxuICBmaWx0ZXJEYXRhKHNlYXJjaFRleHQ6IHN0cmluZyk6IGFueVtdIHtcbiAgICBjb25zdCBmaWx0ZXIgPSBzZWFyY2hUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLm9yaWdpbmFsRGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHRoaXMuZmxhdHRlbk9iamVjdFRvU3RyaW5nKGl0ZW0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnNvcnRDb3Vyc2VzQnlDYXRlZ29yeUFuZFJlbGV2YW5jeShmaWx0ZXJlZCk7XG4gIH1cblxuICBmbGF0dGVuT2JqZWN0VG9TdHJpbmcob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSAnJztcblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgJyArIHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgdmFsO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnICcgKyB0aGlzLmZsYXR0ZW5PYmplY3RUb1N0cmluZyh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgJyArIHRoaXMuZmxhdHRlbk9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3VnZ2VzdE1vcmVDb3Vyc2VzKCkge1xuICAgIC8vIHRoaXMuZGlhbG9nUmVmLmNsb3NlKClcbiAgICBjb25zdCBkaWFsb2dSZWZOZXcgPSB0aGlzLmRpYWxvZy5vcGVuKFN1Z2dlc3RNb3JlQ291cnNlc0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMTAwcHgnLFxuICAgICAgZGF0YTogeyByZWNvbW1lbmRlZF9jb3Vyc2VfaWQ6IHRoaXMucmVjb21tZW5kZWRfY291cnNlX2lkLCByb2xlX21hcHBpbmdfaWQ6IHRoaXMucGxhbkRhdGEuaWQgfSxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmTmV3LmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbihlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnR2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICAvLyB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQgPSBlbGVtZW50XG4gICAgY29uc29sZS5sb2coJ0VkaXQgUm9sZSBNYXBwaW5nIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICAvLyBOYXZpZ2F0ZSBvciBvcGVuIG1vZGFsXG4gICAgY29uc29sZS5sb2coJ1ZpZXcgQ0JQIFBsYW4gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oR2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlcih0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gcmVzXG4gICAgICAgICAgICAvLyB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcztcbiAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJyx0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlOiBzdHJpbmcsIGluZGV4KTogYW55W10ge1xuICAgIGNvbnN0IGNvdXJzZSA9IHRoaXMuZmlsdGVyZENvdXJzZXNbaW5kZXhdO1xuICAgIGlmICghY291cnNlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgTm8gY291cnNlIGZvdW5kIGF0IGluZGV4ICR7aW5kZXh9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgLy8gQUkgUmVjb21tZW5kZWQgJiBQdWJsaWMgY291cnNlcyB1c2UgJ2NvbXBldGVuY2llcydcbiAgICAvLyBNYW51YWxseSBTdWdnZXN0ZWQgLSBpR09UIGNvdXJzZXMgdXNlICdjb21wZXRlbmNpZXNfdjYnXG4gICAgLy8gVXNlciBBZGRlZCBjb3Vyc2VzIHVzZSAnY29tcGV0ZW5jaWVzJ1xuICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICBpZiAoY291cnNlLmNvbXBldGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXMpKSB7XG4gICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgLy8gIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIHVzaW5nICdjb21wZXRlbmNpZXMnIHByb3BlcnR5OmAsIGNvbXBldGVuY2llcyk7XG4gICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgQ291cnNlICR7aW5kZXh9ICgke2NvdXJzZS5jb3Vyc2VfdHlwZSB8fCBjb3Vyc2UubmFtZSB8fCAnVW5rbm93bid9KSB1c2luZyAnY29tcGV0ZW5jaWVzX3Y2JyBwcm9wZXJ0eTpgLCBjb21wZXRlbmNpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgQ291cnNlICR7aW5kZXh9ICgke2NvdXJzZS5jb3Vyc2VfdHlwZSB8fCBjb3Vyc2UubmFtZSB8fCAnVW5rbm93bid9KSBoYXMgbm8gdmFsaWQgY29tcGV0ZW5jaWVzIHByb3BlcnR5OmAsIHtcbiAgICAgIC8vICAgaGFzQ29tcGV0ZW5jaWVzOiAhIWNvdXJzZS5jb21wZXRlbmNpZXMsXG4gICAgICAvLyAgIGNvbXBldGVuY2llc1R5cGU6IHR5cGVvZiBjb3Vyc2UuY29tcGV0ZW5jaWVzLFxuICAgICAgLy8gICBoYXNDb21wZXRlbmNpZXNWNjogISFjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2LFxuICAgICAgLy8gICBjb21wZXRlbmNpZXNWNlR5cGU6IHR5cGVvZiBjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2LFxuICAgICAgLy8gICBjb3Vyc2VLZXlzOiBPYmplY3Qua2V5cyhjb3Vyc2UpXG4gICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29tcGV0ZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gIGNvbnNvbGUubG9nKGBObyBjb21wZXRlbmNpZXMgZm91bmQgZm9yIGNvdXJzZSAke2luZGV4fSBhbmQgdHlwZSAke3R5cGV9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIGZvciBjb21wYXJpc29uIChjYXNlLWluc2Vuc2l0aXZlICsgaGFuZGxlIHNwZWxsaW5nIHZhcmlhdGlvbnMpXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgY29uc3QgbWF0Y2hlZENvbXBldGVuY2llcyA9IGNvbXBldGVuY2llcy5maWx0ZXIoYyA9PiB7XG4gICAgICBpZiAoIWMgfHwgIWMuY29tcGV0ZW5jeUFyZWFOYW1lKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJbnZhbGlkIGNvbXBldGVuY3kgc3RydWN0dXJlIGluIGNvdXJzZSAke2luZGV4fTpgLCBjKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wZXRlbmN5QXJlYSA9IGMuY29tcGV0ZW5jeUFyZWFOYW1lLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAvLyBIYW5kbGUgYm90aCBcImJlaGF2aW9yYWxcIiBhbmQgXCJiZWhhdmlvdXJhbFwiIHNwZWxsaW5nc1xuICAgICAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSAnYmVoYXZpb3VyYWwnIHx8IG5vcm1hbGl6ZWRUeXBlID09PSAnYmVoYXZpb3JhbCcpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBldGVuY3lBcmVhID09PSAnYmVoYXZpb3JhbCcgfHwgY29tcGV0ZW5jeUFyZWEgPT09ICdiZWhhdmlvdXJhbCc7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBvdGhlciB0eXBlcywgZG8gY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uXG4gICAgICByZXR1cm4gY29tcGV0ZW5jeUFyZWEgPT09IG5vcm1hbGl6ZWRUeXBlO1xuICAgIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coYEZvdW5kICR7bWF0Y2hlZENvbXBldGVuY2llcy5sZW5ndGh9IGNvbXBldGVuY2llcyBvZiB0eXBlICR7dHlwZX0gZm9yIGNvdXJzZSAke2luZGV4fTpgLCBtYXRjaGVkQ29tcGV0ZW5jaWVzKTtcbiAgICByZXR1cm4gbWF0Y2hlZENvbXBldGVuY2llcztcbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5QmVodmlvdXJhbFR5cGUoaW5kZXgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdXJzZSA9IHRoaXMuZmlsdGVyZENvdXJzZXNbaW5kZXhdO1xuICAgIGlmICghY291cnNlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llcykpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXM7XG4gICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBldGVuY2llcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGV0ZW5jaWVzXG4gICAgICAuZmlsdGVyKGMgPT4gYyAmJiAoYy5jb21wZXRlbmN5QXJlYU5hbWUgPT09ICdCZWhhdmlvcmFsJyB8fCBjLmNvbXBldGVuY3lBcmVhTmFtZSA9PT0gJ0JlaGF2aW91cmFsJykpXG4gICAgICAubWFwKGMgPT4gYCR7Yy5jb21wZXRlbmN5VGhlbWVOYW1lIHx8ICcnfSAtICR7Yy5jb21wZXRlbmN5U3ViVGhlbWVOYW1lIHx8ICcnfWApXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxuXG4gIGdldERpc3BsYXllZENvbXBldGVuY2llcyh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgY29uc3QgY29tcGV0ZW5jaWVzID0gdGhpcy5nZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZSwgaW5kZXgpO1xuICAgIGNvbnN0IGtleSA9IGAke2luZGV4fS0ke3R5cGV9YDtcblxuICAgIGlmICh0aGlzLmV4cGFuZGVkQ29tcGV0ZW5jaWVzW2tleV0pIHtcbiAgICAgIHJldHVybiBjb21wZXRlbmNpZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBldGVuY2llcy5zbGljZSgwLCAyKTtcbiAgfVxuXG4gIHRvZ2dsZUNvbXBldGVuY2llcyh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG4gICAgdGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldID0gIXRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XTtcbiAgfVxuXG4gIGlzRXhwYW5kZWQodHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2V5ID0gYCR7aW5kZXh9LSR7dHlwZX1gO1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkQ29tcGV0ZW5jaWVzW2tleV0gfHwgZmFsc2U7XG4gIH1cblxuICBoYXNNb3JlVGhhblR3byh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZSwgaW5kZXgpLmxlbmd0aCA+IDI7XG4gIH1cblxuICBnZXRSZW1haW5pbmdDb3VudCh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsQ291bnQgPSB0aGlzLmdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlLCBpbmRleCkubGVuZ3RoO1xuICAgIHJldHVybiB0b3RhbENvdW50IC0gMjtcbiAgfVxuXG4gIG9uT3V0ZXJUYWJDaGFuZ2UoZXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vdXRlclRhYkFjdGl2ZUluZGV4ID0gZXZlbnQuaW5kZXhcbiAgICB0aGlzLm91dGVyVGFiQWN0aXZlVGV4dCA9IGV2ZW50LnRhYi50ZXh0TGFiZWxcbiAgICBjb25zb2xlLmxvZygnT3V0ZXIgVGFiIEluZGV4OicsIGV2ZW50LmluZGV4KTtcbiAgICBjb25zb2xlLmxvZygnT3V0ZXIgVGFiIExhYmVsOicsIGV2ZW50LnRhYi50ZXh0TGFiZWwpO1xuICAgIGlmIChldmVudC5pbmRleCA9PT0gMSkge1xuICAgICAgdGhpcy5nYXBBbmFseXNpc1N0YXRzKClcbiAgICB9XG4gICAgaWYgKGV2ZW50LmluZGV4ID09PSAwKSB7XG4gICAgICAvLyB0aGlzLmdldENvdXJzZXMoKVxuICAgICAgLy8gdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuICAgICAgdGhpcy5nZXRVc2VyQ291cnNlKClcbiAgICB9XG4gIH1cblxuICBvbklubmVyVGFiQ2hhbmdlKGV2ZW50OiBNYXRUYWJDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9IGV2ZW50LmluZGV4XG4gICAgdGhpcy5pbm5lclRhYkFjdGl2ZVRleHQgPSBldmVudC50YWIudGV4dExhYmVsXG4gICAgdGhpcy5zZWxlY3RlZFRoZW1lRmlsdGVyID0gJyc7IC8vIFJlc2V0IHRoZW1lIGZpbHRlciB3aGVuIHN3aXRjaGluZyB0YWJzXG4gICAgY29uc29sZS5sb2coJ0lubmVyIFRhYiBJbmRleDonLCBldmVudC5pbmRleCk7XG4gICAgY29uc29sZS5sb2coJ0lubmVyIFRhYiBMYWJlbDonLCBldmVudC50YWIudGV4dExhYmVsKTtcbiAgICBsZXQgdGFiSW5kZXggPSBldmVudC5pbmRleFxuICAgIHRoaXMuY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5ID0gW11cblxuICAgIC8vIEdldCBhbGwgYXZhaWxhYmxlIGNvdXJzZXMgKG9yaWdpbmFsICsgc3VnZ2VzdGVkICsgdXNlciBhZGRlZClcbiAgICBjb25zdCBhbGxBdmFpbGFibGVDb3Vyc2VzID0gdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCk7XG5cblxuXG4gICAgc3dpdGNoICh0YWJJbmRleCkge1xuICAgICAgY2FzZSAwOiAvLyBBbGxcbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IGFsbEF2YWlsYWJsZUNvdXJzZXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAvLyBCZWhhdmlvcmFsXG4gICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLnNvcnRDb3Vyc2VzQnlSZWxldmFuY3kodGhpcy5iZWhhdmlvcmFsRmlsdGVyKGFsbEF2YWlsYWJsZUNvdXJzZXMpKTtcbiAgICAgICAgdGhpcy5jb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnkgPSB0aGlzLmJlaGF2aW9yYWxDb21wZXRlbmN5RmlsdGVyKHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6IC8vIEZ1bmN0aW9uYWxcbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeVJlbGV2YW5jeSh0aGlzLmZ1bmN0aW9uYWxGaWx0ZXIoYWxsQXZhaWxhYmxlQ291cnNlcykpO1xuICAgICAgICB0aGlzLmNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeSA9IHRoaXMuZnVuY3Rpb25hbENvbXBldGVuY3lGaWx0ZXIodGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzogLy8gRG9tYWluXG4gICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLnNvcnRDb3Vyc2VzQnlSZWxldmFuY3kodGhpcy5kb21haW5GaWx0ZXIoYWxsQXZhaWxhYmxlQ291cnNlcykpO1xuICAgICAgICB0aGlzLmNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeSA9IHRoaXMuZG9tYWluQ29tcGV0ZW5jeUZpbHRlcih0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5maWx0ZXJkQ291cnNlcycsIHRoaXMuZmlsdGVyZENvdXJzZXMpXG4gICAgY29uc29sZS5sb2coJ3RoaXMuY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5JywgdGhpcy5jb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnkpXG4gIH1cblxuICBnZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCkge1xuICAgIC8vIFN0YXJ0IHdpdGggb3JpZ2luYWwgZGF0YSAoQUkgcmVjb21tZW5kZWQgY291cnNlcylcbiAgICBjb25zdCBhbGxDb3Vyc2VzID0gWy4uLnRoaXMub3JpZ2luYWxEYXRhXTtcbiAgICBjb25zdCBzZWVuSWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBUcmFjayBvcmlnaW5hbCBjb3Vyc2UgaWRlbnRpZmllcnNcbiAgICB0aGlzLm9yaWdpbmFsRGF0YS5mb3JFYWNoKGNvdXJzZSA9PiB7XG4gICAgICBpZiAoY291cnNlLmlkZW50aWZpZXIpIHNlZW5JZGVudGlmaWVycy5hZGQoY291cnNlLmlkZW50aWZpZXIpO1xuICAgICAgaWYgKGNvdXJzZS5pZCkgc2VlbklkZW50aWZpZXJzLmFkZChjb3Vyc2UuaWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIHN1Z2dlc3RlZCBjb3Vyc2VzIChpR09UIHBsYXRmb3JtIGNvdXJzZXMpXG4gICAgdGhpcy5zdWdnZXN0ZWRDb3Vyc2VzLmZvckVhY2goY291cnNlID0+IHtcbiAgICAgIGNvbnN0IGNvdXJzZUlkID0gY291cnNlLmlkZW50aWZpZXIgfHwgY291cnNlLmlkO1xuICAgICAgaWYgKGNvdXJzZUlkICYmICFzZWVuSWRlbnRpZmllcnMuaGFzKGNvdXJzZUlkKSkge1xuICAgICAgICBhbGxDb3Vyc2VzLnB1c2goY291cnNlKTtcbiAgICAgICAgc2VlbklkZW50aWZpZXJzLmFkZChjb3Vyc2VJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdXNlci1hZGRlZCBjb3Vyc2VzXG4gICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzLmZvckVhY2goY291cnNlID0+IHtcbiAgICAgIGNvbnN0IGNvdXJzZUlkID0gY291cnNlLmlkZW50aWZpZXIgfHwgY291cnNlLmlkO1xuICAgICAgaWYgKGNvdXJzZUlkICYmICFzZWVuSWRlbnRpZmllcnMuaGFzKGNvdXJzZUlkKSkge1xuICAgICAgICAvLyBFbnN1cmUgdXNlci1hZGRlZCBjb3Vyc2VzIGhhdmUgcHJvcGVyIHN0cnVjdHVyZVxuICAgICAgICBpZiAoIWNvdXJzZS5jb3Vyc2VfdHlwZSkge1xuICAgICAgICAgIGNvdXJzZS5jb3Vyc2VfdHlwZSA9ICdVc2VyIEFkZGVkJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvdXJzZS5pZGVudGlmaWVyICYmIGNvdXJzZS5pZCkge1xuICAgICAgICAgIGNvdXJzZS5pZGVudGlmaWVyID0gY291cnNlLmlkO1xuICAgICAgICB9XG4gICAgICAgIGFsbENvdXJzZXMucHVzaChjb3Vyc2UpO1xuICAgICAgICBzZWVuSWRlbnRpZmllcnMuYWRkKGNvdXJzZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCdnZXRBbGxBdmFpbGFibGVDb3Vyc2VzIGJyZWFrZG93bjonLCB7XG4gICAgICBvcmlnaW5hbERhdGE6IHRoaXMub3JpZ2luYWxEYXRhLmxlbmd0aCxcbiAgICAgIHN1Z2dlc3RlZENvdXJzZXM6IHRoaXMuc3VnZ2VzdGVkQ291cnNlcy5sZW5ndGgsXG4gICAgICB1c2VyQWRkZWRDb3Vyc2VzOiB0aGlzLnVzZXJBZGRlZENvdXJzZXMubGVuZ3RoLFxuICAgICAgdG90YWxBdmFpbGFibGU6IGFsbENvdXJzZXMubGVuZ3RoXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnYWxsQ291cnNlcy0tJywgYWxsQ291cnNlcylcbiAgICBhbGxDb3Vyc2VzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtICYmIGl0ZW0ub3JnYW5pc2F0aW9uICYmIGl0ZW0ub3JnYW5pc2F0aW9uLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJlZFByb3ZpZGVycy5pbmRleE9mKGl0ZW0ub3JnYW5pc2F0aW9uWzBdKSA8IDApIHtcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkUHJvdmlkZXJzLnB1c2goaXRlbS5vcmdhbmlzYXRpb25bMF0pXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pXG4gICAgY29uc3Qgc29ydGVkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeUNhdGVnb3J5QW5kUmVsZXZhbmN5KGFsbENvdXJzZXMpXG4gICAgdGhpcy5mdWxsQ291cnNlTGlzdCA9IHNvcnRlZENvdXJzZXNcbiAgICBsZXQgaWRlbnRpZmllcnNBcnIgPSBbXVxuICAgIHNvcnRlZENvdXJzZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZGVudGlmaWVyc0Fyci5wdXNoKGl0ZW0/LmlkZW50aWZpZXIpXG4gICAgfSlcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0QWRkaXRpb25hbFBhcmFtZXRlcmZvclN1Z2dlc3RlZENvdXJzZXMoaWRlbnRpZmllcnNBcnIpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQgJiYgcmVzcG9uc2UucmVzdWx0LmNvbnRlbnQgJiYgcmVzcG9uc2UucmVzdWx0LmNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2UucmVzdWx0LmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZnVsbENvdXJzZUxpc3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZ1bGxDb3Vyc2VMaXN0W2pdWydpZGVudGlmaWVyJ10gPT09IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50W2ldWydpZGVudGlmaWVyJ10pIHtcbiAgICAgICAgICAgICAgdGhpcy5mdWxsQ291cnNlTGlzdFtqXVsnbGFuZ3VhZ2UnXSA9IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50W2ldWydsYW5ndWFnZSddXG4gICAgICAgICAgICAgIHRoaXMuZnVsbENvdXJzZUxpc3Rbal1bJ2F2Z1JhdGluZyddID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRbaV1bJ2F2Z1JhdGluZyddXG4gICAgICAgICAgICAgIHRoaXMuZnVsbENvdXJzZUxpc3Rbal1bJ2NvdXJzZSddID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRbaV1bJ25hbWUnXVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSlcbiAgICByZXR1cm4gc29ydGVkQ291cnNlcztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgYXJyYXkgd2l0aCBhbGwgYXZhaWxhYmxlIGNvdXJzZSB0eXBlc1xuICAgKiBUaGlzIGVuc3VyZXMgY29uc2lzdGVuY3kgYWNyb3NzIHRoZSBhcHBsaWNhdGlvblxuICAgKi9cbiAgcmVidWlsZEZpbHRlcmVkQ291cnNlcygpIHtcbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gdGhpcy5zb3J0Q291cnNlc0J5Q2F0ZWdvcnlBbmRSZWxldmFuY3kodGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCkpO1xuXG4gICAgY29uc29sZS5sb2coJ1JlYnVpbHQgZmlsdGVyZENvdXJzZXMgd2l0aCBhbGwgY291cnNlIHR5cGVzOicsIHtcbiAgICAgIHRvdGFsOiB0aGlzLmZpbHRlcmRDb3Vyc2VzLmxlbmd0aCxcbiAgICAgIGJyZWFrZG93bjoge1xuICAgICAgICBvcmlnaW5hbDogdGhpcy5vcmlnaW5hbERhdGEubGVuZ3RoLFxuICAgICAgICBzdWdnZXN0ZWQ6IHRoaXMuc3VnZ2VzdGVkQ291cnNlcy5sZW5ndGgsXG4gICAgICAgIHVzZXJBZGRlZDogdGhpcy51c2VyQWRkZWRDb3Vyc2VzLmxlbmd0aFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc29ydENvdXJzZXNCeVJlbGV2YW5jeShjb3Vyc2VzOiBhbnlbXSA9IFtdKTogYW55W10ge1xuICAgIHJldHVybiBbLi4uY291cnNlc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYVNjb3JlID0gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYT8ucmVsZXZhbmN5KVxuICAgICAgY29uc3QgYlNjb3JlID0gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYj8ucmVsZXZhbmN5KVxuICAgICAgcmV0dXJuIGJTY29yZSAtIGFTY29yZVxuICAgIH0pXG4gIH1cblxuICBzb3J0Q291cnNlc0J5Q2F0ZWdvcnlBbmRSZWxldmFuY3koY291cnNlczogYW55W10gPSBbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gWy4uLmNvdXJzZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGNhdGVnb3J5UHJpb3JpdHkgPSB7IGRvbWFpbjogMSwgZnVuY3Rpb25hbDogMiwgYmVoYXZpb3JhbDogMywgb3RoZXI6IDQgfTtcbiAgICAgIGNvbnN0IGFQcmlvcml0eSA9IGNhdGVnb3J5UHJpb3JpdHlbdGhpcy5nZXRDb3Vyc2VDYXRlZ29yeShhKV0gfHwgNDtcbiAgICAgIGNvbnN0IGJQcmlvcml0eSA9IGNhdGVnb3J5UHJpb3JpdHlbdGhpcy5nZXRDb3Vyc2VDYXRlZ29yeShiKV0gfHwgNDtcblxuICAgICAgaWYgKGFQcmlvcml0eSAhPT0gYlByaW9yaXR5KSB7XG4gICAgICAgIHJldHVybiBhUHJpb3JpdHkgLSBiUHJpb3JpdHk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVJlbGV2YW5jeShiPy5yZWxldmFuY3kpIC0gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYT8ucmVsZXZhbmN5KTtcbiAgICB9KVxuICB9XG5cbiAgZ2V0Q291cnNlQ2F0ZWdvcnkoY291cnNlOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBldGVuY2llcyA9IFtcbiAgICAgIC4uLihjb3Vyc2U/LmNvbXBldGVuY2llcyB8fCBbXSksXG4gICAgICAuLi4oY291cnNlPy5jb21wZXRlbmNpZXNfdjYgfHwgW10pXG4gICAgXTtcblxuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBuZXcgU2V0KFxuICAgICAgY29tcGV0ZW5jaWVzXG4gICAgICAgIC5tYXAoKGM6IGFueSkgPT4gdGhpcy5ub3JtYWxpemVDb21wZXRlbmN5KGM/LmNvbXBldGVuY3lBcmVhTmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGM6IHN0cmluZykgPT4gYylcbiAgICApO1xuXG4gICAgaWYgKGNhdGVnb3JpZXMuaGFzKCdkb21haW4nKSkgcmV0dXJuICdkb21haW4nO1xuICAgIGlmIChjYXRlZ29yaWVzLmhhcygnZnVuY3Rpb25hbCcpKSByZXR1cm4gJ2Z1bmN0aW9uYWwnO1xuICAgIGlmIChjYXRlZ29yaWVzLmhhcygnYmVoYXZpb3JhbCcpKSByZXR1cm4gJ2JlaGF2aW9yYWwnO1xuXG4gICAgcmV0dXJuICdvdGhlcic7XG4gIH1cblxuICBub3JtYWxpemVSZWxldmFuY3kodmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZS50cmltKCkpXG4gICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiAtSW5maW5pdHlcbiAgICB9XG5cbiAgICByZXR1cm4gLUluZmluaXR5XG4gIH1cblxuICBiZWhhdmlvcmFsRmlsdGVyKGRhdGE6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiBkYXRhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICAgIGlmIChpdGVtLmNvbXBldGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGl0ZW0uY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBpdGVtLmNvbXBldGVuY2llcztcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5jb21wZXRlbmNpZXNfdjYgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wZXRlbmNpZXMuc29tZShjID0+IGMgJiYgKChjPy5jb21wZXRlbmN5QXJlYU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdiZWhhdmlvcmFsJykgfHwgYz8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAnYmVoYXZpb3VyYWwnKSk7XG4gICAgfSk7XG4gIH1cblxuICBiZWhhdmlvcmFsQ29tcGV0ZW5jeUZpbHRlcihkYXRhOiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zb2xlLmxvZygnZGF0YS0tJywgZGF0YSlcbiAgICBjb25zdCBiZWhhdmlvcmFsVGhlbWVzID0gZGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGl0ZW0/LnR5cGUgJiZcbiAgICAgICAgWydiZWhhdmlvcmFsJywgJ2JlaGF2aW91cmFsJ10uaW5jbHVkZXMoaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkpXG4gICAgICApXG4gICAgICAubWFwKGl0ZW0gPT4gdGhpcy5mb3JtYXRUaGVtZVdpdGhTdWJUaGVtZShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKSlcbiAgICAgIC5maWx0ZXIoKHRoZW1lKTogdGhlbWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odGhlbWUpKTsgLy8gRW5zdXJlcyB0eXBlIHNhZmV0eVxuXG4gICAgY29uc3QgdW5pcXVlQmVoYXZpb3JhbFRoZW1lcyA9IEFycmF5LmZyb20obmV3IFNldChiZWhhdmlvcmFsVGhlbWVzKSk7XG5cbiAgICBjb25zb2xlLmxvZyh1bmlxdWVCZWhhdmlvcmFsVGhlbWVzKTtcbiAgICByZXR1cm4gdW5pcXVlQmVoYXZpb3JhbFRoZW1lcztcbiAgfVxuXG4gIGZ1bmN0aW9uYWxDb21wZXRlbmN5RmlsdGVyKGRhdGE6IGFueVtdKTogYW55IHtcbiAgICBjb25zdCBmdW5jdGlvbmFsVGhlbWVzID0gZGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGl0ZW0/LnR5cGUgJiZcbiAgICAgICAgWydmdW5jdGlvbmFsJ10uaW5jbHVkZXMoaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkpXG4gICAgICApXG4gICAgICAubWFwKGl0ZW0gPT4gdGhpcy5mb3JtYXRUaGVtZVdpdGhTdWJUaGVtZShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKSlcbiAgICAgIC5maWx0ZXIoKHRoZW1lKTogdGhlbWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odGhlbWUpKTsgLy8gRW5zdXJlcyB0eXBlIHNhZmV0eVxuXG4gICAgY29uc3QgdW5pcXVlRnVuY3Rpb25hbFRoZW1lcyA9IEFycmF5LmZyb20obmV3IFNldChmdW5jdGlvbmFsVGhlbWVzKSk7XG5cbiAgICBjb25zb2xlLmxvZyh1bmlxdWVGdW5jdGlvbmFsVGhlbWVzKTtcbiAgICByZXR1cm4gdW5pcXVlRnVuY3Rpb25hbFRoZW1lcztcblxuICAgIC8vIGNvbnNvbGUubG9nKHVuaXF1ZUNvbXBldGVuY3lBcmVhTmFtZXMpO1xuICB9XG5cbiAgZG9tYWluQ29tcGV0ZW5jeUZpbHRlcihkYXRhOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgZG9tYWluVGhlbWVzID0gZGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGl0ZW0/LnR5cGUgJiZcbiAgICAgICAgWydkb21haW4nXS5pbmNsdWRlcyhpdGVtLnR5cGUudG9Mb3dlckNhc2UoKSlcbiAgICAgIClcbiAgICAgIC5tYXAoaXRlbSA9PiB0aGlzLmZvcm1hdFRoZW1lV2l0aFN1YlRoZW1lKGl0ZW0/LnRoZW1lLCBpdGVtPy5zdWJfdGhlbWUpKVxuICAgICAgLmZpbHRlcigodGhlbWUpOiB0aGVtZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih0aGVtZSkpOyAvLyBFbnN1cmVzIHR5cGUgc2FmZXR5XG5cbiAgICBjb25zdCB1bmlxdWVEb21haW5UaGVtZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoZG9tYWluVGhlbWVzKSk7XG5cbiAgICBjb25zb2xlLmxvZyh1bmlxdWVEb21haW5UaGVtZXMpO1xuICAgIHJldHVybiB1bmlxdWVEb21haW5UaGVtZXM7XG5cbiAgICAvLyBjb25zb2xlLmxvZyh1bmlxdWVDb21wZXRlbmN5QXJlYU5hbWVzKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb25hbEZpbHRlcihkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoaXRlbS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llcykpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoaXRlbS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGl0ZW0uY29tcGV0ZW5jaWVzX3Y2O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzLnNvbWUoYyA9PiBjICYmIGM/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2Z1bmN0aW9uYWwnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRvbWFpbkZpbHRlcihkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoaXRlbS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llcykpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoaXRlbS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGl0ZW0uY29tcGV0ZW5jaWVzX3Y2O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzLnNvbWUoYyA9PiBjICYmIGM/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2RvbWFpbicpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2FwQW5hbHlzaXNTdGF0cygpIHtcbiAgICBjb25zb2xlLmxvZygndGhpcy5wbGFuRGF0YScsIHRoaXMucGxhbkRhdGEpXG5cbiAgICAvLyBBbHdheXMgdXNlIEFMTCBjb21wZXRlbmNpZXMgZm9yIGNhbGN1bGF0aW5nIG92ZXJhbGwgc3RhdHNcbiAgICBjb25zdCBhbGxDb21wZXRlbmNpZXMgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcztcblxuICAgIC8vIEZpbHRlciBmb3IgY2F0ZWdvcnktc3BlY2lmaWMgY2FsY3VsYXRpb25zXG4gICAgbGV0IGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXM6IGFueSA9IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdhbGwnKSB7XG4gICAgICBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS50eXBlPy50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCcpIHtcbiAgICAgIGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGU/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbicpIHtcbiAgICAgIGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGU/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSk7XG4gICAgfVxuXG4gICAgLy8gQ291bnQgQUxMIGNvbXBldGVuY2llcyBieSBjYXRlZ29yeSAobm90IGp1c3QgZmlsdGVyZWQgb25lcylcbiAgICBjb25zdCBtYXN0ZXJMaXN0QnlDYXRlZ29yeSA9IHsgdG90YWw6IGFsbENvbXBldGVuY2llcy5sZW5ndGgsIGJlaGF2aW91cmFsOiAwLCBmdW5jdGlvbmFsOiAwLCBkb21haW46IDAgfVxuXG4gICAgLy8gSU1QT1JUQU5UOiBVc2UgYWxsIGF2YWlsYWJsZSBjb3Vyc2VzIGZvciBjb25zaXN0ZW50IGNvdmVyYWdlIGNhbGN1bGF0aW9uXG4gICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggd2hhdCdzIGF2YWlsYWJsZSBpbiB0aGUgRmlsdGVyIEJ5IENvbXBldGVuY3kgc2VjdGlvblxuICAgIGNvbnN0IGFsbENvdXJzZUNvbXBldGVuY2llcyA9IFtdXG4gICAgY29uc3QgYWxsQXZhaWxhYmxlQ291cnNlc0ZvclN0YXRzID0gdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCk7XG5cbiAgICBhbGxBdmFpbGFibGVDb3Vyc2VzRm9yU3RhdHMuZm9yRWFjaChjb3Vyc2UgPT4ge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoY291cnNlICYmIGNvdXJzZS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgfSBlbHNlIGlmIChjb3Vyc2UgJiYgY291cnNlLmNvbXBldGVuY2llc192NiAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICB9XG5cbiAgICAgIGNvbXBldGVuY2llcy5mb3JFYWNoKChsaXN0OiBhbnkpID0+IHtcbiAgICAgICAgYWxsQ291cnNlQ29tcGV0ZW5jaWVzLnB1c2gobGlzdClcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coJ2FsbENvbXBldGVuY2llcycsIGFsbENvbXBldGVuY2llcylcbiAgICBjb25zb2xlLmxvZygnY2F0ZWdvcnlTcGVjaWZpY0NvbXBldGVuY2llcycsIGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMpXG4gICAgY29uc29sZS5sb2coJ2FsbENvdXJzZUNvbXBldGVuY2llcycsIGFsbENvdXJzZUNvbXBldGVuY2llcylcblxuICAgIC8vIENvdW50IGFsbCBjb21wZXRlbmNpZXMgYnkgdHlwZSBmb3IgcHJvcGVyIHRvdGFsc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsQ29tcGV0ZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wZXRlbmN5VHlwZSA9IGFsbENvbXBldGVuY2llc1tpXVsndHlwZSddPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc29sZS5sb2coYENvbXBldGVuY3kgJHtpfTogdHlwZT1cIiR7Y29tcGV0ZW5jeVR5cGV9XCIsIGRhdGE6YCwgYWxsQ29tcGV0ZW5jaWVzW2ldKTtcbiAgICAgIGlmIChjb21wZXRlbmN5VHlwZSA9PT0gJ2JlaGF2aW91cmFsJyB8fCBjb21wZXRlbmN5VHlwZSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICAgIG1hc3Rlckxpc3RCeUNhdGVnb3J5WydiZWhhdmlvdXJhbCddID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2JlaGF2aW91cmFsJ10gKyAxXG4gICAgICB9XG4gICAgICBpZiAoY29tcGV0ZW5jeVR5cGUgPT09ICdmdW5jdGlvbmFsJykge1xuICAgICAgICBtYXN0ZXJMaXN0QnlDYXRlZ29yeVsnZnVuY3Rpb25hbCddID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2Z1bmN0aW9uYWwnXSArIDFcbiAgICAgIH1cbiAgICAgIGlmIChjb21wZXRlbmN5VHlwZSA9PT0gJ2RvbWFpbicpIHtcbiAgICAgICAgbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2RvbWFpbiddID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2RvbWFpbiddICsgMVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygnbWFzdGVyTGlzdEJ5Q2F0ZWdvcnkgYWZ0ZXIgY291bnRpbmc6JywgbWFzdGVyTGlzdEJ5Q2F0ZWdvcnkpXG5cbiAgICAvLyBHZXQgbWF0Y2hpbmcgcmVzdWx0cyBmb3IgQUxMIGNvbXBldGVuY2llcyAoZm9yIG92ZXJhbGwgY292ZXJhZ2UpXG4gICAgY29uc3Qgb3ZlcmFsbFJlc3VsdCA9IHRoaXMuZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyhhbGxDb21wZXRlbmNpZXMsIGFsbENvdXJzZUNvbXBldGVuY2llcyk7XG5cbiAgICAvLyBHZXQgbWF0Y2hpbmcgcmVzdWx0cyBmb3IgY2F0ZWdvcnktc3BlY2lmaWMgY29tcGV0ZW5jaWVzIChmb3IgZmlsdGVyZWQgdmlldylcbiAgICBjb25zdCBjYXRlZ29yeVJlc3VsdCA9IHRoaXMuZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyhjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzLCBhbGxDb3Vyc2VDb21wZXRlbmNpZXMpO1xuXG4gICAgLy8gU2V0IGNvbXBldGVuY3lDb3ZlcmVkQ291bnQgYmFzZWQgb24gc2VsZWN0ZWQgY2F0ZWdvcnkgKGZvciB0aGUgZmlsdGVyZWQgbnVtYmVycylcbiAgICBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnYWxsJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gb3ZlcmFsbFJlc3VsdFsndG90YWwnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICB0aGlzLmNvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSBjYXRlZ29yeVJlc3VsdFsnYmVoYXZpb3JhbCddIHx8IDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdmdW5jdGlvbmFsJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gY2F0ZWdvcnlSZXN1bHRbJ2Z1bmN0aW9uYWwnXSB8fCAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnZG9tYWluJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gY2F0ZWdvcnlSZXN1bHRbJ2RvbWFpbiddIHx8IDA7XG4gICAgfVxuXG4gICAgLy8gSU1QT1JUQU5UOiBPdmVyYWxsIENvdmVyYWdlIHNob3VsZCBBTFdBWVMgYmUgYmFzZWQgb24gQUxMIGNvbXBldGVuY2llcywgbm90IGZpbHRlcmVkXG4gICAgbGV0IHRvdGFsQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMubGVuZ3RoOyAvLyBBbHdheXMgdXNlIHRvdGFsIGNvdW50XG4gICAgbGV0IG92ZXJhbGxDb3ZlcmVkQ291bnQgPSBvdmVyYWxsUmVzdWx0Wyd0b3RhbCddOyAvLyBBbHdheXMgdXNlIG92ZXJhbGwgcmVzdWx0c1xuICAgIGxldCBtYXRoUm91bmQgPSBNYXRoLnJvdW5kKChvdmVyYWxsQ292ZXJlZENvdW50IC8gdG90YWxDb21wZXRlbmNpZXMpICogMTAwKVxuICAgIHRoaXMub3ZlcmFsbENvdmVyYWdlID0gYCR7bWF0aFJvdW5kfSVgXG5cbiAgICBjb25zb2xlLmxvZygnT3ZlcmFsbCBDb3ZlcmFnZSBDYWxjdWxhdGlvbjonLCB7XG4gICAgICB0b3RhbENvbXBldGVuY2llczogdG90YWxDb21wZXRlbmNpZXMsXG4gICAgICBvdmVyYWxsQ292ZXJlZENvdW50OiBvdmVyYWxsQ292ZXJlZENvdW50LFxuICAgICAgb3ZlcmFsbENvdmVyYWdlOiB0aGlzLm92ZXJhbGxDb3ZlcmFnZSxcbiAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSxcbiAgICAgIGNvbXBldGVuY3lDb3ZlcmVkQ291bnQ6IHRoaXMuY29tcGV0ZW5jeUNvdmVyZWRDb3VudFxuICAgIH0pO1xuXG4gICAgLy8gQWx3YXlzIGNhbGN1bGF0ZSBhbGwgY2F0ZWdvcnktc3BlY2lmaWMgbWV0cmljcyByZWdhcmRsZXNzIG9mIHNlbGVjdGVkIGNhdGVnb3J5XG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGNhdGVnb3JpZXNcbiAgICAvLyBVc2Ugb3ZlcmFsbFJlc3VsdCBmb3IgY29uc2lzdGVudCBjYWxjdWxhdGlvbnMgYWNyb3NzIGFsbCBjYXRlZ29yaWVzXG4gICAgdGhpcy5iZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IG92ZXJhbGxSZXN1bHRbJ2JlaGF2aW9yYWwnXSB8fCAwO1xuICAgIHRoaXMuYmVoYXZpb3JhbFRvdGFsQ29tcGV0ZW5jaWVzID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2JlaGF2aW91cmFsJ107XG4gICAgbGV0IGJlaGF2aW9yYWxNYXRoUm91bmQgPSB0aGlzLmJlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llcyA+IDAgPyBNYXRoLnJvdW5kKCh0aGlzLmJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50IC8gdGhpcy5iZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMpICogMTAwKSA6IDA7XG4gICAgdGhpcy5iZWhhdmlvcmFsQ292ZXJhZ2UgPSBgJHtiZWhhdmlvcmFsTWF0aFJvdW5kfSVgO1xuXG4gICAgdGhpcy5mdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IG92ZXJhbGxSZXN1bHRbJ2Z1bmN0aW9uYWwnXSB8fCAwO1xuICAgIHRoaXMuZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2Z1bmN0aW9uYWwnXTtcbiAgICBsZXQgZnVuY3Rpb25hbE1hdGhSb3VuZCA9IHRoaXMuZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzID4gMCA/IE1hdGgucm91bmQoKHRoaXMuZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgLyB0aGlzLmZ1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llcykgKiAxMDApIDogMDtcbiAgICB0aGlzLmZ1bmN0aW9uYWxDb3ZlcmFnZSA9IGAke2Z1bmN0aW9uYWxNYXRoUm91bmR9JWA7XG5cbiAgICB0aGlzLmRvbWFpbkNvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSBvdmVyYWxsUmVzdWx0Wydkb21haW4nXSB8fCAwO1xuICAgIHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMgPSBtYXN0ZXJMaXN0QnlDYXRlZ29yeVsnZG9tYWluJ107XG4gICAgbGV0IGRvbWFpbk1hdGhSb3VuZCA9IHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMgPiAwID8gTWF0aC5yb3VuZCgodGhpcy5kb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50IC8gdGhpcy5kb21haW5Ub3RhbENvbXBldGVuY2llcykgKiAxMDApIDogMDtcbiAgICB0aGlzLmRvbWFpbkNvdmVyYWdlID0gYCR7ZG9tYWluTWF0aFJvdW5kfSVgO1xuXG4gICAgY29uc29sZS5sb2coJ0FsbCBjYXRlZ29yeSBtZXRyaWNzIGNhbGN1bGF0ZWQ6Jywge1xuICAgICAgYmVoYXZpb3JhbDogeyBjb3ZlcmVkOiB0aGlzLmJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50LCB0b3RhbDogdGhpcy5iZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLmJlaGF2aW9yYWxDb3ZlcmFnZSB9LFxuICAgICAgZnVuY3Rpb25hbDogeyBjb3ZlcmVkOiB0aGlzLmZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50LCB0b3RhbDogdGhpcy5mdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLmZ1bmN0aW9uYWxDb3ZlcmFnZSB9LFxuICAgICAgZG9tYWluOiB7IGNvdmVyZWQ6IHRoaXMuZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCwgdG90YWw6IHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLmRvbWFpbkNvdmVyYWdlIH0sXG4gICAgICBvdmVyYWxsOiB7IGNvdmVyZWQ6IG92ZXJhbGxDb3ZlcmVkQ291bnQsIHRvdGFsOiB0b3RhbENvbXBldGVuY2llcywgY292ZXJhZ2U6IHRoaXMub3ZlcmFsbENvdmVyYWdlIH0sXG4gICAgICBzZWxlY3RlZENhdGVnb3J5OiB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnksXG4gICAgICBjb21wZXRlbmN5Q292ZXJlZENvdW50Rm9yQ2F0ZWdvcnk6IHRoaXMuY29tcGV0ZW5jeUNvdmVyZWRDb3VudFxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCdPdmVyYWxsIFJlc3VsdDonLCBvdmVyYWxsUmVzdWx0KTtcbiAgICBjb25zb2xlLmxvZygnQ2F0ZWdvcnkgUmVzdWx0OicsIGNhdGVnb3J5UmVzdWx0KTtcbiAgICBjb25zb2xlLmxvZygndGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnknLCB0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeSlcbiAgICB0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZCA9IHRoaXMuZ2V0Q29tcGV0ZW5jeUJ5Q2F0ZWdvcnlOb3RNYXRjaGluZygnYmVoYXZpb3JhbCcpXG4gICAgdGhpcy5mdW5jdGlvbmFsTm90TWF0Y2hlZCA9IHRoaXMuZ2V0Q29tcGV0ZW5jeUJ5Q2F0ZWdvcnlOb3RNYXRjaGluZygnZnVuY3Rpb25hbCcpXG4gICAgdGhpcy5kb21haW5Ob3RNYXRjaGVkID0gdGhpcy5nZXRDb21wZXRlbmN5QnlDYXRlZ29yeU5vdE1hdGNoaW5nKCdkb21haW4nKVxuXG4gICAgdGhpcy5nZXRCZWhhdmlvdXJhbE1hdGNoZWQoKVxuICAgIHRoaXMuZ2V0RnVuY3Rpb25hbE1hdGNoZWQoKVxuICAgIHRoaXMuZ2V0RG9tYWluTWF0Y2hlZCgpXG4gIH1cblxuICBnZXRNYXRjaGVkQ29tcGV0ZW5jeVN0YXRzKHByaW1hcnlBcnJheTogYW55W10sIHNlY29uZGFyeUFycmF5OiBhbnlbXSkge1xuICAgIC8vIENvbnZlcnQgYm90aCBhcnJheXMgdG8gZW5zdXJlIGNvbnNpc3RlbnQgY2FzaW5nXG4gICAgY29uc3QgY291bnRzOiBhbnkgPSB7XG4gICAgICBiZWhhdmlvcmFsOiAwLFxuICAgICAgZnVuY3Rpb25hbDogMCxcbiAgICAgIGRvbWFpbjogMCxcbiAgICAgIHRvdGFsOiAwXG4gICAgfTtcblxuICAgIC8vIENsZWFyIHRoZSBjb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkgYXJyYXkgZm9yIGZyZXNoIGNhbGN1bGF0aW9uXG4gICAgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkgPSBbXTtcblxuICAgIC8vIFNldCB0byBrZWVwIHRyYWNrIG9mIHVuaXF1ZSBtYXRjaGVzXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG1hdGNoZWRDb21wZXRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgcHJpbWFyeSBvZiBwcmltYXJ5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHR5cGVLZXkgPSBwcmltYXJ5LnR5cGU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgY29uc3QgdGhlbWVLZXkgPSBwcmltYXJ5LnRoZW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHN1YlRoZW1lS2V5ID0gcHJpbWFyeS5zdWJfdGhlbWU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICBsZXQgaXNNYXRjaGVkID0gZmFsc2U7XG5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5IG9mIHNlY29uZGFyeUFycmF5KSB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBzZWNvbmRhcnkga2V5c1xuICAgICAgICBsZXQgc2VjVHlwZSA9IHNlY29uZGFyeT8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgbGV0IHNlY1RoZW1lID0gc2Vjb25kYXJ5Py5jb21wZXRlbmN5VGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgbGV0IHNlY1N1YlRoZW1lID0gc2Vjb25kYXJ5Py5jb21wZXRlbmN5U3ViVGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICAvLyBGaXggZm9yIGRhdGEgaW5jb25zaXN0ZW5jeVxuICAgICAgICBpZiAoc2VjVHlwZSA9PT0gJ2JlaGF2aW91cmFsJykgc2VjVHlwZSA9ICdiZWhhdmlvcmFsJztcblxuICAgICAgICAvLyBDcmVhdGUgdW5pcXVlIG1hdGNoIGtleSBmb3IgcHJpbWFyeSBjb21wZXRlbmN5XG4gICAgICAgIGNvbnN0IG1hdGNoS2V5ID0gYCR7dHlwZUtleX18JHt0aGVtZUtleX18JHtzdWJUaGVtZUtleX1gO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNyb3NzLW1hdGNoaW5nIGxvZ2ljIGFzIHJlcXVlc3RlZDpcbiAgICAgICAgLy8gMS4gUm9sZSBtYXBwaW5nIFRoZW1lIHZzIENvdXJzZSBUaGVtZVxuICAgICAgICAvLyAyLiBSb2xlIG1hcHBpbmcgU3ViIFRoZW1lIHZzIENvdXJzZSBTdWIgVGhlbWUgIFxuICAgICAgICAvLyAzLiBSb2xlIG1hcHBpbmcgVGhlbWUgdnMgQ291cnNlIFN1YiBUaGVtZVxuICAgICAgICAvLyA0LiBSb2xlIG1hcHBpbmcgU3ViIFRoZW1lIHZzIENvdXJzZSBUaGVtZVxuICAgICAgICBjb25zdCB0aGVtZVRvVGhlbWVNYXRjaCA9IHRoZW1lS2V5ID09PSBzZWNUaGVtZTtcbiAgICAgICAgY29uc3Qgc3ViVGhlbWVUb1N1YlRoZW1lTWF0Y2ggPSBzdWJUaGVtZUtleSA9PT0gc2VjU3ViVGhlbWU7XG4gICAgICAgIGNvbnN0IHRoZW1lVG9TdWJUaGVtZU1hdGNoID0gdGhlbWVLZXkgPT09IHNlY1N1YlRoZW1lO1xuICAgICAgICBjb25zdCBzdWJUaGVtZVRvVGhlbWVNYXRjaCA9IHN1YlRoZW1lS2V5ID09PSBzZWNUaGVtZTtcblxuICAgICAgICBsZXQgbWF0Y2hUeXBlID0gJyc7XG4gICAgICAgIGxldCBpc01hdGNoID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHR5cGVLZXkgPT09IHNlY1R5cGUgJiYgIXNlZW4uaGFzKG1hdGNoS2V5KSkge1xuICAgICAgICAgIGlmICh0aGVtZVRvVGhlbWVNYXRjaCkge1xuICAgICAgICAgICAgbWF0Y2hUeXBlID0gJ1RoZW1lLXRvLVRoZW1lJztcbiAgICAgICAgICAgIGlzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3ViVGhlbWVUb1N1YlRoZW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIG1hdGNoVHlwZSA9ICdTdWJUaGVtZS10by1TdWJUaGVtZSc7XG4gICAgICAgICAgICBpc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW1lVG9TdWJUaGVtZU1hdGNoKSB7XG4gICAgICAgICAgICBtYXRjaFR5cGUgPSAnVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgICAgaXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdWJUaGVtZVRvVGhlbWVNYXRjaCkge1xuICAgICAgICAgICAgbWF0Y2hUeXBlID0gJ1N1YlRoZW1lLXRvLVRoZW1lJztcbiAgICAgICAgICAgIGlzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYOKchSBNQVRDSCBGT1VORCBbJHttYXRjaFR5cGV9XTpgLCB7XG4gICAgICAgICAgICByb2xlTWFwcGluZzogeyB0eXBlOiB0eXBlS2V5LCB0aGVtZTogdGhlbWVLZXksIHN1YlRoZW1lOiBzdWJUaGVtZUtleSB9LFxuICAgICAgICAgICAgY291cnNlOiB7IHR5cGU6IHNlY1R5cGUsIHRoZW1lOiBzZWNUaGVtZSwgc3ViVGhlbWU6IHNlY1N1YlRoZW1lIH0sXG4gICAgICAgICAgICBtYXRjaFR5cGU6IG1hdGNoVHlwZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gU3RvcmUgbWF0Y2hlZCBjb21wZXRlbmN5IGluZm8gZm9yIGxhdGVyIHVzZVxuICAgICAgICAgIGxldCBvYmogPSB7fTtcbiAgICAgICAgICBvYmpbdHlwZUtleV0gPSBbdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KHRoZW1lS2V5LCBzdWJUaGVtZUtleSldO1xuICAgICAgICAgIHRoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5LnB1c2gob2JqKTtcbiAgICAgICAgICBzZWVuLmFkZChtYXRjaEtleSk7XG4gICAgICAgICAgbWF0Y2hlZENvbXBldGVuY2llcy5hZGQodGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KHRoZW1lS2V5LCBzdWJUaGVtZUtleSkpO1xuICAgICAgICAgIGlzTWF0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoY291bnRzLmhhc093blByb3BlcnR5KHR5cGVLZXkpKSB7XG4gICAgICAgICAgICBjb3VudHNbdHlwZUtleV0rKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY291bnRzW3R5cGVLZXldID0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb3VudHMudG90YWwrKztcbiAgICAgICAgICBicmVhazsgLy8gU3RvcCBsb29raW5nIGZvciBtYXRjaGVzIGZvciB0aGlzIHByaW1hcnkgY29tcGV0ZW5jeVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50cztcbiAgfVxuICBnZXRDb21wZXRlbmN5QnlDYXRlZ29yeU5vdE1hdGNoaW5nKGNhdGVnb3J5VHlwZSkge1xuICAgIC8vIEdldCBhbGwgY29tcGV0ZW5jaWVzIGZvciB0aGUgZ2l2ZW4gY2F0ZWdvcnkgZnJvbSByb2xlIG1hcHBpbmdcbiAgICBsZXQgYWxsQ2F0ZWdvcnlDb21wZXRlbmNpZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNbaV1bJ3R5cGUnXT8udG9Mb3dlckNhc2UoKSA9PT0gY2F0ZWdvcnlUeXBlPy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGFsbENhdGVnb3J5Q29tcGV0ZW5jaWVzLnB1c2goXG4gICAgICAgICAgdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KFxuICAgICAgICAgICAgdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNbaV1bJ3RoZW1lJ10sXG4gICAgICAgICAgICB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llc1tpXVsnc3ViX3RoZW1lJ11cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IG1hdGNoZWQgY29tcGV0ZW5jaWVzIGZvciB0aGlzIGNhdGVnb3J5IGZyb20gY291cnNlc1xuICAgIGxldCBtYXRjaGVkQ29tcGV0ZW5jaWVzID0gW107XG4gICAgY29uc29sZS5sb2coJ2NvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeScsIHRoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeVtpXVtjYXRlZ29yeVR5cGU/LnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdjb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnlbaV0nLCB0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeVtpXSlcbiAgICAgICAgLy8gRXh0cmFjdCBtYXRjaGVkIHRoZW1lcyBmcm9tIGNvdXJzZSBjb21wZXRlbmNpZXNcbiAgICAgICAgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnlbaV1bY2F0ZWdvcnlUeXBlPy50b0xvd2VyQ2FzZSgpXS5mb3JFYWNoKHRoZW1lID0+IHtcbiAgICAgICAgICBpZiAodGhlbWUpIHtcbiAgICAgICAgICAgIG1hdGNoZWRDb21wZXRlbmNpZXMucHVzaCh0aGVtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbmhhbmNlZCBtYXRjaGluZzogY2hlY2sgYm90aCB0aGVtZSBhbmQgc3VidGhlbWUgZnJvbSBjb3Vyc2VzIGFnYWluc3QgRlJBQyBjb21wZXRlbmNpZXNcbiAgICAvLyBJTVBPUlRBTlQ6IFVzZSBhbGwgYXZhaWxhYmxlIGNvdXJzZXMgZm9yIGNvbnNpc3RlbnQgY292ZXJhZ2UgY2FsY3VsYXRpb25cbiAgICBjb25zdCBhbGxDb3Vyc2VzRm9yTWF0Y2hpbmcgPSB0aGlzLmdldEFsbEF2YWlsYWJsZUNvdXJzZXMoKTtcblxuICAgIGFsbENvdXJzZXNGb3JNYXRjaGluZy5mb3JFYWNoKGNvdXJzZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICAgIGlmIChjb3Vyc2UgJiYgY291cnNlLmNvbXBldGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXMpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGNvdXJzZSAmJiBjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llc192NjtcbiAgICAgIH1cblxuICAgICAgY29tcGV0ZW5jaWVzLmZvckVhY2goKGNvbXA6IGFueSkgPT4ge1xuICAgICAgICBsZXQgc2VjVHlwZSA9IGNvbXA/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGlmIChzZWNUeXBlID09PSAnYmVoYXZpb3VyYWwnKSBzZWNUeXBlID0gJ2JlaGF2aW9yYWwnO1xuXG4gICAgICAgIGlmIChzZWNUeXBlID09PSBjYXRlZ29yeVR5cGU/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjb25zdCBjb3Vyc2VUaGVtZSA9IGNvbXAuY29tcGV0ZW5jeVRoZW1lTmFtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgY291cnNlU3ViVGhlbWUgPSBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYW55IEZSQUMgY29tcGV0ZW5jeSBtYXRjaGVzIHRoaXMgY291cnNlIGNvbXBldGVuY3lcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmcmFjQ29tcCA9IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzW2ldO1xuICAgICAgICAgICAgaWYgKGZyYWNDb21wWyd0eXBlJ10/LnRvTG93ZXJDYXNlKCkgPT09IGNhdGVnb3J5VHlwZT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICBjb25zdCBmcmFjVGhlbWUgPSBmcmFjQ29tcFsndGhlbWUnXT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGZyYWNTdWJUaGVtZSA9IGZyYWNDb21wWydzdWJfdGhlbWUnXT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgLy8gRW5oYW5jZWQgY3Jvc3MtbWF0Y2hpbmcgbG9naWMgKHNhbWUgYXMgaW4gZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyk6XG4gICAgICAgICAgICAgIC8vIDEuIENvdXJzZSBUaGVtZSB2cyBGUkFDIFRoZW1lXG4gICAgICAgICAgICAgIC8vIDIuIENvdXJzZSBTdWIgVGhlbWUgdnMgRlJBQyBTdWIgVGhlbWUgIFxuICAgICAgICAgICAgICAvLyAzLiBDb3Vyc2UgVGhlbWUgdnMgRlJBQyBTdWIgVGhlbWVcbiAgICAgICAgICAgICAgLy8gNC4gQ291cnNlIFN1YiBUaGVtZSB2cyBGUkFDIFRoZW1lXG4gICAgICAgICAgICAgIGNvbnN0IGNvdXJzZVRoZW1lVG9GcmFjVGhlbWUgPSBjb3Vyc2VUaGVtZSA9PT0gZnJhY1RoZW1lO1xuICAgICAgICAgICAgICBjb25zdCBjb3Vyc2VTdWJUaGVtZVRvRnJhY1N1YlRoZW1lID0gY291cnNlU3ViVGhlbWUgPT09IGZyYWNTdWJUaGVtZTtcbiAgICAgICAgICAgICAgY29uc3QgY291cnNlVGhlbWVUb0ZyYWNTdWJUaGVtZSA9IGNvdXJzZVRoZW1lID09PSBmcmFjU3ViVGhlbWU7XG4gICAgICAgICAgICAgIGNvbnN0IGNvdXJzZVN1YlRoZW1lVG9GcmFjVGhlbWUgPSBjb3Vyc2VTdWJUaGVtZSA9PT0gZnJhY1RoZW1lO1xuXG4gICAgICAgICAgICAgIGlmIChjb3Vyc2VUaGVtZVRvRnJhY1RoZW1lIHx8IGNvdXJzZVN1YlRoZW1lVG9GcmFjU3ViVGhlbWUgfHxcbiAgICAgICAgICAgICAgICBjb3Vyc2VUaGVtZVRvRnJhY1N1YlRoZW1lIHx8IGNvdXJzZVN1YlRoZW1lVG9GcmFjVGhlbWUpIHtcblxuICAgICAgICAgICAgICAgIGxldCBtYXRjaFR5cGUgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoY291cnNlVGhlbWVUb0ZyYWNUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVRoZW1lLXRvLUZSQUNUaGVtZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY291cnNlU3ViVGhlbWVUb0ZyYWNTdWJUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVN1YlRoZW1lLXRvLUZSQUNTdWJUaGVtZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY291cnNlVGhlbWVUb0ZyYWNTdWJUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVRoZW1lLXRvLUZSQUNTdWJUaGVtZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY291cnNlU3ViVGhlbWVUb0ZyYWNUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVN1YlRoZW1lLXRvLUZSQUNUaGVtZSc7XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhg4pyFIENPTVBFVEVOQ1kgTUFUQ0ggRk9VTkQgWyR7bWF0Y2hUeXBlfV0gZm9yICR7Y2F0ZWdvcnlUeXBlfTpgLCB7XG4gICAgICAgICAgICAgICAgICBjb3Vyc2U6IHsgdGhlbWU6IGNvdXJzZVRoZW1lLCBzdWJUaGVtZTogY291cnNlU3ViVGhlbWUgfSxcbiAgICAgICAgICAgICAgICAgIGZyYWM6IHsgdGhlbWU6IGZyYWNUaGVtZSwgc3ViVGhlbWU6IGZyYWNTdWJUaGVtZSB9LFxuICAgICAgICAgICAgICAgICAgbWF0Y2hUeXBlOiBtYXRjaFR5cGVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIG1hdGNoZWRDb21wZXRlbmNpZXMucHVzaCh0aGlzLmdldFRoZW1lU3ViVGhlbWVLZXkoZnJhY1RoZW1lLCBmcmFjU3ViVGhlbWUpKTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gRm91bmQgYSBtYXRjaCwgbW92ZSB0byBuZXh0IGNvdXJzZSBjb21wZXRlbmN5XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSBtYXRjaGVkIGNvbXBldGVuY2llc1xuICAgIG1hdGNoZWRDb21wZXRlbmNpZXMgPSBbLi4ubmV3IFNldChtYXRjaGVkQ29tcGV0ZW5jaWVzKV07XG5cbiAgICBjb25zb2xlLmxvZyhgXFxuPT09ICR7Y2F0ZWdvcnlUeXBlLnRvVXBwZXJDYXNlKCl9IENPTVBFVEVOQ1kgTUFUQ0hJTkcgPT09YCk7XG4gICAgY29uc29sZS5sb2coYCR7Y2F0ZWdvcnlUeXBlfSAtIEFsbCBGUkFDIGNvbXBldGVuY2llczpgLCBhbGxDYXRlZ29yeUNvbXBldGVuY2llcyk7XG4gICAgY29uc29sZS5sb2coYCR7Y2F0ZWdvcnlUeXBlfSAtIE1hdGNoZWQgZnJvbSBjb3Vyc2VzOmAsIG1hdGNoZWRDb21wZXRlbmNpZXMpO1xuICAgIGNvbnNvbGUubG9nKGAke2NhdGVnb3J5VHlwZX0gLSBNYXRjaCByYXRlOiAke21hdGNoZWRDb21wZXRlbmNpZXMubGVuZ3RofS8ke2FsbENhdGVnb3J5Q29tcGV0ZW5jaWVzLmxlbmd0aH0gKCR7TWF0aC5yb3VuZCgobWF0Y2hlZENvbXBldGVuY2llcy5sZW5ndGggLyBhbGxDYXRlZ29yeUNvbXBldGVuY2llcy5sZW5ndGgpICogMTAwKX0lKWApO1xuXG4gICAgLy8gUmV0dXJuIHVubWF0Y2hlZCBjb21wZXRlbmNpZXMgKHRob3NlIGluIHJvbGUgbWFwcGluZyBidXQgbm90IGNvdmVyZWQgYnkgY291cnNlcylcbiAgICByZXR1cm4gdGhpcy5jb21wYXJlU3RyaW5nQXJyYXlzKGFsbENhdGVnb3J5Q29tcGV0ZW5jaWVzLCBtYXRjaGVkQ29tcGV0ZW5jaWVzKTtcbiAgfVxuXG4gIGNvbXBhcmVTdHJpbmdBcnJheXMoYXJyMTogc3RyaW5nW10sIGFycjI6IHN0cmluZ1tdKSB7XG4gICAgY29uc29sZS5sb2coJ0FsbCBjb21wZXRlbmNpZXMgaW4gY2F0ZWdvcnk6JywgYXJyMSk7XG4gICAgY29uc29sZS5sb2coJ01hdGNoZWQgY29tcGV0ZW5jaWVzIGZyb20gY291cnNlczonLCBhcnIyKTtcblxuICAgIC8vIFJldHVybiBpdGVtcyBpbiBhcnIxIHRoYXQgYXJlIE5PVCBpbiBhcnIyICh1bm1hdGNoZWQgY29tcGV0ZW5jaWVzKVxuICAgIGNvbnN0IHVubWF0Y2hlZCA9IGFycjEuZmlsdGVyKGl0ZW0gPT4gIWFycjIuaW5jbHVkZXMoaXRlbSkpO1xuICAgIGNvbnNvbGUubG9nKCdVbm1hdGNoZWQgY29tcGV0ZW5jaWVzOicsIHVubWF0Y2hlZCk7XG5cbiAgICByZXR1cm4gdW5tYXRjaGVkO1xuICB9XG5cbiAgYWRkQ291cnNlKG1pc3NpbmdDb21wZXRlbmN5Pzogc3RyaW5nLCBjb21wZXRlbmN5VHlwZT86IHN0cmluZykge1xuICAgIGxldCBkaWFsb2dEYXRhID0geyAuLi50aGlzLnBsYW5EYXRhIH07XG5cbiAgICAvLyBJZiBjb21wZXRlbmN5IHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCBhZGQgdGhlbSB0byB0aGUgZGlhbG9nIGRhdGFcbiAgICBpZiAobWlzc2luZ0NvbXBldGVuY3kgJiYgY29tcGV0ZW5jeVR5cGUpIHtcbiAgICAgIGNvbnN0IHsgdGhlbWUsIHN1YlRoZW1lIH0gPSB0aGlzLnBhcnNlVGhlbWVBbmRTdWJUaGVtZShtaXNzaW5nQ29tcGV0ZW5jeSk7XG5cbiAgICAgIGRpYWxvZ0RhdGEucHJlZmlsbENvbXBldGVuY3kgPSB7XG4gICAgICAgIHR5cGU6IGNvbXBldGVuY3lUeXBlLFxuICAgICAgICB0aGVtZTogdGhlbWUsXG4gICAgICAgIHN1YlRoZW1lOiBzdWJUaGVtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFkZENvdXJzZUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDb3Vyc2UgYWRkZWQgc3VjY2Vzc2Z1bGx5ISBSZWZyZXNoaW5nIGRhdGEuLi4nKTtcblxuICAgICAgICAvLyBSZWZyZXNoIHVzZXIgY291cnNlcyB0byBpbmNsdWRlIHRoZSBuZXdseSBhZGRlZCBjb3Vyc2VcbiAgICAgICAgdGhpcy5nZXRVc2VyQ291cnNlKCk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCBnYXAgYW5hbHlzaXMgd2l0aCB0aGUgbGF0ZXN0IGRhdGFcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVHYXBBbmFseXNpc0FmdGVyQ291cnNlc1VwZGF0ZSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdHYXAgYW5hbHlzaXMgcmVmcmVzaGVkIGFmdGVyIGNvdXJzZSBhZGRpdGlvbicpO1xuICAgICAgICB9LCA1MDApOyAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgZGF0YSBpcyBsb2FkZWRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZpbHRlck9uQ29tcGV0ZW5jeVRoZW1lKHRoZW1lSXRlbSkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9IHRoZW1lSXRlbTtcbiAgICBjb25zdCB7IHRoZW1lLCBzdWJUaGVtZSB9ID0gdGhpcy5wYXJzZVRoZW1lQW5kU3ViVGhlbWUodGhlbWVJdGVtIHx8ICcnKTtcbiAgICBsZXQgdGhlbWVOYW1lID0gdGhlbWU7XG4gICAgbGV0IHN1YlRoZW1lTmFtZSA9IHN1YlRoZW1lO1xuXG4gICAgY29uc29sZS5sb2coJ0ZpbHRlcmluZyBieSB0aGVtZTonLCB0aGVtZU5hbWUsICdzdWJUaGVtZTonLCBzdWJUaGVtZU5hbWUsICdUYWIgaW5kZXg6JywgdGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4KTtcblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBjb21wZXRlbmN5IHR5cGUgYmFzZWQgb24gdGhlIGFjdGl2ZSB0YWJcbiAgICBsZXQgY29tcGV0ZW5jeVR5cGUgPSAnJztcbiAgICBpZiAodGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4ID09PSAxKSB7XG4gICAgICBjb21wZXRlbmN5VHlwZSA9ICdiZWhhdmlvcmFsJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMikge1xuICAgICAgY29tcGV0ZW5jeVR5cGUgPSAnZnVuY3Rpb25hbCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDMpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ2RvbWFpbic7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFsbCBhdmFpbGFibGUgY291cnNlcyB1c2luZyB0aGUgaGVscGVyIG1ldGhvZFxuICAgIGNvbnN0IGFsbEF2YWlsYWJsZUNvdXJzZXMgPSB0aGlzLmdldEFsbEF2YWlsYWJsZUNvdXJzZXMoKTtcbiAgICBjb25zb2xlLmxvZygnVG90YWwgY291cnNlcyB0byBmaWx0ZXIgZnJvbTonLCBhbGxBdmFpbGFibGVDb3Vyc2VzLmxlbmd0aCk7XG5cbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gYWxsQXZhaWxhYmxlQ291cnNlcy5maWx0ZXIoY291cnNlID0+IHtcbiAgICAgIGlmICghY291cnNlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgY29tcGV0ZW5jeSBwcm9wZXJ0eSBuYW1lc1xuICAgICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgICAgaWYgKGNvdXJzZS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llc192NjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbXBldGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gRmlsdGVyIGJ5IGNvbXBldGVuY3kgdHlwZSBhbmQgdGhlbWUvc3VidGhlbWVcbiAgICAgIHJldHVybiBjb21wZXRlbmNpZXMuc29tZShjb21wID0+IHtcbiAgICAgICAgaWYgKCFjb21wKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2hlY2sgY29tcGV0ZW5jeSB0eXBlIG1hdGNoZXMgY3VycmVudCB0YWJcbiAgICAgICAgbGV0IGNvbXBUeXBlID0gY29tcD8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY29tcFR5cGUgPT09ICdiZWhhdmlvdXJhbCcpIGNvbXBUeXBlID0gJ2JlaGF2aW9yYWwnOyAvLyBOb3JtYWxpemUgc3BlbGxpbmdcblxuICAgICAgICBpZiAoY29tcFR5cGUgIT09IGNvbXBldGVuY3lUeXBlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2hlY2sgY3Jvc3MtbWF0Y2hpbmcgbGlrZSBnYXAgYW5hbHlzaXM6IHRoZW1lIHZzIHN1YnRoZW1lIGFuZCBzdWJ0aGVtZSB2cyB0aGVtZVxuICAgICAgICBjb25zdCBjb21wVGhlbWUgPSBjb21wPy5jb21wZXRlbmN5VGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpPy50cmltKCk7XG4gICAgICAgIGNvbnN0IGNvbXBTdWJUaGVtZSA9IGNvbXA/LmNvbXBldGVuY3lTdWJUaGVtZU5hbWU/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGhlbWUgPSB0aGVtZU5hbWU/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFN1YlRoZW1lID0gc3ViVGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNyb3NzLW1hdGNoaW5nIGxvZ2ljIGxpa2UgZ2FwIGFuYWx5c2lzOlxuICAgICAgICAvLyAxLiBTZWxlY3RlZCBUaGVtZSB2cyBDb3Vyc2UgVGhlbWVcbiAgICAgICAgLy8gMi4gU2VsZWN0ZWQgU3ViIFRoZW1lIHZzIENvdXJzZSBTdWIgVGhlbWUgIFxuICAgICAgICAvLyAzLiBTZWxlY3RlZCBUaGVtZSB2cyBDb3Vyc2UgU3ViIFRoZW1lXG4gICAgICAgIC8vIDQuIFNlbGVjdGVkIFN1YiBUaGVtZSB2cyBDb3Vyc2UgVGhlbWVcbiAgICAgICAgY29uc3QgdGhlbWVUb1RoZW1lTWF0Y2ggPSBzZWFyY2hUaGVtZSAmJiBjb21wVGhlbWUgPT09IHNlYXJjaFRoZW1lO1xuICAgICAgICBjb25zdCBzdWJUaGVtZVRvU3ViVGhlbWVNYXRjaCA9IHNlYXJjaFN1YlRoZW1lICYmIGNvbXBTdWJUaGVtZSA9PT0gc2VhcmNoU3ViVGhlbWU7XG4gICAgICAgIGNvbnN0IHRoZW1lVG9TdWJUaGVtZU1hdGNoID0gc2VhcmNoVGhlbWUgJiYgY29tcFN1YlRoZW1lID09PSBzZWFyY2hUaGVtZTtcbiAgICAgICAgY29uc3Qgc3ViVGhlbWVUb1RoZW1lTWF0Y2ggPSBzZWFyY2hTdWJUaGVtZSAmJiBjb21wVGhlbWUgPT09IHNlYXJjaFN1YlRoZW1lO1xuXG4gICAgICAgIGNvbnN0IGlzTWF0Y2ggPSB0aGVtZVRvVGhlbWVNYXRjaCB8fCBzdWJUaGVtZVRvU3ViVGhlbWVNYXRjaCB8fCB0aGVtZVRvU3ViVGhlbWVNYXRjaCB8fCBzdWJUaGVtZVRvVGhlbWVNYXRjaDtcblxuICAgICAgICAvLyBMb2cgbWF0Y2hlcyBmb3IgZGVidWdnaW5nIChzaW1pbGFyIHRvIGdhcCBhbmFseXNpcylcbiAgICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgICBsZXQgbWF0Y2hUeXBlID0gJyc7XG4gICAgICAgICAgaWYgKHRoZW1lVG9UaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnVGhlbWUtdG8tVGhlbWUnO1xuICAgICAgICAgIGVsc2UgaWYgKHN1YlRoZW1lVG9TdWJUaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnU3ViVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgIGVsc2UgaWYgKHRoZW1lVG9TdWJUaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgIGVsc2UgaWYgKHN1YlRoZW1lVG9UaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnU3ViVGhlbWUtdG8tVGhlbWUnO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coYOKchSBGSUxURVIgTUFUQ0ggRk9VTkQgWyR7bWF0Y2hUeXBlfV06YCwge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHsgdGhlbWU6IHNlYXJjaFRoZW1lLCBzdWJUaGVtZTogc2VhcmNoU3ViVGhlbWUgfSxcbiAgICAgICAgICAgIGNvdXJzZTogeyB0eXBlOiBjb21wVHlwZSwgdGhlbWU6IGNvbXBUaGVtZSwgc3ViVGhlbWU6IGNvbXBTdWJUaGVtZSB9LFxuICAgICAgICAgICAgbWF0Y2hUeXBlOiBtYXRjaFR5cGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hdGNoIGlmIGFueSBvZiB0aGUgY3Jvc3MtbWF0Y2hpbmcgY29uZGl0aW9ucyBhcmUgbWV0XG4gICAgICAgIHJldHVybiBpc01hdGNoO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnRmlsdGVyZWQgY291cnNlcyBmb3IgdGhlbWU6JywgdGhlbWVOYW1lLCAnQ291bnQ6JywgdGhpcy5maWx0ZXJkQ291cnNlcy5sZW5ndGgpO1xuICAgIGNvbnNvbGUubG9nKCdGaWx0ZXJlZCBjb3Vyc2VzOicsIHRoaXMuZmlsdGVyZENvdXJzZXMubWFwKGMgPT4gYy5uYW1lIHx8IGMuY291cnNlKSk7XG4gIH1cblxuICBjbGVhclRoZW1lRmlsdGVyKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9ICcnO1xuICAgIC8vIFJlc2V0IHRvIGNhdGVnb3J5IGZpbHRlcmVkIGNvdXJzZXMgYnkgY2FsbGluZyB0aGUgdGFiIGNoYW5nZSBtZXRob2RcbiAgICB0aGlzLm9uSW5uZXJUYWJDaGFuZ2Uoe1xuICAgICAgaW5kZXg6IHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCxcbiAgICAgIHRhYjogeyB0ZXh0TGFiZWw6IHRoaXMuaW5uZXJUYWJBY3RpdmVUZXh0IH1cbiAgICB9IGFzIGFueSk7XG4gICAgY29uc29sZS5sb2coJ1RoZW1lIGZpbHRlciBjbGVhcmVkLCBzaG93aW5nIGFsbCBjb3Vyc2VzIGZvciBjYXRlZ29yeTonLCB0aGlzLmlubmVyVGFiQWN0aXZlVGV4dCk7XG4gIH1cblxuICBpc1RoZW1lU2VsZWN0ZWQodGhlbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIgPT09IHRoZW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjb3Vyc2UgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGhlbWUgZmlsdGVyIHdpdGggcHJlZmlsbGVkIGNvbXBldGVuY3kgZGF0YVxuICAgKi9cbiAgYWRkQ291cnNlRm9yU2VsZWN0ZWRUaGVtZSgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlcikge1xuICAgICAgY29uc29sZS53YXJuKCdObyB0aGVtZSBzZWxlY3RlZCBmb3IgYWRkaW5nIGNvdXJzZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGhlbWUsIHN1YlRoZW1lIH0gPSB0aGlzLnBhcnNlVGhlbWVBbmRTdWJUaGVtZSh0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IGNvbXBldGVuY3kgdHlwZSBiYXNlZCBvbiB0aGUgYWN0aXZlIHRhYlxuICAgIC8vIE1hcCB0aGUgdGFiIGxhYmVscyB0byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IEFkZENvdXJzZUNvbXBvbmVudFxuICAgIGxldCBjb21wZXRlbmN5VHlwZSA9ICcnO1xuICAgIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDEpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ0JlaGF2aW9yYWwnOyAvLyBUYWIgbGFiZWwgaXMgXCJiZWhhdmlvdXJhbFwiXG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDIpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ0Z1bmN0aW9uYWwnOyAvLyBUYWIgbGFiZWwgaXMgXCJmdW5jdGlvbmFsXCJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMykge1xuICAgICAgY29tcGV0ZW5jeVR5cGUgPSAnRG9tYWluJzsgLy8gVGFiIGxhYmVsIGlzIFwiZG9tYWluXCJcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnVGFiIG1hcHBpbmcgLSBpbm5lclRhYkFjdGl2ZUluZGV4OicsIHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCxcbiAgICAgICdpbm5lclRhYkFjdGl2ZVRleHQ6JywgdGhpcy5pbm5lclRhYkFjdGl2ZVRleHQsXG4gICAgICAnbWFwcGVkIGNvbXBldGVuY3lUeXBlOicsIGNvbXBldGVuY3lUeXBlKTtcblxuICAgIGNvbnNvbGUubG9nKCdBZGRpbmcgY291cnNlIGZvciBtaXNzaW5nIGNvbXBldGVuY3k6Jywge1xuICAgICAgY29tcGV0ZW5jeVR5cGUsXG4gICAgICB0aGVtZSxcbiAgICAgIHN1YlRoZW1lLFxuICAgICAgc2VsZWN0ZWRUaGVtZUZpbHRlcjogdGhpcy5zZWxlY3RlZFRoZW1lRmlsdGVyXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgZGlhbG9nIGRhdGEgd2l0aCBwcmVmaWxsZWQgY29tcGV0ZW5jeSBpbmZvcm1hdGlvblxuICAgIGxldCBkaWFsb2dEYXRhID0geyAuLi50aGlzLnBsYW5EYXRhIH07XG4gICAgZGlhbG9nRGF0YS5wcmVmaWxsQ29tcGV0ZW5jeSA9IHtcbiAgICAgIHR5cGU6IGNvbXBldGVuY3lUeXBlLFxuICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgc3ViVGhlbWU6IHN1YlRoZW1lIHx8ICcnIC8vIEluY2x1ZGUgc3ViLXRoZW1lIGlmIGF2YWlsYWJsZVxuICAgIH07XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFkZENvdXJzZUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnNDAwcHgnLFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ291cnNlIGFkZGVkIHN1Y2Nlc3NmdWxseSBmb3IgY29tcGV0ZW5jeSEgUmVmcmVzaGluZyBkYXRhLi4uJyk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCB1c2VyIGNvdXJzZXMgdG8gaW5jbHVkZSB0aGUgbmV3bHkgYWRkZWQgY291cnNlXG4gICAgICAgIHRoaXMuZ2V0VXNlckNvdXJzZSgpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBnYXAgYW5hbHlzaXMgYWZ0ZXIgY291cnNlIGFkZGl0aW9uXG4gICAgICAgIHRoaXMudXBkYXRlR2FwQW5hbHlzaXNBZnRlckNvdXJzZXNVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldER1cmF0aW9uKHRpbWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZFNlcnZpY2UuY29udmVydCh0aW1lKTtcbiAgfVxuXG5cbiAgZ2V0QmVoYXZpb3VyYWxNYXRjaGVkKCkge1xuICAgIHRoaXMuYmVoYXZpb3VyYWxNYXRjaGVkID0gW11cbiAgICBjb25zb2xlLmxvZygndGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMnLCB0aGlzLnBsYW5EYXRhKVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZCcsIHRoaXMuYmVoYXZpb3VyYWxOb3RNYXRjaGVkKVxuICAgIHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgY29tcGV0ZW5jeUtleSA9IHRoaXMuZ2V0VGhlbWVTdWJUaGVtZUtleShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKTtcbiAgICAgIGlmIChpdGVtICYmIGl0ZW0/LnR5cGUgPT09ICdCZWhhdmlvcmFsJyAmJiB0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZC5pbmRleE9mKGNvbXBldGVuY3lLZXkpIDwgMCkge1xuICAgICAgICB0aGlzLmJlaGF2aW91cmFsTWF0Y2hlZC5wdXNoKGl0ZW0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmJlaGF2aW91cmFsTWF0Y2hlZC0tJywgdGhpcy5iZWhhdmlvdXJhbE1hdGNoZWQpXG4gIH1cblxuICBnZXRGdW5jdGlvbmFsTWF0Y2hlZCgpIHtcbiAgICB0aGlzLmZ1bmN0aW9uYWxNYXRjaGVkID0gW11cbiAgICB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGNvbXBldGVuY3lLZXkgPSB0aGlzLmdldFRoZW1lU3ViVGhlbWVLZXkoaXRlbT8udGhlbWUsIGl0ZW0/LnN1Yl90aGVtZSk7XG4gICAgICBpZiAoaXRlbSAmJiBpdGVtPy50eXBlID09PSAnRnVuY3Rpb25hbCcgJiYgdGhpcy5mdW5jdGlvbmFsTm90TWF0Y2hlZC5pbmRleE9mKGNvbXBldGVuY3lLZXkpIDwgMCkge1xuICAgICAgICB0aGlzLmZ1bmN0aW9uYWxNYXRjaGVkLnB1c2goaXRlbSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uYWxNYXRjaGVkXG4gIH1cblxuICBnZXREb21haW5NYXRjaGVkKCkge1xuICAgIHRoaXMuZG9tYWluTWF0Y2hlZCA9IFtdXG4gICAgdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBjb21wZXRlbmN5S2V5ID0gdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KGl0ZW0/LnRoZW1lLCBpdGVtPy5zdWJfdGhlbWUpO1xuICAgICAgaWYgKGl0ZW0gJiYgaXRlbT8udHlwZSA9PT0gJ0RvbWFpbicgJiYgdGhpcy5kb21haW5Ob3RNYXRjaGVkLmluZGV4T2YoY29tcGV0ZW5jeUtleSkgPCAwKSB7XG4gICAgICAgIHRoaXMuZG9tYWluTWF0Y2hlZC5wdXNoKGl0ZW0pXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zb2xlLmxvZygndGhpcy5kb21haW5NYXRjaGVkLS0nLCB0aGlzLmRvbWFpbk1hdGNoZWQpXG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRoZW1lV2l0aFN1YlRoZW1lKHRoZW1lOiBhbnksIHN1YlRoZW1lOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUaGVtZSA9ICh0aGVtZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFN1YlRoZW1lID0gKHN1YlRoZW1lIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcblxuICAgIGlmIChub3JtYWxpemVkVGhlbWUgJiYgbm9ybWFsaXplZFN1YlRoZW1lKSB7XG4gICAgICByZXR1cm4gYCR7bm9ybWFsaXplZFRoZW1lfSAtICR7bm9ybWFsaXplZFN1YlRoZW1lfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUaGVtZSB8fCBub3JtYWxpemVkU3ViVGhlbWU7XG4gIH1cblxuICBwcml2YXRlIGdldFRoZW1lU3ViVGhlbWVLZXkodGhlbWU6IGFueSwgc3ViVGhlbWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0VGhlbWVXaXRoU3ViVGhlbWUodGhlbWUsIHN1YlRoZW1lKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUaGVtZUFuZFN1YlRoZW1lKHZhbHVlOiBzdHJpbmcpOiB7IHRoZW1lOiBzdHJpbmc7IHN1YlRoZW1lOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgdGV4dCA9ICh2YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICByZXR1cm4geyB0aGVtZTogJycsIHN1YlRoZW1lOiAnJyB9O1xuICAgIH1cblxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCcgLSAnKSkge1xuICAgICAgY29uc3QgcGFydHMgPSB0ZXh0LnNwbGl0KCcgLSAnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRoZW1lOiAocGFydHMuc2hpZnQoKSB8fCAnJykudHJpbSgpLFxuICAgICAgICBzdWJUaGVtZTogcGFydHMuam9pbignIC0gJykudHJpbSgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCctJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGV4dC5zcGxpdCgnLScpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRoZW1lOiBwYXJ0c1swXS50cmltKCksXG4gICAgICAgICAgc3ViVGhlbWU6IHBhcnRzWzFdLnRyaW0oKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHRoZW1lOiB0ZXh0LCBzdWJUaGVtZTogJycgfTtcbiAgfVxuXG4gIGRvd25sb2FkUERGKCkge1xuICAgIHRoaXMuaXNQREZEb3dubG9hZCA9IHRydWVcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGRmQ29udGVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gV2FpdCBmb3IgaW1hZ2VzIHRvIGxvYWRcbiAgICBjb25zdCBpbWFnZXMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xuICAgIGNvbnN0IHByb21pc2VzID0gQXJyYXkuZnJvbShpbWFnZXMpLm1hcCgoaW1nOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoaW1nLmNvbXBsZXRlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBpbWcub25sb2FkID0gcmVzb2x2ZSk7XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtYXJnaW46IDAuMjAsXG4gICAgICAgIGZpbGVuYW1lOiAnR2FwIEFuYWx5c2lzLnBkZicsXG4gICAgICAgIGltYWdlOiB7IHR5cGU6ICdqcGVnJywgcXVhbGl0eTogMC45OCB9LFxuICAgICAgICBodG1sMmNhbnZhczoge1xuICAgICAgICAgIHNjYWxlOiAyLFxuICAgICAgICAgIHVzZUNPUlM6IHRydWUsXG4gICAgICAgICAgc2Nyb2xsWTogMCxcbiAgICAgICAgfSxcbiAgICAgICAganNQREY6IHtcbiAgICAgICAgICB1bml0OiAnaW4nLFxuICAgICAgICAgIGZvcm1hdDogJ2E0JyxcbiAgICAgICAgICBvcmllbnRhdGlvbjogJ3BvcnRyYWl0J1xuICAgICAgICB9LFxuICAgICAgICBwYWdlYnJlYWs6IHtcbiAgICAgICAgICBtb2RlOiBbJ2NzcycsICdsZWdhY3knXSxcbiAgICAgICAgICBiZWZvcmU6ICcucGFnZS1icmVhaycsXG4gICAgICAgICAgYXZvaWQ6IFsnLm5vLWJyZWFrJ11cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaHRtbDJwZGYoKS5mcm9tKGVsZW1lbnQpLnNldChvcHRpb25zKS5zYXZlKClcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzUERGRG93bmxvYWQgPSBmYWxzZVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sIDMwMDApO1xuICAgIH0pO1xuICB9XG5cblxuICByZWRpcmVjdFRvVG9jKGl0ZW0pIHtcbiAgICBpZiAoaXRlbT8ucHVibGljX2xpbmspIHtcbiAgICAgIHdpbmRvdy5vcGVuKGl0ZW0/LnB1YmxpY19saW5rLCAnX2JsYW5rJylcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHVybCA9IGBodHRwczovL3BvcnRhbC5pZ290a2FybWF5b2dpLmdvdi5pbi9hcHAvdG9jLyR7aXRlbT8uaWRlbnRpZmllcn0vb3ZlcnZpZXc/YFxuICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJylcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGdhcCBhbmFseXNpcyBzdGF0cyBhZnRlciBpbml0aWFsIGRhdGEgbG9hZFxuICAgKi9cbiAgaW5pdGlhbGl6ZUdhcEFuYWx5c2lzU3RhdHMoKSB7XG4gICAgLy8gU2V0IGEgc21hbGwgdGltZW91dCB0byBlbnN1cmUgYWxsIGFzeW5jIG9wZXJhdGlvbnMgY29tcGxldGVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcmRDb3Vyc2VzICYmIHRoaXMuZmlsdGVyZENvdXJzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmdhcEFuYWx5c2lzU3RhdHMoKTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBnYXAgYW5hbHlzaXMgc3RhdHMgYWZ0ZXIgY291cnNlcyBhcmUgdXBkYXRlZCAobGlrZSBzdWdnZXN0ZWQgY291cnNlcyBhZGRlZClcbiAgICovXG4gIHVwZGF0ZUdhcEFuYWx5c2lzQWZ0ZXJDb3Vyc2VzVXBkYXRlKCkge1xuICAgIC8vIERvbid0IG1vZGlmeSBvcmlnaW5hbERhdGEgLSBpdCBzaG91bGQgcmVtYWluIGFzIEFJIHJlY29tbWVuZGVkIGNvdXJzZXMgb25seVxuICAgIC8vIFRoZSBnYXAgYW5hbHlzaXMgYWxyZWFkeSBwcm9wZXJseSBpbmNsdWRlcyBhbGwgY291cnNlIHR5cGVzXG5cbiAgICAvLyBSZWNhbGN1bGF0ZSBnYXAgYW5hbHlzaXMgc3RhdHNcbiAgICB0aGlzLmdhcEFuYWx5c2lzU3RhdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYXRlIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgYnkgZGVsZXRpbmcgZXhpc3RpbmcgcmVjb21tZW5kYXRpb25zIGFuZCBnZW5lcmF0aW5nIG5ldyBvbmVzXG4gICAqL1xuICBhc3luYyByZWdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25zKCkge1xuICAgIGlmICh0aGlzLmlzUmVnZW5lcmF0aW5nKSB7XG4gICAgICByZXR1cm47IC8vIFByZXZlbnQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlZ2VuZXJhdGlvbnNcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZyA9IHRydWU7XG5cbiAgICAgIC8vIFNob3cgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybWF0aW9uRGlhbG9nKCk7XG5cbiAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZygnU3RhcnRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uIHJlZ2VuZXJhdGlvbi4uLicpO1xuXG4gICAgICAvLyBTZXQgcmVnZW5lcmF0aW9uIHByb2dyZXNzIHN0YXRlXG4gICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlOyAvLyBIaWRlIG1haW4gY29udGVudCBkdXJpbmcgcmVnZW5lcmF0aW9uXG5cbiAgICAgIC8vIFN0ZXAgMTogRGVsZXRlIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnNcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKCk7XG5cbiAgICAgIC8vIFN0ZXAgMjogR2VuZXJhdGUgbmV3IGNvdXJzZSByZWNvbW1lbmRhdGlvbnNcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVOZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbnMoKTtcblxuICAgICAgLy8gU3RlcCAzOiBSZWZyZXNoIHRoZSBjdXJyZW50IGRhdGFcbiAgICAgIHRoaXMucmVmcmVzaENvbXBvbmVudCgpO1xuXG4gICAgICBjb25zb2xlLmxvZygnQ291cnNlIHJlY29tbWVuZGF0aW9uIHJlZ2VuZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgICAgIC8vIFNob3cgc3VjY2VzcyBtZXNzYWdlXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgcmVnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IScsICdDbG9zZScsIHtcbiAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgIHBhbmVsQ2xhc3M6IFsnc3VjY2Vzcy1zbmFja2JhciddXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uIHJlZ2VuZXJhdGlvbjonLCBlcnJvcik7XG5cbiAgICAgIC8vIFNob3cgZXJyb3IgbWVzc2FnZVxuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gcmVnZW5lcmF0ZSBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdDbG9zZScsIHtcbiAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgIHBhbmVsQ2xhc3M6IFsnZXJyb3Itc25hY2tiYXInXVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7IC8vIEVuc3VyZSBtYWluIGNvbnRlbnQgaXMgc2hvd24gYWZ0ZXIgcmVnZW5lcmF0aW9uXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgY29uZmlybWF0aW9uIGRpYWxvZyBmb3IgcmVnZW5lcmF0ZSBhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgc2hvd0NvbmZpcm1hdGlvbkRpYWxvZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFJlZ2VuZXJhdGVDb25maXJtYXRpb25EaWFsb2csIHtcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXG4gICAgICAgIHBhbmVsQ2xhc3M6ICdyZWdlbmVyYXRlLWNvbmZpcm1hdGlvbi1kaWFsb2cnLFxuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQgPT09IHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSBjdXJyZW50IHJvbGUgbWFwcGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVDb3Vyc2VSZWNvbW1lbmRhdGlvbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZU1hcElkID0gdGhpcy5wbGFuRGF0YT8uaWQ7XG5cbiAgICAgIGlmICghcm9sZU1hcElkKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1JvbGUgbWFwcGluZyBJRCBub3QgZm91bmQnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ0RlbGV0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZm9yIHJvbGUgbWFwcGluZzonLCByb2xlTWFwSWQpO1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKHJvbGVNYXBJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgZGVsZXRlZCBzdWNjZXNzZnVsbHk6JywgcmVzcG9uc2UpO1xuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVsZXRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uczonLCBlcnJvcik7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbmV3IGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZHVyaW5nIHJlZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU5ld0NvdXJzZVJlY29tbWVuZGF0aW9ucygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnNvbGUubG9nKCdHZW5lcmF0aW5nIG5ldyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVjb21tZW5kZWRDb3Vyc2VGb3JSZWdlbmVyYXRpb24odGhpcy5wbGFuRGF0YS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgY291cnNlIGdlbmVyYXRpb24gc3BlY2lmaWNhbGx5IGZvciByZWdlbmVyYXRpb24gd2l0aCBwcm9ncmVzc2l2ZSBsb2FkaW5nXG4gICAqL1xuICBwcml2YXRlIGdldFJlY29tbWVuZGVkQ291cnNlRm9yUmVnZW5lcmF0aW9uKHJvbGVfbWFwcGluZ19pZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gU3RhcnQgdGhlIHByb2dyZXNzaXZlIGxvYWRpbmcgc2ltdWxhdGlvbiBmb3IgcmVnZW5lcmF0aW9uXG4gICAgICB0aGlzLnN0YXJ0UmVnZW5lcmF0aXZlUHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG5cbiAgICAgIC8vIE1ha2UgdGhlIGFjdHVhbCBBUEkgY2FsbFxuICAgICAgLy8gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJlY29tbWVuZGVkQ291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgIC8vICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyAgICAgLy8gU3RvcCBwcm9ncmVzc2l2ZSBsb2FkaW5nIGFuZCBzaG93IGNvbXBsZXRpb25cbiAgICAgIC8vICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gZmFsc2U7IC8vIFRoaXMgd2lsbCBzdG9wIHRoZSBpbnRlcnZhbFxuICAgICAgLy8gICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgLy8gICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICdDb3Vyc2UgcmVjb21tZW5kYXRpb25zIHJlZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEnO1xuXG4gICAgICAvLyAgICAgLy8gQ2xlYXIgdGhlIGxvYWRpbmcgc3RhdGUgYWZ0ZXIgc2hvd2luZyBjb21wbGV0aW9uXG4gICAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgIC8vICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICAgIC8vICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgLy8gICAgIH0sIDIwMDApO1xuICAgICAgLy8gICB9LFxuICAgICAgLy8gICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAvLyAgICAgLy8gU3RvcCBwcm9ncmVzc2l2ZSBsb2FkaW5nXG4gICAgICAvLyAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgLy8gICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgLy8gICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcblxuICAgICAgLy8gICAgIC8vIEhhbmRsZSBzcGVjaWZpYyBlcnJvciBjYXNlc1xuICAgICAgLy8gICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwOSB8fCBlcnJvci5lcnJvcj8uZGV0YWlsPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSkge1xuICAgICAgLy8gICAgICAgLy8gQ291cnNlIHJlY29tbWVuZGF0aW9ucyBhbHJlYWR5IGV4aXN0IC0gdGhpcyBpcyBub3JtYWxcbiAgICAgIC8vICAgICAgIGNvbnNvbGUubG9nKCdDb3Vyc2UgcmVjb21tZW5kYXRpb25zIGFscmVhZHkgZXhpc3QsIGxvYWRpbmcgZXhpc3RpbmcgZGF0YS4uLicpO1xuXG4gICAgICAvLyAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGluZyBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcblxuICAgICAgLy8gICAgICAgLy8gVHJ5IHRvIGdldCBleGlzdGluZyBkYXRhXG4gICAgICAvLyAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgLy8gICAgICAgICBuZXh0OiAoZXhpc3RpbmdSZXNwb25zZSkgPT4ge1xuICAgICAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzZnVsbHkgbG9hZGVkIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMnKTtcbiAgICAgIC8vICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDEwMDtcbiAgICAgIC8vICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGVkIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgc3VjY2Vzc2Z1bGx5ISc7XG5cbiAgICAgIC8vICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgLy8gICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgLy8gICAgICAgICAgICAgcmVzb2x2ZShleGlzdGluZ1Jlc3BvbnNlKTtcbiAgICAgIC8vICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgIC8vICAgICAgICAgfSxcbiAgICAgIC8vICAgICAgICAgZXJyb3I6IChsb2FkRXJyb3IpID0+IHtcbiAgICAgIC8vICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zOicsIGxvYWRFcnJvcik7XG4gICAgICAvLyAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAvLyAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgLy8gICAgICAgICAgIHJlamVjdChsb2FkRXJyb3IpO1xuICAgICAgLy8gICAgICAgICB9XG4gICAgICAvLyAgICAgICB9KTtcbiAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiByZWdlbmVyYXRpb246JywgZXJyb3IpO1xuICAgICAgLy8gICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0pO1xuICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IHRydWU7XG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnR2VuZXJhdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcblxuICAgICAgaW50ZXJ2YWwoNTAwMClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5waXBlKFxuICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIGVycm9yIHRocm91Z2ggb2JzZXJ2YWJsZSBzbyBwb2xsaW5nIGxvZ2ljIGNhbiBpbnNwZWN0IGl0XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHsgZXJyb3IgfSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcblxuICAgICAgICAgIHRhcChyZXMgPT4gY29uc29sZS5sb2coXCJQb2xsaW5nIHJlc3VsdDpcIiwgcmVzKSksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiDirIfvuI8gU1RPUCBQT0xMSU5HIG9ubHkgd2hlbjpcbiAgICAgICAgICAgKiAtIFNVQ0NFU1Mg4oaSIHJlcy5zdGF0dXMgPT09IENPTVBMRVRFRFxuICAgICAgICAgICAqIC0gRVJST1Ig4oaSIGNvbmZsaWN0IC8gYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICAgKi9cbiAgICAgICAgICB0YWtlV2hpbGUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiBmYWxzZTsgICAgICAgLy8gU3RvcFxuICAgICAgICAgICAgaWYgKHJlcz8uZXJyb3I/LnN0YXR1cyA9PT0gNDA5KSByZXR1cm4gZmFsc2U7ICAgICAgICAvLyBTdG9wXG4gICAgICAgICAgICBpZiAocmVzPy5lcnJvcj8uZXJyb3I/LmRldGFpbD8uaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHJldHVybiBmYWxzZTsgLy8gU3RvcFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgcG9sbGluZ1xuICAgICAgICAgIH0sIHRydWUpIC8vIGluY2x1ZGUgZmluYWwgZW1pc3Npb25cbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgICogIFNVQ0NFU1MgQ0FTRSAoc3RhdHVzIENPTVBMRVRFRClcbiAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnQ09NUExFVEVEJykge1xuICAgICAgICAgICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnQ291cnNlIHJlY29tbWVuZGF0aW9ucyByZWdlbmVyYXRlZCBzdWNjZXNzZnVsbHkhJztcblxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICB9LCAyMDAwKTtcblxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgICogIEVSUk9SIENBU0UgKDQwOSAvIGFscmVhZHkgZXhpc3RzKVxuICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgaWYgKHJlcz8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSByZXMuZXJyb3I7XG5cbiAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDA5IHx8IGVycm9yPy5lcnJvcj8uZGV0YWlsPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0xvYWRpbmcgZXhpc3RpbmcgY291cnNlIHJlY29tbWVuZGF0aW9ucy4uLic7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgbmV4dDogKGV4aXN0aW5nRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDEwMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0xvYWRlZCBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zIHN1Y2Nlc3NmdWxseSEnO1xuXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGV4aXN0aW5nRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBsb2FkRXJyb3IgPT4gcmVqZWN0KGxvYWRFcnJvcilcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8qKiBBbnkgb3RoZXIgZXJyb3Ig4oaSIHN0b3AgJiByZWplY3QgKi9cbiAgICAgICAgICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgICAqICBTVElMTCBQUk9DRVNTSU5HIChrZWVwIHBvbGxpbmcpXG4gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSBNYXRoLm1pbih0aGlzLnByb2dyZXNzUGVyY2VudGFnZSArIDEwLCA5NSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnU3RpbGwgcHJvY2Vzc2luZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZXJyb3I6IGVyciA9PiByZWplY3QoZXJyKVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cblxuICAvLyBQcm9ncmVzc2l2ZSBsb2FkaW5nIG1ldGhvZHMgZm9yIHJlZ2VuZXJhdGlvblxuICBzdGFydFJlZ2VuZXJhdGl2ZVByb2dyZXNzaXZlTG9hZGluZygpIHtcbiAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSB0aGlzLnByb2Nlc3NpbmdTdGFnZXNbMF07XG4gICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgIHRoaXMuc3RhZ2VTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuc2ltdWxhdGVSZWdlbmVyYXRpdmVQcm9ncmVzc2l2ZVN0YWdlcygpO1xuICB9XG5cbiAgc2ltdWxhdGVSZWdlbmVyYXRpdmVQcm9ncmVzc2l2ZVN0YWdlcygpIHtcbiAgICBsZXQgY3VycmVudFN0YWdlSW5kZXggPSAwO1xuICAgIGNvbnN0IHRvdGFsRHVyYXRpb24gPSA2MDAwMDsgLy8gNjAgc2Vjb25kcyBlc3RpbWF0ZWQgZHVyYXRpb25cbiAgICBjb25zdCBzdGFnZUludGVydmFsID0gdG90YWxEdXJhdGlvbiAvIHRoaXMucHJvY2Vzc2luZ1N0YWdlcy5sZW5ndGg7XG5cbiAgICBjb25zdCBwcm9ncmVzc0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgLy8gU3RvcCBpZiByZWdlbmVyYXRpb24gaXMgY29tcGxldGVcbiAgICAgIGlmICghdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcykge1xuICAgICAgICBjbGVhckludGVydmFsKHByb2dyZXNzSW50ZXJ2YWwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gdGhpcy5zdGFnZVN0YXJ0VGltZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGFnZVByb2dyZXNzID0gKGVsYXBzZWQgJSBzdGFnZUludGVydmFsKSAvIHN0YWdlSW50ZXJ2YWw7XG4gICAgICBjb25zdCBzdGFnZUluZGV4ID0gTWF0aC5taW4oTWF0aC5mbG9vcihlbGFwc2VkIC8gc3RhZ2VJbnRlcnZhbCksIHRoaXMucHJvY2Vzc2luZ1N0YWdlcy5sZW5ndGggLSAxKTtcblxuICAgICAgLy8gVXBkYXRlIHN0YWdlIGlmIG5lZWRlZFxuICAgICAgaWYgKHN0YWdlSW5kZXggIT09IGN1cnJlbnRTdGFnZUluZGV4ICYmIHN0YWdlSW5kZXggPCB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnJlbnRTdGFnZUluZGV4ID0gc3RhZ2VJbmRleDtcbiAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzW3N0YWdlSW5kZXhdO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgb3ZlcmFsbCBwcm9ncmVzcyAoZWFjaCBzdGFnZSBpcyB3b3J0aCB+MTYuNjclKVxuICAgICAgY29uc3QgYmFzZVByb2dyZXNzID0gKHN0YWdlSW5kZXggLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIGNvbnN0IHN0YWdlUHJvZ3Jlc3MgPSAoY3VycmVudFN0YWdlUHJvZ3Jlc3MgLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gTWF0aC5taW4oTWF0aC5yb3VuZChiYXNlUHJvZ3Jlc3MgKyBzdGFnZVByb2dyZXNzKSwgOTUpO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIGNvbXBvbmVudCBkYXRhIGFmdGVyIHJlZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoQ29tcG9uZW50KCkge1xuICAgIGNvbnNvbGUubG9nKCdSZWZyZXNoaW5nIGNvbXBvbmVudCBkYXRhLi4uJyk7XG5cbiAgICAvLyBSZXNldCBhbGwgZmlsdGVycyBhbmQgc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9ICcnO1xuICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSBbXTtcbiAgICB0aGlzLm9yaWdpbmFsRmlsdGVyZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy5zdWdnZXN0ZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzID0gW107XG5cbiAgICAvLyBSZXNldCB0YWIgc3RhdGVzXG4gICAgdGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4ID0gMDtcbiAgICB0aGlzLm91dGVyVGFiQWN0aXZlSW5kZXggPSAwO1xuXG4gICAgLy8gQ2FsbCB0aGUgZGF0YSBsb2FkaW5nIG1ldGhvZHMgZGlyZWN0bHkgdG8gYXZvaWQgcmVzZXR0aW5nIGRhdGFMb2FkZWRcbiAgICB0aGlzLmxvYWRDb21wb25lbnREYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBjb21wb25lbnQgZGF0YSAoc2VwYXJhdGVkIGZyb20gbmdPbkluaXQgZm9yIHJldXNlKVxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkQ29tcG9uZW50RGF0YSgpIHtcbiAgICB0aGlzLmdldFJlY29tbWVuZGVkQ291cnNlV2l0aFByb2dyZXNzKHRoaXMucGxhbkRhdGEuaWQpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgIHRoaXMucmVjb21tZW5kZWRfY291cnNlX2lkID0gcmVzLmlkXG4gICAgICBsZXQgYWxsQ291cmVzID0gW11cbiAgICAgIGlmIChyZXMgJiYgcmVzLmZpbHRlcmVkX2NvdXJzZXMgJiYgcmVzLmZpbHRlcmVkX2NvdXJzZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlcz8uZmlsdGVyZWRfY291cnNlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0/LnJlbGV2YW5jeSA+PSA3NSkge1xuICAgICAgICAgICAgYWxsQ291cmVzLnB1c2goaXRlbSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gdGhpcy5zb3J0Q291cnNlc0J5UmVsZXZhbmN5KGFsbENvdXJlcylcbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeVJlbGV2YW5jeShhbGxDb3VyZXMpXG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmZpbHRlcmRDb3Vyc2VzJywgdGhpcy5maWx0ZXJkQ291cnNlcylcbiAgICAgIHRoaXMuZ2V0Q291cnNlcygpXG4gICAgICB0aGlzLmdldFN1Z2dlc3RlZENvdXJzZSgpXG5cbiAgICAgIC8vIEluaXRpYWxpemUgZ2FwIGFuYWx5c2lzIHN0YXRzIGFmdGVyIGNvdXJzZXMgYXJlIGxvYWRlZFxuICAgICAgdGhpcy5pbml0aWFsaXplR2FwQW5hbHlzaXNTdGF0cygpXG4gICAgICB0aGlzLmdldFVzZXJDb3Vyc2UoKVxuXG4gICAgICAvLyBNYXJrIGRhdGEgYXMgbG9hZGVkIGFmdGVyIGFsbCBpbml0aWFsIG9wZXJhdGlvbnNcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXR0aW5nIHJlY29tbWVuZGVkIGNvdXJzZXM6JywgZXJyb3IpO1xuICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdVbmF1dGhvcml6ZWQgYWNjZXNzIC0gdXNlciB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gbG9naW4nKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3Iuc3RhdHVzICE9PSA0MDkpIHtcbiAgICAgICAgLy8gRG9uJ3QgbG9nIGVycm9yIGZvciA0MDkgKGFscmVhZHkgZXhpc3RzKSBhcyBpdCdzIGhhbmRsZWQgaW4gdGhlIG1ldGhvZFxuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBjb3Vyc2UgcmVjb21tZW5kYXRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyBNYXJrIGRhdGEgYXMgbG9hZGVkIGV2ZW4gaWYgdGhlcmUncyBhbiBlcnJvciB0byBzaG93IHRoZSBkaWFsb2cgY29udGVudFxuICAgICAgdGhpcy5kYXRhTG9hZGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFByb2dyZXNzaXZlIGxvYWRpbmcgbWV0aG9kcyBmb3IgY291cnNlIGdlbmVyYXRpb25cbiAgc3RhcnRQcm9ncmVzc2l2ZUxvYWRpbmcoKSB7XG4gICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzWzBdO1xuICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICB0aGlzLnN0YWdlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLnNpbXVsYXRlUHJvZ3Jlc3NpdmVTdGFnZXMoKTtcbiAgfVxuXG4gIHNpbXVsYXRlUHJvZ3Jlc3NpdmVTdGFnZXMoKSB7XG4gICAgbGV0IGN1cnJlbnRTdGFnZUluZGV4ID0gMDtcbiAgICBjb25zdCB0b3RhbER1cmF0aW9uID0gNjAwMDA7IC8vIDYwIHNlY29uZHMgZXN0aW1hdGVkIGR1cmF0aW9uXG4gICAgY29uc3Qgc3RhZ2VJbnRlcnZhbCA9IHRvdGFsRHVyYXRpb24gLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoO1xuXG4gICAgY29uc3QgcHJvZ3Jlc3NJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gdGhpcy5zdGFnZVN0YXJ0VGltZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGFnZVByb2dyZXNzID0gKGVsYXBzZWQgJSBzdGFnZUludGVydmFsKSAvIHN0YWdlSW50ZXJ2YWw7XG4gICAgICBjb25zdCBzdGFnZUluZGV4ID0gTWF0aC5taW4oTWF0aC5mbG9vcihlbGFwc2VkIC8gc3RhZ2VJbnRlcnZhbCksIHRoaXMucHJvY2Vzc2luZ1N0YWdlcy5sZW5ndGggLSAxKTtcblxuICAgICAgLy8gVXBkYXRlIHN0YWdlIGlmIG5lZWRlZFxuICAgICAgaWYgKHN0YWdlSW5kZXggIT09IGN1cnJlbnRTdGFnZUluZGV4ICYmIHN0YWdlSW5kZXggPCB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnJlbnRTdGFnZUluZGV4ID0gc3RhZ2VJbmRleDtcbiAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzW3N0YWdlSW5kZXhdO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgb3ZlcmFsbCBwcm9ncmVzcyAoZWFjaCBzdGFnZSBpcyB3b3J0aCB+MTYuNjclKVxuICAgICAgY29uc3QgYmFzZVByb2dyZXNzID0gKHN0YWdlSW5kZXggLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIGNvbnN0IHN0YWdlUHJvZ3Jlc3MgPSAoY3VycmVudFN0YWdlUHJvZ3Jlc3MgLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gTWF0aC5taW4oTWF0aC5yb3VuZChiYXNlUHJvZ3Jlc3MgKyBzdGFnZVByb2dyZXNzKSwgOTUpO1xuXG4gICAgICAvLyBDbGVhciBpbnRlcnZhbCB3aGVuIGxvYWRpbmcgc3RvcHNcbiAgICAgIGlmICghdGhpcy5sb2FkaW5nKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NJbnRlcnZhbCk7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnQ291cnNlIHJlY29tbWVuZGF0aW9ucyBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICAvLyBFbmhhbmNlZCBjb3Vyc2UgZ2VuZXJhdGlvbiB3aXRoIHByb2dyZXNzaXZlIGxvYWRpbmdcbiAgZ2V0UmVjb21tZW5kZWRDb3Vyc2VXaXRoUHJvZ3Jlc3Mocm9sZV9tYXBwaW5nX2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnR2VuZXJhdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcbiAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMzA7XG5cbiAgICAgIHRoaXMuc3RhcnRQcm9ncmVzc2l2ZUxvYWRpbmcoKTtcblxuICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gbnVsbDtcblxuICAgICAgY29uY2F0KFxuICAgICAgICBvZihudWxsKSwgICAgICAgICAgLy8gaW1tZWRpYXRlIGNhbGxcbiAgICAgICAgaW50ZXJ2YWwoNTAwMCkgICAgIC8vIHBvbGwgZXZlcnkgNSBzZWNcbiAgICAgIClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKVxuICAgICAgICAgICksXG5cbiAgICAgICAgICB0YXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpcnN0QXBpUmVzcG9uc2UgJiYgIXRoaXMuZXhpc3RpbmdSZWNvbW1lbmRhdGlvbkZvdW5kKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzX2V4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGlzdGluZ1JlY29tbWVuZGF0aW9uRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICdGaXJzdCByZWNvbW1lbmRhdGlvbiByZXNwb25zZTonLFxuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgICB0YWtlV2hpbGUoKHJlc3BvbnNlOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgLy8gc3RvcCBwb2xsaW5nIGlmIGV4aXN0aW5nIHJlY29tbWVuZGF0aW9ucyBmb3VuZFxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RBcGlSZXNwb25zZT8uaXNfZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U/LnN0YXR1cyAhPT0gJ0NPTVBMRVRFRCc7XG5cbiAgICAgICAgICB9LCB0cnVlKSxcblxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh7XG5cbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAgIC8vIEVYSVNUSU5HIFJFQ09NTUVOREFUSU9OU1xuICAgICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdEFwaVJlc3BvbnNlPy5pc19leGlzdGluZyAmJiB0aGlzLmV4aXN0aW5nUmVjb21tZW5kYXRpb25Gb3VuZCkge1xuXG4gICAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oXG4gICAgICAgICAgICAgICAgRGVsZXRlUm9sZU1hcHBpbmdQb3B1cENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206ICdnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucycgICAgICAgICAgICAgICAgIC8vIGluZGV4IGZvciBVSSByZW1vdmFsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKHJvbGVfbWFwcGluZ19pZClcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG5cbiAgICAgICAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXN0aW5nUmVjb21tZW5kYXRpb25Gb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlY29tbWVuZGVkQ291cnNlV2l0aFByb2dyZXNzKHJvbGVfbWFwcGluZ19pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBkZWxldGUgcmVjb21tZW5kYXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmZpcnN0QXBpUmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAvLyBDT01QTEVURURcbiAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMgPT09ICdDT01QTEVURUQnKSB7XG5cbiAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAxMDA7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID1cbiAgICAgICAgICAgICAgICAnQ291cnNlIHJlY29tbWVuZGF0aW9ucyBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG5cbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgICAgICAgICB9LCAyMDAwKTtcblxuICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgICAgICAgJ1JlY29tbWVuZGF0aW9ucyByZWFkeSEnLFxuICAgICAgICAgICAgICAgICdYJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG5cbiAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBnZW5lcmF0ZSBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLicsXG4gICAgICAgICAgICAgICdYJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXNldEZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLnJlc2V0KHtcbiAgICAgIGNvbXBldGVuY3k6IFtdLFxuICAgICAgcmF0aW5nOiBbXSxcbiAgICAgIGxhbmd1YWdlOiBbXSxcbiAgICAgIGR1cmF0aW9uOiBbXSxcbiAgICAgIHByb3ZpZGVyOiBbXVxuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgZmlsdGVyZWQgZHJvcGRvd24gbGlzdHNcbiAgICB0aGlzLmZpbHRlcmVkQ29tcGV0ZW5jeSA9IFsuLi50aGlzLmNvbXBldGVuY2llc1R5cGVdO1xuICAgIHRoaXMuZmlsdGVyZWRSYXRpbmdzID0gWy4uLnRoaXMucmF0aW5nc107XG4gICAgdGhpcy5maWx0ZXJlZExhbmd1YWdlcyA9IFsuLi50aGlzLmxhbmd1YWdlc107XG4gICAgdGhpcy5maWx0ZXJlZER1cmF0aW9ucyA9IFsuLi50aGlzLmR1cmF0aW9uc107XG4gICAgdGhpcy5maWx0ZXJlZFByb3ZpZGVycyA9IFsuLi50aGlzLnByb3ZpZGVyc107XG5cbiAgICAvLyBSZXNldCBjb3Vyc2UgbGlzdFxuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSBbLi4udGhpcy5mdWxsQ291cnNlTGlzdF07XG4gICAgLy8gdGhpcy5mdWxsQ291cnNlTGlzdC5mb3JFYWNoKChpdGVtKT0+e1xuICAgIC8vICAgaWYoaXRlbSAmJiBpdGVtLm9yZ2FuaXNhdGlvbiAmJiBpdGVtLm9yZ2FuaXNhdGlvbi5sZW5ndGgpIHtcbiAgICAvLyAgICAgaWYodGhpcy5maWx0ZXJlZFByb3ZpZGVycy5pbmRleE9mKGl0ZW0ub3JnYW5pc2F0aW9uWzBdKSA8IDApIHtcbiAgICAvLyAgICAgICB0aGlzLmZpbHRlcmVkUHJvdmlkZXJzLnB1c2goaXRlbS5vcmdhbmlzYXRpb25bMF0pXG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgfVxuICAgIC8vIH0pXG4gICAgdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKClcbiAgfVxuXG4gIGZpbHRlckxpc3QodmFsdWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VhcmNoID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnY29tcGV0ZW5jeSc6XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb21wZXRlbmN5ID0gdGhpcy5jb21wZXRlbmNpZXNUeXBlLmZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyYXRpbmcnOlxuICAgICAgICB0aGlzLmZpbHRlcmVkUmF0aW5ncyA9IHRoaXMucmF0aW5ncy5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGFuZ3VhZ2UnOlxuICAgICAgICB0aGlzLmZpbHRlcmVkTGFuZ3VhZ2VzID0gdGhpcy5sYW5ndWFnZXMuZmlsdGVyKHYgPT4gdi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2R1cmF0aW9uJzpcbiAgICAgICAgdGhpcy5maWx0ZXJlZER1cmF0aW9ucyA9IHRoaXMuZHVyYXRpb25zLmZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwcm92aWRlcic6XG4gICAgICAgIHRoaXMuZmlsdGVyZWRQcm92aWRlcnMgPSB0aGlzLnByb3ZpZGVycy5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG5vcm1hbGl6ZUNvbXBldGVuY3kodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHYgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHYgPT09ICdhbGwnKSByZXR1cm4gJ2FsbCc7XG4gICAgaWYgKHYuaW5jbHVkZXMoJ2JlaGF2aW91cmFsJykgfHwgdi5pbmNsdWRlcygnYmVoYXZpb3JhbCcpKSByZXR1cm4gJ2JlaGF2aW9yYWwnO1xuICAgIGlmICh2LmluY2x1ZGVzKCdmdW5jdGlvbmFsJykpIHJldHVybiAnZnVuY3Rpb25hbCc7XG4gICAgaWYgKHYuaW5jbHVkZXMoJ2RvbWFpbicpKSByZXR1cm4gJ2RvbWFpbic7XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tcGV0ZW5jeSA9IFtdLFxuICAgICAgcmF0aW5nID0gW10sXG4gICAgICBsYW5ndWFnZSA9IFtdLFxuICAgICAgZHVyYXRpb24gPSBbXSxcbiAgICAgIHByb3ZpZGVyID0gW11cbiAgICB9ID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlO1xuXG4gICAgY29uc29sZS5sb2coJ3RoaXMuZnVsbENvdXJzZUxpc3QtLScsIHRoaXMuZnVsbENvdXJzZUxpc3QpXG5cbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gdGhpcy5mdWxsQ291cnNlTGlzdC5maWx0ZXIoY291cnNlID0+IHtcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBDb21wZXRlbmN5IC0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgIGNvbnN0IGNvdXJzZUNvbXBldGVuY2llcyA9IFtcbiAgICAgICAgLi4uKGNvdXJzZS5jb21wZXRlbmNpZXMgfHwgW10pLFxuICAgICAgICAuLi4oY291cnNlLmNvbXBldGVuY2llc192NiB8fCBbXSlcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkQ29tcGV0ZW5jaWVzID0gY29tcGV0ZW5jeVxuICAgICAgICAubWFwKChjOiBzdHJpbmcpID0+IHRoaXMubm9ybWFsaXplQ29tcGV0ZW5jeShjKSlcbiAgICAgICAgLmZpbHRlcihjID0+IGMgIT09ICcnKTtcblxuICAgICAgY29uc3QgY29tcGV0ZW5jeU1hdGNoID1cbiAgICAgICAgc2VsZWN0ZWRDb21wZXRlbmNpZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIHNlbGVjdGVkQ29tcGV0ZW5jaWVzLmluY2x1ZGVzKCdhbGwnKSB8fFxuICAgICAgICBjb3Vyc2VDb21wZXRlbmNpZXMuc29tZSgoYzogYW55KSA9PlxuICAgICAgICAgIHNlbGVjdGVkQ29tcGV0ZW5jaWVzLmluY2x1ZGVzKFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVDb21wZXRlbmN5KGMuY29tcGV0ZW5jeUFyZWFOYW1lKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBSYXRpbmcgLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgY29uc3QgcmF0aW5nTWF0Y2ggPVxuICAgICAgICByYXRpbmcubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIHRoaXMubWF0Y2hSYXRpbmcoY291cnNlLCByYXRpbmcpO1xuXG4gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIExhbmd1YWdlIC0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgIGNvbnN0IGxhbmd1YWdlTWF0Y2ggPVxuICAgICAgICBsYW5ndWFnZS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgbGFuZ3VhZ2Uuc29tZSgobDogc3RyaW5nKSA9PlxuICAgICAgICAgIGNvdXJzZS5sYW5ndWFnZSA9PT0gbCB8fFxuICAgICAgICAgIGNvdXJzZS5sYW5ndWFnZT8uaW5jbHVkZXM/LihsKSB8fFxuICAgICAgICAgIGNvdXJzZS5sYW5ndWFnZT8uWzBdPy5pbmNsdWRlcz8uKGwpXG4gICAgICAgICk7XG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gRHVyYXRpb24gLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgY29uc3QgZHVyYXRpb25NYXRjaCA9XG4gICAgICAgIGR1cmF0aW9uLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICB0aGlzLm1hdGNoRHVyYXRpb24oY291cnNlLmR1cmF0aW9uLCBkdXJhdGlvbik7XG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gUHJvdmlkZXIgLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgY29uc3QgcHJvdmlkZXJNYXRjaCA9XG4gICAgICAgIHByb3ZpZGVyLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBwcm92aWRlci5zb21lKChwOiBzdHJpbmcpID0+XG4gICAgICAgICAgY291cnNlLm9yZ2FuaXNhdGlvbj8uaW5jbHVkZXMocClcbiAgICAgICAgKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29tcGV0ZW5jeU1hdGNoICYmXG4gICAgICAgIHJhdGluZ01hdGNoICYmXG4gICAgICAgIGxhbmd1YWdlTWF0Y2ggJiZcbiAgICAgICAgZHVyYXRpb25NYXRjaCAmJlxuICAgICAgICBwcm92aWRlck1hdGNoXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeUNhdGVnb3J5QW5kUmVsZXZhbmN5KHRoaXMuZmlsdGVyZENvdXJzZXMpO1xuICB9XG5cbiAgbWF0Y2hSYXRpbmcoY291cnNlOiBhbnksIHNlbGVjdGVkUmF0aW5nczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoIXNlbGVjdGVkUmF0aW5ncyB8fCBzZWxlY3RlZFJhdGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gbm8gZmlsdGVyIHNlbGVjdGVkIOKGkiBtYXRjaCBldmVyeXRoaW5nXG4gICAgfVxuXG4gICAgbGV0IHJhdGluZyA9IG51bGw7XG5cbiAgICAvLyAx77iP4oOjIFVzZSBhdmdSYXRpbmcgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGNvdXJzZS5hdmdSYXRpbmcgIT0gbnVsbCAmJiAhaXNOYU4oY291cnNlLmF2Z1JhdGluZykpIHtcbiAgICAgIHJhdGluZyA9IE51bWJlcihjb3Vyc2UuYXZnUmF0aW5nKTtcbiAgICB9XG4gICAgLy8gMu+4j+KDoyBNYXAgcmVsZXZhbmN5IGlmIGF2Z1JhdGluZyBtaXNzaW5nXG4gICAgZWxzZSBpZiAoY291cnNlLnJlbGV2YW5jeSAhPSBudWxsICYmICFpc05hTihjb3Vyc2UucmVsZXZhbmN5KSkge1xuICAgICAgY29uc3QgcmVsID0gTnVtYmVyKGNvdXJzZS5yZWxldmFuY3kpO1xuICAgICAgaWYgKHJlbCA+PSA5MCkgcmF0aW5nID0gNC41O1xuICAgICAgZWxzZSBpZiAocmVsID49IDgwKSByYXRpbmcgPSA0LjA7XG4gICAgICBlbHNlIGlmIChyZWwgPj0gNzApIHJhdGluZyA9IDMuNTtcbiAgICAgIGVsc2UgaWYgKHJlbCA+PSA1MCkgcmF0aW5nID0gMi41O1xuICAgICAgZWxzZSByYXRpbmcgPSAxLjA7XG4gICAgfVxuXG4gICAgLy8gM++4j+KDoyBObyB1c2FibGUgcmF0aW5nIOKGkiBleGNsdWRlXG4gICAgaWYgKHJhdGluZyA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gNO+4j+KDoyBNYXRjaCBzZWxlY3RlZCByYXRpbmcgcmFuZ2VzXG4gICAgcmV0dXJuIHNlbGVjdGVkUmF0aW5ncy5zb21lKHIgPT4ge1xuICAgICAgc3dpdGNoIChyKSB7XG4gICAgICAgIGNhc2UgJzQuNSBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDQuNTtcbiAgICAgICAgY2FzZSAnNC4wIGFuZCBhYm92ZSc6IHJldHVybiByYXRpbmcgPj0gNC4wO1xuICAgICAgICBjYXNlICczLjUgYW5kIGFib3ZlJzogcmV0dXJuIHJhdGluZyA+PSAzLjU7XG4gICAgICAgIGNhc2UgJzIuNSBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDIuNTtcbiAgICAgICAgY2FzZSAnMSBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDEuMDtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBtYXRjaER1cmF0aW9uKGR1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXIgfCBzdHJpbmcsIHNlbGVjdGVkUmFuZ2VzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvdXJzID0gTnVtYmVyKGR1cmF0aW9uSW5TZWNvbmRzKSAvIDM2MDA7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRSYW5nZXMuc29tZShyYW5nZSA9PiB7XG4gICAgICBzd2l0Y2ggKHJhbmdlKSB7XG4gICAgICAgIGNhc2UgJzwgMSBIb3VyJzpcbiAgICAgICAgICByZXR1cm4gaG91cnMgPCAxO1xuICAgICAgICBjYXNlICcxLTUgSG91cnMnOlxuICAgICAgICAgIHJldHVybiBob3VycyA+PSAxICYmIGhvdXJzIDw9IDU7XG4gICAgICAgIGNhc2UgJzUrIEhvdXJzJzpcbiAgICAgICAgICByZXR1cm4gaG91cnMgPiA1O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8vIENvbmZpcm1hdGlvbiBEaWFsb2cgQ29tcG9uZW50XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyZWdlbmVyYXRlLWNvbmZpcm1hdGlvbi1kaWFsb2cnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJjb25maXJtYXRpb24tZGlhbG9nLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1oZWFkZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwid2FybmluZy1pY29uXCI+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPlJlZ2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uczwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cImRpYWxvZy1jb250ZW50XCI+XG4gICAgICAgIDxwIGNsYXNzPVwibWFpbi1tZXNzYWdlXCI+XG4gICAgICAgICAgVGhpcyB3aWxsIGRlbGV0ZSBhbGwgY3VycmVudCBjb3Vyc2UgcmVjb21tZW5kYXRpb25zIGFuZCBnZW5lcmF0ZSBuZXcgb25lcyBiYXNlZCBvbiB0aGUgbGF0ZXN0IHJvbGUgbWFwcGluZy5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cInN1Yi1tZXNzYWdlXCI+XG4gICAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlP1xuICAgICAgICA8L3A+XG4gICAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICAgIFxuICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucyBjbGFzcz1cImRpYWxvZy1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoKVwiIGNsYXNzPVwiY2FuY2VsLWJ0blwiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib25Db25maXJtKClcIiBjbGFzcz1cImNvbmZpcm0tYnRuXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxuICAgICAgICAgIFllcywgUmVnZW5lcmF0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmNvbmZpcm1hdGlvbi1kaWFsb2ctY29udGFpbmVyIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuICAgIFxuICAgIC5kaWFsb2ctaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgICAgcGFkZGluZzogMjRweCAyNHB4IDE2cHggMjRweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTBlMGUwO1xuICAgIH1cbiAgICBcbiAgICAud2FybmluZy1pY29uIHtcbiAgICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgY29sb3I6ICNmZjk4MDA7XG4gICAgfVxuICAgIFxuICAgIGgyIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzMzMztcbiAgICB9XG4gICAgXG4gICAgLmRpYWxvZy1jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgfVxuICAgIFxuICAgIC5tYWluLW1lc3NhZ2Uge1xuICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgY29sb3I6ICMzMzM7XG4gICAgICBtYXJnaW46IDAgMCAxMnB4IDA7XG4gICAgICBsaW5lLWhlaWdodDogMS41O1xuICAgIH1cbiAgICBcbiAgICAuc3ViLW1lc3NhZ2Uge1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgY29sb3I6ICM2NjY7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICBcbiAgICAuZGlhbG9nLWFjdGlvbnMge1xuICAgICAgcGFkZGluZzogMTZweCAyNHB4IDI0cHggMjRweDtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgfVxuICAgIFxuICAgIC5jYW5jZWwtYnRuIHtcbiAgICAgIGNvbG9yOiAjNjY2O1xuICAgIH1cbiAgICBcbiAgICAuY29uZmlybS1idG4ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIFxuICAgICAgLm1hdC1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICB3aWR0aDogMThweDtcbiAgICAgICAgaGVpZ2h0OiAxOHB4O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBSZWdlbmVyYXRlQ29uZmlybWF0aW9uRGlhbG9nIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFJlZ2VuZXJhdGVDb25maXJtYXRpb25EaWFsb2c+XG4gICkgeyB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xuICB9XG5cbiAgb25Db25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRydWUpO1xuICB9XG5cblxufVxuIiwiPGRpdiBjbGFzcz1cInZpZXctY2JwLXBsYW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY29udGFpbmVyXCI+XG4gICAgICAgIFxuICAgICAgICA8IS0tIEluaXRpYWwgTG9hZGluZyBTY3JlZW4gKGZvciBpbml0aWFsIGxvYWQgYW5kIHJlZ2VuZXJhdGlvbikgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbml0aWFsLWxvYWRpbmctY29udGFpbmVyXCIgKm5nSWY9XCIhZGF0YUxvYWRlZCB8fCBpc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0IG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYWluLW1lc3NhZ2VcIj57eyBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlIHx8IChpc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA/ICdSZWdlbmVyYXRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9ucy4uLicgOiAnTG9hZGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJykgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1kZXRhaWxzXCIgKm5nSWY9XCJwcm9ncmVzc1BlcmNlbnRhZ2UgPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtaW5kaWNhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzUGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJwcm9ncmVzcy10ZXh0XCI+e3sgcHJvZ3Jlc3NQZXJjZW50YWdlIH19JSBDb21wbGV0ZTwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRpbWUtZXN0aW1hdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsLXRpbWUgY291cnNlIGdlbmVyYXRpb24gaW4gcHJvZ3Jlc3MuIFRoaXMgbWF5IHRha2UgMS0yIG1pbnV0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1haW4tY29udGVudFwiICpuZ0lmPVwiZGF0YUxvYWRlZCAmJiAhaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIj5TYXZlIENvdXJzZXMgKDxzcGFuPnt7c2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8ub3JnTmFtZX19IDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwbGFuRGF0YT8uZGVzaWduYXRpb25fbmFtZSBcIj4vIHt7cGxhbkRhdGE/LmRlc2lnbmF0aW9uX25hbWV9fTwvc3Bhbj48L3NwYW4+KTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVnZW5lcmF0ZS1idG5cIiAoY2xpY2spPVwicmVnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlZ2VuZXJhdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWlzUmVnZW5lcmF0aW5nXCI+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzUmVnZW5lcmF0aW5nXCIgZGlhbWV0ZXI9XCIyMFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7aXNSZWdlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5nLi4uJyA6ICdSZWdlbmVyYXRlIFJlY29tbWVuZGF0aW9ucyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgY2xvc2UtYnRuXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGFpbmVyIG10LTRcIj5cbiAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIChzZWxlY3RlZFRhYkNoYW5nZSk9XCJvbk91dGVyVGFiQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8IS0tIEZpcnN0IE1haW4gVGFiIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiY291cnNlIHJlY29tbWVuZGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTmVzdGVkIFRhYnMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC10YWItZ3JvdXAgKHNlbGVjdGVkVGFiQ2hhbmdlKT1cIm9uSW5uZXJUYWJDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJhbGxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJiZWhhdmlvdXJhbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cImZ1bmN0aW9uYWxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJkb21haW5cIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+IC0tPlxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cblxuICAgICAgICAgICAgICAgIDwhLS0gU2Vjb25kIE1haW4gVGFiIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiZ2FwIGFuYWx5c2lzXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHA+R2FwIGFuYWx5c2lzIGNvbnRlbnQgZ29lcyBoZXJlPC9wPiAtLT5cbiAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIiBjbGFzcz1cImZpbHRlcnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm9sZS1tYXBwaW5nLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvdXRlclRhYkFjdGl2ZUluZGV4ID09PSAwICYmIChpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAwIHx8IGlubmVyVGFiQWN0aXZlSW5kZXggPT09IDEgfHwgaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMiB8fCBpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAzIClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlci1pbXByb3ZlZCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWFyY2ggQ291cnNlczwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyLWNvbXBhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJzZWFyY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInNlYXJjaC1pY29uXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInNpbnB1dC1jb21wYWN0XCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiYXBwbHlGaWx0ZXIoJGV2ZW50LnRhcmdldC52YWx1ZSk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBDb3Vyc2VzXCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBDb21wZXRlbmN5PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5jb21wZXRlbmN5Py5sZW5ndGggPyAnJyA6ICdDb21wZXRlbmN5JyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBDb21wZXRlbmN5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJmaWx0ZXJMaXN0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsICdjb21wZXRlbmN5JylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZENvbXBldGVuY3lcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBSYXRpbmc8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5yYXRpbmc/Lmxlbmd0aCA/ICcnIDogJ1JhdGluZycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyYXRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBSZWF0aW5nc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyTGlzdCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlLCAncmF0aW5nJylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZFJhdGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXItaW1wcm92ZWQtc2VjLTIgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgTGFuZ3VhZ2U8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5sYW5ndWFnZT8ubGVuZ3RoID8gJycgOiAnTGFuZ3VhZ2UnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBMYW5ndWFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlckxpc3QoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSwgJ2xhbmd1YWdlJylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZExhbmd1YWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBEdXJhdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJGb3JtLnZhbHVlLmR1cmF0aW9uPy5sZW5ndGggPyAnJyA6ICdEdXJhdGlvbicgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJzZWxlY3Qtc2VhcmNoLXBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJhcHBseUZpbHRlcnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlYXJjaCBib3ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiA1cHg7d2lkdGg6IDkyJTttYXJnaW46IDVweDtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIER1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJmaWx0ZXJMaXN0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsICdkdXJhdGlvbicpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWYWx1ZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHIgb2YgZmlsdGVyZWREdXJhdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgUHJvdmlkZXI8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5wcm92aWRlcj8ubGVuZ3RoID8gJycgOiAnUHJvdmlkZXInIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBQcm92aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyTGlzdCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlLCAncHJvdmlkZXInKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVmFsdWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByIG9mIGZpbHRlcmVkUHJvdmlkZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA0NXB4O21hcmdpbi1sZWZ0OiAyMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1hY3RpdmVcIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJSZXNldCBBbGwgRmlsdGVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcnMoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyZWQgQ291cnNlIENvdW50IDoge3tmaWx0ZXJkQ291cnNlcz8ubGVuZ3RofX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTUgc3ViLWhlYWRpbmcgc2VsZWN0LWFsbC1jb250YWluZXJcIiAqbmdJZj1cImZpbHRlcmRDb3Vyc2VzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImZhbHNlXCIgKGNoYW5nZSk9XCJzZWxlY3RBbGxDb3Vyc2VzKCRldmVudClcIj5TZWxlY3QgQWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdXJzZXM8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cC1jb21wYWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkFkZCBNb3JlIENvdXJzZSBGcm9tIGlHT1RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1Z2dlc3RNb3JlQ291cnNlcygpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGwtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW2Rpc2FibGVkXT1cInNlbGVjdEZpbHRlckNvdXJzZXM/Lmxlbmd0aCA+IDAgPyBmYWxzZSA6IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0RmlsdGVyQ291cnNlcz8ubGVuZ3RoID4gMCA/ICdidG4tYWN0aXZlJyA6ICdidG4tZGlzYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFt2YWx1ZV09XCJtb2RlID09PSAnYWRkJyA/ICdTYXZlIENvdXJzZXMnIDogJ1VwZGF0ZSBDb3Vyc2VzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZUNvdXJzZXMoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjbGFpbWVyLWNvbnRhaW5lciBtdC0yXCIgKm5nSWY9XCJmaWx0ZXJkQ291cnNlcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY2xhaW1lci1tZXNzYWdlIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPkRpc2NsYWltZXI6PC9zdHJvbmc+IFBsZWFzZSB2ZXJpZnkgdGhlIHB1YmxpYyBjb3Vyc2UgVVJMIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIHBsYW4uXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtbGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImlubmVyVGFiQWN0aXZlSW5kZXggPiAwID8gJ2NvdXJzZS1saXN0LWNvbnRhaW5lci1mbGV4JzonY291cnNlLWxpc3QtY29udGFpbmVyLXJpZ2h0LWZsZXgnIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA+IDAgPyAnbGVmdC1wYW5lbCc6JydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbXBldGVuY2llcyBpbiBCZWhhdmlvdXJhbDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlbWUtZmlsdGVyLWNvbnRyb2xzIG1iLTJcIiAqbmdJZj1cInNlbGVjdGVkVGhlbWVGaWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNsZWFyLWZpbHRlci1idG5cIiAoY2xpY2spPVwiY2xlYXJUaGVtZUZpbHRlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPiBDbGVhciBGaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiZmlsdGVyT25Db21wZXRlbmN5VGhlbWUoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXRlZ29yeS1saXN0LWl0ZW0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLXRoZW1lJzogaXNUaGVtZVNlbGVjdGVkKGl0ZW0pfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlubmVyVGFiQWN0aXZlSW5kZXggPT09IDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q29tcGV0ZW5jaWVzIGluIEZ1bmN0aW9uYWw8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZW1lLWZpbHRlci1jb250cm9scyBtYi0yXCIgKm5nSWY9XCJzZWxlY3RlZFRoZW1lRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjbGVhci1maWx0ZXItYnRuXCIgKGNsaWNrKT1cImNsZWFyVGhlbWVGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj4gQ2xlYXIgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImZpbHRlck9uQ29tcGV0ZW5jeVRoZW1lKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F0ZWdvcnktbGlzdC1pdGVtIGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzZWxlY3RlZC10aGVtZSc6IGlzVGhlbWVTZWxlY3RlZChpdGVtKX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbXBldGVuY2llcyBpbiBEb21haW48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZW1lLWZpbHRlci1jb250cm9scyBtYi0yXCIgKm5nSWY9XCJzZWxlY3RlZFRoZW1lRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjbGVhci1maWx0ZXItYnRuXCIgKGNsaWNrKT1cImNsZWFyVGhlbWVGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj4gQ2xlYXIgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImZpbHRlck9uQ29tcGV0ZW5jeVRoZW1lKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXRlZ29yeS1saXN0LWl0ZW0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQtdGhlbWUnOiBpc1RoZW1lU2VsZWN0ZWQoaXRlbSl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA+IDAgPyAncmlnaHQtcGFuZWwnOidyaWdodC1wYW5lbC1mbGV4J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBDb3Vyc2UgRm91bmQgTWVzc2FnZSBpbiBSaWdodCBQYW5lbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1jb3Vyc2UtZm91bmQtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlcmRDb3Vyc2VzPy5sZW5ndGggPT09IDAgJiYgc2VsZWN0ZWRUaGVtZUZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1jb3Vyc2UtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tY291cnNlLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5zZWFyY2hfb2ZmPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1jb3Vyc2UtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0Pk5vIENvdXJzZXMgRm91bmQ8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Tm8gY291cnNlcyBmb3VuZCBmb3IgdGhlIHNlbGVjdGVkIHRoZW1lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tzZWxlY3RlZFRoZW1lRmlsdGVyfX08L3N0cm9uZz48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Xb3VsZCB5b3UgbGlrZSB0byBhZGQgYSBjb3Vyc2UgZm9yIHRoaXMgY29tcGV0ZW5jeT88L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3VnZ2VzdC1jb3Vyc2UtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ291cnNlRm9yU2VsZWN0ZWRUaGVtZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBDb3Vyc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvdXJzZXMgTGlzdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZENvdXJzZXM7bGV0IGk9aW5kZXhcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrZWQtY291cnNlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiY2hlY2tJZkNvdXJzZUV4aXN0cyhpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdGVkRmlsdGVyQ291cnNlcygkZXZlbnQsIGl0ZW0pXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9jb3Vyc2Uuc3ZnXCI+PC9zcGFuPiZuYnNwOzxzcGFuPkNvdXJzZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8ucmF0aW9uYWxlXCI+QUkgUmVjb21tZW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmlzX3B1YmxpY1wiPiAtIFB1YmxpYzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtPy5pc19wdWJsaWNcIj4gLSBpR09UPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbT8ucmF0aW9uYWxlXCI+TWFudWFsbHkgU3VnZ2VzdGVkIC0gaUdPVDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5yYXRpb25hbGUgJiYgIWl0ZW0/LmlzX3B1YmxpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1ncmVlbi10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QUkgUmVjb21tZW5kZWQgLSBpR09UIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5wbGF0Zm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBbaHJlZl09XCJpdGVtPy5wdWJsaWNfbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0/LnBsYXRmb3JtfX08L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5vcmdhbmlzYXRpb24/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlByb3ZpZGVyIC0ge3tpdGVtPy5vcmdhbmlzYXRpb259fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5yYXRpb25hbGUgJiYgaXRlbT8uaXNfcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1wdWJsaWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1wdWJsaWMtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFJIFJlY29tbWVuZGVkIC0gUHVibGljIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5wbGF0Zm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBbaHJlZl09XCJpdGVtPy5wdWJsaWNfbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0/LnBsYXRmb3JtfX08L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5vcmdhbmlzYXRpb24/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlByb3ZpZGVyIC0ge3tpdGVtPy5vcmdhbmlzYXRpb259fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXRlbT8ucmF0aW9uYWxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1ncmF5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JheS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+TWFudWFsbHkgU3VnZ2VzdGVkIC0gaUdPVCA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuPlBsYXRmb3JtIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9ufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtdGl0bGUgbXQtMyBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZWRpcmVjdFRvVG9jKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmNvdXJzZVwiPnt7aXRlbT8uY291cnNlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiaXRlbT8ubmFtZVwiPnt7aXRlbT8ubmFtZX19KioqKjwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7XCIgKGNsaWNrKT1cInJlZGlyZWN0VG9Ub2MoaXRlbSlcIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4cHhcIiB3aWR0aD1cIjE4cHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvcmVkaXJlY3QucG5nXCIgLz48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWRlc2MgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIml0ZW0/LnJhdGlvbmFsZVwiPnt7aXRlbT8ucmF0aW9uYWxlfX08L3NwYW4+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5kZXNjcmlwdGlvblwiPnt7aXRlbT8uZGVzY3JpcHRpb259fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0JlaGF2aW91cmFsJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkJlaGF2aW91cmFsIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJiZWhhdmlvdXJhbC1waWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdCZWhhdmlvdXJhbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHRcIj4ge3sgY29tcC5jb21wZXRlbmN5VGhlbWVOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0JlaGF2aW91cmFsJyxpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaG93LW1vcmUtbGluayBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29tcGV0ZW5jaWVzKCdCZWhhdmlvdXJhbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlzRXhwYW5kZWQoJ0JlaGF2aW91cmFsJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdCZWhhdmlvdXJhbCcsaSkgKyAnIE1vcmUnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0Z1bmN0aW9uYWwnLGkpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+RnVuY3Rpb25hbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnVuY3Rpb25hbC1waWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdGdW5jdGlvbmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuY29tcGV0ZW5jeVN1YlRoZW1lTmFtZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJoYXNNb3JlVGhhblR3bygnRnVuY3Rpb25hbCcsaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZS1jb21wZXRlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnRnVuY3Rpb25hbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlzRXhwYW5kZWQoJ0Z1bmN0aW9uYWwnLGkpID8gJ1Nob3cgTGVzcycgOiAnKycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nQ291bnQoJ0Z1bmN0aW9uYWwnLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdEb21haW4nLGkpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+RG9tYWluIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkb21haW4tcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldERpc3BsYXllZENvbXBldGVuY2llcygnRG9tYWluJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuY29tcGV0ZW5jeVN1YlRoZW1lTmFtZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJoYXNNb3JlVGhhblR3bygnRG9tYWluJyxpKVwiIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaG93LW1vcmUtbGluayBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29tcGV0ZW5jaWVzKCdEb21haW4nLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdEb21haW4nLGkpID8gJ1Nob3cgTGVzcycgOiAnKycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nQ291bnQoJ0RvbWFpbicsaSkgKyAnIE1vcmUnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWxldmFuY3kgYW5kIER1cmF0aW9uIHNlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1mb290ZXJcIiAqbmdJZj1cIml0ZW0/LnJlbGV2YW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5LXBpbGwtZ3JlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3ktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeVwiPlJlbGV2YW5jeTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXNoXCI+LTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJjZW50YWdlXCI+e3tpdGVtPy5yZWxldmFuY3l9fSU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1waWxsLWdyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3lcIj5EdXJhdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXNoXCI+LTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJjZW50YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0/LmR1cmF0aW9uXCI+e3tnZXREdXJhdGlvbihpdGVtPy5kdXJhdGlvbil9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhKGl0ZW0/LmR1cmF0aW9uKVwiPk4vQTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gR2VuZXJhbCBObyBEYXRhIE1lc3NhZ2UgKG9ubHkgd2hlbiBubyB0aGVtZSBmaWx0ZXIgaXMgYWN0aXZlKSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc3ViLWhlYWRpbmdcIiAqbmdJZj1cImZpbHRlcmRDb3Vyc2VzPy5sZW5ndGggPT09IDAgJiYgIXNlbGVjdGVkVGhlbWVGaWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vIERhdGEgRm91bmQ8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb2xlLW1hcHBpbmctY29udGFpbmVyXCIgKm5nSWY9XCJvdXRlclRhYkFjdGl2ZUluZGV4ID09PSAxXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImdhcC1hbmFseXNpcy1jb250ZW50XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLXBkZiBtdC00IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkRvd25sb2FkXCIgKGNsaWNrKT1cImRvd25sb2FkUERGKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaXNQREZEb3dubG9hZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZGYtaGVhZGluZ1wiPnt7c2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8ubmFtZX19IDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInBsYW5EYXRhPy5kZXNpZ25hdGlvbl9uYW1lIFwiPl97e3BsYW5EYXRhPy5kZXNpZ25hdGlvbl9uYW1lfX1fR2FwX0FuYWx5c2lzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB2aC0xMDBcIiBbbmdDbGFzc109XCJpc1BERkRvd25sb2FkID8gJ210LTQnOicnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaWRlYmFyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gcC0zIGJnLWxpZ2h0IGJvcmRlci1lbmRcIiBzdHlsZT1cIndpZHRoOiAyNTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItNFwiPkFuYWx5emUgYnkgQ2F0ZWdvcnk8L2g1PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1lbnVJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1iLTIgdGV4dC1zdGFydCBtZW51LWxpc3QtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09IGl0ZW0ua2V5XCIgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5KGl0ZW0ua2V5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTWFpbiBDb250ZW50IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSBwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMyBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTMgZ3JheS1iZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtbGFiZWwgc3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q29tcGV0ZW5jaWVzIENvdmVyZWQ8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1jb3VudFwiPnt7Y29tcGV0ZW5jeUNvdmVyZWRDb3VudH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTMgZ3JheS1iZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtbGFiZWwgc3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnYWxsJ1wiPlRvdGFsIENvbXBldGVuY2llczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnYmVoYXZpb3JhbCdcIj5Ub3RhbCBCZWhhdmlvdXJhbCBDb21wZXRlbmNpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdmdW5jdGlvbmFsJ1wiPlRvdGFsIEZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZG9tYWluJ1wiPlRvdGFsIERvbWFpbiBDb21wZXRlbmNpZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2FsbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YmVoYXZpb3JhbFRvdGFsQ29tcGV0ZW5jaWVzfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXN9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdkb21haW4nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZG9tYWluVG90YWxDb21wZXRlbmNpZXN9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zIGdyZWVuLWJnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2FsbCdcIj5PdmVyYWxsIENvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlaGF2aW91cmFsIENvdmVyYWdlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2Z1bmN0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uYWwgQ292ZXJhZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWdyZWVuLWxhYmVsXCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZG9tYWluJ1wiPkRvbWFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3ZlcmFnZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdhbGwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3ZlcmFsbENvdmVyYWdlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWdyZWVuLWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnYmVoYXZpb3JhbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tiZWhhdmlvcmFsQ292ZXJhZ2V9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdmdW5jdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2Z1bmN0aW9uYWxDb3ZlcmFnZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkb21haW5Db3ZlcmFnZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IGFsbC1jYXRlZ29yeS1saXN0XCIgW25nU3dpdGNoXT1cInNlbGVjdGVkQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidhbGwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkFsbCBDYXRlZ29yaWVzPC9oND5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyBCZWhhdmlvdXJhbCBzZWN0aW9uIG9ubHkgaWYgdGhlcmUgYXJlIHVubWF0Y2hlZCBiZWhhdmlvdXJhbCBjb21wZXRlbmNpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImJlaGF2aW91cmFsTm90TWF0Y2hlZCAmJiBiZWhhdmlvdXJhbE5vdE1hdGNoZWQubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkJlaGF2aW91cmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXktYmctaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJlaGF2aW91cmFsTm90TWF0Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4+e3tpdGVtIHwgdGl0bGVjYXNlfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvdXJzZShpdGVtLCAnQmVoYXZpb3JhbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3Vyc2U8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNob3cgRnVuY3Rpb25hbCBzZWN0aW9uIG9ubHkgaWYgdGhlcmUgYXJlIHVubWF0Y2hlZCBmdW5jdGlvbmFsIGNvbXBldGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZnVuY3Rpb25hbE5vdE1hdGNoZWQgJiYgZnVuY3Rpb25hbE5vdE1hdGNoZWQubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkZ1bmN0aW9uYWw8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JheS1iZy1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZnVuY3Rpb25hbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuPnt7aXRlbSB8IHRpdGxlY2FzZX19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb3Vyc2UoaXRlbSwgJ0Z1bmN0aW9uYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291cnNlPC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IERvbWFpbiBzZWN0aW9uIG9ubHkgaWYgdGhlcmUgYXJlIHVubWF0Y2hlZCBkb21haW4gY29tcGV0ZW5jaWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJkb21haW5Ob3RNYXRjaGVkICYmIGRvbWFpbk5vdE1hdGNoZWQubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkRvbWFpbjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF5LWJnLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkb21haW5Ob3RNYXRjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3Bhbj57e2l0ZW0gfCB0aXRsZWNhc2V9fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ291cnNlKGl0ZW0sICdEb21haW4nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291cnNlPC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IG1lc3NhZ2Ugd2hlbiBhbGwgY29tcGV0ZW5jaWVzIGFyZSBjb3ZlcmVkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoIWJlaGF2aW91cmFsTm90TWF0Y2hlZCB8fCBiZWhhdmlvdXJhbE5vdE1hdGNoZWQubGVuZ3RoID09PSAwKSAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghZnVuY3Rpb25hbE5vdE1hdGNoZWQgfHwgZnVuY3Rpb25hbE5vdE1hdGNoZWQubGVuZ3RoID09PSAwKSAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghZG9tYWluTm90TWF0Y2hlZCB8fCBkb21haW5Ob3RNYXRjaGVkLmxlbmd0aCA9PT0gMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWdhcHMtbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwic3VjY2Vzcy1pY29uXCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5FeGNlbGxlbnQhIEFsbCBjb21wZXRlbmNpZXMgYXJlIGNvdmVyZWQ8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QWxsIHJlcXVpcmVkIGNvbXBldGVuY2llcyBoYXZlIGJlZW4gYWRkcmVzc2VkIGJ5IHRoZSBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdXJzZXMuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidiZWhhdmlvcmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5CZWhhdmlvdXJhbDwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImJlaGF2aW9yYWxDb3ZlcmFnZSAhPT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkJlaGF2aW91cmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXktYmctaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJlaGF2aW91cmFsTm90TWF0Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4+e3tpdGVtfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ291cnNlKGl0ZW0sICdCZWhhdmlvcmFsJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtYnRuXCI+PG1hdC1pY29uPmFkZDwvbWF0LWljb24+IEFkZCBOZXcgQ291cnNlIDwvc3Bhbj48L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImJlaGF2aW9yYWxDb3ZlcmFnZSA9PT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZThmNWU4OyBib3JkZXI6IDFweCBzb2xpZCAjNGNhZjUwOyBib3JkZXItcmFkaXVzOiA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjogIzJlN2QzMjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfjokgRXhjZWxsZW50ISBBbGwgYmVoYXZpb3JhbCBjb21wZXRlbmNpZXMgYXJlIGNvdmVyZWQgYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgY291cnNlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInZnVuY3Rpb25hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+RnVuY3Rpb25hbDwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImZ1bmN0aW9uYWxDb3ZlcmFnZSAhPT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkZ1bmN0aW9uYWw8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JheS1iZy1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZnVuY3Rpb25hbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuPnt7aXRlbX19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvdXJzZShpdGVtLCAnRnVuY3Rpb25hbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3IENvdXJzZTwvc3Bhbj48L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImZ1bmN0aW9uYWxDb3ZlcmFnZSA9PT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZThmNWU4OyBib3JkZXI6IDFweCBzb2xpZCAjNGNhZjUwOyBib3JkZXItcmFkaXVzOiA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjogIzJlN2QzMjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfjokgRXhjZWxsZW50ISBBbGwgZnVuY3Rpb25hbCBjb21wZXRlbmNpZXMgYXJlIGNvdmVyZWQgYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgY291cnNlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInZG9tYWluJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5Eb21haW48L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJkb21haW5Db3ZlcmFnZSAhPT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkRvbWFpbjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF5LWJnLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkb21haW5Ob3RNYXRjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3Bhbj57e2l0ZW19fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb3Vyc2UoaXRlbSwgJ0RvbWFpbicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3IENvdXJzZSA8L3NwYW4+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJkb21haW5Db3ZlcmFnZSA9PT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZThmNWU4OyBib3JkZXI6IDFweCBzb2xpZCAjNGNhZjUwOyBib3JkZXItcmFkaXVzOiA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjogIzJlN2QzMjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfjokgRXhjZWxsZW50ISBBbGwgZG9tYWluIGNvbXBldGVuY2llcyBhcmUgY292ZXJlZCBieSB0aGUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3Vyc2VzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5QbGVhc2Ugc2VsZWN0IGEgY2F0ZWdvcnkuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PiA8IS0tIENsb3NlIG1haW4tY29udGVudCBkaXYgLS0+XG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxkaXYgW2hpZGRlbl09XCIhaXNQREZEb3dubG9hZFwiIGNsYXNzPVwiZ2FwLWFuYWx5c2lzLXBkZi1jb250YWluZXJcIiAjcGRmQ29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiZ2FwLWFuYWx5c2lzLXBkZi1oZWFkZXJcIj5cbiAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2thcm1heW9naUxvZ28tbWluLnBuZ1wiIGFsdD1cIkthcm1heW9naSBCaGFyYXQgTG9nb1wiIGNsYXNzPVwibG9nb1wiIC8+XG4gICAgICA8aDE+PHNwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlID09PSAnc3RhdGUnXCI+e3tzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/LmRlcGFydG1lbnRfbmFtZT8ubmFtZX19PC9zcGFuPiBcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeSdcIj57e3NoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/Lm5hbWV9fTwvc3Bhbj4gICBcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJwbGFuRGF0YT8uZGVzaWduYXRpb25fbmFtZSBcIj4vIHt7cGxhbkRhdGE/LmRlc2lnbmF0aW9uX25hbWV9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPjwvaDE+XG4gICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+QSBkZXRhaWxlZCBicmVha2Rvd24gb2YgY29tcGV0ZW5jaWVzIEdhcCBBbmFseXNpczwvcD5cbiAgICAgXG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXNuYXBzaG90XCI+XG4gICAgICA8aDI+Q29tcGV0ZW5jeSBTbmFwc2hvdDwvaDI+XG4gICAgICA8ZGl2IGNsYXNzPVwic25hcHNob3QtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlLXdyYXBwZXJcIj5cbiAgICAgICAgICA8c3ZnIGNsYXNzPVwicHJvZ3Jlc3MtcmluZ1wiIHdpZHRoPVwiMTIwXCIgaGVpZ2h0PVwiMTIwXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicHJvZ3Jlc3MtcmluZy1iZ1wiIGN4PVwiNjBcIiBjeT1cIjYwXCIgcj1cIjUyXCIgLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwcm9ncmVzcy1yaW5nLWNpcmNsZVwiIGN4PVwiNjBcIiBjeT1cIjYwXCIgcj1cIjUyXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZS10ZXh0XCI+e3tvdmVyYWxsQ292ZXJhZ2V9fTxiciAvPjxzcGFuPk92ZXJhbGwgQ292ZXJhZ2U8L3NwYW4+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8IS0tIFRvdGFsIENvbXBldGVuY2llcyBCb3ggLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG90YWwtYm94XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlRvdGFsIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRcIj57e3RoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RofX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIFxuICAgICAgICAgICAgPCEtLSBQcm9ncmVzcyBCYXJzIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtdGV4dCBiZWhhdmlvcmFsXCI+QmVoYXZpb3VyYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3ZlcmVkLXRleHRcIj57e2JlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50fX0gLyB7e2JlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llc319IENvdmVyZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWZpbGwgYmVoYXZpb3JhbFwiIFtzdHlsZS53aWR0aC4lXT1cIihiZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCAvIGJlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llcykgKiAxMDBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHQgZnVuY3Rpb25hbFwiPkZ1bmN0aW9uYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3ZlcmVkLXRleHRcIj57e2Z1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50fX0gLyB7e2Z1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llc319IENvdmVyZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWZpbGwgZnVuY3Rpb25hbFwiIFtzdHlsZS53aWR0aC4lXT1cIihmdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCAvIGZ1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llcykgKiAxMDBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHQgZG9tYWluXCI+RG9tYWluPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY292ZXJlZC10ZXh0XCI+e3tkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50fX0gLyB7e2RvbWFpblRvdGFsQ29tcGV0ZW5jaWVzfX0gQ292ZXJlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZmlsbCBkb21haW5cIiBbc3R5bGUud2lkdGguJV09XCIoZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCAvIGRvbWFpblRvdGFsQ29tcGV0ZW5jaWVzKSAqIDEwMFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2xhc3M9XCJnYXAtc2VjdGlvbiBtYi00XCI+XG4gICAgICA8aDI+RGV0YWlsZWQgQ29tcGV0ZW5jeSBBbmFseXNpczwvaDI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FwLWJveFwiPlxuICAgICAgICBCcmlkZ2UgWW91ciBDb21wZXRlbmNpZXMgR2FwXG4gICAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj5IZXJlIGFyZSB7e3RoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RoIC0gKGJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgKyBkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50KX19IGtleSBhcmVhcyBmb3IgZGV2ZWxvcG1lbnQuPC9wPlxuICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZyBtYi00XCI+XG4gICAgICAgIDxwPkdhcCB0byBBZGRyZXNzIDxzcGFuICpuZ0lmPVwiKHRoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RoIC0gKGJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgKyBkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50KSkgPiAwXCI+KHt7dGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzPy5sZW5ndGggLSAoYmVoYXZpb3JhbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgKyBmdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCArIGRvbWFpbkNvbXBldGVuY3lDb3ZlcmVkQ291bnQpfX0pPC9zcGFuPjwvcD5cbiAgICAgICAgXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktY2FyZCBiZWhhdmlvcmFsXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYmVoYXZpb3VyYWxOb3RNYXRjaGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7aXRlbSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgICZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgYmVoYXZpb3JhbFwiPkJlaGF2aW91cmFsPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktY2FyZCBmdW5jdGlvbmFsXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZnVuY3Rpb25hbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+XG4gICAgICAgICAgICZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgZnVuY3Rpb25hbFwiPkZ1bmN0aW9uYWw8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgZG9tYWluXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZG9tYWluTm90TWF0Y2hlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2l0ZW0gfCB0aXRsZWNhc2V9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGl0bGVcIj5cbiAgICAgICAgICA8IS0tIFByb2plY3QgTWFuYWdlbWVudCAgLS0+XG4gICAgICAgICAgJm5ic3A7IOKAoiAmbmJzcDtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBkb21haW5cIj5Eb21haW48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmcgbWItNFwiPlxuICAgICAgICA8cD5Db3ZlcmVkIENvbXBldGVuY2llcyA8c3Bhbj4oe3t0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aCAtIChiZWhhdmlvdXJhbE5vdE1hdGNoZWQ/Lmxlbmd0aCArIGZ1bmN0aW9uYWxOb3RNYXRjaGVkPy5sZW5ndGggKyBkb21haW5Ob3RNYXRjaGVkPy5sZW5ndGgpfX0pPC9zcGFuPjwvcD4gICAgICAgIFxuICAgICA8L2Rpdj5cbiAgICAgPGRpdiBjbGFzcz1cImdhcC1zZWN0aW9uIG1iLTRcIj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmVlbi1iZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zIVxuICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgXG4gICAgICAgICAgICA8cD5Zb3UgaGF2ZSBzdWNjZXNzZnVsbHkgY292ZXJlZCA8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJzdWJ0aXRsZVwiPnt7dGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzPy5sZW5ndGggLSAoYmVoYXZpb3VyYWxOb3RNYXRjaGVkPy5sZW5ndGggKyBmdW5jdGlvbmFsTm90TWF0Y2hlZD8ubGVuZ3RoICsgZG9tYWluTm90TWF0Y2hlZD8ubGVuZ3RoKX19IGtleSBjb21wZXRlbmNpZXMsIGZvcm1pbmcgYSBzdHJvbmcgcHJvZmVzc2lvbmFsIGZvdW5kYXRpb24uPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgYmVoYXZpb3JhbFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJlaGF2aW91cmFsTWF0Y2hlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2l0ZW0/LnRoZW1lIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+XG4gICAgICAgICAge3tpdGVtPy5zdWJfdGhlbWV9fSZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgYmVoYXZpb3JhbFwiPkJlaGF2aW91cmFsPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktY2FyZCBmdW5jdGlvbmFsXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZnVuY3Rpb25hbE1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtPy50aGVtZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgICAge3tpdGVtPy5zdWJfdGhlbWV9fSZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgZnVuY3Rpb25hbFwiPkZ1bmN0aW9uYWw8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgZG9tYWluXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZG9tYWluTWF0Y2hlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2l0ZW0/LnRoZW1lIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+XG4gICAgICAgICAgPCEtLSBQcm9qZWN0IE1hbmFnZW1lbnQgIC0tPlxuICAgICAgICAgIHt7aXRlbT8uc3ViX3RoZW1lfX0mbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGRvbWFpblwiPkRvbWFpbjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnYXAtc2VjdGlvbiBtYi00XCI+XG4gICAgICAgIDxoMj5SZWNvbW1lbmRlZCBDb3Vyc2VzPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGFwcC1nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlIFtwbGFuRGF0YV09XCJwbGFuRGF0YVwiPjwvYXBwLWdhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2U+XG48L2Rpdj5cbiAgXG5cblxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJsb2FkaW5nICYmIGRhdGFMb2FkZWQgJiYgIWlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGVudFwiPlxuICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXRleHQgbXQtM1wiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYWluLW1lc3NhZ2VcIj57eyBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlIHx8ICdQcmVwYXJpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uIGdlbmVyYXRpb24uLi4nIH19PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtaW5kaWNhdG9yXCIgKm5nSWY9XCJwcm9ncmVzc1BlcmNlbnRhZ2UgPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzUGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJwcm9ncmVzcy10ZXh0XCI+e3sgcHJvZ3Jlc3NQZXJjZW50YWdlIH19JSBDb21wbGV0ZTwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGltZS1lc3RpbWF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICBSZWFsLXRpbWUgY291cnNlIGdlbmVyYXRpb24gaW4gcHJvZ3Jlc3MuIFRoaXMgbWF5IHRha2UgMS0yIG1pbnV0ZXMuXG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
2090
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9jb21wb25lbnRzL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi9nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUEyQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBcUIsU0FBUyxFQUFjLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHcEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFFckcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQU9uSCxNQUFNLE9BQU8scUNBQXFDO0lBb0JoRCxZQUFtQixTQUE4RCxFQUMvQyxJQUFTLEVBQVMsYUFBNEIs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LFFBQVEsS0FBSyxFQUFFO2dCQUNiLEtBQUssVUFBVTtvQkFDYixPQUFPLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ25CLEtBQUssV0FBVztvQkFDZCxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsS0FBSyxVQUFVO29CQUNiLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDbkI7b0JBQ0UsT0FBTyxJQUFJLENBQUM7YUFDZjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FseUVVLHFDQUFxQyw4Q0FxQnRDLGVBQWU7bUdBckJkLHFDQUFxQyxvTENqQmxELDY0aUVBNitCTTs7NEZENTlCTyxxQ0FBcUM7a0JBTGpELFNBQVM7K0JBQ0Usb0NBQW9DOzswQkF5QjNDLE1BQU07MkJBQUMsZUFBZTtvSkFwQm1CLFVBQVU7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7QUFveUU1QyxnQ0FBZ0M7QUFtR2hDLE1BQU0sT0FBTyw0QkFBNEI7SUFDdkMsWUFDUyxTQUFxRDtRQUFyRCxjQUFTLEdBQVQsU0FBUyxDQUE0QztJQUMxRCxDQUFDO0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQzsrR0FYVSw0QkFBNEI7bUdBQTVCLDRCQUE0QixzRUFoRzdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVDs7NEZBc0VVLDRCQUE0QjtrQkFsR3hDLFNBQVM7K0JBQ0UsZ0NBQWdDLFlBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IFN1Z2dlc3RNb3JlQ291cnNlc0NvbXBvbmVudCB9IGZyb20gJy4uL3N1Z2dlc3QtbW9yZS1jb3Vyc2VzL3N1Z2dlc3QtbW9yZS1jb3Vyc2VzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRUYWJDaGFuZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHsgQWRkQ291cnNlQ29tcG9uZW50IH0gZnJvbSAnLi4vYWRkLWNvdXJzZS9hZGQtY291cnNlLmNvbXBvbmVudCc7XG5pbXBvcnQgaHRtbDJwZGYgZnJvbSAnaHRtbDJwZGYuanMnO1xuaW1wb3J0IHsgY29uY2F0LCBpbnRlcnZhbCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZVdoaWxlLCB0YXAsIGNhdGNoRXJyb3IsIGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGVsZXRlUm9sZU1hcHBpbmdQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL2RlbGV0ZS1yb2xlLW1hcHBpbmctcG9wdXAvZGVsZXRlLXJvbGUtbWFwcGluZy1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudCB7XG4gIEBWaWV3Q2hpbGQoJ3BkZkNvbnRlbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgcGRmQ29udGVudCE6IEVsZW1lbnRSZWY7XG4gIHBsYW5EYXRhOiBhbnlcbiAgbG9hZGluZyA9IGZhbHNlXG4gIGRhdGFMb2FkZWQgPSBmYWxzZSAvLyBUcmFjayBpZiBpbml0aWFsIGRhdGEgaGFzIGJlZW4gbG9hZGVkXG4gIGlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gZmFsc2UgLy8gVHJhY2sgcmVnZW5lcmF0aW9uIHdpdGggcHJvZ3Jlc3MgbG9hZGluZ1xuICByZWNvbW1lbmRlZF9jb3Vyc2VfaWQgPSAnJ1xuXG4gIC8vIFByb2dyZXNzaXZlIGxvYWRpbmcgZm9yIGNvdXJzZSBnZW5lcmF0aW9uXG4gIGN1cnJlbnRQcm9jZXNzaW5nU3RhZ2U6IHN0cmluZyA9ICcnO1xuICBwcm9ncmVzc1BlcmNlbnRhZ2U6IG51bWJlciA9IDA7XG4gIHByb2Nlc3NpbmdTdGFnZXMgPSBbXG4gICAgJ0FuYWx5emluZyByb2xlcyBhbmQgcmVzcG9uc2liaWxpdGllcy4uLicsXG4gICAgJ0RldGFpbGluZyBjb21wZXRlbmN5IHJlcXVpcmVtZW50cy4uLicsXG4gICAgJ1ByZXBhcmluZyBpR09UIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMuLi4nLFxuICAgICdHZW5lcmF0aW5nIHB1YmxpYyBjb3Vyc2Ugc3VnZ2VzdGlvbnMuLi4nLFxuICAgICdDb21wdXRpbmcgY29tcHJlaGVuc2l2ZSBnYXAgYW5hbHlzaXMuLi4nLFxuICAgICdGaW5hbGl6aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiBwbGFuLi4uJ1xuICBdO1xuICBzdGFnZVN0YXJ0VGltZTogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IocHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LCBwdWJsaWMgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhciwgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5wbGFuRGF0YSA9IGRhdGFcbiAgfVxuICBzZWFyY2hUZXh0ID0gJydcbiAgZmlsdGVyZENvdXJzZXM6IGFueSA9IFtdXG4gIG9yaWdpbmFsRGF0YTogYW55ID0gW11cbiAgc2VsZWN0RmlsdGVyQ291cnNlczogYW55ID0gW11cbiAgc3VnZ2VzdGVkQ291cnNlczogYW55ID0gW10gLy8gVHJhY2sgaUdPVCBzdWdnZXN0ZWQgY291cnNlcyBzZXBhcmF0ZWx5XG4gIHVzZXJBZGRlZENvdXJzZXM6IGFueSA9IFtdIC8vIFRyYWNrIHVzZXItYWRkZWQgY291cnNlcyBzZXBhcmF0ZWx5XG4gIG1vZGUgPSAnYWRkJ1xuICBjYnBfcGxhbl9pZCA9ICcnXG4gIGV4cGFuZGVkQ29tcGV0ZW5jaWVzOiBhbnkgPSB7fTsgLy8gVHJhY2sgZXhwYW5kZWQgc3RhdGUgZm9yIGVhY2ggY291cnNlIGFuZCBjb21wZXRlbmN5IHR5cGVcbiAgb3V0ZXJUYWJBY3RpdmVJbmRleCA9IDBcbiAgaW5uZXJUYWJBY3RpdmVJbmRleCA9IDBcbiAgb3V0ZXJUYWJBY3RpdmVUZXh0ID0gJ2FsbCdcbiAgaW5uZXJUYWJBY3RpdmVUZXh0ID0gJ2FsbCdcbiAgc2VsZWN0ZWRDYXRlZ29yeSA9ICdhbGwnO1xuICBjb21wZXRlbmN5Q292ZXJlZENvdW50ID0gMFxuICBvdmVyYWxsQ292ZXJhZ2U6IGFueSA9IDBcbiAgYmVoYXZpb3JhbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSAwXG4gIGJlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llcyA9IDBcbiAgYmVoYXZpb3JhbENvdmVyYWdlOiBhbnkgPSAwXG4gIGZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ID0gMFxuICBmdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXMgPSAwXG4gIGZ1bmN0aW9uYWxDb3ZlcmFnZTogYW55ID0gMFxuICBkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50ID0gMFxuICBkb21haW5Ub3RhbENvbXBldGVuY2llcyA9IDBcbiAgZG9tYWluQ292ZXJhZ2U6IGFueSA9IDBcbiAgY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5ID0gW11cbiAgY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5ID0gW11cbiAgbWVudUl0ZW1zID0gW1xuICAgIHsga2V5OiAnYWxsJywgbGFiZWw6ICdBbGwgQ2F0ZWdvcmllcycgfSxcbiAgICB7IGtleTogJ2JlaGF2aW9yYWwnLCBsYWJlbDogJ0JlaGF2aW91cmFsJyB9LFxuICAgIHsga2V5OiAnZnVuY3Rpb25hbCcsIGxhYmVsOiAnRnVuY3Rpb25hbCcgfSxcbiAgICB7IGtleTogJ2RvbWFpbicsIGxhYmVsOiAnRG9tYWluJyB9XG4gIF07XG4gIGJlaGF2aW91cmFsTm90TWF0Y2hlZCA9IFtdXG4gIGZ1bmN0aW9uYWxOb3RNYXRjaGVkID0gW11cbiAgZG9tYWluTm90TWF0Y2hlZCA9IFtdXG4gIHNlbGVjdGVkVGhlbWVGaWx0ZXIgPSAnJ1xuICBvcmlnaW5hbEZpbHRlcmVkQ291cnNlcyA9IFtdXG4gIGlzUmVnZW5lcmF0aW5nID0gZmFsc2VcbiAgaXNQREZEb3dubG9hZCA9IGZhbHNlXG4gIGJlaGF2aW91cmFsTWF0Y2hlZCA9IFtdXG4gIGZ1bmN0aW9uYWxNYXRjaGVkID0gW11cbiAgZG9tYWluTWF0Y2hlZCA9IFtdXG4gIGZpbHRlckZvcm0hOiBGb3JtR3JvdXA7XG4gIGNvbXBldGVuY2llc1R5cGUgPSBbJ0FsbCcsICdCZWhhdmlvdXJhbCcsICdGdW5jdGlvbmFsJywgJ0RvbWFpbiddXG4gIHJhdGluZ3MgPSBbJzQuNSBhbmQgYWJvdmUnLCAnNC4wIGFuZCBhYm92ZScsICczLjUgYW5kIGFib3ZlJywgJzIuNSBhbmQgYWJvdmUnLCAnMSBhbmQgYWJvdmUnXTtcbiAgbGFuZ3VhZ2VzID0gWydFbmdsaXNoJywgJ0hpbmRpJywgJ1RhbWlsJywgJ0thbm5hZGEnLCAnVGVsdWd1JywgJ01hbGF5YWxhbScsICdBc3NhbWVzZScsICdCZW5nYWxpJywgJ0d1amFyYXRpJywgJ01hcmF0aGknLCAnT2RpYScsICdQdW5qYWJpJywgJ0tvbmthbmknLCAnQm9kbycsICdEb2dyaScsICdLYXNobWlyaScsICdNYWl0aGlsaScsICdNYW5pcHVyaScsICdOZXBhbGknLCAnU2Fuc2tyaXQnLCAnU2FudGFsaScsICdTaW5kaGknLCAnVXJkdSddO1xuICBkdXJhdGlvbnMgPSBbJzwgMSBIb3VyJywgJzEtNSBIb3VycycsICc1KyBIb3VycyddO1xuICBwcm92aWRlcnMgPSBbXTtcbiAgZmlsdGVyZWRDb21wZXRlbmN5ID0gWy4uLnRoaXMuY29tcGV0ZW5jaWVzVHlwZV07XG4gIGZpbHRlcmVkUmF0aW5ncyA9IFsuLi50aGlzLnJhdGluZ3NdO1xuICBmaWx0ZXJlZExhbmd1YWdlcyA9IFsuLi50aGlzLmxhbmd1YWdlc107XG4gIGZpbHRlcmVkRHVyYXRpb25zID0gWy4uLnRoaXMuZHVyYXRpb25zXTtcbiAgZmlsdGVyZWRQcm92aWRlcnMgPSBbLi4udGhpcy5wcm92aWRlcnNdO1xuICBmdWxsQ291cnNlTGlzdCA9IFtdXG4gIC8vIFNlbGVjdGVkIGZpbHRlcnNcbiAgc2VsZWN0ZWRDb21wZXRlbmN5ID0gJ0FsbCc7XG4gIHNlbGVjdGVkUmF0aW5nOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0ZWRMYW5ndWFnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkRHVyYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzZWxlY3RlZFByb3ZpZGVyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgZmlyc3RBcGlSZXNwb25zZTogYW55ID0gbnVsbFxuICBleGlzdGluZ1JlY29tbWVuZGF0aW9uRm91bmQgPSBmYWxzZTtcbiAgc2VsZWN0Q2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9IGNhdGVnb3J5O1xuICAgIHRoaXMuZ2FwQW5hbHlzaXNTdGF0cygpXG4gIH1cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb21wZXRlbmN5OiBbW11dLFxuICAgICAgcmF0aW5nOiBbW11dLFxuICAgICAgbGFuZ3VhZ2U6IFtbXV0sXG4gICAgICBkdXJhdGlvbjogW1tdXSxcbiAgICAgIHByb3ZpZGVyOiBbW11dXG4gICAgfSk7XG4gICAgdGhpcy5sb2FkQ29tcG9uZW50RGF0YSgpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIodmFsdWU6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCd0aGlzLnNlYXJjaFRleHQnLCB2YWx1ZSlcbiAgICB0aGlzLnNlYXJjaFRleHQgPSB2YWx1ZVxuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLmZpbHRlckRhdGEodGhpcy5zZWFyY2hUZXh0KTtcbiAgfVxuXG4gIHNlYXJjaERhdGEoKSB7XG4gICAgLy8gIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLmZpbHRlckRhdGEodGhpcy5zZWFyY2hUZXh0KTtcbiAgfVxuXG4gIHNlbGVjdGVkRmlsdGVyQ291cnNlcyhldmVudCwgaXRlbSkge1xuICAgIGNvbnNvbGUubG9nKCdldmVudCcsIGV2ZW50KVxuICAgIGNvbnNvbGUubG9nKCdpdGVtJywgaXRlbSlcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5pbmRleE9mKGl0ZW0/LmlkZW50aWZpZXIpIDwgMCkge1xuICAgICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMucHVzaChpdGVtPy5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5maW5kSW5kZXgoXG4gICAgICAgIGNvbnRyb2wgPT4gY29udHJvbCA9PT0gaXRlbS5pZGVudGlmaWVyXG4gICAgICApO1xuXG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzJywgdGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzKVxuICB9XG5cbiAgY2xvc2VEaWFsb2coKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICB9XG5cbiAgc2F2ZUNvdXJzZXMoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLnBsYW5EYXRhJywgdGhpcy5wbGFuRGF0YSlcbiAgICBsZXQgcmVxQm9keSA9IHtcbiAgICAgIFwicm9sZV9tYXBwaW5nX2lkXCI6IHRoaXMucGxhbkRhdGEuaWQsXG4gICAgICBcInJlY29tbWVuZGVkX2NvdXJzZV9pZFwiOiB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCxcbiAgICAgIFwiY291cnNlX2lkZW50aWZpZXJzXCI6IHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlc1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygncmVxQm9keSwgJywgcmVxQm9keSlcbiAgICBpZiAodGhpcy5tb2RlID09PSAnYWRkJykge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNhdmVDb3Vyc2UocmVxQm9keSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3NhdmVkJylcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NvdXJzZXMgU2F2ZWQgU3VjY2Vzc2Z1bGx5JywgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICAgICAgICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgaGVyZVxuICAgICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgICAgLy90aGlzLmdldFxuICAgICAgICAgIC8vIE9yIHlvdSBjYW4gc2V0IGEgVUkgZXJyb3IgbWVzc2FnZSB2YXJpYWJsZVxuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY2JwX3BsYW5faWQpIHtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwZGF0ZUNvdXJzZShyZXFCb2R5LCB0aGlzLmNicF9wbGFuX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzOicsIHJlcyk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3NhdmVkJylcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignQ291cnNlcyBVcGRhdGVkIFN1Y2Nlc3NmdWxseScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpXG4gICAgICAgICAgICAvLyBIYW5kbGUgNDA5IENvbmZsaWN0IGhlcmVcbiAgICAgICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgICAgICAvL3RoaXMuZ2V0XG4gICAgICAgICAgICAvLyBPciB5b3UgY2FuIHNldCBhIFVJIGVycm9yIG1lc3NhZ2UgdmFyaWFibGVcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIC8vdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiBjYnBfcGxhbl9pZCBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NicF9wbGFuX2lkIGlzIG5vdCBhdmFpbGFibGUgZm9yIHVwZGF0ZSBvcGVyYXRpb24nKTtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gdXBkYXRlIGNvdXJzZXM6IG1pc3NpbmcgcGxhbiBJRCcsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIH1cblxuICB9XG5cbiAgZ2V0Q291cnNlcygpIHtcbiAgICBsZXQgcm9sZV9tYXBwaW5nX2lkID0gdGhpcy5wbGFuRGF0YS5pZFxuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Q291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgLy8gU3VjY2VzcyBoYW5kbGluZ1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICB0aGlzLmNicF9wbGFuX2lkID0gcmVzPy5pZFxuICAgICAgICBpZiAocmVzICYmIHJlcz8uc2VsZWN0ZWRfY291cnNlcyAmJiByZXM/LnNlbGVjdGVkX2NvdXJzZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMubW9kZSA9ICdlZGl0J1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzPy5zZWxlY3RlZF9jb3Vyc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMucHVzaChyZXMuc2VsZWN0ZWRfY291cnNlc1tpXT8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgaGVyZVxuICAgICAgICAvLyBhbGVydCgnQ29uZmxpY3QgZGV0ZWN0ZWQ6IFRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBvciBhY3Rpb24gY29uZmxpY3RzLicpO1xuICAgICAgICAvL3RoaXMuZ2V0XG4gICAgICAgIC8vIE9yIHlvdSBjYW4gc2V0IGEgVUkgZXJyb3IgbWVzc2FnZSB2YXJpYWJsZVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIC8vdGhpcy5hbHJlYWR5QXZhaWxhYmxlUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgIH1cblxuXG4gICAgfSlcbiAgfVxuICBnZXRTdWdnZXN0ZWRDb3Vyc2UoKSB7XG4gICAgbGV0IHJvbGVfbWFwcGluZ19pZCA9IHRoaXMucGxhbkRhdGEuaWRcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFN1Z2dlc3RlZENvdXJzZXMocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAvLyBTdWNjZXNzIGhhbmRsaW5nXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnNvbGUubG9nKCdnZXRTdWdnZXN0ZWRDb3Vyc2VzIHJlcycsIHJlcylcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZmlsdGVyZENvdXJzZXMnLCB0aGlzLmZpbHRlcmRDb3Vyc2VzKVxuICAgICAgICAvLyBTdG9yZSBzdWdnZXN0ZWQgY291cnNlcyBzZXBhcmF0ZWx5XG4gICAgICAgIHRoaXMuc3VnZ2VzdGVkQ291cnNlcyA9IFsuLi5yZXNdO1xuXG4gICAgICAgIC8vIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgdG8gaW5jbHVkZSBhbGwgY291cnNlIHR5cGVzXG4gICAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkQ291cnNlcygpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBnYXAgYW5hbHlzaXMgc3RhdHMgYWZ0ZXIgc3VnZ2VzdGVkIGNvdXJzZXMgYXJlIGFkZGVkXG4gICAgICAgIHRoaXMudXBkYXRlR2FwQW5hbHlzaXNBZnRlckNvdXJzZXNVcGRhdGUoKVxuICAgICAgICAvL3RoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcilcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1VuYXV0aG9yaXplZCBhY2Nlc3MgLSB1c2VyIHdpbGwgYmUgcmVkaXJlY3RlZCB0byBsb2dpbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEhhbmRsZSBvdGhlciBlcnJvcnMgZ3JhY2VmdWxseVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHN1Z2dlc3RlZCBjb3Vyc2VzJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3IgeW91IGNhbiBzZXQgYSBVSSBlcnJvciBtZXNzYWdlIHZhcmlhYmxlXG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfVxuXG5cbiAgICB9KVxuICB9XG5cbiAgZ2V0VXNlckNvdXJzZSgpIHtcbiAgICBsZXQgcm9sZV9tYXBwaW5nX2lkID0gdGhpcy5wbGFuRGF0YS5pZFxuICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0VXNlckNvdXJzZShyb2xlX21hcHBpbmdfaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgY29uc29sZS5sb2coJ2dldFVzZXJDb3Vyc2UgQVBJIHJlc3BvbnNlOicsIHJlcylcbiAgICAgICAgY29uc29sZS5sb2coJ0N1cnJlbnQgZmlsdGVyZENvdXJzZXMgYmVmb3JlIGFkZGluZyB1c2VyIGNvdXJzZXM6JywgdGhpcy5maWx0ZXJkQ291cnNlcylcblxuICAgICAgICAvLyBTdG9yZSB1c2VyLWFkZGVkIGNvdXJzZXMgc2VwYXJhdGVseSAocmVzZXQgdG8gYXZvaWQgZHVwbGljYXRlcylcbiAgICAgICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzID0gWy4uLnJlc107XG5cbiAgICAgICAgLy8gUHJvY2VzcyB1c2VyLWFkZGVkIGNvdXJzZXMgdG8gZW5zdXJlIHByb3BlciBzdHJ1Y3R1cmVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyQ291cnNlID0gcmVzW2ldO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBVc2VyIGNvdXJzZSAke2l9IGNvbXBldGVuY2llczpgLCB1c2VyQ291cnNlLmNvbXBldGVuY2llcyk7XG5cbiAgICAgICAgICAvLyBFbnN1cmUgdXNlci1hZGRlZCBjb3Vyc2VzIGhhdmUgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZSBmb3IgZGlzcGxheVxuICAgICAgICAgIGlmICh1c2VyQ291cnNlICYmICF1c2VyQ291cnNlLmNvdXJzZV90eXBlKSB7XG4gICAgICAgICAgICB1c2VyQ291cnNlLmNvdXJzZV90eXBlID0gJ1VzZXIgQWRkZWQnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCBpZGVudGlmaWVyIGlmIG1pc3NpbmcgKG5lZWRlZCBmb3IgY291cnNlIHNlbGVjdGlvbiBsb2dpYylcbiAgICAgICAgICBpZiAodXNlckNvdXJzZSAmJiAhdXNlckNvdXJzZS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICB1c2VyQ291cnNlLmlkZW50aWZpZXIgPSB1c2VyQ291cnNlLmlkIHx8IGB1c2VyX2NvdXJzZV8ke2l9XyR7RGF0ZS5ub3coKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgdG8gaW5jbHVkZSBhbGwgY291cnNlIHR5cGVzXG4gICAgICAgIHRoaXMucmVidWlsZEZpbHRlcmVkQ291cnNlcygpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdmaWx0ZXJkQ291cnNlcyBhZnRlciBhZGRpbmcgdXNlciBjb3Vyc2VzOicsIHRoaXMuZmlsdGVyZENvdXJzZXMpO1xuICAgICAgICAvL3RoaXMuc3VjY2Vzc1JvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcilcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy8gSGFuZGxlIDQwOSBDb25mbGljdCBoZXJlXG4gICAgICAgIC8vIGFsZXJ0KCdDb25mbGljdCBkZXRlY3RlZDogVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIG9yIGFjdGlvbiBjb25mbGljdHMuJyk7XG4gICAgICAgIC8vdGhpcy5nZXRcbiAgICAgICAgLy8gT3IgeW91IGNhbiBzZXQgYSBVSSBlcnJvciBtZXNzYWdlIHZhcmlhYmxlXG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfVxuXG5cbiAgICB9KVxuICB9XG5cbiAgY2hlY2tJZkNvdXJzZUV4aXN0cyhpdGVtKSB7XG4gICAgbGV0IGZsYWcgPSBmYWxzZVxuICAgIGlmICh0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMuaW5kZXhPZihpdGVtPy5pZGVudGlmaWVyKSA+IC0xKSB7XG4gICAgICBmbGFnID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmxhZ1xuICB9XG5cbiAgc2VsZWN0QWxsQ291cnNlcyhldmVudCkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVyZENvdXJzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zZWxlY3RGaWx0ZXJDb3Vyc2VzLnB1c2godGhpcy5maWx0ZXJkQ291cnNlc1tpXS5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdEZpbHRlckNvdXJzZXMgPSBbXVxuXG4gICAgfVxuICAgIGlmICh0aGlzLmNicF9wbGFuX2lkKSB7XG4gICAgICB0aGlzLm1vZGUgPSAndXBkYXRlJ1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGUgPSAnYWRkJ1xuICAgIH1cblxuXG4gIH1cbiAgZ2V0U2VjdG9ycyhzZWN0b3IpIHtcbiAgICBpZiAoc2VjdG9yICYmIHNlY3Rvci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNlY3RvcikgPyBzZWN0b3Iuam9pbignLyAnKSA6ICcnXG4gICAgfVxuXG4gIH1cblxuICBmaWx0ZXJEYXRhKHNlYXJjaFRleHQ6IHN0cmluZyk6IGFueVtdIHtcbiAgICBjb25zdCBmaWx0ZXIgPSBzZWFyY2hUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLm9yaWdpbmFsRGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IHRoaXMuZmxhdHRlbk9iamVjdFRvU3RyaW5nKGl0ZW0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gc3RyaW5naWZpZWQuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnNvcnRDb3Vyc2VzQnlDYXRlZ29yeUFuZFJlbGV2YW5jeShmaWx0ZXJlZCk7XG4gIH1cblxuICBmbGF0dGVuT2JqZWN0VG9TdHJpbmcob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSAnJztcblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgJyArIHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgdmFsO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnICcgKyB0aGlzLmZsYXR0ZW5PYmplY3RUb1N0cmluZyh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgJyArIHRoaXMuZmxhdHRlbk9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3VnZ2VzdE1vcmVDb3Vyc2VzKCkge1xuICAgIC8vIHRoaXMuZGlhbG9nUmVmLmNsb3NlKClcbiAgICBjb25zdCBkaWFsb2dSZWZOZXcgPSB0aGlzLmRpYWxvZy5vcGVuKFN1Z2dlc3RNb3JlQ291cnNlc0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMTAwcHgnLFxuICAgICAgZGF0YTogeyByZWNvbW1lbmRlZF9jb3Vyc2VfaWQ6IHRoaXMucmVjb21tZW5kZWRfY291cnNlX2lkLCByb2xlX21hcHBpbmdfaWQ6IHRoaXMucGxhbkRhdGEuaWQgfSxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmTmV3LmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbihlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnR2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICAvLyB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQgPSBlbGVtZW50XG4gICAgY29uc29sZS5sb2coJ0VkaXQgUm9sZSBNYXBwaW5nIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICAvLyBOYXZpZ2F0ZSBvciBvcGVuIG1vZGFsXG4gICAgY29uc29sZS5sb2coJ1ZpZXcgQ0JQIFBsYW4gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oR2VuZXJhdGVDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlcih0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gcmVzXG4gICAgICAgICAgICAvLyB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcztcbiAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJyx0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlOiBzdHJpbmcsIGluZGV4KTogYW55W10ge1xuICAgIGNvbnN0IGNvdXJzZSA9IHRoaXMuZmlsdGVyZENvdXJzZXNbaW5kZXhdO1xuICAgIGlmICghY291cnNlKSB7XG4gICAgICBjb25zb2xlLmxvZyhgTm8gY291cnNlIGZvdW5kIGF0IGluZGV4ICR7aW5kZXh9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgLy8gQUkgUmVjb21tZW5kZWQgJiBQdWJsaWMgY291cnNlcyB1c2UgJ2NvbXBldGVuY2llcydcbiAgICAvLyBNYW51YWxseSBTdWdnZXN0ZWQgLSBpR09UIGNvdXJzZXMgdXNlICdjb21wZXRlbmNpZXNfdjYnXG4gICAgLy8gVXNlciBBZGRlZCBjb3Vyc2VzIHVzZSAnY29tcGV0ZW5jaWVzJ1xuICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICBpZiAoY291cnNlLmNvbXBldGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXMpKSB7XG4gICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgLy8gIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIHVzaW5nICdjb21wZXRlbmNpZXMnIHByb3BlcnR5OmAsIGNvbXBldGVuY2llcyk7XG4gICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgQ291cnNlICR7aW5kZXh9ICgke2NvdXJzZS5jb3Vyc2VfdHlwZSB8fCBjb3Vyc2UubmFtZSB8fCAnVW5rbm93bid9KSB1c2luZyAnY29tcGV0ZW5jaWVzX3Y2JyBwcm9wZXJ0eTpgLCBjb21wZXRlbmNpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgQ291cnNlICR7aW5kZXh9ICgke2NvdXJzZS5jb3Vyc2VfdHlwZSB8fCBjb3Vyc2UubmFtZSB8fCAnVW5rbm93bid9KSBoYXMgbm8gdmFsaWQgY29tcGV0ZW5jaWVzIHByb3BlcnR5OmAsIHtcbiAgICAgIC8vICAgaGFzQ29tcGV0ZW5jaWVzOiAhIWNvdXJzZS5jb21wZXRlbmNpZXMsXG4gICAgICAvLyAgIGNvbXBldGVuY2llc1R5cGU6IHR5cGVvZiBjb3Vyc2UuY29tcGV0ZW5jaWVzLFxuICAgICAgLy8gICBoYXNDb21wZXRlbmNpZXNWNjogISFjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2LFxuICAgICAgLy8gICBjb21wZXRlbmNpZXNWNlR5cGU6IHR5cGVvZiBjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2LFxuICAgICAgLy8gICBjb3Vyc2VLZXlzOiBPYmplY3Qua2V5cyhjb3Vyc2UpXG4gICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBpZiAoY29tcGV0ZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gIGNvbnNvbGUubG9nKGBObyBjb21wZXRlbmNpZXMgZm91bmQgZm9yIGNvdXJzZSAke2luZGV4fSBhbmQgdHlwZSAke3R5cGV9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIGZvciBjb21wYXJpc29uIChjYXNlLWluc2Vuc2l0aXZlICsgaGFuZGxlIHNwZWxsaW5nIHZhcmlhdGlvbnMpXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgY29uc3QgbWF0Y2hlZENvbXBldGVuY2llcyA9IGNvbXBldGVuY2llcy5maWx0ZXIoYyA9PiB7XG4gICAgICBpZiAoIWMgfHwgIWMuY29tcGV0ZW5jeUFyZWFOYW1lKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJbnZhbGlkIGNvbXBldGVuY3kgc3RydWN0dXJlIGluIGNvdXJzZSAke2luZGV4fTpgLCBjKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wZXRlbmN5QXJlYSA9IGMuY29tcGV0ZW5jeUFyZWFOYW1lLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAvLyBIYW5kbGUgYm90aCBcImJlaGF2aW9yYWxcIiBhbmQgXCJiZWhhdmlvdXJhbFwiIHNwZWxsaW5nc1xuICAgICAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSAnYmVoYXZpb3VyYWwnIHx8IG5vcm1hbGl6ZWRUeXBlID09PSAnYmVoYXZpb3JhbCcpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBldGVuY3lBcmVhID09PSAnYmVoYXZpb3JhbCcgfHwgY29tcGV0ZW5jeUFyZWEgPT09ICdiZWhhdmlvdXJhbCc7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBvdGhlciB0eXBlcywgZG8gY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uXG4gICAgICByZXR1cm4gY29tcGV0ZW5jeUFyZWEgPT09IG5vcm1hbGl6ZWRUeXBlO1xuICAgIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coYEZvdW5kICR7bWF0Y2hlZENvbXBldGVuY2llcy5sZW5ndGh9IGNvbXBldGVuY2llcyBvZiB0eXBlICR7dHlwZX0gZm9yIGNvdXJzZSAke2luZGV4fTpgLCBtYXRjaGVkQ29tcGV0ZW5jaWVzKTtcbiAgICByZXR1cm4gbWF0Y2hlZENvbXBldGVuY2llcztcbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5QmVodmlvdXJhbFR5cGUoaW5kZXgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdXJzZSA9IHRoaXMuZmlsdGVyZENvdXJzZXNbaW5kZXhdO1xuICAgIGlmICghY291cnNlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llcykpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXM7XG4gICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBldGVuY2llcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGV0ZW5jaWVzXG4gICAgICAuZmlsdGVyKGMgPT4gYyAmJiAoYy5jb21wZXRlbmN5QXJlYU5hbWUgPT09ICdCZWhhdmlvcmFsJyB8fCBjLmNvbXBldGVuY3lBcmVhTmFtZSA9PT0gJ0JlaGF2aW91cmFsJykpXG4gICAgICAubWFwKGMgPT4gYCR7Yy5jb21wZXRlbmN5VGhlbWVOYW1lIHx8ICcnfSAtICR7Yy5jb21wZXRlbmN5U3ViVGhlbWVOYW1lIHx8ICcnfWApXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxuXG4gIGdldERpc3BsYXllZENvbXBldGVuY2llcyh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgY29uc3QgY29tcGV0ZW5jaWVzID0gdGhpcy5nZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZSwgaW5kZXgpO1xuICAgIGNvbnN0IGtleSA9IGAke2luZGV4fS0ke3R5cGV9YDtcblxuICAgIGlmICh0aGlzLmV4cGFuZGVkQ29tcGV0ZW5jaWVzW2tleV0pIHtcbiAgICAgIHJldHVybiBjb21wZXRlbmNpZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBldGVuY2llcy5zbGljZSgwLCAyKTtcbiAgfVxuXG4gIHRvZ2dsZUNvbXBldGVuY2llcyh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG4gICAgdGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldID0gIXRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XTtcbiAgfVxuXG4gIGlzRXhwYW5kZWQodHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2V5ID0gYCR7aW5kZXh9LSR7dHlwZX1gO1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkQ29tcGV0ZW5jaWVzW2tleV0gfHwgZmFsc2U7XG4gIH1cblxuICBoYXNNb3JlVGhhblR3byh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZSwgaW5kZXgpLmxlbmd0aCA+IDI7XG4gIH1cblxuICBnZXRSZW1haW5pbmdDb3VudCh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHRvdGFsQ291bnQgPSB0aGlzLmdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlLCBpbmRleCkubGVuZ3RoO1xuICAgIHJldHVybiB0b3RhbENvdW50IC0gMjtcbiAgfVxuXG4gIG9uT3V0ZXJUYWJDaGFuZ2UoZXZlbnQ6IE1hdFRhYkNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vdXRlclRhYkFjdGl2ZUluZGV4ID0gZXZlbnQuaW5kZXhcbiAgICB0aGlzLm91dGVyVGFiQWN0aXZlVGV4dCA9IGV2ZW50LnRhYi50ZXh0TGFiZWxcbiAgICBjb25zb2xlLmxvZygnT3V0ZXIgVGFiIEluZGV4OicsIGV2ZW50LmluZGV4KTtcbiAgICBjb25zb2xlLmxvZygnT3V0ZXIgVGFiIExhYmVsOicsIGV2ZW50LnRhYi50ZXh0TGFiZWwpO1xuICAgIGlmIChldmVudC5pbmRleCA9PT0gMSkge1xuICAgICAgdGhpcy5nYXBBbmFseXNpc1N0YXRzKClcbiAgICB9XG4gICAgaWYgKGV2ZW50LmluZGV4ID09PSAwKSB7XG4gICAgICAvLyB0aGlzLmdldENvdXJzZXMoKVxuICAgICAgLy8gdGhpcy5nZXRTdWdnZXN0ZWRDb3Vyc2UoKVxuICAgICAgdGhpcy5nZXRVc2VyQ291cnNlKClcbiAgICB9XG4gIH1cblxuICBvbklubmVyVGFiQ2hhbmdlKGV2ZW50OiBNYXRUYWJDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9IGV2ZW50LmluZGV4XG4gICAgdGhpcy5pbm5lclRhYkFjdGl2ZVRleHQgPSBldmVudC50YWIudGV4dExhYmVsXG4gICAgdGhpcy5zZWxlY3RlZFRoZW1lRmlsdGVyID0gJyc7IC8vIFJlc2V0IHRoZW1lIGZpbHRlciB3aGVuIHN3aXRjaGluZyB0YWJzXG4gICAgY29uc29sZS5sb2coJ0lubmVyIFRhYiBJbmRleDonLCBldmVudC5pbmRleCk7XG4gICAgY29uc29sZS5sb2coJ0lubmVyIFRhYiBMYWJlbDonLCBldmVudC50YWIudGV4dExhYmVsKTtcbiAgICBsZXQgdGFiSW5kZXggPSBldmVudC5pbmRleFxuICAgIHRoaXMuY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5ID0gW11cblxuICAgIC8vIEdldCBhbGwgYXZhaWxhYmxlIGNvdXJzZXMgKG9yaWdpbmFsICsgc3VnZ2VzdGVkICsgdXNlciBhZGRlZClcbiAgICBjb25zdCBhbGxBdmFpbGFibGVDb3Vyc2VzID0gdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCk7XG5cblxuXG4gICAgc3dpdGNoICh0YWJJbmRleCkge1xuICAgICAgY2FzZSAwOiAvLyBBbGxcbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IGFsbEF2YWlsYWJsZUNvdXJzZXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAvLyBCZWhhdmlvcmFsXG4gICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLnNvcnRDb3Vyc2VzQnlSZWxldmFuY3kodGhpcy5iZWhhdmlvcmFsRmlsdGVyKGFsbEF2YWlsYWJsZUNvdXJzZXMpKTtcbiAgICAgICAgdGhpcy5jb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnkgPSB0aGlzLmJlaGF2aW9yYWxDb21wZXRlbmN5RmlsdGVyKHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6IC8vIEZ1bmN0aW9uYWxcbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeVJlbGV2YW5jeSh0aGlzLmZ1bmN0aW9uYWxGaWx0ZXIoYWxsQXZhaWxhYmxlQ291cnNlcykpO1xuICAgICAgICB0aGlzLmNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeSA9IHRoaXMuZnVuY3Rpb25hbENvbXBldGVuY3lGaWx0ZXIodGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzogLy8gRG9tYWluXG4gICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSB0aGlzLnNvcnRDb3Vyc2VzQnlSZWxldmFuY3kodGhpcy5kb21haW5GaWx0ZXIoYWxsQXZhaWxhYmxlQ291cnNlcykpO1xuICAgICAgICB0aGlzLmNvbXBldGVuY3lNYXRjaGVkQnlDYXRlZ29yeSA9IHRoaXMuZG9tYWluQ29tcGV0ZW5jeUZpbHRlcih0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5maWx0ZXJkQ291cnNlcycsIHRoaXMuZmlsdGVyZENvdXJzZXMpXG4gICAgY29uc29sZS5sb2coJ3RoaXMuY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5JywgdGhpcy5jb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnkpXG4gIH1cblxuICBnZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCkge1xuICAgIC8vIFN0YXJ0IHdpdGggb3JpZ2luYWwgZGF0YSAoQUkgcmVjb21tZW5kZWQgY291cnNlcylcbiAgICBjb25zdCBhbGxDb3Vyc2VzID0gWy4uLnRoaXMub3JpZ2luYWxEYXRhXTtcbiAgICBjb25zdCBzZWVuSWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBUcmFjayBvcmlnaW5hbCBjb3Vyc2UgaWRlbnRpZmllcnNcbiAgICB0aGlzLm9yaWdpbmFsRGF0YS5mb3JFYWNoKGNvdXJzZSA9PiB7XG4gICAgICBpZiAoY291cnNlLmlkZW50aWZpZXIpIHNlZW5JZGVudGlmaWVycy5hZGQoY291cnNlLmlkZW50aWZpZXIpO1xuICAgICAgaWYgKGNvdXJzZS5pZCkgc2VlbklkZW50aWZpZXJzLmFkZChjb3Vyc2UuaWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIHN1Z2dlc3RlZCBjb3Vyc2VzIChpR09UIHBsYXRmb3JtIGNvdXJzZXMpXG4gICAgdGhpcy5zdWdnZXN0ZWRDb3Vyc2VzLmZvckVhY2goY291cnNlID0+IHtcbiAgICAgIGNvbnN0IGNvdXJzZUlkID0gY291cnNlLmlkZW50aWZpZXIgfHwgY291cnNlLmlkO1xuICAgICAgaWYgKGNvdXJzZUlkICYmICFzZWVuSWRlbnRpZmllcnMuaGFzKGNvdXJzZUlkKSkge1xuICAgICAgICBhbGxDb3Vyc2VzLnB1c2goY291cnNlKTtcbiAgICAgICAgc2VlbklkZW50aWZpZXJzLmFkZChjb3Vyc2VJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdXNlci1hZGRlZCBjb3Vyc2VzXG4gICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzLmZvckVhY2goY291cnNlID0+IHtcbiAgICAgIGNvbnN0IGNvdXJzZUlkID0gY291cnNlLmlkZW50aWZpZXIgfHwgY291cnNlLmlkO1xuICAgICAgaWYgKGNvdXJzZUlkICYmICFzZWVuSWRlbnRpZmllcnMuaGFzKGNvdXJzZUlkKSkge1xuICAgICAgICAvLyBFbnN1cmUgdXNlci1hZGRlZCBjb3Vyc2VzIGhhdmUgcHJvcGVyIHN0cnVjdHVyZVxuICAgICAgICBpZiAoIWNvdXJzZS5jb3Vyc2VfdHlwZSkge1xuICAgICAgICAgIGNvdXJzZS5jb3Vyc2VfdHlwZSA9ICdVc2VyIEFkZGVkJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvdXJzZS5pZGVudGlmaWVyICYmIGNvdXJzZS5pZCkge1xuICAgICAgICAgIGNvdXJzZS5pZGVudGlmaWVyID0gY291cnNlLmlkO1xuICAgICAgICB9XG4gICAgICAgIGFsbENvdXJzZXMucHVzaChjb3Vyc2UpO1xuICAgICAgICBzZWVuSWRlbnRpZmllcnMuYWRkKGNvdXJzZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCdnZXRBbGxBdmFpbGFibGVDb3Vyc2VzIGJyZWFrZG93bjonLCB7XG4gICAgICBvcmlnaW5hbERhdGE6IHRoaXMub3JpZ2luYWxEYXRhLmxlbmd0aCxcbiAgICAgIHN1Z2dlc3RlZENvdXJzZXM6IHRoaXMuc3VnZ2VzdGVkQ291cnNlcy5sZW5ndGgsXG4gICAgICB1c2VyQWRkZWRDb3Vyc2VzOiB0aGlzLnVzZXJBZGRlZENvdXJzZXMubGVuZ3RoLFxuICAgICAgdG90YWxBdmFpbGFibGU6IGFsbENvdXJzZXMubGVuZ3RoXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnYWxsQ291cnNlcy0tJywgYWxsQ291cnNlcylcbiAgICBhbGxDb3Vyc2VzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtICYmIGl0ZW0ub3JnYW5pc2F0aW9uICYmIGl0ZW0ub3JnYW5pc2F0aW9uLmxlbmd0aCkge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJlZFByb3ZpZGVycy5pbmRleE9mKGl0ZW0ub3JnYW5pc2F0aW9uWzBdKSA8IDApIHtcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkUHJvdmlkZXJzLnB1c2goaXRlbS5vcmdhbmlzYXRpb25bMF0pXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pXG4gICAgY29uc3Qgc29ydGVkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeUNhdGVnb3J5QW5kUmVsZXZhbmN5KGFsbENvdXJzZXMpXG4gICAgdGhpcy5mdWxsQ291cnNlTGlzdCA9IHNvcnRlZENvdXJzZXNcbiAgICBsZXQgaWRlbnRpZmllcnNBcnIgPSBbXVxuICAgIHNvcnRlZENvdXJzZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBpZGVudGlmaWVyc0Fyci5wdXNoKGl0ZW0/LmlkZW50aWZpZXIpXG4gICAgfSlcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0QWRkaXRpb25hbFBhcmFtZXRlcmZvclN1Z2dlc3RlZENvdXJzZXMoaWRlbnRpZmllcnNBcnIpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHQgJiYgcmVzcG9uc2UucmVzdWx0LmNvbnRlbnQgJiYgcmVzcG9uc2UucmVzdWx0LmNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2UucmVzdWx0LmNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZnVsbENvdXJzZUxpc3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZ1bGxDb3Vyc2VMaXN0W2pdWydpZGVudGlmaWVyJ10gPT09IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50W2ldWydpZGVudGlmaWVyJ10pIHtcbiAgICAgICAgICAgICAgdGhpcy5mdWxsQ291cnNlTGlzdFtqXVsnbGFuZ3VhZ2UnXSA9IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50W2ldWydsYW5ndWFnZSddXG4gICAgICAgICAgICAgIHRoaXMuZnVsbENvdXJzZUxpc3Rbal1bJ2F2Z1JhdGluZyddID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRbaV1bJ2F2Z1JhdGluZyddXG4gICAgICAgICAgICAgIHRoaXMuZnVsbENvdXJzZUxpc3Rbal1bJ2NvdXJzZSddID0gcmVzcG9uc2UucmVzdWx0LmNvbnRlbnRbaV1bJ25hbWUnXVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSlcbiAgICByZXR1cm4gc29ydGVkQ291cnNlcztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgYXJyYXkgd2l0aCBhbGwgYXZhaWxhYmxlIGNvdXJzZSB0eXBlc1xuICAgKiBUaGlzIGVuc3VyZXMgY29uc2lzdGVuY3kgYWNyb3NzIHRoZSBhcHBsaWNhdGlvblxuICAgKi9cbiAgcmVidWlsZEZpbHRlcmVkQ291cnNlcygpIHtcbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gdGhpcy5zb3J0Q291cnNlc0J5Q2F0ZWdvcnlBbmRSZWxldmFuY3kodGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCkpO1xuXG4gICAgY29uc29sZS5sb2coJ1JlYnVpbHQgZmlsdGVyZENvdXJzZXMgd2l0aCBhbGwgY291cnNlIHR5cGVzOicsIHtcbiAgICAgIHRvdGFsOiB0aGlzLmZpbHRlcmRDb3Vyc2VzLmxlbmd0aCxcbiAgICAgIGJyZWFrZG93bjoge1xuICAgICAgICBvcmlnaW5hbDogdGhpcy5vcmlnaW5hbERhdGEubGVuZ3RoLFxuICAgICAgICBzdWdnZXN0ZWQ6IHRoaXMuc3VnZ2VzdGVkQ291cnNlcy5sZW5ndGgsXG4gICAgICAgIHVzZXJBZGRlZDogdGhpcy51c2VyQWRkZWRDb3Vyc2VzLmxlbmd0aFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc29ydENvdXJzZXNCeVJlbGV2YW5jeShjb3Vyc2VzOiBhbnlbXSA9IFtdKTogYW55W10ge1xuICAgIHJldHVybiBbLi4uY291cnNlc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYVNjb3JlID0gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYT8ucmVsZXZhbmN5KVxuICAgICAgY29uc3QgYlNjb3JlID0gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYj8ucmVsZXZhbmN5KVxuICAgICAgcmV0dXJuIGJTY29yZSAtIGFTY29yZVxuICAgIH0pXG4gIH1cblxuICBzb3J0Q291cnNlc0J5Q2F0ZWdvcnlBbmRSZWxldmFuY3koY291cnNlczogYW55W10gPSBbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gWy4uLmNvdXJzZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGNhdGVnb3J5UHJpb3JpdHkgPSB7IGRvbWFpbjogMSwgZnVuY3Rpb25hbDogMiwgYmVoYXZpb3JhbDogMywgb3RoZXI6IDQgfTtcbiAgICAgIGNvbnN0IGFQcmlvcml0eSA9IGNhdGVnb3J5UHJpb3JpdHlbdGhpcy5nZXRDb3Vyc2VDYXRlZ29yeShhKV0gfHwgNDtcbiAgICAgIGNvbnN0IGJQcmlvcml0eSA9IGNhdGVnb3J5UHJpb3JpdHlbdGhpcy5nZXRDb3Vyc2VDYXRlZ29yeShiKV0gfHwgNDtcblxuICAgICAgaWYgKGFQcmlvcml0eSAhPT0gYlByaW9yaXR5KSB7XG4gICAgICAgIHJldHVybiBhUHJpb3JpdHkgLSBiUHJpb3JpdHk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVJlbGV2YW5jeShiPy5yZWxldmFuY3kpIC0gdGhpcy5ub3JtYWxpemVSZWxldmFuY3koYT8ucmVsZXZhbmN5KTtcbiAgICB9KVxuICB9XG5cbiAgZ2V0Q291cnNlQ2F0ZWdvcnkoY291cnNlOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbXBldGVuY2llcyA9IFtcbiAgICAgIC4uLihjb3Vyc2U/LmNvbXBldGVuY2llcyB8fCBbXSksXG4gICAgICAuLi4oY291cnNlPy5jb21wZXRlbmNpZXNfdjYgfHwgW10pXG4gICAgXTtcblxuICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBuZXcgU2V0KFxuICAgICAgY29tcGV0ZW5jaWVzXG4gICAgICAgIC5tYXAoKGM6IGFueSkgPT4gdGhpcy5ub3JtYWxpemVDb21wZXRlbmN5KGM/LmNvbXBldGVuY3lBcmVhTmFtZSkpXG4gICAgICAgIC5maWx0ZXIoKGM6IHN0cmluZykgPT4gYylcbiAgICApO1xuXG4gICAgaWYgKGNhdGVnb3JpZXMuaGFzKCdkb21haW4nKSkgcmV0dXJuICdkb21haW4nO1xuICAgIGlmIChjYXRlZ29yaWVzLmhhcygnZnVuY3Rpb25hbCcpKSByZXR1cm4gJ2Z1bmN0aW9uYWwnO1xuICAgIGlmIChjYXRlZ29yaWVzLmhhcygnYmVoYXZpb3JhbCcpKSByZXR1cm4gJ2JlaGF2aW9yYWwnO1xuXG4gICAgcmV0dXJuICdvdGhlcic7XG4gIH1cblxuICBub3JtYWxpemVSZWxldmFuY3kodmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZS50cmltKCkpXG4gICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiAtSW5maW5pdHlcbiAgICB9XG5cbiAgICByZXR1cm4gLUluZmluaXR5XG4gIH1cblxuICBiZWhhdmlvcmFsRmlsdGVyKGRhdGE6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiBkYXRhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICAgIGlmIChpdGVtLmNvbXBldGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGl0ZW0uY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBpdGVtLmNvbXBldGVuY2llcztcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS5jb21wZXRlbmNpZXNfdjYgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wZXRlbmNpZXMuc29tZShjID0+IGMgJiYgKChjPy5jb21wZXRlbmN5QXJlYU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09ICdiZWhhdmlvcmFsJykgfHwgYz8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpID09PSAnYmVoYXZpb3VyYWwnKSk7XG4gICAgfSk7XG4gIH1cblxuICBiZWhhdmlvcmFsQ29tcGV0ZW5jeUZpbHRlcihkYXRhOiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zb2xlLmxvZygnZGF0YS0tJywgZGF0YSlcbiAgICBjb25zdCBiZWhhdmlvcmFsVGhlbWVzID0gZGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGl0ZW0/LnR5cGUgJiZcbiAgICAgICAgWydiZWhhdmlvcmFsJywgJ2JlaGF2aW91cmFsJ10uaW5jbHVkZXMoaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkpXG4gICAgICApXG4gICAgICAubWFwKGl0ZW0gPT4gdGhpcy5mb3JtYXRUaGVtZVdpdGhTdWJUaGVtZShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKSlcbiAgICAgIC5maWx0ZXIoKHRoZW1lKTogdGhlbWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odGhlbWUpKTsgLy8gRW5zdXJlcyB0eXBlIHNhZmV0eVxuXG4gICAgY29uc3QgdW5pcXVlQmVoYXZpb3JhbFRoZW1lcyA9IEFycmF5LmZyb20obmV3IFNldChiZWhhdmlvcmFsVGhlbWVzKSk7XG5cbiAgICBjb25zb2xlLmxvZyh1bmlxdWVCZWhhdmlvcmFsVGhlbWVzKTtcbiAgICByZXR1cm4gdW5pcXVlQmVoYXZpb3JhbFRoZW1lcztcbiAgfVxuXG4gIGZ1bmN0aW9uYWxDb21wZXRlbmN5RmlsdGVyKGRhdGE6IGFueVtdKTogYW55IHtcbiAgICBjb25zdCBmdW5jdGlvbmFsVGhlbWVzID0gZGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGl0ZW0/LnR5cGUgJiZcbiAgICAgICAgWydmdW5jdGlvbmFsJ10uaW5jbHVkZXMoaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkpXG4gICAgICApXG4gICAgICAubWFwKGl0ZW0gPT4gdGhpcy5mb3JtYXRUaGVtZVdpdGhTdWJUaGVtZShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKSlcbiAgICAgIC5maWx0ZXIoKHRoZW1lKTogdGhlbWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odGhlbWUpKTsgLy8gRW5zdXJlcyB0eXBlIHNhZmV0eVxuXG4gICAgY29uc3QgdW5pcXVlRnVuY3Rpb25hbFRoZW1lcyA9IEFycmF5LmZyb20obmV3IFNldChmdW5jdGlvbmFsVGhlbWVzKSk7XG5cbiAgICBjb25zb2xlLmxvZyh1bmlxdWVGdW5jdGlvbmFsVGhlbWVzKTtcbiAgICByZXR1cm4gdW5pcXVlRnVuY3Rpb25hbFRoZW1lcztcblxuICAgIC8vIGNvbnNvbGUubG9nKHVuaXF1ZUNvbXBldGVuY3lBcmVhTmFtZXMpO1xuICB9XG5cbiAgZG9tYWluQ29tcGV0ZW5jeUZpbHRlcihkYXRhOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgZG9tYWluVGhlbWVzID0gZGF0YVxuICAgICAgLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGl0ZW0/LnR5cGUgJiZcbiAgICAgICAgWydkb21haW4nXS5pbmNsdWRlcyhpdGVtLnR5cGUudG9Mb3dlckNhc2UoKSlcbiAgICAgIClcbiAgICAgIC5tYXAoaXRlbSA9PiB0aGlzLmZvcm1hdFRoZW1lV2l0aFN1YlRoZW1lKGl0ZW0/LnRoZW1lLCBpdGVtPy5zdWJfdGhlbWUpKVxuICAgICAgLmZpbHRlcigodGhlbWUpOiB0aGVtZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih0aGVtZSkpOyAvLyBFbnN1cmVzIHR5cGUgc2FmZXR5XG5cbiAgICBjb25zdCB1bmlxdWVEb21haW5UaGVtZXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoZG9tYWluVGhlbWVzKSk7XG5cbiAgICBjb25zb2xlLmxvZyh1bmlxdWVEb21haW5UaGVtZXMpO1xuICAgIHJldHVybiB1bmlxdWVEb21haW5UaGVtZXM7XG5cbiAgICAvLyBjb25zb2xlLmxvZyh1bmlxdWVDb21wZXRlbmN5QXJlYU5hbWVzKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb25hbEZpbHRlcihkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoaXRlbS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llcykpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoaXRlbS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGl0ZW0uY29tcGV0ZW5jaWVzX3Y2O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzLnNvbWUoYyA9PiBjICYmIGM/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2Z1bmN0aW9uYWwnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRvbWFpbkZpbHRlcihkYXRhOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gZGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoaXRlbS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShpdGVtLmNvbXBldGVuY2llcykpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gaXRlbS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0uY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoaXRlbS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGl0ZW0uY29tcGV0ZW5jaWVzX3Y2O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzLnNvbWUoYyA9PiBjICYmIGM/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2RvbWFpbicpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2FwQW5hbHlzaXNTdGF0cygpIHtcbiAgICBjb25zb2xlLmxvZygndGhpcy5wbGFuRGF0YScsIHRoaXMucGxhbkRhdGEpXG5cbiAgICAvLyBBbHdheXMgdXNlIEFMTCBjb21wZXRlbmNpZXMgZm9yIGNhbGN1bGF0aW5nIG92ZXJhbGwgc3RhdHNcbiAgICBjb25zdCBhbGxDb21wZXRlbmNpZXMgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcztcblxuICAgIC8vIEZpbHRlciBmb3IgY2F0ZWdvcnktc3BlY2lmaWMgY2FsY3VsYXRpb25zXG4gICAgbGV0IGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXM6IGFueSA9IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdhbGwnKSB7XG4gICAgICBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICBjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS50eXBlPy50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCcpIHtcbiAgICAgIGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGU/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbicpIHtcbiAgICAgIGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMgPSB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGU/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSk7XG4gICAgfVxuXG4gICAgLy8gQ291bnQgQUxMIGNvbXBldGVuY2llcyBieSBjYXRlZ29yeSAobm90IGp1c3QgZmlsdGVyZWQgb25lcylcbiAgICBjb25zdCBtYXN0ZXJMaXN0QnlDYXRlZ29yeSA9IHsgdG90YWw6IGFsbENvbXBldGVuY2llcy5sZW5ndGgsIGJlaGF2aW91cmFsOiAwLCBmdW5jdGlvbmFsOiAwLCBkb21haW46IDAgfVxuXG4gICAgLy8gSU1QT1JUQU5UOiBVc2UgYWxsIGF2YWlsYWJsZSBjb3Vyc2VzIGZvciBjb25zaXN0ZW50IGNvdmVyYWdlIGNhbGN1bGF0aW9uXG4gICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggd2hhdCdzIGF2YWlsYWJsZSBpbiB0aGUgRmlsdGVyIEJ5IENvbXBldGVuY3kgc2VjdGlvblxuICAgIGNvbnN0IGFsbENvdXJzZUNvbXBldGVuY2llcyA9IFtdXG4gICAgY29uc3QgYWxsQXZhaWxhYmxlQ291cnNlc0ZvclN0YXRzID0gdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKCk7XG5cbiAgICBhbGxBdmFpbGFibGVDb3Vyc2VzRm9yU3RhdHMuZm9yRWFjaChjb3Vyc2UgPT4ge1xuICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb21wZXRlbmN5IHByb3BlcnR5IG5hbWVzXG4gICAgICBsZXQgY29tcGV0ZW5jaWVzID0gW107XG4gICAgICBpZiAoY291cnNlICYmIGNvdXJzZS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgfSBlbHNlIGlmIChjb3Vyc2UgJiYgY291cnNlLmNvbXBldGVuY2llc192NiAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXNfdjYpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgICB9XG5cbiAgICAgIGNvbXBldGVuY2llcy5mb3JFYWNoKChsaXN0OiBhbnkpID0+IHtcbiAgICAgICAgYWxsQ291cnNlQ29tcGV0ZW5jaWVzLnB1c2gobGlzdClcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coJ2FsbENvbXBldGVuY2llcycsIGFsbENvbXBldGVuY2llcylcbiAgICBjb25zb2xlLmxvZygnY2F0ZWdvcnlTcGVjaWZpY0NvbXBldGVuY2llcycsIGNhdGVnb3J5U3BlY2lmaWNDb21wZXRlbmNpZXMpXG4gICAgY29uc29sZS5sb2coJ2FsbENvdXJzZUNvbXBldGVuY2llcycsIGFsbENvdXJzZUNvbXBldGVuY2llcylcblxuICAgIC8vIENvdW50IGFsbCBjb21wZXRlbmNpZXMgYnkgdHlwZSBmb3IgcHJvcGVyIHRvdGFsc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsQ29tcGV0ZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wZXRlbmN5VHlwZSA9IGFsbENvbXBldGVuY2llc1tpXVsndHlwZSddPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc29sZS5sb2coYENvbXBldGVuY3kgJHtpfTogdHlwZT1cIiR7Y29tcGV0ZW5jeVR5cGV9XCIsIGRhdGE6YCwgYWxsQ29tcGV0ZW5jaWVzW2ldKTtcbiAgICAgIGlmIChjb21wZXRlbmN5VHlwZSA9PT0gJ2JlaGF2aW91cmFsJyB8fCBjb21wZXRlbmN5VHlwZSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICAgIG1hc3Rlckxpc3RCeUNhdGVnb3J5WydiZWhhdmlvdXJhbCddID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2JlaGF2aW91cmFsJ10gKyAxXG4gICAgICB9XG4gICAgICBpZiAoY29tcGV0ZW5jeVR5cGUgPT09ICdmdW5jdGlvbmFsJykge1xuICAgICAgICBtYXN0ZXJMaXN0QnlDYXRlZ29yeVsnZnVuY3Rpb25hbCddID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2Z1bmN0aW9uYWwnXSArIDFcbiAgICAgIH1cbiAgICAgIGlmIChjb21wZXRlbmN5VHlwZSA9PT0gJ2RvbWFpbicpIHtcbiAgICAgICAgbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2RvbWFpbiddID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2RvbWFpbiddICsgMVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygnbWFzdGVyTGlzdEJ5Q2F0ZWdvcnkgYWZ0ZXIgY291bnRpbmc6JywgbWFzdGVyTGlzdEJ5Q2F0ZWdvcnkpXG5cbiAgICAvLyBHZXQgbWF0Y2hpbmcgcmVzdWx0cyBmb3IgQUxMIGNvbXBldGVuY2llcyAoZm9yIG92ZXJhbGwgY292ZXJhZ2UpXG4gICAgY29uc3Qgb3ZlcmFsbFJlc3VsdCA9IHRoaXMuZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyhhbGxDb21wZXRlbmNpZXMsIGFsbENvdXJzZUNvbXBldGVuY2llcyk7XG5cbiAgICAvLyBHZXQgbWF0Y2hpbmcgcmVzdWx0cyBmb3IgY2F0ZWdvcnktc3BlY2lmaWMgY29tcGV0ZW5jaWVzIChmb3IgZmlsdGVyZWQgdmlldylcbiAgICBjb25zdCBjYXRlZ29yeVJlc3VsdCA9IHRoaXMuZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyhjYXRlZ29yeVNwZWNpZmljQ29tcGV0ZW5jaWVzLCBhbGxDb3Vyc2VDb21wZXRlbmNpZXMpO1xuXG4gICAgLy8gU2V0IGNvbXBldGVuY3lDb3ZlcmVkQ291bnQgYmFzZWQgb24gc2VsZWN0ZWQgY2F0ZWdvcnkgKGZvciB0aGUgZmlsdGVyZWQgbnVtYmVycylcbiAgICBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnYWxsJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gb3ZlcmFsbFJlc3VsdFsndG90YWwnXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICB0aGlzLmNvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSBjYXRlZ29yeVJlc3VsdFsnYmVoYXZpb3JhbCddIHx8IDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdmdW5jdGlvbmFsJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gY2F0ZWdvcnlSZXN1bHRbJ2Z1bmN0aW9uYWwnXSB8fCAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZENhdGVnb3J5ID09PSAnZG9tYWluJykge1xuICAgICAgdGhpcy5jb21wZXRlbmN5Q292ZXJlZENvdW50ID0gY2F0ZWdvcnlSZXN1bHRbJ2RvbWFpbiddIHx8IDA7XG4gICAgfVxuXG4gICAgLy8gSU1QT1JUQU5UOiBPdmVyYWxsIENvdmVyYWdlIHNob3VsZCBBTFdBWVMgYmUgYmFzZWQgb24gQUxMIGNvbXBldGVuY2llcywgbm90IGZpbHRlcmVkXG4gICAgbGV0IHRvdGFsQ29tcGV0ZW5jaWVzID0gdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMubGVuZ3RoOyAvLyBBbHdheXMgdXNlIHRvdGFsIGNvdW50XG4gICAgbGV0IG92ZXJhbGxDb3ZlcmVkQ291bnQgPSBvdmVyYWxsUmVzdWx0Wyd0b3RhbCddOyAvLyBBbHdheXMgdXNlIG92ZXJhbGwgcmVzdWx0c1xuICAgIGxldCBtYXRoUm91bmQgPSBNYXRoLnJvdW5kKChvdmVyYWxsQ292ZXJlZENvdW50IC8gdG90YWxDb21wZXRlbmNpZXMpICogMTAwKVxuICAgIHRoaXMub3ZlcmFsbENvdmVyYWdlID0gYCR7bWF0aFJvdW5kfSVgXG5cbiAgICBjb25zb2xlLmxvZygnT3ZlcmFsbCBDb3ZlcmFnZSBDYWxjdWxhdGlvbjonLCB7XG4gICAgICB0b3RhbENvbXBldGVuY2llczogdG90YWxDb21wZXRlbmNpZXMsXG4gICAgICBvdmVyYWxsQ292ZXJlZENvdW50OiBvdmVyYWxsQ292ZXJlZENvdW50LFxuICAgICAgb3ZlcmFsbENvdmVyYWdlOiB0aGlzLm92ZXJhbGxDb3ZlcmFnZSxcbiAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSxcbiAgICAgIGNvbXBldGVuY3lDb3ZlcmVkQ291bnQ6IHRoaXMuY29tcGV0ZW5jeUNvdmVyZWRDb3VudFxuICAgIH0pO1xuXG4gICAgLy8gQWx3YXlzIGNhbGN1bGF0ZSBhbGwgY2F0ZWdvcnktc3BlY2lmaWMgbWV0cmljcyByZWdhcmRsZXNzIG9mIHNlbGVjdGVkIGNhdGVnb3J5XG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGNhdGVnb3JpZXNcbiAgICAvLyBVc2Ugb3ZlcmFsbFJlc3VsdCBmb3IgY29uc2lzdGVudCBjYWxjdWxhdGlvbnMgYWNyb3NzIGFsbCBjYXRlZ29yaWVzXG4gICAgdGhpcy5iZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IG92ZXJhbGxSZXN1bHRbJ2JlaGF2aW9yYWwnXSB8fCAwO1xuICAgIHRoaXMuYmVoYXZpb3JhbFRvdGFsQ29tcGV0ZW5jaWVzID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2JlaGF2aW91cmFsJ107XG4gICAgbGV0IGJlaGF2aW9yYWxNYXRoUm91bmQgPSB0aGlzLmJlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llcyA+IDAgPyBNYXRoLnJvdW5kKCh0aGlzLmJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50IC8gdGhpcy5iZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMpICogMTAwKSA6IDA7XG4gICAgdGhpcy5iZWhhdmlvcmFsQ292ZXJhZ2UgPSBgJHtiZWhhdmlvcmFsTWF0aFJvdW5kfSVgO1xuXG4gICAgdGhpcy5mdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCA9IG92ZXJhbGxSZXN1bHRbJ2Z1bmN0aW9uYWwnXSB8fCAwO1xuICAgIHRoaXMuZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzID0gbWFzdGVyTGlzdEJ5Q2F0ZWdvcnlbJ2Z1bmN0aW9uYWwnXTtcbiAgICBsZXQgZnVuY3Rpb25hbE1hdGhSb3VuZCA9IHRoaXMuZnVuY3Rpb25hbFRvdGFsQ29tcGV0ZW5jaWVzID4gMCA/IE1hdGgucm91bmQoKHRoaXMuZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgLyB0aGlzLmZ1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llcykgKiAxMDApIDogMDtcbiAgICB0aGlzLmZ1bmN0aW9uYWxDb3ZlcmFnZSA9IGAke2Z1bmN0aW9uYWxNYXRoUm91bmR9JWA7XG5cbiAgICB0aGlzLmRvbWFpbkNvbXBldGVuY3lDb3ZlcmVkQ291bnQgPSBvdmVyYWxsUmVzdWx0Wydkb21haW4nXSB8fCAwO1xuICAgIHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMgPSBtYXN0ZXJMaXN0QnlDYXRlZ29yeVsnZG9tYWluJ107XG4gICAgbGV0IGRvbWFpbk1hdGhSb3VuZCA9IHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMgPiAwID8gTWF0aC5yb3VuZCgodGhpcy5kb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50IC8gdGhpcy5kb21haW5Ub3RhbENvbXBldGVuY2llcykgKiAxMDApIDogMDtcbiAgICB0aGlzLmRvbWFpbkNvdmVyYWdlID0gYCR7ZG9tYWluTWF0aFJvdW5kfSVgO1xuXG4gICAgY29uc29sZS5sb2coJ0FsbCBjYXRlZ29yeSBtZXRyaWNzIGNhbGN1bGF0ZWQ6Jywge1xuICAgICAgYmVoYXZpb3JhbDogeyBjb3ZlcmVkOiB0aGlzLmJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50LCB0b3RhbDogdGhpcy5iZWhhdmlvcmFsVG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLmJlaGF2aW9yYWxDb3ZlcmFnZSB9LFxuICAgICAgZnVuY3Rpb25hbDogeyBjb3ZlcmVkOiB0aGlzLmZ1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50LCB0b3RhbDogdGhpcy5mdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLmZ1bmN0aW9uYWxDb3ZlcmFnZSB9LFxuICAgICAgZG9tYWluOiB7IGNvdmVyZWQ6IHRoaXMuZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCwgdG90YWw6IHRoaXMuZG9tYWluVG90YWxDb21wZXRlbmNpZXMsIGNvdmVyYWdlOiB0aGlzLmRvbWFpbkNvdmVyYWdlIH0sXG4gICAgICBvdmVyYWxsOiB7IGNvdmVyZWQ6IG92ZXJhbGxDb3ZlcmVkQ291bnQsIHRvdGFsOiB0b3RhbENvbXBldGVuY2llcywgY292ZXJhZ2U6IHRoaXMub3ZlcmFsbENvdmVyYWdlIH0sXG4gICAgICBzZWxlY3RlZENhdGVnb3J5OiB0aGlzLnNlbGVjdGVkQ2F0ZWdvcnksXG4gICAgICBjb21wZXRlbmN5Q292ZXJlZENvdW50Rm9yQ2F0ZWdvcnk6IHRoaXMuY29tcGV0ZW5jeUNvdmVyZWRDb3VudFxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCdPdmVyYWxsIFJlc3VsdDonLCBvdmVyYWxsUmVzdWx0KTtcbiAgICBjb25zb2xlLmxvZygnQ2F0ZWdvcnkgUmVzdWx0OicsIGNhdGVnb3J5UmVzdWx0KTtcbiAgICBjb25zb2xlLmxvZygndGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnknLCB0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeSlcbiAgICB0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZCA9IHRoaXMuZ2V0Q29tcGV0ZW5jeUJ5Q2F0ZWdvcnlOb3RNYXRjaGluZygnYmVoYXZpb3JhbCcpXG4gICAgdGhpcy5mdW5jdGlvbmFsTm90TWF0Y2hlZCA9IHRoaXMuZ2V0Q29tcGV0ZW5jeUJ5Q2F0ZWdvcnlOb3RNYXRjaGluZygnZnVuY3Rpb25hbCcpXG4gICAgdGhpcy5kb21haW5Ob3RNYXRjaGVkID0gdGhpcy5nZXRDb21wZXRlbmN5QnlDYXRlZ29yeU5vdE1hdGNoaW5nKCdkb21haW4nKVxuXG4gICAgdGhpcy5nZXRCZWhhdmlvdXJhbE1hdGNoZWQoKVxuICAgIHRoaXMuZ2V0RnVuY3Rpb25hbE1hdGNoZWQoKVxuICAgIHRoaXMuZ2V0RG9tYWluTWF0Y2hlZCgpXG4gIH1cblxuICBnZXRNYXRjaGVkQ29tcGV0ZW5jeVN0YXRzKHByaW1hcnlBcnJheTogYW55W10sIHNlY29uZGFyeUFycmF5OiBhbnlbXSkge1xuICAgIC8vIENvbnZlcnQgYm90aCBhcnJheXMgdG8gZW5zdXJlIGNvbnNpc3RlbnQgY2FzaW5nXG4gICAgY29uc3QgY291bnRzOiBhbnkgPSB7XG4gICAgICBiZWhhdmlvcmFsOiAwLFxuICAgICAgZnVuY3Rpb25hbDogMCxcbiAgICAgIGRvbWFpbjogMCxcbiAgICAgIHRvdGFsOiAwXG4gICAgfTtcblxuICAgIC8vIENsZWFyIHRoZSBjb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkgYXJyYXkgZm9yIGZyZXNoIGNhbGN1bGF0aW9uXG4gICAgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkgPSBbXTtcblxuICAgIC8vIFNldCB0byBrZWVwIHRyYWNrIG9mIHVuaXF1ZSBtYXRjaGVzXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG1hdGNoZWRDb21wZXRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgcHJpbWFyeSBvZiBwcmltYXJ5QXJyYXkpIHtcbiAgICAgIGNvbnN0IHR5cGVLZXkgPSBwcmltYXJ5LnR5cGU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgY29uc3QgdGhlbWVLZXkgPSBwcmltYXJ5LnRoZW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHN1YlRoZW1lS2V5ID0gcHJpbWFyeS5zdWJfdGhlbWU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICBsZXQgaXNNYXRjaGVkID0gZmFsc2U7XG5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5IG9mIHNlY29uZGFyeUFycmF5KSB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBzZWNvbmRhcnkga2V5c1xuICAgICAgICBsZXQgc2VjVHlwZSA9IHNlY29uZGFyeT8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgbGV0IHNlY1RoZW1lID0gc2Vjb25kYXJ5Py5jb21wZXRlbmN5VGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgbGV0IHNlY1N1YlRoZW1lID0gc2Vjb25kYXJ5Py5jb21wZXRlbmN5U3ViVGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICAvLyBGaXggZm9yIGRhdGEgaW5jb25zaXN0ZW5jeVxuICAgICAgICBpZiAoc2VjVHlwZSA9PT0gJ2JlaGF2aW91cmFsJykgc2VjVHlwZSA9ICdiZWhhdmlvcmFsJztcblxuICAgICAgICAvLyBDcmVhdGUgdW5pcXVlIG1hdGNoIGtleSBmb3IgcHJpbWFyeSBjb21wZXRlbmN5XG4gICAgICAgIGNvbnN0IG1hdGNoS2V5ID0gYCR7dHlwZUtleX18JHt0aGVtZUtleX18JHtzdWJUaGVtZUtleX1gO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNyb3NzLW1hdGNoaW5nIGxvZ2ljIGFzIHJlcXVlc3RlZDpcbiAgICAgICAgLy8gMS4gUm9sZSBtYXBwaW5nIFRoZW1lIHZzIENvdXJzZSBUaGVtZVxuICAgICAgICAvLyAyLiBSb2xlIG1hcHBpbmcgU3ViIFRoZW1lIHZzIENvdXJzZSBTdWIgVGhlbWUgIFxuICAgICAgICAvLyAzLiBSb2xlIG1hcHBpbmcgVGhlbWUgdnMgQ291cnNlIFN1YiBUaGVtZVxuICAgICAgICAvLyA0LiBSb2xlIG1hcHBpbmcgU3ViIFRoZW1lIHZzIENvdXJzZSBUaGVtZVxuICAgICAgICBjb25zdCB0aGVtZVRvVGhlbWVNYXRjaCA9IHRoZW1lS2V5ID09PSBzZWNUaGVtZTtcbiAgICAgICAgY29uc3Qgc3ViVGhlbWVUb1N1YlRoZW1lTWF0Y2ggPSBzdWJUaGVtZUtleSA9PT0gc2VjU3ViVGhlbWU7XG4gICAgICAgIGNvbnN0IHRoZW1lVG9TdWJUaGVtZU1hdGNoID0gdGhlbWVLZXkgPT09IHNlY1N1YlRoZW1lO1xuICAgICAgICBjb25zdCBzdWJUaGVtZVRvVGhlbWVNYXRjaCA9IHN1YlRoZW1lS2V5ID09PSBzZWNUaGVtZTtcblxuICAgICAgICBsZXQgbWF0Y2hUeXBlID0gJyc7XG4gICAgICAgIGxldCBpc01hdGNoID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHR5cGVLZXkgPT09IHNlY1R5cGUgJiYgIXNlZW4uaGFzKG1hdGNoS2V5KSkge1xuICAgICAgICAgIGlmICh0aGVtZVRvVGhlbWVNYXRjaCkge1xuICAgICAgICAgICAgbWF0Y2hUeXBlID0gJ1RoZW1lLXRvLVRoZW1lJztcbiAgICAgICAgICAgIGlzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3ViVGhlbWVUb1N1YlRoZW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIG1hdGNoVHlwZSA9ICdTdWJUaGVtZS10by1TdWJUaGVtZSc7XG4gICAgICAgICAgICBpc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW1lVG9TdWJUaGVtZU1hdGNoKSB7XG4gICAgICAgICAgICBtYXRjaFR5cGUgPSAnVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgICAgaXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdWJUaGVtZVRvVGhlbWVNYXRjaCkge1xuICAgICAgICAgICAgbWF0Y2hUeXBlID0gJ1N1YlRoZW1lLXRvLVRoZW1lJztcbiAgICAgICAgICAgIGlzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc01hdGNoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYOKchSBNQVRDSCBGT1VORCBbJHttYXRjaFR5cGV9XTpgLCB7XG4gICAgICAgICAgICByb2xlTWFwcGluZzogeyB0eXBlOiB0eXBlS2V5LCB0aGVtZTogdGhlbWVLZXksIHN1YlRoZW1lOiBzdWJUaGVtZUtleSB9LFxuICAgICAgICAgICAgY291cnNlOiB7IHR5cGU6IHNlY1R5cGUsIHRoZW1lOiBzZWNUaGVtZSwgc3ViVGhlbWU6IHNlY1N1YlRoZW1lIH0sXG4gICAgICAgICAgICBtYXRjaFR5cGU6IG1hdGNoVHlwZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gU3RvcmUgbWF0Y2hlZCBjb21wZXRlbmN5IGluZm8gZm9yIGxhdGVyIHVzZVxuICAgICAgICAgIGxldCBvYmogPSB7fTtcbiAgICAgICAgICBvYmpbdHlwZUtleV0gPSBbdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KHRoZW1lS2V5LCBzdWJUaGVtZUtleSldO1xuICAgICAgICAgIHRoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5LnB1c2gob2JqKTtcbiAgICAgICAgICBzZWVuLmFkZChtYXRjaEtleSk7XG4gICAgICAgICAgbWF0Y2hlZENvbXBldGVuY2llcy5hZGQodGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KHRoZW1lS2V5LCBzdWJUaGVtZUtleSkpO1xuICAgICAgICAgIGlzTWF0Y2hlZCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAoY291bnRzLmhhc093blByb3BlcnR5KHR5cGVLZXkpKSB7XG4gICAgICAgICAgICBjb3VudHNbdHlwZUtleV0rKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY291bnRzW3R5cGVLZXldID0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb3VudHMudG90YWwrKztcbiAgICAgICAgICBicmVhazsgLy8gU3RvcCBsb29raW5nIGZvciBtYXRjaGVzIGZvciB0aGlzIHByaW1hcnkgY29tcGV0ZW5jeVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50cztcbiAgfVxuICBnZXRDb21wZXRlbmN5QnlDYXRlZ29yeU5vdE1hdGNoaW5nKGNhdGVnb3J5VHlwZSkge1xuICAgIC8vIEdldCBhbGwgY29tcGV0ZW5jaWVzIGZvciB0aGUgZ2l2ZW4gY2F0ZWdvcnkgZnJvbSByb2xlIG1hcHBpbmdcbiAgICBsZXQgYWxsQ2F0ZWdvcnlDb21wZXRlbmNpZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNbaV1bJ3R5cGUnXT8udG9Mb3dlckNhc2UoKSA9PT0gY2F0ZWdvcnlUeXBlPy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGFsbENhdGVnb3J5Q29tcGV0ZW5jaWVzLnB1c2goXG4gICAgICAgICAgdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KFxuICAgICAgICAgICAgdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXNbaV1bJ3RoZW1lJ10sXG4gICAgICAgICAgICB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llc1tpXVsnc3ViX3RoZW1lJ11cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IG1hdGNoZWQgY29tcGV0ZW5jaWVzIGZvciB0aGlzIGNhdGVnb3J5IGZyb20gY291cnNlc1xuICAgIGxldCBtYXRjaGVkQ29tcGV0ZW5jaWVzID0gW107XG4gICAgY29uc29sZS5sb2coJ2NvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeScsIHRoaXMuY29tcGV0ZW5jeU5vdE1hdGNoZWRCeUNhdGVnb3J5KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeVtpXVtjYXRlZ29yeVR5cGU/LnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdjb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnlbaV0nLCB0aGlzLmNvbXBldGVuY3lOb3RNYXRjaGVkQnlDYXRlZ29yeVtpXSlcbiAgICAgICAgLy8gRXh0cmFjdCBtYXRjaGVkIHRoZW1lcyBmcm9tIGNvdXJzZSBjb21wZXRlbmNpZXNcbiAgICAgICAgdGhpcy5jb21wZXRlbmN5Tm90TWF0Y2hlZEJ5Q2F0ZWdvcnlbaV1bY2F0ZWdvcnlUeXBlPy50b0xvd2VyQ2FzZSgpXS5mb3JFYWNoKHRoZW1lID0+IHtcbiAgICAgICAgICBpZiAodGhlbWUpIHtcbiAgICAgICAgICAgIG1hdGNoZWRDb21wZXRlbmNpZXMucHVzaCh0aGVtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbmhhbmNlZCBtYXRjaGluZzogY2hlY2sgYm90aCB0aGVtZSBhbmQgc3VidGhlbWUgZnJvbSBjb3Vyc2VzIGFnYWluc3QgRlJBQyBjb21wZXRlbmNpZXNcbiAgICAvLyBJTVBPUlRBTlQ6IFVzZSBhbGwgYXZhaWxhYmxlIGNvdXJzZXMgZm9yIGNvbnNpc3RlbnQgY292ZXJhZ2UgY2FsY3VsYXRpb25cbiAgICBjb25zdCBhbGxDb3Vyc2VzRm9yTWF0Y2hpbmcgPSB0aGlzLmdldEFsbEF2YWlsYWJsZUNvdXJzZXMoKTtcblxuICAgIGFsbENvdXJzZXNGb3JNYXRjaGluZy5mb3JFYWNoKGNvdXJzZSA9PiB7XG4gICAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAgIGxldCBjb21wZXRlbmNpZXMgPSBbXTtcbiAgICAgIGlmIChjb3Vyc2UgJiYgY291cnNlLmNvbXBldGVuY2llcyAmJiBBcnJheS5pc0FycmF5KGNvdXJzZS5jb21wZXRlbmNpZXMpKSB7XG4gICAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXM7XG4gICAgICB9IGVsc2UgaWYgKGNvdXJzZSAmJiBjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llc192NjtcbiAgICAgIH1cblxuICAgICAgY29tcGV0ZW5jaWVzLmZvckVhY2goKGNvbXA6IGFueSkgPT4ge1xuICAgICAgICBsZXQgc2VjVHlwZSA9IGNvbXA/LmNvbXBldGVuY3lBcmVhTmFtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGlmIChzZWNUeXBlID09PSAnYmVoYXZpb3VyYWwnKSBzZWNUeXBlID0gJ2JlaGF2aW9yYWwnO1xuXG4gICAgICAgIGlmIChzZWNUeXBlID09PSBjYXRlZ29yeVR5cGU/LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjb25zdCBjb3Vyc2VUaGVtZSA9IGNvbXAuY29tcGV0ZW5jeVRoZW1lTmFtZT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgY291cnNlU3ViVGhlbWUgPSBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWU/LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgYW55IEZSQUMgY29tcGV0ZW5jeSBtYXRjaGVzIHRoaXMgY291cnNlIGNvbXBldGVuY3lcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmcmFjQ29tcCA9IHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzW2ldO1xuICAgICAgICAgICAgaWYgKGZyYWNDb21wWyd0eXBlJ10/LnRvTG93ZXJDYXNlKCkgPT09IGNhdGVnb3J5VHlwZT8udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICBjb25zdCBmcmFjVGhlbWUgPSBmcmFjQ29tcFsndGhlbWUnXT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgICAgIGNvbnN0IGZyYWNTdWJUaGVtZSA9IGZyYWNDb21wWydzdWJfdGhlbWUnXT8udG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgLy8gRW5oYW5jZWQgY3Jvc3MtbWF0Y2hpbmcgbG9naWMgKHNhbWUgYXMgaW4gZ2V0TWF0Y2hlZENvbXBldGVuY3lTdGF0cyk6XG4gICAgICAgICAgICAgIC8vIDEuIENvdXJzZSBUaGVtZSB2cyBGUkFDIFRoZW1lXG4gICAgICAgICAgICAgIC8vIDIuIENvdXJzZSBTdWIgVGhlbWUgdnMgRlJBQyBTdWIgVGhlbWUgIFxuICAgICAgICAgICAgICAvLyAzLiBDb3Vyc2UgVGhlbWUgdnMgRlJBQyBTdWIgVGhlbWVcbiAgICAgICAgICAgICAgLy8gNC4gQ291cnNlIFN1YiBUaGVtZSB2cyBGUkFDIFRoZW1lXG4gICAgICAgICAgICAgIGNvbnN0IGNvdXJzZVRoZW1lVG9GcmFjVGhlbWUgPSBjb3Vyc2VUaGVtZSA9PT0gZnJhY1RoZW1lO1xuICAgICAgICAgICAgICBjb25zdCBjb3Vyc2VTdWJUaGVtZVRvRnJhY1N1YlRoZW1lID0gY291cnNlU3ViVGhlbWUgPT09IGZyYWNTdWJUaGVtZTtcbiAgICAgICAgICAgICAgY29uc3QgY291cnNlVGhlbWVUb0ZyYWNTdWJUaGVtZSA9IGNvdXJzZVRoZW1lID09PSBmcmFjU3ViVGhlbWU7XG4gICAgICAgICAgICAgIGNvbnN0IGNvdXJzZVN1YlRoZW1lVG9GcmFjVGhlbWUgPSBjb3Vyc2VTdWJUaGVtZSA9PT0gZnJhY1RoZW1lO1xuXG4gICAgICAgICAgICAgIGlmIChjb3Vyc2VUaGVtZVRvRnJhY1RoZW1lIHx8IGNvdXJzZVN1YlRoZW1lVG9GcmFjU3ViVGhlbWUgfHxcbiAgICAgICAgICAgICAgICBjb3Vyc2VUaGVtZVRvRnJhY1N1YlRoZW1lIHx8IGNvdXJzZVN1YlRoZW1lVG9GcmFjVGhlbWUpIHtcblxuICAgICAgICAgICAgICAgIGxldCBtYXRjaFR5cGUgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoY291cnNlVGhlbWVUb0ZyYWNUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVRoZW1lLXRvLUZSQUNUaGVtZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY291cnNlU3ViVGhlbWVUb0ZyYWNTdWJUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVN1YlRoZW1lLXRvLUZSQUNTdWJUaGVtZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY291cnNlVGhlbWVUb0ZyYWNTdWJUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVRoZW1lLXRvLUZSQUNTdWJUaGVtZSc7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY291cnNlU3ViVGhlbWVUb0ZyYWNUaGVtZSkgbWF0Y2hUeXBlID0gJ0NvdXJzZVN1YlRoZW1lLXRvLUZSQUNUaGVtZSc7XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhg4pyFIENPTVBFVEVOQ1kgTUFUQ0ggRk9VTkQgWyR7bWF0Y2hUeXBlfV0gZm9yICR7Y2F0ZWdvcnlUeXBlfTpgLCB7XG4gICAgICAgICAgICAgICAgICBjb3Vyc2U6IHsgdGhlbWU6IGNvdXJzZVRoZW1lLCBzdWJUaGVtZTogY291cnNlU3ViVGhlbWUgfSxcbiAgICAgICAgICAgICAgICAgIGZyYWM6IHsgdGhlbWU6IGZyYWNUaGVtZSwgc3ViVGhlbWU6IGZyYWNTdWJUaGVtZSB9LFxuICAgICAgICAgICAgICAgICAgbWF0Y2hUeXBlOiBtYXRjaFR5cGVcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIG1hdGNoZWRDb21wZXRlbmNpZXMucHVzaCh0aGlzLmdldFRoZW1lU3ViVGhlbWVLZXkoZnJhY1RoZW1lLCBmcmFjU3ViVGhlbWUpKTtcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gRm91bmQgYSBtYXRjaCwgbW92ZSB0byBuZXh0IGNvdXJzZSBjb21wZXRlbmN5XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXMgZnJvbSBtYXRjaGVkIGNvbXBldGVuY2llc1xuICAgIG1hdGNoZWRDb21wZXRlbmNpZXMgPSBbLi4ubmV3IFNldChtYXRjaGVkQ29tcGV0ZW5jaWVzKV07XG5cbiAgICBjb25zb2xlLmxvZyhgXFxuPT09ICR7Y2F0ZWdvcnlUeXBlLnRvVXBwZXJDYXNlKCl9IENPTVBFVEVOQ1kgTUFUQ0hJTkcgPT09YCk7XG4gICAgY29uc29sZS5sb2coYCR7Y2F0ZWdvcnlUeXBlfSAtIEFsbCBGUkFDIGNvbXBldGVuY2llczpgLCBhbGxDYXRlZ29yeUNvbXBldGVuY2llcyk7XG4gICAgY29uc29sZS5sb2coYCR7Y2F0ZWdvcnlUeXBlfSAtIE1hdGNoZWQgZnJvbSBjb3Vyc2VzOmAsIG1hdGNoZWRDb21wZXRlbmNpZXMpO1xuICAgIGNvbnNvbGUubG9nKGAke2NhdGVnb3J5VHlwZX0gLSBNYXRjaCByYXRlOiAke21hdGNoZWRDb21wZXRlbmNpZXMubGVuZ3RofS8ke2FsbENhdGVnb3J5Q29tcGV0ZW5jaWVzLmxlbmd0aH0gKCR7TWF0aC5yb3VuZCgobWF0Y2hlZENvbXBldGVuY2llcy5sZW5ndGggLyBhbGxDYXRlZ29yeUNvbXBldGVuY2llcy5sZW5ndGgpICogMTAwKX0lKWApO1xuXG4gICAgLy8gUmV0dXJuIHVubWF0Y2hlZCBjb21wZXRlbmNpZXMgKHRob3NlIGluIHJvbGUgbWFwcGluZyBidXQgbm90IGNvdmVyZWQgYnkgY291cnNlcylcbiAgICByZXR1cm4gdGhpcy5jb21wYXJlU3RyaW5nQXJyYXlzKGFsbENhdGVnb3J5Q29tcGV0ZW5jaWVzLCBtYXRjaGVkQ29tcGV0ZW5jaWVzKTtcbiAgfVxuXG4gIGNvbXBhcmVTdHJpbmdBcnJheXMoYXJyMTogc3RyaW5nW10sIGFycjI6IHN0cmluZ1tdKSB7XG4gICAgY29uc29sZS5sb2coJ0FsbCBjb21wZXRlbmNpZXMgaW4gY2F0ZWdvcnk6JywgYXJyMSk7XG4gICAgY29uc29sZS5sb2coJ01hdGNoZWQgY29tcGV0ZW5jaWVzIGZyb20gY291cnNlczonLCBhcnIyKTtcblxuICAgIC8vIFJldHVybiBpdGVtcyBpbiBhcnIxIHRoYXQgYXJlIE5PVCBpbiBhcnIyICh1bm1hdGNoZWQgY29tcGV0ZW5jaWVzKVxuICAgIGNvbnN0IHVubWF0Y2hlZCA9IGFycjEuZmlsdGVyKGl0ZW0gPT4gIWFycjIuaW5jbHVkZXMoaXRlbSkpO1xuICAgIGNvbnNvbGUubG9nKCdVbm1hdGNoZWQgY29tcGV0ZW5jaWVzOicsIHVubWF0Y2hlZCk7XG5cbiAgICByZXR1cm4gdW5tYXRjaGVkO1xuICB9XG5cbiAgYWRkQ291cnNlKG1pc3NpbmdDb21wZXRlbmN5Pzogc3RyaW5nLCBjb21wZXRlbmN5VHlwZT86IHN0cmluZykge1xuICAgIGxldCBkaWFsb2dEYXRhID0geyAuLi50aGlzLnBsYW5EYXRhIH07XG5cbiAgICAvLyBJZiBjb21wZXRlbmN5IHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLCBhZGQgdGhlbSB0byB0aGUgZGlhbG9nIGRhdGFcbiAgICBpZiAobWlzc2luZ0NvbXBldGVuY3kgJiYgY29tcGV0ZW5jeVR5cGUpIHtcbiAgICAgIGNvbnN0IHsgdGhlbWUsIHN1YlRoZW1lIH0gPSB0aGlzLnBhcnNlVGhlbWVBbmRTdWJUaGVtZShtaXNzaW5nQ29tcGV0ZW5jeSk7XG5cbiAgICAgIGRpYWxvZ0RhdGEucHJlZmlsbENvbXBldGVuY3kgPSB7XG4gICAgICAgIHR5cGU6IGNvbXBldGVuY3lUeXBlLFxuICAgICAgICB0aGVtZTogdGhlbWUsXG4gICAgICAgIHN1YlRoZW1lOiBzdWJUaGVtZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFkZENvdXJzZUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDb3Vyc2UgYWRkZWQgc3VjY2Vzc2Z1bGx5ISBSZWZyZXNoaW5nIGRhdGEuLi4nKTtcblxuICAgICAgICAvLyBSZWZyZXNoIHVzZXIgY291cnNlcyB0byBpbmNsdWRlIHRoZSBuZXdseSBhZGRlZCBjb3Vyc2VcbiAgICAgICAgdGhpcy5nZXRVc2VyQ291cnNlKCk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCBnYXAgYW5hbHlzaXMgd2l0aCB0aGUgbGF0ZXN0IGRhdGFcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVHYXBBbmFseXNpc0FmdGVyQ291cnNlc1VwZGF0ZSgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdHYXAgYW5hbHlzaXMgcmVmcmVzaGVkIGFmdGVyIGNvdXJzZSBhZGRpdGlvbicpO1xuICAgICAgICB9LCA1MDApOyAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgZGF0YSBpcyBsb2FkZWRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZpbHRlck9uQ29tcGV0ZW5jeVRoZW1lKHRoZW1lSXRlbSkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9IHRoZW1lSXRlbTtcbiAgICBjb25zdCB7IHRoZW1lLCBzdWJUaGVtZSB9ID0gdGhpcy5wYXJzZVRoZW1lQW5kU3ViVGhlbWUodGhlbWVJdGVtIHx8ICcnKTtcbiAgICBsZXQgdGhlbWVOYW1lID0gdGhlbWU7XG4gICAgbGV0IHN1YlRoZW1lTmFtZSA9IHN1YlRoZW1lO1xuXG4gICAgY29uc29sZS5sb2coJ0ZpbHRlcmluZyBieSB0aGVtZTonLCB0aGVtZU5hbWUsICdzdWJUaGVtZTonLCBzdWJUaGVtZU5hbWUsICdUYWIgaW5kZXg6JywgdGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4KTtcblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBjb21wZXRlbmN5IHR5cGUgYmFzZWQgb24gdGhlIGFjdGl2ZSB0YWJcbiAgICBsZXQgY29tcGV0ZW5jeVR5cGUgPSAnJztcbiAgICBpZiAodGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4ID09PSAxKSB7XG4gICAgICBjb21wZXRlbmN5VHlwZSA9ICdiZWhhdmlvcmFsJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMikge1xuICAgICAgY29tcGV0ZW5jeVR5cGUgPSAnZnVuY3Rpb25hbCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDMpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ2RvbWFpbic7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFsbCBhdmFpbGFibGUgY291cnNlcyB1c2luZyB0aGUgaGVscGVyIG1ldGhvZFxuICAgIGNvbnN0IGFsbEF2YWlsYWJsZUNvdXJzZXMgPSB0aGlzLmdldEFsbEF2YWlsYWJsZUNvdXJzZXMoKTtcbiAgICBjb25zb2xlLmxvZygnVG90YWwgY291cnNlcyB0byBmaWx0ZXIgZnJvbTonLCBhbGxBdmFpbGFibGVDb3Vyc2VzLmxlbmd0aCk7XG5cbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gYWxsQXZhaWxhYmxlQ291cnNlcy5maWx0ZXIoY291cnNlID0+IHtcbiAgICAgIGlmICghY291cnNlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgY29tcGV0ZW5jeSBwcm9wZXJ0eSBuYW1lc1xuICAgICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgICAgaWYgKGNvdXJzZS5jb21wZXRlbmNpZXMgJiYgQXJyYXkuaXNBcnJheShjb3Vyc2UuY29tcGV0ZW5jaWVzKSkge1xuICAgICAgICBjb21wZXRlbmNpZXMgPSBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgICAgY29tcGV0ZW5jaWVzID0gY291cnNlLmNvbXBldGVuY2llc192NjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbXBldGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gRmlsdGVyIGJ5IGNvbXBldGVuY3kgdHlwZSBhbmQgdGhlbWUvc3VidGhlbWVcbiAgICAgIHJldHVybiBjb21wZXRlbmNpZXMuc29tZShjb21wID0+IHtcbiAgICAgICAgaWYgKCFjb21wKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2hlY2sgY29tcGV0ZW5jeSB0eXBlIG1hdGNoZXMgY3VycmVudCB0YWJcbiAgICAgICAgbGV0IGNvbXBUeXBlID0gY29tcD8uY29tcGV0ZW5jeUFyZWFOYW1lPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY29tcFR5cGUgPT09ICdiZWhhdmlvdXJhbCcpIGNvbXBUeXBlID0gJ2JlaGF2aW9yYWwnOyAvLyBOb3JtYWxpemUgc3BlbGxpbmdcblxuICAgICAgICBpZiAoY29tcFR5cGUgIT09IGNvbXBldGVuY3lUeXBlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2hlY2sgY3Jvc3MtbWF0Y2hpbmcgbGlrZSBnYXAgYW5hbHlzaXM6IHRoZW1lIHZzIHN1YnRoZW1lIGFuZCBzdWJ0aGVtZSB2cyB0aGVtZVxuICAgICAgICBjb25zdCBjb21wVGhlbWUgPSBjb21wPy5jb21wZXRlbmN5VGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpPy50cmltKCk7XG4gICAgICAgIGNvbnN0IGNvbXBTdWJUaGVtZSA9IGNvbXA/LmNvbXBldGVuY3lTdWJUaGVtZU5hbWU/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGhlbWUgPSB0aGVtZU5hbWU/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHNlYXJjaFN1YlRoZW1lID0gc3ViVGhlbWVOYW1lPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIEVuaGFuY2VkIGNyb3NzLW1hdGNoaW5nIGxvZ2ljIGxpa2UgZ2FwIGFuYWx5c2lzOlxuICAgICAgICAvLyAxLiBTZWxlY3RlZCBUaGVtZSB2cyBDb3Vyc2UgVGhlbWVcbiAgICAgICAgLy8gMi4gU2VsZWN0ZWQgU3ViIFRoZW1lIHZzIENvdXJzZSBTdWIgVGhlbWUgIFxuICAgICAgICAvLyAzLiBTZWxlY3RlZCBUaGVtZSB2cyBDb3Vyc2UgU3ViIFRoZW1lXG4gICAgICAgIC8vIDQuIFNlbGVjdGVkIFN1YiBUaGVtZSB2cyBDb3Vyc2UgVGhlbWVcbiAgICAgICAgY29uc3QgdGhlbWVUb1RoZW1lTWF0Y2ggPSBzZWFyY2hUaGVtZSAmJiBjb21wVGhlbWUgPT09IHNlYXJjaFRoZW1lO1xuICAgICAgICBjb25zdCBzdWJUaGVtZVRvU3ViVGhlbWVNYXRjaCA9IHNlYXJjaFN1YlRoZW1lICYmIGNvbXBTdWJUaGVtZSA9PT0gc2VhcmNoU3ViVGhlbWU7XG4gICAgICAgIGNvbnN0IHRoZW1lVG9TdWJUaGVtZU1hdGNoID0gc2VhcmNoVGhlbWUgJiYgY29tcFN1YlRoZW1lID09PSBzZWFyY2hUaGVtZTtcbiAgICAgICAgY29uc3Qgc3ViVGhlbWVUb1RoZW1lTWF0Y2ggPSBzZWFyY2hTdWJUaGVtZSAmJiBjb21wVGhlbWUgPT09IHNlYXJjaFN1YlRoZW1lO1xuXG4gICAgICAgIGNvbnN0IGlzTWF0Y2ggPSB0aGVtZVRvVGhlbWVNYXRjaCB8fCBzdWJUaGVtZVRvU3ViVGhlbWVNYXRjaCB8fCB0aGVtZVRvU3ViVGhlbWVNYXRjaCB8fCBzdWJUaGVtZVRvVGhlbWVNYXRjaDtcblxuICAgICAgICAvLyBMb2cgbWF0Y2hlcyBmb3IgZGVidWdnaW5nIChzaW1pbGFyIHRvIGdhcCBhbmFseXNpcylcbiAgICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgICBsZXQgbWF0Y2hUeXBlID0gJyc7XG4gICAgICAgICAgaWYgKHRoZW1lVG9UaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnVGhlbWUtdG8tVGhlbWUnO1xuICAgICAgICAgIGVsc2UgaWYgKHN1YlRoZW1lVG9TdWJUaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnU3ViVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgIGVsc2UgaWYgKHRoZW1lVG9TdWJUaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnVGhlbWUtdG8tU3ViVGhlbWUnO1xuICAgICAgICAgIGVsc2UgaWYgKHN1YlRoZW1lVG9UaGVtZU1hdGNoKSBtYXRjaFR5cGUgPSAnU3ViVGhlbWUtdG8tVGhlbWUnO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coYOKchSBGSUxURVIgTUFUQ0ggRk9VTkQgWyR7bWF0Y2hUeXBlfV06YCwge1xuICAgICAgICAgICAgc2VsZWN0ZWQ6IHsgdGhlbWU6IHNlYXJjaFRoZW1lLCBzdWJUaGVtZTogc2VhcmNoU3ViVGhlbWUgfSxcbiAgICAgICAgICAgIGNvdXJzZTogeyB0eXBlOiBjb21wVHlwZSwgdGhlbWU6IGNvbXBUaGVtZSwgc3ViVGhlbWU6IGNvbXBTdWJUaGVtZSB9LFxuICAgICAgICAgICAgbWF0Y2hUeXBlOiBtYXRjaFR5cGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hdGNoIGlmIGFueSBvZiB0aGUgY3Jvc3MtbWF0Y2hpbmcgY29uZGl0aW9ucyBhcmUgbWV0XG4gICAgICAgIHJldHVybiBpc01hdGNoO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnRmlsdGVyZWQgY291cnNlcyBmb3IgdGhlbWU6JywgdGhlbWVOYW1lLCAnQ291bnQ6JywgdGhpcy5maWx0ZXJkQ291cnNlcy5sZW5ndGgpO1xuICAgIGNvbnNvbGUubG9nKCdGaWx0ZXJlZCBjb3Vyc2VzOicsIHRoaXMuZmlsdGVyZENvdXJzZXMubWFwKGMgPT4gYy5uYW1lIHx8IGMuY291cnNlKSk7XG4gIH1cblxuICBjbGVhclRoZW1lRmlsdGVyKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9ICcnO1xuICAgIC8vIFJlc2V0IHRvIGNhdGVnb3J5IGZpbHRlcmVkIGNvdXJzZXMgYnkgY2FsbGluZyB0aGUgdGFiIGNoYW5nZSBtZXRob2RcbiAgICB0aGlzLm9uSW5uZXJUYWJDaGFuZ2Uoe1xuICAgICAgaW5kZXg6IHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCxcbiAgICAgIHRhYjogeyB0ZXh0TGFiZWw6IHRoaXMuaW5uZXJUYWJBY3RpdmVUZXh0IH1cbiAgICB9IGFzIGFueSk7XG4gICAgY29uc29sZS5sb2coJ1RoZW1lIGZpbHRlciBjbGVhcmVkLCBzaG93aW5nIGFsbCBjb3Vyc2VzIGZvciBjYXRlZ29yeTonLCB0aGlzLmlubmVyVGFiQWN0aXZlVGV4dCk7XG4gIH1cblxuICBpc1RoZW1lU2VsZWN0ZWQodGhlbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIgPT09IHRoZW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjb3Vyc2UgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGhlbWUgZmlsdGVyIHdpdGggcHJlZmlsbGVkIGNvbXBldGVuY3kgZGF0YVxuICAgKi9cbiAgYWRkQ291cnNlRm9yU2VsZWN0ZWRUaGVtZSgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlcikge1xuICAgICAgY29uc29sZS53YXJuKCdObyB0aGVtZSBzZWxlY3RlZCBmb3IgYWRkaW5nIGNvdXJzZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdGhlbWUsIHN1YlRoZW1lIH0gPSB0aGlzLnBhcnNlVGhlbWVBbmRTdWJUaGVtZSh0aGlzLnNlbGVjdGVkVGhlbWVGaWx0ZXIpO1xuXG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IGNvbXBldGVuY3kgdHlwZSBiYXNlZCBvbiB0aGUgYWN0aXZlIHRhYlxuICAgIC8vIE1hcCB0aGUgdGFiIGxhYmVscyB0byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IEFkZENvdXJzZUNvbXBvbmVudFxuICAgIGxldCBjb21wZXRlbmN5VHlwZSA9ICcnO1xuICAgIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDEpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ0JlaGF2aW9yYWwnOyAvLyBUYWIgbGFiZWwgaXMgXCJiZWhhdmlvdXJhbFwiXG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyVGFiQWN0aXZlSW5kZXggPT09IDIpIHtcbiAgICAgIGNvbXBldGVuY3lUeXBlID0gJ0Z1bmN0aW9uYWwnOyAvLyBUYWIgbGFiZWwgaXMgXCJmdW5jdGlvbmFsXCJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMykge1xuICAgICAgY29tcGV0ZW5jeVR5cGUgPSAnRG9tYWluJzsgLy8gVGFiIGxhYmVsIGlzIFwiZG9tYWluXCJcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnVGFiIG1hcHBpbmcgLSBpbm5lclRhYkFjdGl2ZUluZGV4OicsIHRoaXMuaW5uZXJUYWJBY3RpdmVJbmRleCxcbiAgICAgICdpbm5lclRhYkFjdGl2ZVRleHQ6JywgdGhpcy5pbm5lclRhYkFjdGl2ZVRleHQsXG4gICAgICAnbWFwcGVkIGNvbXBldGVuY3lUeXBlOicsIGNvbXBldGVuY3lUeXBlKTtcblxuICAgIGNvbnNvbGUubG9nKCdBZGRpbmcgY291cnNlIGZvciBtaXNzaW5nIGNvbXBldGVuY3k6Jywge1xuICAgICAgY29tcGV0ZW5jeVR5cGUsXG4gICAgICB0aGVtZSxcbiAgICAgIHN1YlRoZW1lLFxuICAgICAgc2VsZWN0ZWRUaGVtZUZpbHRlcjogdGhpcy5zZWxlY3RlZFRoZW1lRmlsdGVyXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgZGlhbG9nIGRhdGEgd2l0aCBwcmVmaWxsZWQgY29tcGV0ZW5jeSBpbmZvcm1hdGlvblxuICAgIGxldCBkaWFsb2dEYXRhID0geyAuLi50aGlzLnBsYW5EYXRhIH07XG4gICAgZGlhbG9nRGF0YS5wcmVmaWxsQ29tcGV0ZW5jeSA9IHtcbiAgICAgIHR5cGU6IGNvbXBldGVuY3lUeXBlLFxuICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgc3ViVGhlbWU6IHN1YlRoZW1lIHx8ICcnIC8vIEluY2x1ZGUgc3ViLXRoZW1lIGlmIGF2YWlsYWJsZVxuICAgIH07XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFkZENvdXJzZUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc4MDBweCcsXG4gICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnNDAwcHgnLFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ291cnNlIGFkZGVkIHN1Y2Nlc3NmdWxseSBmb3IgY29tcGV0ZW5jeSEgUmVmcmVzaGluZyBkYXRhLi4uJyk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCB1c2VyIGNvdXJzZXMgdG8gaW5jbHVkZSB0aGUgbmV3bHkgYWRkZWQgY291cnNlXG4gICAgICAgIHRoaXMuZ2V0VXNlckNvdXJzZSgpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBnYXAgYW5hbHlzaXMgYWZ0ZXIgY291cnNlIGFkZGl0aW9uXG4gICAgICAgIHRoaXMudXBkYXRlR2FwQW5hbHlzaXNBZnRlckNvdXJzZXNVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldER1cmF0aW9uKHRpbWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZFNlcnZpY2UuY29udmVydCh0aW1lKTtcbiAgfVxuXG5cbiAgZ2V0QmVoYXZpb3VyYWxNYXRjaGVkKCkge1xuICAgIHRoaXMuYmVoYXZpb3VyYWxNYXRjaGVkID0gW11cbiAgICBjb25zb2xlLmxvZygndGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMnLCB0aGlzLnBsYW5EYXRhKVxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZCcsIHRoaXMuYmVoYXZpb3VyYWxOb3RNYXRjaGVkKVxuICAgIHRoaXMucGxhbkRhdGEuY29tcGV0ZW5jaWVzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgY29tcGV0ZW5jeUtleSA9IHRoaXMuZ2V0VGhlbWVTdWJUaGVtZUtleShpdGVtPy50aGVtZSwgaXRlbT8uc3ViX3RoZW1lKTtcbiAgICAgIGlmIChpdGVtICYmIGl0ZW0/LnR5cGUgPT09ICdCZWhhdmlvcmFsJyAmJiB0aGlzLmJlaGF2aW91cmFsTm90TWF0Y2hlZC5pbmRleE9mKGNvbXBldGVuY3lLZXkpIDwgMCkge1xuICAgICAgICB0aGlzLmJlaGF2aW91cmFsTWF0Y2hlZC5wdXNoKGl0ZW0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmJlaGF2aW91cmFsTWF0Y2hlZC0tJywgdGhpcy5iZWhhdmlvdXJhbE1hdGNoZWQpXG4gIH1cblxuICBnZXRGdW5jdGlvbmFsTWF0Y2hlZCgpIHtcbiAgICB0aGlzLmZ1bmN0aW9uYWxNYXRjaGVkID0gW11cbiAgICB0aGlzLnBsYW5EYXRhLmNvbXBldGVuY2llcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGNvbXBldGVuY3lLZXkgPSB0aGlzLmdldFRoZW1lU3ViVGhlbWVLZXkoaXRlbT8udGhlbWUsIGl0ZW0/LnN1Yl90aGVtZSk7XG4gICAgICBpZiAoaXRlbSAmJiBpdGVtPy50eXBlID09PSAnRnVuY3Rpb25hbCcgJiYgdGhpcy5mdW5jdGlvbmFsTm90TWF0Y2hlZC5pbmRleE9mKGNvbXBldGVuY3lLZXkpIDwgMCkge1xuICAgICAgICB0aGlzLmZ1bmN0aW9uYWxNYXRjaGVkLnB1c2goaXRlbSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uYWxNYXRjaGVkXG4gIH1cblxuICBnZXREb21haW5NYXRjaGVkKCkge1xuICAgIHRoaXMuZG9tYWluTWF0Y2hlZCA9IFtdXG4gICAgdGhpcy5wbGFuRGF0YS5jb21wZXRlbmNpZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBjb21wZXRlbmN5S2V5ID0gdGhpcy5nZXRUaGVtZVN1YlRoZW1lS2V5KGl0ZW0/LnRoZW1lLCBpdGVtPy5zdWJfdGhlbWUpO1xuICAgICAgaWYgKGl0ZW0gJiYgaXRlbT8udHlwZSA9PT0gJ0RvbWFpbicgJiYgdGhpcy5kb21haW5Ob3RNYXRjaGVkLmluZGV4T2YoY29tcGV0ZW5jeUtleSkgPCAwKSB7XG4gICAgICAgIHRoaXMuZG9tYWluTWF0Y2hlZC5wdXNoKGl0ZW0pXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zb2xlLmxvZygndGhpcy5kb21haW5NYXRjaGVkLS0nLCB0aGlzLmRvbWFpbk1hdGNoZWQpXG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRoZW1lV2l0aFN1YlRoZW1lKHRoZW1lOiBhbnksIHN1YlRoZW1lOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUaGVtZSA9ICh0aGVtZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFN1YlRoZW1lID0gKHN1YlRoZW1lIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcblxuICAgIGlmIChub3JtYWxpemVkVGhlbWUgJiYgbm9ybWFsaXplZFN1YlRoZW1lKSB7XG4gICAgICByZXR1cm4gYCR7bm9ybWFsaXplZFRoZW1lfSAtICR7bm9ybWFsaXplZFN1YlRoZW1lfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUaGVtZSB8fCBub3JtYWxpemVkU3ViVGhlbWU7XG4gIH1cblxuICBwcml2YXRlIGdldFRoZW1lU3ViVGhlbWVLZXkodGhlbWU6IGFueSwgc3ViVGhlbWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0VGhlbWVXaXRoU3ViVGhlbWUodGhlbWUsIHN1YlRoZW1lKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VUaGVtZUFuZFN1YlRoZW1lKHZhbHVlOiBzdHJpbmcpOiB7IHRoZW1lOiBzdHJpbmc7IHN1YlRoZW1lOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgdGV4dCA9ICh2YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICByZXR1cm4geyB0aGVtZTogJycsIHN1YlRoZW1lOiAnJyB9O1xuICAgIH1cblxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCcgLSAnKSkge1xuICAgICAgY29uc3QgcGFydHMgPSB0ZXh0LnNwbGl0KCcgLSAnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRoZW1lOiAocGFydHMuc2hpZnQoKSB8fCAnJykudHJpbSgpLFxuICAgICAgICBzdWJUaGVtZTogcGFydHMuam9pbignIC0gJykudHJpbSgpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCctJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdGV4dC5zcGxpdCgnLScpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRoZW1lOiBwYXJ0c1swXS50cmltKCksXG4gICAgICAgICAgc3ViVGhlbWU6IHBhcnRzWzFdLnRyaW0oKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHRoZW1lOiB0ZXh0LCBzdWJUaGVtZTogJycgfTtcbiAgfVxuXG4gIGRvd25sb2FkUERGKCkge1xuICAgIHRoaXMuaXNQREZEb3dubG9hZCA9IHRydWVcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGRmQ29udGVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gV2FpdCBmb3IgaW1hZ2VzIHRvIGxvYWRcbiAgICBjb25zdCBpbWFnZXMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xuICAgIGNvbnN0IHByb21pc2VzID0gQXJyYXkuZnJvbShpbWFnZXMpLm1hcCgoaW1nOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoaW1nLmNvbXBsZXRlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBpbWcub25sb2FkID0gcmVzb2x2ZSk7XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtYXJnaW46IDAuMjAsXG4gICAgICAgIGZpbGVuYW1lOiAnR2FwIEFuYWx5c2lzLnBkZicsXG4gICAgICAgIGltYWdlOiB7IHR5cGU6ICdqcGVnJywgcXVhbGl0eTogMC45OCB9LFxuICAgICAgICBodG1sMmNhbnZhczoge1xuICAgICAgICAgIHNjYWxlOiAyLFxuICAgICAgICAgIHVzZUNPUlM6IHRydWUsXG4gICAgICAgICAgc2Nyb2xsWTogMCxcbiAgICAgICAgfSxcbiAgICAgICAganNQREY6IHtcbiAgICAgICAgICB1bml0OiAnaW4nLFxuICAgICAgICAgIGZvcm1hdDogJ2E0JyxcbiAgICAgICAgICBvcmllbnRhdGlvbjogJ3BvcnRyYWl0J1xuICAgICAgICB9LFxuICAgICAgICBwYWdlYnJlYWs6IHtcbiAgICAgICAgICBtb2RlOiBbJ2NzcycsICdsZWdhY3knXSxcbiAgICAgICAgICBiZWZvcmU6ICcucGFnZS1icmVhaycsXG4gICAgICAgICAgYXZvaWQ6IFsnLm5vLWJyZWFrJ11cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaHRtbDJwZGYoKS5mcm9tKGVsZW1lbnQpLnNldChvcHRpb25zKS5zYXZlKClcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzUERGRG93bmxvYWQgPSBmYWxzZVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sIDMwMDApO1xuICAgIH0pO1xuICB9XG5cblxuICByZWRpcmVjdFRvVG9jKGl0ZW0pIHtcbiAgICBpZiAoaXRlbT8ucHVibGljX2xpbmspIHtcbiAgICAgIHdpbmRvdy5vcGVuKGl0ZW0/LnB1YmxpY19saW5rLCAnX2JsYW5rJylcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHVybCA9IGBodHRwczovL3BvcnRhbC5pZ290a2FybWF5b2dpLmdvdi5pbi9hcHAvdG9jLyR7aXRlbT8uaWRlbnRpZmllcn0vb3ZlcnZpZXc/YFxuICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJylcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGdhcCBhbmFseXNpcyBzdGF0cyBhZnRlciBpbml0aWFsIGRhdGEgbG9hZFxuICAgKi9cbiAgaW5pdGlhbGl6ZUdhcEFuYWx5c2lzU3RhdHMoKSB7XG4gICAgLy8gU2V0IGEgc21hbGwgdGltZW91dCB0byBlbnN1cmUgYWxsIGFzeW5jIG9wZXJhdGlvbnMgY29tcGxldGVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcmRDb3Vyc2VzICYmIHRoaXMuZmlsdGVyZENvdXJzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmdhcEFuYWx5c2lzU3RhdHMoKTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBnYXAgYW5hbHlzaXMgc3RhdHMgYWZ0ZXIgY291cnNlcyBhcmUgdXBkYXRlZCAobGlrZSBzdWdnZXN0ZWQgY291cnNlcyBhZGRlZClcbiAgICovXG4gIHVwZGF0ZUdhcEFuYWx5c2lzQWZ0ZXJDb3Vyc2VzVXBkYXRlKCkge1xuICAgIC8vIERvbid0IG1vZGlmeSBvcmlnaW5hbERhdGEgLSBpdCBzaG91bGQgcmVtYWluIGFzIEFJIHJlY29tbWVuZGVkIGNvdXJzZXMgb25seVxuICAgIC8vIFRoZSBnYXAgYW5hbHlzaXMgYWxyZWFkeSBwcm9wZXJseSBpbmNsdWRlcyBhbGwgY291cnNlIHR5cGVzXG5cbiAgICAvLyBSZWNhbGN1bGF0ZSBnYXAgYW5hbHlzaXMgc3RhdHNcbiAgICB0aGlzLmdhcEFuYWx5c2lzU3RhdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdlbmVyYXRlIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgYnkgZGVsZXRpbmcgZXhpc3RpbmcgcmVjb21tZW5kYXRpb25zIGFuZCBnZW5lcmF0aW5nIG5ldyBvbmVzXG4gICAqL1xuICBhc3luYyByZWdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25zKCkge1xuICAgIGlmICh0aGlzLmlzUmVnZW5lcmF0aW5nKSB7XG4gICAgICByZXR1cm47IC8vIFByZXZlbnQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlZ2VuZXJhdGlvbnNcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZyA9IHRydWU7XG5cbiAgICAgIC8vIFNob3cgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdGhpcy5zaG93Q29uZmlybWF0aW9uRGlhbG9nKCk7XG5cbiAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZygnU3RhcnRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uIHJlZ2VuZXJhdGlvbi4uLicpO1xuXG4gICAgICAvLyBTZXQgcmVnZW5lcmF0aW9uIHByb2dyZXNzIHN0YXRlXG4gICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlOyAvLyBIaWRlIG1haW4gY29udGVudCBkdXJpbmcgcmVnZW5lcmF0aW9uXG5cbiAgICAgIC8vIFN0ZXAgMTogRGVsZXRlIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnNcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKCk7XG5cbiAgICAgIC8vIFN0ZXAgMjogR2VuZXJhdGUgbmV3IGNvdXJzZSByZWNvbW1lbmRhdGlvbnNcbiAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVOZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbnMoKTtcblxuICAgICAgLy8gU3RlcCAzOiBSZWZyZXNoIHRoZSBjdXJyZW50IGRhdGFcbiAgICAgIHRoaXMucmVmcmVzaENvbXBvbmVudCgpO1xuXG4gICAgICBjb25zb2xlLmxvZygnQ291cnNlIHJlY29tbWVuZGF0aW9uIHJlZ2VuZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgICAgIC8vIFNob3cgc3VjY2VzcyBtZXNzYWdlXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgcmVnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IScsICdDbG9zZScsIHtcbiAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgIHBhbmVsQ2xhc3M6IFsnc3VjY2Vzcy1zbmFja2JhciddXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uIHJlZ2VuZXJhdGlvbjonLCBlcnJvcik7XG5cbiAgICAgIC8vIFNob3cgZXJyb3IgbWVzc2FnZVxuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gcmVnZW5lcmF0ZSBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLiBQbGVhc2UgdHJ5IGFnYWluLicsICdDbG9zZScsIHtcbiAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgIHBhbmVsQ2xhc3M6IFsnZXJyb3Itc25hY2tiYXInXVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7IC8vIEVuc3VyZSBtYWluIGNvbnRlbnQgaXMgc2hvd24gYWZ0ZXIgcmVnZW5lcmF0aW9uXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgY29uZmlybWF0aW9uIGRpYWxvZyBmb3IgcmVnZW5lcmF0ZSBhY3Rpb25cbiAgICovXG4gIHByaXZhdGUgc2hvd0NvbmZpcm1hdGlvbkRpYWxvZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFJlZ2VuZXJhdGVDb25maXJtYXRpb25EaWFsb2csIHtcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXG4gICAgICAgIHBhbmVsQ2xhc3M6ICdyZWdlbmVyYXRlLWNvbmZpcm1hdGlvbi1kaWFsb2cnLFxuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQgPT09IHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZm9yIHRoZSBjdXJyZW50IHJvbGUgbWFwcGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVDb3Vyc2VSZWNvbW1lbmRhdGlvbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZU1hcElkID0gdGhpcy5wbGFuRGF0YT8uaWQ7XG5cbiAgICAgIGlmICghcm9sZU1hcElkKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1JvbGUgbWFwcGluZyBJRCBub3QgZm91bmQnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coJ0RlbGV0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZm9yIHJvbGUgbWFwcGluZzonLCByb2xlTWFwSWQpO1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKHJvbGVNYXBJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0NvdXJzZSByZWNvbW1lbmRhdGlvbnMgZGVsZXRlZCBzdWNjZXNzZnVsbHk6JywgcmVzcG9uc2UpO1xuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVsZXRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uczonLCBlcnJvcik7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbmV3IGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgZHVyaW5nIHJlZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZU5ld0NvdXJzZVJlY29tbWVuZGF0aW9ucygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnNvbGUubG9nKCdHZW5lcmF0aW5nIG5ldyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJyk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVjb21tZW5kZWRDb3Vyc2VGb3JSZWdlbmVyYXRpb24odGhpcy5wbGFuRGF0YS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgY291cnNlIGdlbmVyYXRpb24gc3BlY2lmaWNhbGx5IGZvciByZWdlbmVyYXRpb24gd2l0aCBwcm9ncmVzc2l2ZSBsb2FkaW5nXG4gICAqL1xuICBwcml2YXRlIGdldFJlY29tbWVuZGVkQ291cnNlRm9yUmVnZW5lcmF0aW9uKHJvbGVfbWFwcGluZ19pZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gU3RhcnQgdGhlIHByb2dyZXNzaXZlIGxvYWRpbmcgc2ltdWxhdGlvbiBmb3IgcmVnZW5lcmF0aW9uXG4gICAgICB0aGlzLnN0YXJ0UmVnZW5lcmF0aXZlUHJvZ3Jlc3NpdmVMb2FkaW5nKCk7XG5cbiAgICAgIC8vIE1ha2UgdGhlIGFjdHVhbCBBUEkgY2FsbFxuICAgICAgLy8gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJlY29tbWVuZGVkQ291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgIC8vICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyAgICAgLy8gU3RvcCBwcm9ncmVzc2l2ZSBsb2FkaW5nIGFuZCBzaG93IGNvbXBsZXRpb25cbiAgICAgIC8vICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gZmFsc2U7IC8vIFRoaXMgd2lsbCBzdG9wIHRoZSBpbnRlcnZhbFxuICAgICAgLy8gICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgLy8gICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICdDb3Vyc2UgcmVjb21tZW5kYXRpb25zIHJlZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseSEnO1xuXG4gICAgICAvLyAgICAgLy8gQ2xlYXIgdGhlIGxvYWRpbmcgc3RhdGUgYWZ0ZXIgc2hvd2luZyBjb21wbGV0aW9uXG4gICAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgIC8vICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICAgIC8vICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgLy8gICAgIH0sIDIwMDApO1xuICAgICAgLy8gICB9LFxuICAgICAgLy8gICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAvLyAgICAgLy8gU3RvcCBwcm9ncmVzc2l2ZSBsb2FkaW5nXG4gICAgICAvLyAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgLy8gICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgLy8gICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcblxuICAgICAgLy8gICAgIC8vIEhhbmRsZSBzcGVjaWZpYyBlcnJvciBjYXNlc1xuICAgICAgLy8gICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwOSB8fCBlcnJvci5lcnJvcj8uZGV0YWlsPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSkge1xuICAgICAgLy8gICAgICAgLy8gQ291cnNlIHJlY29tbWVuZGF0aW9ucyBhbHJlYWR5IGV4aXN0IC0gdGhpcyBpcyBub3JtYWxcbiAgICAgIC8vICAgICAgIGNvbnNvbGUubG9nKCdDb3Vyc2UgcmVjb21tZW5kYXRpb25zIGFscmVhZHkgZXhpc3QsIGxvYWRpbmcgZXhpc3RpbmcgZGF0YS4uLicpO1xuXG4gICAgICAvLyAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGluZyBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcblxuICAgICAgLy8gICAgICAgLy8gVHJ5IHRvIGdldCBleGlzdGluZyBkYXRhXG4gICAgICAvLyAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgLy8gICAgICAgICBuZXh0OiAoZXhpc3RpbmdSZXNwb25zZSkgPT4ge1xuICAgICAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzZnVsbHkgbG9hZGVkIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMnKTtcbiAgICAgIC8vICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDEwMDtcbiAgICAgIC8vICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnTG9hZGVkIGV4aXN0aW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbnMgc3VjY2Vzc2Z1bGx5ISc7XG5cbiAgICAgIC8vICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgLy8gICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgLy8gICAgICAgICAgICAgcmVzb2x2ZShleGlzdGluZ1Jlc3BvbnNlKTtcbiAgICAgIC8vICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgIC8vICAgICAgICAgfSxcbiAgICAgIC8vICAgICAgICAgZXJyb3I6IChsb2FkRXJyb3IpID0+IHtcbiAgICAgIC8vICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zOicsIGxvYWRFcnJvcik7XG4gICAgICAvLyAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAvLyAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgLy8gICAgICAgICAgIHJlamVjdChsb2FkRXJyb3IpO1xuICAgICAgLy8gICAgICAgICB9XG4gICAgICAvLyAgICAgICB9KTtcbiAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGNvdXJzZSByZWNvbW1lbmRhdGlvbiByZWdlbmVyYXRpb246JywgZXJyb3IpO1xuICAgICAgLy8gICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH0pO1xuICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IHRydWU7XG4gICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnR2VuZXJhdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcblxuICAgICAgaW50ZXJ2YWwoNTAwMClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5waXBlKFxuICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIGVycm9yIHRocm91Z2ggb2JzZXJ2YWJsZSBzbyBwb2xsaW5nIGxvZ2ljIGNhbiBpbnNwZWN0IGl0XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHsgZXJyb3IgfSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcblxuICAgICAgICAgIHRhcChyZXMgPT4gY29uc29sZS5sb2coXCJQb2xsaW5nIHJlc3VsdDpcIiwgcmVzKSksXG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiDirIfvuI8gU1RPUCBQT0xMSU5HIG9ubHkgd2hlbjpcbiAgICAgICAgICAgKiAtIFNVQ0NFU1Mg4oaSIHJlcy5zdGF0dXMgPT09IENPTVBMRVRFRFxuICAgICAgICAgICAqIC0gRVJST1Ig4oaSIGNvbmZsaWN0IC8gYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICAgKi9cbiAgICAgICAgICB0YWtlV2hpbGUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiBmYWxzZTsgICAgICAgLy8gU3RvcFxuICAgICAgICAgICAgaWYgKHJlcz8uZXJyb3I/LnN0YXR1cyA9PT0gNDA5KSByZXR1cm4gZmFsc2U7ICAgICAgICAvLyBTdG9wXG4gICAgICAgICAgICBpZiAocmVzPy5lcnJvcj8uZXJyb3I/LmRldGFpbD8uaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHJldHVybiBmYWxzZTsgLy8gU3RvcFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEtlZXAgcG9sbGluZ1xuICAgICAgICAgIH0sIHRydWUpIC8vIGluY2x1ZGUgZmluYWwgZW1pc3Npb25cbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgICogIFNVQ0NFU1MgQ0FTRSAoc3RhdHVzIENPTVBMRVRFRClcbiAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnQ09NUExFVEVEJykge1xuICAgICAgICAgICAgICB0aGlzLmlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnQ291cnNlIHJlY29tbWVuZGF0aW9ucyByZWdlbmVyYXRlZCBzdWNjZXNzZnVsbHkhJztcblxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICB9LCAyMDAwKTtcblxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgICogIEVSUk9SIENBU0UgKDQwOSAvIGFscmVhZHkgZXhpc3RzKVxuICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgaWYgKHJlcz8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSByZXMuZXJyb3I7XG5cbiAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDA5IHx8IGVycm9yPy5lcnJvcj8uZGV0YWlsPy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0xvYWRpbmcgZXhpc3RpbmcgY291cnNlIHJlY29tbWVuZGF0aW9ucy4uLic7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgbmV4dDogKGV4aXN0aW5nRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDEwMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0xvYWRlZCBleGlzdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zIHN1Y2Nlc3NmdWxseSEnO1xuXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGV4aXN0aW5nRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBsb2FkRXJyb3IgPT4gcmVqZWN0KGxvYWRFcnJvcilcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8qKiBBbnkgb3RoZXIgZXJyb3Ig4oaSIHN0b3AgJiByZWplY3QgKi9cbiAgICAgICAgICAgICAgdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnJztcbiAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICAgICAqICBTVElMTCBQUk9DRVNTSU5HIChrZWVwIHBvbGxpbmcpXG4gICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSBNYXRoLm1pbih0aGlzLnByb2dyZXNzUGVyY2VudGFnZSArIDEwLCA5NSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnU3RpbGwgcHJvY2Vzc2luZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZXJyb3I6IGVyciA9PiByZWplY3QoZXJyKVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cblxuICAvLyBQcm9ncmVzc2l2ZSBsb2FkaW5nIG1ldGhvZHMgZm9yIHJlZ2VuZXJhdGlvblxuICBzdGFydFJlZ2VuZXJhdGl2ZVByb2dyZXNzaXZlTG9hZGluZygpIHtcbiAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSB0aGlzLnByb2Nlc3NpbmdTdGFnZXNbMF07XG4gICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgIHRoaXMuc3RhZ2VTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuc2ltdWxhdGVSZWdlbmVyYXRpdmVQcm9ncmVzc2l2ZVN0YWdlcygpO1xuICB9XG5cbiAgc2ltdWxhdGVSZWdlbmVyYXRpdmVQcm9ncmVzc2l2ZVN0YWdlcygpIHtcbiAgICBsZXQgY3VycmVudFN0YWdlSW5kZXggPSAwO1xuICAgIGNvbnN0IHRvdGFsRHVyYXRpb24gPSA2MDAwMDsgLy8gNjAgc2Vjb25kcyBlc3RpbWF0ZWQgZHVyYXRpb25cbiAgICBjb25zdCBzdGFnZUludGVydmFsID0gdG90YWxEdXJhdGlvbiAvIHRoaXMucHJvY2Vzc2luZ1N0YWdlcy5sZW5ndGg7XG5cbiAgICBjb25zdCBwcm9ncmVzc0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgLy8gU3RvcCBpZiByZWdlbmVyYXRpb24gaXMgY29tcGxldGVcbiAgICAgIGlmICghdGhpcy5pc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcykge1xuICAgICAgICBjbGVhckludGVydmFsKHByb2dyZXNzSW50ZXJ2YWwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gdGhpcy5zdGFnZVN0YXJ0VGltZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGFnZVByb2dyZXNzID0gKGVsYXBzZWQgJSBzdGFnZUludGVydmFsKSAvIHN0YWdlSW50ZXJ2YWw7XG4gICAgICBjb25zdCBzdGFnZUluZGV4ID0gTWF0aC5taW4oTWF0aC5mbG9vcihlbGFwc2VkIC8gc3RhZ2VJbnRlcnZhbCksIHRoaXMucHJvY2Vzc2luZ1N0YWdlcy5sZW5ndGggLSAxKTtcblxuICAgICAgLy8gVXBkYXRlIHN0YWdlIGlmIG5lZWRlZFxuICAgICAgaWYgKHN0YWdlSW5kZXggIT09IGN1cnJlbnRTdGFnZUluZGV4ICYmIHN0YWdlSW5kZXggPCB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnJlbnRTdGFnZUluZGV4ID0gc3RhZ2VJbmRleDtcbiAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzW3N0YWdlSW5kZXhdO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgb3ZlcmFsbCBwcm9ncmVzcyAoZWFjaCBzdGFnZSBpcyB3b3J0aCB+MTYuNjclKVxuICAgICAgY29uc3QgYmFzZVByb2dyZXNzID0gKHN0YWdlSW5kZXggLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIGNvbnN0IHN0YWdlUHJvZ3Jlc3MgPSAoY3VycmVudFN0YWdlUHJvZ3Jlc3MgLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gTWF0aC5taW4oTWF0aC5yb3VuZChiYXNlUHJvZ3Jlc3MgKyBzdGFnZVByb2dyZXNzKSwgOTUpO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIGNvbXBvbmVudCBkYXRhIGFmdGVyIHJlZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZWZyZXNoQ29tcG9uZW50KCkge1xuICAgIGNvbnNvbGUubG9nKCdSZWZyZXNoaW5nIGNvbXBvbmVudCBkYXRhLi4uJyk7XG5cbiAgICAvLyBSZXNldCBhbGwgZmlsdGVycyBhbmQgc2VsZWN0aW9uc1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZUZpbHRlciA9ICcnO1xuICAgIHRoaXMuc2VsZWN0RmlsdGVyQ291cnNlcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSBbXTtcbiAgICB0aGlzLm9yaWdpbmFsRmlsdGVyZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy5zdWdnZXN0ZWRDb3Vyc2VzID0gW107XG4gICAgdGhpcy51c2VyQWRkZWRDb3Vyc2VzID0gW107XG5cbiAgICAvLyBSZXNldCB0YWIgc3RhdGVzXG4gICAgdGhpcy5pbm5lclRhYkFjdGl2ZUluZGV4ID0gMDtcbiAgICB0aGlzLm91dGVyVGFiQWN0aXZlSW5kZXggPSAwO1xuXG4gICAgLy8gQ2FsbCB0aGUgZGF0YSBsb2FkaW5nIG1ldGhvZHMgZGlyZWN0bHkgdG8gYXZvaWQgcmVzZXR0aW5nIGRhdGFMb2FkZWRcbiAgICB0aGlzLmxvYWRDb21wb25lbnREYXRhKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBjb21wb25lbnQgZGF0YSAoc2VwYXJhdGVkIGZyb20gbmdPbkluaXQgZm9yIHJldXNlKVxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkQ29tcG9uZW50RGF0YSgpIHtcbiAgICB0aGlzLmdldFJlY29tbWVuZGVkQ291cnNlV2l0aFByb2dyZXNzKHRoaXMucGxhbkRhdGEuaWQpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgIHRoaXMucmVjb21tZW5kZWRfY291cnNlX2lkID0gcmVzLmlkXG4gICAgICBsZXQgYWxsQ291cmVzID0gW11cbiAgICAgIGlmIChyZXMgJiYgcmVzLmZpbHRlcmVkX2NvdXJzZXMgJiYgcmVzLmZpbHRlcmVkX2NvdXJzZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlcz8uZmlsdGVyZWRfY291cnNlcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0/LnJlbGV2YW5jeSA+PSA3NSkge1xuICAgICAgICAgICAgYWxsQ291cmVzLnB1c2goaXRlbSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gdGhpcy5zb3J0Q291cnNlc0J5UmVsZXZhbmN5KGFsbENvdXJlcylcbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeVJlbGV2YW5jeShhbGxDb3VyZXMpXG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmZpbHRlcmRDb3Vyc2VzJywgdGhpcy5maWx0ZXJkQ291cnNlcylcbiAgICAgIHRoaXMuZ2V0Q291cnNlcygpXG4gICAgICB0aGlzLmdldFN1Z2dlc3RlZENvdXJzZSgpXG5cbiAgICAgIC8vIEluaXRpYWxpemUgZ2FwIGFuYWx5c2lzIHN0YXRzIGFmdGVyIGNvdXJzZXMgYXJlIGxvYWRlZFxuICAgICAgdGhpcy5pbml0aWFsaXplR2FwQW5hbHlzaXNTdGF0cygpXG4gICAgICB0aGlzLmdldFVzZXJDb3Vyc2UoKVxuXG4gICAgICAvLyBNYXJrIGRhdGEgYXMgbG9hZGVkIGFmdGVyIGFsbCBpbml0aWFsIG9wZXJhdGlvbnNcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXR0aW5nIHJlY29tbWVuZGVkIGNvdXJzZXM6JywgZXJyb3IpO1xuICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdVbmF1dGhvcml6ZWQgYWNjZXNzIC0gdXNlciB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gbG9naW4nKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3Iuc3RhdHVzICE9PSA0MDkpIHtcbiAgICAgICAgLy8gRG9uJ3QgbG9nIGVycm9yIGZvciA0MDkgKGFscmVhZHkgZXhpc3RzKSBhcyBpdCdzIGhhbmRsZWQgaW4gdGhlIG1ldGhvZFxuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBjb3Vyc2UgcmVjb21tZW5kYXRpb25zJyk7XG4gICAgICB9XG4gICAgICAvLyBNYXJrIGRhdGEgYXMgbG9hZGVkIGV2ZW4gaWYgdGhlcmUncyBhbiBlcnJvciB0byBzaG93IHRoZSBkaWFsb2cgY29udGVudFxuICAgICAgdGhpcy5kYXRhTG9hZGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFByb2dyZXNzaXZlIGxvYWRpbmcgbWV0aG9kcyBmb3IgY291cnNlIGdlbmVyYXRpb25cbiAgc3RhcnRQcm9ncmVzc2l2ZUxvYWRpbmcoKSB7XG4gICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzWzBdO1xuICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMDtcbiAgICB0aGlzLnN0YWdlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLnNpbXVsYXRlUHJvZ3Jlc3NpdmVTdGFnZXMoKTtcbiAgfVxuXG4gIHNpbXVsYXRlUHJvZ3Jlc3NpdmVTdGFnZXMoKSB7XG4gICAgbGV0IGN1cnJlbnRTdGFnZUluZGV4ID0gMDtcbiAgICBjb25zdCB0b3RhbER1cmF0aW9uID0gNjAwMDA7IC8vIDYwIHNlY29uZHMgZXN0aW1hdGVkIGR1cmF0aW9uXG4gICAgY29uc3Qgc3RhZ2VJbnRlcnZhbCA9IHRvdGFsRHVyYXRpb24gLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoO1xuXG4gICAgY29uc3QgcHJvZ3Jlc3NJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gdGhpcy5zdGFnZVN0YXJ0VGltZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGFnZVByb2dyZXNzID0gKGVsYXBzZWQgJSBzdGFnZUludGVydmFsKSAvIHN0YWdlSW50ZXJ2YWw7XG4gICAgICBjb25zdCBzdGFnZUluZGV4ID0gTWF0aC5taW4oTWF0aC5mbG9vcihlbGFwc2VkIC8gc3RhZ2VJbnRlcnZhbCksIHRoaXMucHJvY2Vzc2luZ1N0YWdlcy5sZW5ndGggLSAxKTtcblxuICAgICAgLy8gVXBkYXRlIHN0YWdlIGlmIG5lZWRlZFxuICAgICAgaWYgKHN0YWdlSW5kZXggIT09IGN1cnJlbnRTdGFnZUluZGV4ICYmIHN0YWdlSW5kZXggPCB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnJlbnRTdGFnZUluZGV4ID0gc3RhZ2VJbmRleDtcbiAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzW3N0YWdlSW5kZXhdO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgb3ZlcmFsbCBwcm9ncmVzcyAoZWFjaCBzdGFnZSBpcyB3b3J0aCB+MTYuNjclKVxuICAgICAgY29uc3QgYmFzZVByb2dyZXNzID0gKHN0YWdlSW5kZXggLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIGNvbnN0IHN0YWdlUHJvZ3Jlc3MgPSAoY3VycmVudFN0YWdlUHJvZ3Jlc3MgLyB0aGlzLnByb2Nlc3NpbmdTdGFnZXMubGVuZ3RoKSAqIDEwMDtcbiAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gTWF0aC5taW4oTWF0aC5yb3VuZChiYXNlUHJvZ3Jlc3MgKyBzdGFnZVByb2dyZXNzKSwgOTUpO1xuXG4gICAgICAvLyBDbGVhciBpbnRlcnZhbCB3aGVuIGxvYWRpbmcgc3RvcHNcbiAgICAgIGlmICghdGhpcy5sb2FkaW5nKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NJbnRlcnZhbCk7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMTAwO1xuICAgICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnQ291cnNlIHJlY29tbWVuZGF0aW9ucyBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICAvLyBFbmhhbmNlZCBjb3Vyc2UgZ2VuZXJhdGlvbiB3aXRoIHByb2dyZXNzaXZlIGxvYWRpbmdcbiAgZ2V0UmVjb21tZW5kZWRDb3Vyc2VXaXRoUHJvZ3Jlc3Mocm9sZV9tYXBwaW5nX2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmN1cnJlbnRQcm9jZXNzaW5nU3RhZ2UgPSAnR2VuZXJhdGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJztcbiAgICAgIHRoaXMucHJvZ3Jlc3NQZXJjZW50YWdlID0gMzA7XG5cbiAgICAgIHRoaXMuc3RhcnRQcm9ncmVzc2l2ZUxvYWRpbmcoKTtcblxuICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gbnVsbDtcblxuICAgICAgY29uY2F0KFxuICAgICAgICBvZihudWxsKSwgICAgICAgICAgLy8gaW1tZWRpYXRlIGNhbGxcbiAgICAgICAgaW50ZXJ2YWwoNTAwMCkgICAgIC8vIHBvbGwgZXZlcnkgNSBzZWNcbiAgICAgIClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0UmVjb21tZW5kZWRDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKVxuICAgICAgICAgICksXG5cbiAgICAgICAgICB0YXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpcnN0QXBpUmVzcG9uc2UgJiYgIXRoaXMuZXhpc3RpbmdSZWNvbW1lbmRhdGlvbkZvdW5kKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzX2V4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGlzdGluZ1JlY29tbWVuZGF0aW9uRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICdGaXJzdCByZWNvbW1lbmRhdGlvbiByZXNwb25zZTonLFxuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgICB0YWtlV2hpbGUoKHJlc3BvbnNlOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgLy8gc3RvcCBwb2xsaW5nIGlmIGV4aXN0aW5nIHJlY29tbWVuZGF0aW9ucyBmb3VuZFxuICAgICAgICAgICAgaWYgKHRoaXMuZmlyc3RBcGlSZXNwb25zZT8uaXNfZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U/LnN0YXR1cyAhPT0gJ0NPTVBMRVRFRCc7XG5cbiAgICAgICAgICB9LCB0cnVlKSxcblxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh7XG5cbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAgIC8vIEVYSVNUSU5HIFJFQ09NTUVOREFUSU9OU1xuICAgICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICBpZiAodGhpcy5maXJzdEFwaVJlc3BvbnNlPy5pc19leGlzdGluZyAmJiB0aGlzLmV4aXN0aW5nUmVjb21tZW5kYXRpb25Gb3VuZCkge1xuXG4gICAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oXG4gICAgICAgICAgICAgICAgRGVsZXRlUm9sZU1hcHBpbmdQb3B1cENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGZyb206ICdnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucycgICAgICAgICAgICAgICAgIC8vIGluZGV4IGZvciBVSSByZW1vdmFsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlQ291cnNlUmVjb21tZW5kYXRpb25zKHJvbGVfbWFwcGluZ19pZClcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG5cbiAgICAgICAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXN0aW5nUmVjb21tZW5kYXRpb25Gb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdlbmVyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlY29tbWVuZGVkQ291cnNlV2l0aFByb2dyZXNzKHJvbGVfbWFwcGluZ19pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBkZWxldGUgcmVjb21tZW5kYXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmZpcnN0QXBpUmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAvLyBDT01QTEVURURcbiAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMgPT09ICdDT01QTEVURUQnKSB7XG5cbiAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAxMDA7XG4gICAgICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID1cbiAgICAgICAgICAgICAgICAnQ291cnNlIHJlY29tbWVuZGF0aW9ucyBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5ISc7XG5cbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1BlcmNlbnRhZ2UgPSAwO1xuICAgICAgICAgICAgICB9LCAyMDAwKTtcblxuICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgICAgICAgJ1JlY29tbWVuZGF0aW9ucyByZWFkeSEnLFxuICAgICAgICAgICAgICAgICdYJyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJyc7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzUGVyY2VudGFnZSA9IDA7XG5cbiAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBnZW5lcmF0ZSBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLicsXG4gICAgICAgICAgICAgICdYJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXNldEZpbHRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLnJlc2V0KHtcbiAgICAgIGNvbXBldGVuY3k6IFtdLFxuICAgICAgcmF0aW5nOiBbXSxcbiAgICAgIGxhbmd1YWdlOiBbXSxcbiAgICAgIGR1cmF0aW9uOiBbXSxcbiAgICAgIHByb3ZpZGVyOiBbXVxuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgZmlsdGVyZWQgZHJvcGRvd24gbGlzdHNcbiAgICB0aGlzLmZpbHRlcmVkQ29tcGV0ZW5jeSA9IFsuLi50aGlzLmNvbXBldGVuY2llc1R5cGVdO1xuICAgIHRoaXMuZmlsdGVyZWRSYXRpbmdzID0gWy4uLnRoaXMucmF0aW5nc107XG4gICAgdGhpcy5maWx0ZXJlZExhbmd1YWdlcyA9IFsuLi50aGlzLmxhbmd1YWdlc107XG4gICAgdGhpcy5maWx0ZXJlZER1cmF0aW9ucyA9IFsuLi50aGlzLmR1cmF0aW9uc107XG4gICAgdGhpcy5maWx0ZXJlZFByb3ZpZGVycyA9IFsuLi50aGlzLnByb3ZpZGVyc107XG5cbiAgICAvLyBSZXNldCBjb3Vyc2UgbGlzdFxuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMgPSBbLi4udGhpcy5mdWxsQ291cnNlTGlzdF07XG4gICAgLy8gdGhpcy5mdWxsQ291cnNlTGlzdC5mb3JFYWNoKChpdGVtKT0+e1xuICAgIC8vICAgaWYoaXRlbSAmJiBpdGVtLm9yZ2FuaXNhdGlvbiAmJiBpdGVtLm9yZ2FuaXNhdGlvbi5sZW5ndGgpIHtcbiAgICAvLyAgICAgaWYodGhpcy5maWx0ZXJlZFByb3ZpZGVycy5pbmRleE9mKGl0ZW0ub3JnYW5pc2F0aW9uWzBdKSA8IDApIHtcbiAgICAvLyAgICAgICB0aGlzLmZpbHRlcmVkUHJvdmlkZXJzLnB1c2goaXRlbS5vcmdhbmlzYXRpb25bMF0pXG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgfVxuICAgIC8vIH0pXG4gICAgdGhpcy5nZXRBbGxBdmFpbGFibGVDb3Vyc2VzKClcbiAgfVxuXG4gIGZpbHRlckxpc3QodmFsdWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VhcmNoID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnY29tcGV0ZW5jeSc6XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb21wZXRlbmN5ID0gdGhpcy5jb21wZXRlbmNpZXNUeXBlLmZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyYXRpbmcnOlxuICAgICAgICB0aGlzLmZpbHRlcmVkUmF0aW5ncyA9IHRoaXMucmF0aW5ncy5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGFuZ3VhZ2UnOlxuICAgICAgICB0aGlzLmZpbHRlcmVkTGFuZ3VhZ2VzID0gdGhpcy5sYW5ndWFnZXMuZmlsdGVyKHYgPT4gdi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2R1cmF0aW9uJzpcbiAgICAgICAgdGhpcy5maWx0ZXJlZER1cmF0aW9ucyA9IHRoaXMuZHVyYXRpb25zLmZpbHRlcih2ID0+IHYudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwcm92aWRlcic6XG4gICAgICAgIHRoaXMuZmlsdGVyZWRQcm92aWRlcnMgPSB0aGlzLnByb3ZpZGVycy5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG5vcm1hbGl6ZUNvbXBldGVuY3kodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHYgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHYgPT09ICdhbGwnKSByZXR1cm4gJ2FsbCc7XG4gICAgaWYgKHYuaW5jbHVkZXMoJ2JlaGF2aW91cmFsJykgfHwgdi5pbmNsdWRlcygnYmVoYXZpb3JhbCcpKSByZXR1cm4gJ2JlaGF2aW9yYWwnO1xuICAgIGlmICh2LmluY2x1ZGVzKCdmdW5jdGlvbmFsJykpIHJldHVybiAnZnVuY3Rpb25hbCc7XG4gICAgaWYgKHYuaW5jbHVkZXMoJ2RvbWFpbicpKSByZXR1cm4gJ2RvbWFpbic7XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBhcHBseUZpbHRlcnMoKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tcGV0ZW5jeSA9IFtdLFxuICAgICAgcmF0aW5nID0gW10sXG4gICAgICBsYW5ndWFnZSA9IFtdLFxuICAgICAgZHVyYXRpb24gPSBbXSxcbiAgICAgIHByb3ZpZGVyID0gW11cbiAgICB9ID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlO1xuXG4gICAgY29uc29sZS5sb2coJ3RoaXMuZnVsbENvdXJzZUxpc3QtLScsIHRoaXMuZnVsbENvdXJzZUxpc3QpXG5cbiAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gdGhpcy5mdWxsQ291cnNlTGlzdC5maWx0ZXIoY291cnNlID0+IHtcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBDb21wZXRlbmN5IC0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgIGNvbnN0IGNvdXJzZUNvbXBldGVuY2llcyA9IFtcbiAgICAgICAgLi4uKGNvdXJzZS5jb21wZXRlbmNpZXMgfHwgW10pLFxuICAgICAgICAuLi4oY291cnNlLmNvbXBldGVuY2llc192NiB8fCBbXSlcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkQ29tcGV0ZW5jaWVzID0gY29tcGV0ZW5jeVxuICAgICAgICAubWFwKChjOiBzdHJpbmcpID0+IHRoaXMubm9ybWFsaXplQ29tcGV0ZW5jeShjKSlcbiAgICAgICAgLmZpbHRlcihjID0+IGMgIT09ICcnKTtcblxuICAgICAgY29uc3QgY29tcGV0ZW5jeU1hdGNoID1cbiAgICAgICAgc2VsZWN0ZWRDb21wZXRlbmNpZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIHNlbGVjdGVkQ29tcGV0ZW5jaWVzLmluY2x1ZGVzKCdhbGwnKSB8fFxuICAgICAgICBjb3Vyc2VDb21wZXRlbmNpZXMuc29tZSgoYzogYW55KSA9PlxuICAgICAgICAgIHNlbGVjdGVkQ29tcGV0ZW5jaWVzLmluY2x1ZGVzKFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVDb21wZXRlbmN5KGMuY29tcGV0ZW5jeUFyZWFOYW1lKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBSYXRpbmcgLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgY29uc3QgcmF0aW5nTWF0Y2ggPVxuICAgICAgICByYXRpbmcubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIHRoaXMubWF0Y2hSYXRpbmcoY291cnNlLCByYXRpbmcpO1xuXG4gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIExhbmd1YWdlIC0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICAgIGNvbnN0IGxhbmd1YWdlTWF0Y2ggPVxuICAgICAgICBsYW5ndWFnZS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgbGFuZ3VhZ2Uuc29tZSgobDogc3RyaW5nKSA9PlxuICAgICAgICAgIGNvdXJzZS5sYW5ndWFnZSA9PT0gbCB8fFxuICAgICAgICAgIGNvdXJzZS5sYW5ndWFnZT8uaW5jbHVkZXM/LihsKSB8fFxuICAgICAgICAgIGNvdXJzZS5sYW5ndWFnZT8uWzBdPy5pbmNsdWRlcz8uKGwpXG4gICAgICAgICk7XG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gRHVyYXRpb24gLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgY29uc3QgZHVyYXRpb25NYXRjaCA9XG4gICAgICAgIGR1cmF0aW9uLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICB0aGlzLm1hdGNoRHVyYXRpb24oY291cnNlLmR1cmF0aW9uLCBkdXJhdGlvbik7XG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gUHJvdmlkZXIgLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgICAgY29uc3QgcHJvdmlkZXJNYXRjaCA9XG4gICAgICAgIHByb3ZpZGVyLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBwcm92aWRlci5zb21lKChwOiBzdHJpbmcpID0+XG4gICAgICAgICAgY291cnNlLm9yZ2FuaXNhdGlvbj8uaW5jbHVkZXMocClcbiAgICAgICAgKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29tcGV0ZW5jeU1hdGNoICYmXG4gICAgICAgIHJhdGluZ01hdGNoICYmXG4gICAgICAgIGxhbmd1YWdlTWF0Y2ggJiZcbiAgICAgICAgZHVyYXRpb25NYXRjaCAmJlxuICAgICAgICBwcm92aWRlck1hdGNoXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IHRoaXMuc29ydENvdXJzZXNCeUNhdGVnb3J5QW5kUmVsZXZhbmN5KHRoaXMuZmlsdGVyZENvdXJzZXMpO1xuICB9XG5cbiAgbWF0Y2hSYXRpbmcoY291cnNlOiBhbnksIHNlbGVjdGVkUmF0aW5nczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoIXNlbGVjdGVkUmF0aW5ncyB8fCBzZWxlY3RlZFJhdGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gbm8gZmlsdGVyIHNlbGVjdGVkIOKGkiBtYXRjaCBldmVyeXRoaW5nXG4gICAgfVxuXG4gICAgbGV0IHJhdGluZyA9IG51bGw7XG5cbiAgICAvLyAx77iP4oOjIFVzZSBhdmdSYXRpbmcgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGNvdXJzZS5hdmdSYXRpbmcgIT0gbnVsbCAmJiAhaXNOYU4oY291cnNlLmF2Z1JhdGluZykpIHtcbiAgICAgIHJhdGluZyA9IE51bWJlcihjb3Vyc2UuYXZnUmF0aW5nKTtcbiAgICB9XG4gICAgLy8gMu+4j+KDoyBNYXAgcmVsZXZhbmN5IGlmIGF2Z1JhdGluZyBtaXNzaW5nXG4gICAgZWxzZSBpZiAoY291cnNlLnJlbGV2YW5jeSAhPSBudWxsICYmICFpc05hTihjb3Vyc2UucmVsZXZhbmN5KSkge1xuICAgICAgY29uc3QgcmVsID0gTnVtYmVyKGNvdXJzZS5yZWxldmFuY3kpO1xuICAgICAgaWYgKHJlbCA+PSA5MCkgcmF0aW5nID0gNC41O1xuICAgICAgZWxzZSBpZiAocmVsID49IDgwKSByYXRpbmcgPSA0LjA7XG4gICAgICBlbHNlIGlmIChyZWwgPj0gNzApIHJhdGluZyA9IDMuNTtcbiAgICAgIGVsc2UgaWYgKHJlbCA+PSA1MCkgcmF0aW5nID0gMi41O1xuICAgICAgZWxzZSByYXRpbmcgPSAxLjA7XG4gICAgfVxuXG4gICAgLy8gM++4j+KDoyBObyB1c2FibGUgcmF0aW5nIOKGkiBleGNsdWRlXG4gICAgaWYgKHJhdGluZyA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gNO+4j+KDoyBNYXRjaCBzZWxlY3RlZCByYXRpbmcgcmFuZ2VzXG4gICAgcmV0dXJuIHNlbGVjdGVkUmF0aW5ncy5zb21lKHIgPT4ge1xuICAgICAgc3dpdGNoIChyKSB7XG4gICAgICAgIGNhc2UgJzQuNSBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDQuNTtcbiAgICAgICAgY2FzZSAnNC4wIGFuZCBhYm92ZSc6IHJldHVybiByYXRpbmcgPj0gNC4wO1xuICAgICAgICBjYXNlICczLjUgYW5kIGFib3ZlJzogcmV0dXJuIHJhdGluZyA+PSAzLjU7XG4gICAgICAgIGNhc2UgJzIuNSBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDIuNTtcbiAgICAgICAgY2FzZSAnMSBhbmQgYWJvdmUnOiByZXR1cm4gcmF0aW5nID49IDEuMDtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBtYXRjaER1cmF0aW9uKGR1cmF0aW9uSW5TZWNvbmRzOiBudW1iZXIgfCBzdHJpbmcsIHNlbGVjdGVkUmFuZ2VzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhvdXJzID0gTnVtYmVyKGR1cmF0aW9uSW5TZWNvbmRzKSAvIDM2MDA7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRSYW5nZXMuc29tZShyYW5nZSA9PiB7XG4gICAgICBzd2l0Y2ggKHJhbmdlKSB7XG4gICAgICAgIGNhc2UgJzwgMSBIb3VyJzpcbiAgICAgICAgICByZXR1cm4gaG91cnMgPCAxO1xuICAgICAgICBjYXNlICcxLTUgSG91cnMnOlxuICAgICAgICAgIHJldHVybiBob3VycyA+PSAxICYmIGhvdXJzIDw9IDU7XG4gICAgICAgIGNhc2UgJzUrIEhvdXJzJzpcbiAgICAgICAgICByZXR1cm4gaG91cnMgPiA1O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8vIENvbmZpcm1hdGlvbiBEaWFsb2cgQ29tcG9uZW50XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyZWdlbmVyYXRlLWNvbmZpcm1hdGlvbi1kaWFsb2cnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJjb25maXJtYXRpb24tZGlhbG9nLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1oZWFkZXJcIj5cbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwid2FybmluZy1pY29uXCI+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICAgIDxoMiBtYXQtZGlhbG9nLXRpdGxlPlJlZ2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uczwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cImRpYWxvZy1jb250ZW50XCI+XG4gICAgICAgIDxwIGNsYXNzPVwibWFpbi1tZXNzYWdlXCI+XG4gICAgICAgICAgVGhpcyB3aWxsIGRlbGV0ZSBhbGwgY3VycmVudCBjb3Vyc2UgcmVjb21tZW5kYXRpb25zIGFuZCBnZW5lcmF0ZSBuZXcgb25lcyBiYXNlZCBvbiB0aGUgbGF0ZXN0IHJvbGUgbWFwcGluZy5cbiAgICAgICAgPC9wPlxuICAgICAgICA8cCBjbGFzcz1cInN1Yi1tZXNzYWdlXCI+XG4gICAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlP1xuICAgICAgICA8L3A+XG4gICAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICAgIFxuICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucyBjbGFzcz1cImRpYWxvZy1hY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoKVwiIGNsYXNzPVwiY2FuY2VsLWJ0blwiPlxuICAgICAgICAgIENhbmNlbFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib25Db25maXJtKClcIiBjbGFzcz1cImNvbmZpcm0tYnRuXCI+XG4gICAgICAgICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxuICAgICAgICAgIFllcywgUmVnZW5lcmF0ZVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmNvbmZpcm1hdGlvbi1kaWFsb2ctY29udGFpbmVyIHtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgfVxuICAgIFxuICAgIC5kaWFsb2ctaGVhZGVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAxMnB4O1xuICAgICAgcGFkZGluZzogMjRweCAyNHB4IDE2cHggMjRweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTBlMGUwO1xuICAgIH1cbiAgICBcbiAgICAud2FybmluZy1pY29uIHtcbiAgICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgY29sb3I6ICNmZjk4MDA7XG4gICAgfVxuICAgIFxuICAgIGgyIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBjb2xvcjogIzMzMztcbiAgICB9XG4gICAgXG4gICAgLmRpYWxvZy1jb250ZW50IHtcbiAgICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgfVxuICAgIFxuICAgIC5tYWluLW1lc3NhZ2Uge1xuICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgY29sb3I6ICMzMzM7XG4gICAgICBtYXJnaW46IDAgMCAxMnB4IDA7XG4gICAgICBsaW5lLWhlaWdodDogMS41O1xuICAgIH1cbiAgICBcbiAgICAuc3ViLW1lc3NhZ2Uge1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgY29sb3I6ICM2NjY7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbiAgICBcbiAgICAuZGlhbG9nLWFjdGlvbnMge1xuICAgICAgcGFkZGluZzogMTZweCAyNHB4IDI0cHggMjRweDtcbiAgICAgIGdhcDogMTJweDtcbiAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgfVxuICAgIFxuICAgIC5jYW5jZWwtYnRuIHtcbiAgICAgIGNvbG9yOiAjNjY2O1xuICAgIH1cbiAgICBcbiAgICAuY29uZmlybS1idG4ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDhweDtcbiAgICAgIFxuICAgICAgLm1hdC1pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICB3aWR0aDogMThweDtcbiAgICAgICAgaGVpZ2h0OiAxOHB4O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBSZWdlbmVyYXRlQ29uZmlybWF0aW9uRGlhbG9nIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFJlZ2VuZXJhdGVDb25maXJtYXRpb25EaWFsb2c+XG4gICkgeyB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xuICB9XG5cbiAgb25Db25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRydWUpO1xuICB9XG5cblxufVxuIiwiPGRpdiBjbGFzcz1cInZpZXctY2JwLXBsYW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY29udGFpbmVyXCI+XG4gICAgICAgIFxuICAgICAgICA8IS0tIEluaXRpYWwgTG9hZGluZyBTY3JlZW4gKGZvciBpbml0aWFsIGxvYWQgYW5kIHJlZ2VuZXJhdGlvbikgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbml0aWFsLWxvYWRpbmctY29udGFpbmVyXCIgKm5nSWY9XCIhZGF0YUxvYWRlZCB8fCBpc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0IG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYWluLW1lc3NhZ2VcIj57eyBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlIHx8IChpc1JlZ2VuZXJhdGluZ1dpdGhQcm9ncmVzcyA/ICdSZWdlbmVyYXRpbmcgY291cnNlIHJlY29tbWVuZGF0aW9ucy4uLicgOiAnTG9hZGluZyBjb3Vyc2UgcmVjb21tZW5kYXRpb25zLi4uJykgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1kZXRhaWxzXCIgKm5nSWY9XCJwcm9ncmVzc1BlcmNlbnRhZ2UgPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtaW5kaWNhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzUGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJwcm9ncmVzcy10ZXh0XCI+e3sgcHJvZ3Jlc3NQZXJjZW50YWdlIH19JSBDb21wbGV0ZTwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRpbWUtZXN0aW1hdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsLXRpbWUgY291cnNlIGdlbmVyYXRpb24gaW4gcHJvZ3Jlc3MuIFRoaXMgbWF5IHRha2UgMS0yIG1pbnV0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1haW4tY29udGVudFwiICpuZ0lmPVwiZGF0YUxvYWRlZCAmJiAhaXNSZWdlbmVyYXRpbmdXaXRoUHJvZ3Jlc3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIj5TYXZlIENvdXJzZXMgKDxzcGFuPnt7c2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8ub3JnTmFtZX19IDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwbGFuRGF0YT8uZGVzaWduYXRpb25fbmFtZSBcIj4vIHt7cGxhbkRhdGE/LmRlc2lnbmF0aW9uX25hbWV9fTwvc3Bhbj48L3NwYW4+KTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicmVnZW5lcmF0ZS1idG5cIiAoY2xpY2spPVwicmVnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlZ2VuZXJhdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWlzUmVnZW5lcmF0aW5nXCI+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImlzUmVnZW5lcmF0aW5nXCIgZGlhbWV0ZXI9XCIyMFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7aXNSZWdlbmVyYXRpbmcgPyAnUmVnZW5lcmF0aW5nLi4uJyA6ICdSZWdlbmVyYXRlIFJlY29tbWVuZGF0aW9ucyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgY2xvc2UtYnRuXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGFpbmVyIG10LTRcIj5cbiAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwIChzZWxlY3RlZFRhYkNoYW5nZSk9XCJvbk91dGVyVGFiQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8IS0tIEZpcnN0IE1haW4gVGFiIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiY291cnNlIHJlY29tbWVuZGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTmVzdGVkIFRhYnMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC10YWItZ3JvdXAgKHNlbGVjdGVkVGFiQ2hhbmdlKT1cIm9uSW5uZXJUYWJDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJhbGxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJiZWhhdmlvdXJhbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYiBsYWJlbD1cImZ1bmN0aW9uYWxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJkb21haW5cIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+IC0tPlxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cblxuICAgICAgICAgICAgICAgIDwhLS0gU2Vjb25kIE1haW4gVGFiIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiZ2FwIGFuYWx5c2lzXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHA+R2FwIGFuYWx5c2lzIGNvbnRlbnQgZ29lcyBoZXJlPC9wPiAtLT5cbiAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIiBjbGFzcz1cImZpbHRlcnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm9sZS1tYXBwaW5nLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvdXRlclRhYkFjdGl2ZUluZGV4ID09PSAwICYmIChpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAwIHx8IGlubmVyVGFiQWN0aXZlSW5kZXggPT09IDEgfHwgaW5uZXJUYWJBY3RpdmVJbmRleCA9PT0gMiB8fCBpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAzIClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlci1pbXByb3ZlZCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWFyY2ggQ291cnNlczwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyLWNvbXBhY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJzZWFyY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInNlYXJjaC1pY29uXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cInNpbnB1dC1jb21wYWN0XCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiYXBwbHlGaWx0ZXIoJGV2ZW50LnRhcmdldC52YWx1ZSk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBDb3Vyc2VzXCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBDb21wZXRlbmN5PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5jb21wZXRlbmN5Py5sZW5ndGggPyAnJyA6ICdDb21wZXRlbmN5JyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBDb21wZXRlbmN5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJmaWx0ZXJMaXN0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsICdjb21wZXRlbmN5JylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZENvbXBldGVuY3lcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBSYXRpbmc8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5yYXRpbmc/Lmxlbmd0aCA/ICcnIDogJ1JhdGluZycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyYXRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBSZWF0aW5nc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyTGlzdCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlLCAncmF0aW5nJylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZFJhdGluZ3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXItaW1wcm92ZWQtc2VjLTIgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgTGFuZ3VhZ2U8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5sYW5ndWFnZT8ubGVuZ3RoID8gJycgOiAnTGFuZ3VhZ2UnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGFuZ3VhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBMYW5ndWFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlckxpc3QoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSwgJ2xhbmd1YWdlJylcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFZhbHVlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgciBvZiBmaWx0ZXJlZExhbmd1YWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWFuZC1idXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlbGVjdCBEdXJhdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWx0ZXJGb3JtLnZhbHVlLmR1cmF0aW9uPy5sZW5ndGggPyAnJyA6ICdEdXJhdGlvbicgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJzZWxlY3Qtc2VhcmNoLXBhbmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJhcHBseUZpbHRlcnMoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlYXJjaCBib3ggLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiA1cHg7d2lkdGg6IDkyJTttYXJnaW46IDVweDtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIER1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJmaWx0ZXJMaXN0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUsICdkdXJhdGlvbicpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWYWx1ZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHIgb2YgZmlsdGVyZWREdXJhdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1hbmQtYnV0dG9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWxlY3QgUHJvdmlkZXI8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmlsdGVyRm9ybS52YWx1ZS5wcm92aWRlcj8ubGVuZ3RoID8gJycgOiAnUHJvdmlkZXInIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJvdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXNlYXJjaC1wYW5lbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImJvcmRlcjoxcHggc29saWQgI2NjYzsgcGFkZGluZzogNXB4O3dpZHRoOiA5MiU7bWFyZ2luOiA1cHg7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBQcm92aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyTGlzdCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlLCAncHJvdmlkZXInKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVmFsdWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByIG9mIGZpbHRlcmVkUHJvdmlkZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA0NXB4O21hcmdpbi1sZWZ0OiAyMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1hY3RpdmVcIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJSZXNldCBBbGwgRmlsdGVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcnMoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojMDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyZWQgQ291cnNlIENvdW50IDoge3tmaWx0ZXJkQ291cnNlcz8ubGVuZ3RofX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTUgc3ViLWhlYWRpbmcgc2VsZWN0LWFsbC1jb250YWluZXJcIiAqbmdJZj1cImZpbHRlcmRDb3Vyc2VzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IFtjaGVja2VkXT1cImZhbHNlXCIgKGNoYW5nZSk9XCJzZWxlY3RBbGxDb3Vyc2VzKCRldmVudClcIj5TZWxlY3QgQWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdXJzZXM8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cC1jb21wYWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkFkZCBNb3JlIENvdXJzZSBGcm9tIGlHT1RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1Z2dlc3RNb3JlQ291cnNlcygpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGwtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW2Rpc2FibGVkXT1cInNlbGVjdEZpbHRlckNvdXJzZXM/Lmxlbmd0aCA+IDAgPyBmYWxzZSA6IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0RmlsdGVyQ291cnNlcz8ubGVuZ3RoID4gMCA/ICdidG4tYWN0aXZlJyA6ICdidG4tZGlzYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFt2YWx1ZV09XCJtb2RlID09PSAnYWRkJyA/ICdTYXZlIENvdXJzZXMnIDogJ1VwZGF0ZSBDb3Vyc2VzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZUNvdXJzZXMoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImRpc2NsYWltZXItY29udGFpbmVyIG10LTJcIiAqbmdJZj1cImZpbHRlcmRDb3Vyc2VzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNjbGFpbWVyLW1lc3NhZ2UgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+RGlzY2xhaW1lcjo8L3N0cm9uZz4gUGxlYXNlIHZlcmlmeSB0aGUgcHVibGljIGNvdXJzZSBVUkwgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgcGxhbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtbGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImlubmVyVGFiQWN0aXZlSW5kZXggPiAwID8gJ2NvdXJzZS1saXN0LWNvbnRhaW5lci1mbGV4JzonY291cnNlLWxpc3QtY29udGFpbmVyLXJpZ2h0LWZsZXgnIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA+IDAgPyAnbGVmdC1wYW5lbCc6JydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbXBldGVuY2llcyBpbiBCZWhhdmlvdXJhbDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlbWUtZmlsdGVyLWNvbnRyb2xzIG1iLTJcIiAqbmdJZj1cInNlbGVjdGVkVGhlbWVGaWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNsZWFyLWZpbHRlci1idG5cIiAoY2xpY2spPVwiY2xlYXJUaGVtZUZpbHRlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPiBDbGVhciBGaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiZmlsdGVyT25Db21wZXRlbmN5VGhlbWUoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXRlZ29yeS1saXN0LWl0ZW0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkLXRoZW1lJzogaXNUaGVtZVNlbGVjdGVkKGl0ZW0pfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb21wZXRlbmN5TWF0Y2hlZEJ5Q2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlubmVyVGFiQWN0aXZlSW5kZXggPT09IDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q29tcGV0ZW5jaWVzIGluIEZ1bmN0aW9uYWw8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZW1lLWZpbHRlci1jb250cm9scyBtYi0yXCIgKm5nSWY9XCJzZWxlY3RlZFRoZW1lRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjbGVhci1maWx0ZXItYnRuXCIgKGNsaWNrKT1cImNsZWFyVGhlbWVGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj4gQ2xlYXIgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImZpbHRlck9uQ29tcGV0ZW5jeVRoZW1lKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F0ZWdvcnktbGlzdC1pdGVtIGN1cnNvci1wb2ludGVyIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzZWxlY3RlZC10aGVtZSc6IGlzVGhlbWVTZWxlY3RlZChpdGVtKX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbm5lclRhYkFjdGl2ZUluZGV4ID09PSAzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNvbXBldGVuY2llcyBpbiBEb21haW48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZW1lLWZpbHRlci1jb250cm9scyBtYi0yXCIgKm5nSWY9XCJzZWxlY3RlZFRoZW1lRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjbGVhci1maWx0ZXItYnRuXCIgKGNsaWNrKT1cImNsZWFyVGhlbWVGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj4gQ2xlYXIgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImZpbHRlck9uQ29tcGV0ZW5jeVRoZW1lKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXRlZ29yeS1saXN0LWl0ZW0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQtdGhlbWUnOiBpc1RoZW1lU2VsZWN0ZWQoaXRlbSl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeU1hdGNoZWRCeUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaW5uZXJUYWJBY3RpdmVJbmRleCA+IDAgPyAncmlnaHQtcGFuZWwnOidyaWdodC1wYW5lbC1mbGV4J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBDb3Vyc2UgRm91bmQgTWVzc2FnZSBpbiBSaWdodCBQYW5lbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1jb3Vyc2UtZm91bmQtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlcmRDb3Vyc2VzPy5sZW5ndGggPT09IDAgJiYgc2VsZWN0ZWRUaGVtZUZpbHRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1jb3Vyc2UtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tY291cnNlLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5zZWFyY2hfb2ZmPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1jb3Vyc2UtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0Pk5vIENvdXJzZXMgRm91bmQ8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Tm8gY291cnNlcyBmb3VuZCBmb3IgdGhlIHNlbGVjdGVkIHRoZW1lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3tzZWxlY3RlZFRoZW1lRmlsdGVyfX08L3N0cm9uZz48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Xb3VsZCB5b3UgbGlrZSB0byBhZGQgYSBjb3Vyc2UgZm9yIHRoaXMgY29tcGV0ZW5jeT88L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3VnZ2VzdC1jb3Vyc2UtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ291cnNlRm9yU2VsZWN0ZWRUaGVtZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBDb3Vyc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvdXJzZXMgTGlzdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZENvdXJzZXM7bGV0IGk9aW5kZXhcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrZWQtY291cnNlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2NoZWNrZWRdPVwiY2hlY2tJZkNvdXJzZUV4aXN0cyhpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdGVkRmlsdGVyQ291cnNlcygkZXZlbnQsIGl0ZW0pXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9jb3Vyc2Uuc3ZnXCI+PC9zcGFuPiZuYnNwOzxzcGFuPkNvdXJzZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbT8ucmF0aW9uYWxlXCI+QUkgUmVjb21tZW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmlzX3B1YmxpY1wiPiAtIFB1YmxpYzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtPy5pc19wdWJsaWNcIj4gLSBpR09UPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbT8ucmF0aW9uYWxlXCI+TWFudWFsbHkgU3VnZ2VzdGVkIC0gaUdPVDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5yYXRpb25hbGUgJiYgIWl0ZW0/LmlzX3B1YmxpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1ncmVlbi10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QUkgUmVjb21tZW5kZWQgLSBpR09UIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5wbGF0Zm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBbaHJlZl09XCJpdGVtPy5wdWJsaWNfbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0/LnBsYXRmb3JtfX08L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5vcmdhbmlzYXRpb24/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlByb3ZpZGVyIC0ge3tpdGVtPy5vcmdhbmlzYXRpb259fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5yYXRpb25hbGUgJiYgaXRlbT8uaXNfcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1wdWJsaWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1wdWJsaWMtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFJIFJlY29tbWVuZGVkIC0gUHVibGljIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5wbGF0Zm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBbaHJlZl09XCJpdGVtPy5wdWJsaWNfbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0/LnBsYXRmb3JtfX08L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5vcmdhbmlzYXRpb24/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlByb3ZpZGVyIC0ge3tpdGVtPy5vcmdhbmlzYXRpb259fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXRlbT8ucmF0aW9uYWxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1ncmF5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JheS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+TWFudWFsbHkgU3VnZ2VzdGVkIC0gaUdPVCA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuPlBsYXRmb3JtIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9ufX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtdGl0bGUgbXQtMyBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZWRpcmVjdFRvVG9jKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0/LmNvdXJzZVwiPnt7aXRlbT8uY291cnNlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiaXRlbT8ubmFtZVwiPnt7aXRlbT8ubmFtZX19KioqKjwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7XCIgKGNsaWNrKT1cInJlZGlyZWN0VG9Ub2MoaXRlbSlcIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4cHhcIiB3aWR0aD1cIjE4cHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvcmVkaXJlY3QucG5nXCIgLz48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWRlc2MgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cIml0ZW0/LnJhdGlvbmFsZVwiPnt7aXRlbT8ucmF0aW9uYWxlfX08L3NwYW4+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtPy5kZXNjcmlwdGlvblwiPnt7aXRlbT8uZGVzY3JpcHRpb259fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0JlaGF2aW91cmFsJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkJlaGF2aW91cmFsIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJiZWhhdmlvdXJhbC1waWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdCZWhhdmlvdXJhbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHRcIj4ge3sgY29tcC5jb21wZXRlbmN5VGhlbWVOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0JlaGF2aW91cmFsJyxpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaG93LW1vcmUtbGluayBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29tcGV0ZW5jaWVzKCdCZWhhdmlvdXJhbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlzRXhwYW5kZWQoJ0JlaGF2aW91cmFsJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdCZWhhdmlvdXJhbCcsaSkgKyAnIE1vcmUnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0Z1bmN0aW9uYWwnLGkpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+RnVuY3Rpb25hbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnVuY3Rpb25hbC1waWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdGdW5jdGlvbmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuY29tcGV0ZW5jeVN1YlRoZW1lTmFtZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJoYXNNb3JlVGhhblR3bygnRnVuY3Rpb25hbCcsaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZS1jb21wZXRlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnRnVuY3Rpb25hbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlzRXhwYW5kZWQoJ0Z1bmN0aW9uYWwnLGkpID8gJ1Nob3cgTGVzcycgOiAnKycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nQ291bnQoJ0Z1bmN0aW9uYWwnLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdEb21haW4nLGkpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+RG9tYWluIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkb21haW4tcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldERpc3BsYXllZENvbXBldGVuY2llcygnRG9tYWluJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuY29tcGV0ZW5jeVN1YlRoZW1lTmFtZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJoYXNNb3JlVGhhblR3bygnRG9tYWluJyxpKVwiIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaG93LW1vcmUtbGluayBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29tcGV0ZW5jaWVzKCdEb21haW4nLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdEb21haW4nLGkpID8gJ1Nob3cgTGVzcycgOiAnKycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nQ291bnQoJ0RvbWFpbicsaSkgKyAnIE1vcmUnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWxldmFuY3kgYW5kIER1cmF0aW9uIHNlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1mb290ZXJcIiAqbmdJZj1cIml0ZW0/LnJlbGV2YW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5LXBpbGwtZ3JlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3ktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeVwiPlJlbGV2YW5jeTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXNoXCI+LTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJjZW50YWdlXCI+e3tpdGVtPy5yZWxldmFuY3l9fSU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1waWxsLWdyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3lcIj5EdXJhdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXNoXCI+LTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJjZW50YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0/LmR1cmF0aW9uXCI+e3tnZXREdXJhdGlvbihpdGVtPy5kdXJhdGlvbil9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhKGl0ZW0/LmR1cmF0aW9uKVwiPk4vQTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gR2VuZXJhbCBObyBEYXRhIE1lc3NhZ2UgKG9ubHkgd2hlbiBubyB0aGVtZSBmaWx0ZXIgaXMgYWN0aXZlKSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc3ViLWhlYWRpbmdcIiAqbmdJZj1cImZpbHRlcmRDb3Vyc2VzPy5sZW5ndGggPT09IDAgJiYgIXNlbGVjdGVkVGhlbWVGaWx0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vIERhdGEgRm91bmQ8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb2xlLW1hcHBpbmctY29udGFpbmVyXCIgKm5nSWY9XCJvdXRlclRhYkFjdGl2ZUluZGV4ID09PSAxXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImdhcC1hbmFseXNpcy1jb250ZW50XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLXBkZiBtdC00IG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkRvd25sb2FkXCIgKGNsaWNrKT1cImRvd25sb2FkUERGKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiaXNQREZEb3dubG9hZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZGYtaGVhZGluZ1wiPnt7c2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8ubmFtZX19IDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInBsYW5EYXRhPy5kZXNpZ25hdGlvbl9uYW1lIFwiPl97e3BsYW5EYXRhPy5kZXNpZ25hdGlvbl9uYW1lfX1fR2FwX0FuYWx5c2lzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB2aC0xMDBcIiBbbmdDbGFzc109XCJpc1BERkRvd25sb2FkID8gJ210LTQnOicnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaWRlYmFyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gcC0zIGJnLWxpZ2h0IGJvcmRlci1lbmRcIiBzdHlsZT1cIndpZHRoOiAyNTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItNFwiPkFuYWx5emUgYnkgQ2F0ZWdvcnk8L2g1PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1lbnVJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1iLTIgdGV4dC1zdGFydCBtZW51LWxpc3QtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09IGl0ZW0ua2V5XCIgKGNsaWNrKT1cInNlbGVjdENhdGVnb3J5KGl0ZW0ua2V5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTWFpbiBDb250ZW50IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSBwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMyBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTMgZ3JheS1iZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtbGFiZWwgc3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q29tcGV0ZW5jaWVzIENvdmVyZWQ8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1jb3VudFwiPnt7Y29tcGV0ZW5jeUNvdmVyZWRDb3VudH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTMgZ3JheS1iZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtbGFiZWwgc3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnYWxsJ1wiPlRvdGFsIENvbXBldGVuY2llczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnYmVoYXZpb3JhbCdcIj5Ub3RhbCBCZWhhdmlvdXJhbCBDb21wZXRlbmNpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdmdW5jdGlvbmFsJ1wiPlRvdGFsIEZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZG9tYWluJ1wiPlRvdGFsIERvbWFpbiBDb21wZXRlbmNpZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2FsbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YmVoYXZpb3JhbFRvdGFsQ29tcGV0ZW5jaWVzfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZnVuY3Rpb25hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmdW5jdGlvbmFsVG90YWxDb21wZXRlbmNpZXN9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdkb21haW4nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZG9tYWluVG90YWxDb21wZXRlbmNpZXN9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0zIGdyZWVuLWJnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2FsbCdcIj5PdmVyYWxsIENvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2JlaGF2aW9yYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlaGF2aW91cmFsIENvdmVyYWdlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2Z1bmN0aW9uYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uYWwgQ292ZXJhZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWdyZWVuLWxhYmVsXCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnZG9tYWluJ1wiPkRvbWFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3ZlcmFnZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdhbGwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7b3ZlcmFsbENvdmVyYWdlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWdyZWVuLWNvdW50XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5ID09PSAnYmVoYXZpb3JhbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tiZWhhdmlvcmFsQ292ZXJhZ2V9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXYtZ3JlZW4tY291bnRcIiAqbmdJZj1cInNlbGVjdGVkQ2F0ZWdvcnkgPT09ICdmdW5jdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2Z1bmN0aW9uYWxDb3ZlcmFnZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1jb3VudFwiICpuZ0lmPVwic2VsZWN0ZWRDYXRlZ29yeSA9PT0gJ2RvbWFpbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkb21haW5Db3ZlcmFnZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IGFsbC1jYXRlZ29yeS1saXN0XCIgW25nU3dpdGNoXT1cInNlbGVjdGVkQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidhbGwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkFsbCBDYXRlZ29yaWVzPC9oND5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdyBCZWhhdmlvdXJhbCBzZWN0aW9uIG9ubHkgaWYgdGhlcmUgYXJlIHVubWF0Y2hlZCBiZWhhdmlvdXJhbCBjb21wZXRlbmNpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImJlaGF2aW91cmFsTm90TWF0Y2hlZCAmJiBiZWhhdmlvdXJhbE5vdE1hdGNoZWQubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkJlaGF2aW91cmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXktYmctaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJlaGF2aW91cmFsTm90TWF0Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4+e3tpdGVtIHwgdGl0bGVjYXNlfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvdXJzZShpdGVtLCAnQmVoYXZpb3JhbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3Vyc2U8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNob3cgRnVuY3Rpb25hbCBzZWN0aW9uIG9ubHkgaWYgdGhlcmUgYXJlIHVubWF0Y2hlZCBmdW5jdGlvbmFsIGNvbXBldGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZnVuY3Rpb25hbE5vdE1hdGNoZWQgJiYgZnVuY3Rpb25hbE5vdE1hdGNoZWQubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkZ1bmN0aW9uYWw8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JheS1iZy1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZnVuY3Rpb25hbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuPnt7aXRlbSB8IHRpdGxlY2FzZX19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb3Vyc2UoaXRlbSwgJ0Z1bmN0aW9uYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291cnNlPC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IERvbWFpbiBzZWN0aW9uIG9ubHkgaWYgdGhlcmUgYXJlIHVubWF0Y2hlZCBkb21haW4gY29tcGV0ZW5jaWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJkb21haW5Ob3RNYXRjaGVkICYmIGRvbWFpbk5vdE1hdGNoZWQubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkRvbWFpbjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF5LWJnLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkb21haW5Ob3RNYXRjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3Bhbj57e2l0ZW0gfCB0aXRsZWNhc2V9fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ291cnNlKGl0ZW0sICdEb21haW4nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZC1idG5cIj48bWF0LWljb24+YWRkPC9tYXQtaWNvbj4gQWRkIE5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291cnNlPC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTaG93IG1lc3NhZ2Ugd2hlbiBhbGwgY29tcGV0ZW5jaWVzIGFyZSBjb3ZlcmVkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoIWJlaGF2aW91cmFsTm90TWF0Y2hlZCB8fCBiZWhhdmlvdXJhbE5vdE1hdGNoZWQubGVuZ3RoID09PSAwKSAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghZnVuY3Rpb25hbE5vdE1hdGNoZWQgfHwgZnVuY3Rpb25hbE5vdE1hdGNoZWQubGVuZ3RoID09PSAwKSAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghZG9tYWluTm90TWF0Y2hlZCB8fCBkb21haW5Ob3RNYXRjaGVkLmxlbmd0aCA9PT0gMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWdhcHMtbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwic3VjY2Vzcy1pY29uXCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5FeGNlbGxlbnQhIEFsbCBjb21wZXRlbmNpZXMgYXJlIGNvdmVyZWQ8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QWxsIHJlcXVpcmVkIGNvbXBldGVuY2llcyBoYXZlIGJlZW4gYWRkcmVzc2VkIGJ5IHRoZSBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdXJzZXMuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidiZWhhdmlvcmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5CZWhhdmlvdXJhbDwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImJlaGF2aW9yYWxDb3ZlcmFnZSAhPT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkJlaGF2aW91cmFsPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyYXktYmctaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJlaGF2aW91cmFsTm90TWF0Y2hlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4+e3tpdGVtfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ291cnNlKGl0ZW0sICdCZWhhdmlvcmFsJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtYnRuXCI+PG1hdC1pY29uPmFkZDwvbWF0LWljb24+IEFkZCBOZXcgQ291cnNlIDwvc3Bhbj48L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImJlaGF2aW9yYWxDb3ZlcmFnZSA9PT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZThmNWU4OyBib3JkZXI6IDFweCBzb2xpZCAjNGNhZjUwOyBib3JkZXItcmFkaXVzOiA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjogIzJlN2QzMjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfjokgRXhjZWxsZW50ISBBbGwgYmVoYXZpb3JhbCBjb21wZXRlbmNpZXMgYXJlIGNvdmVyZWQgYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgY291cnNlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInZnVuY3Rpb25hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+RnVuY3Rpb25hbDwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImZ1bmN0aW9uYWxDb3ZlcmFnZSAhPT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkZ1bmN0aW9uYWw8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JheS1iZy1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZnVuY3Rpb25hbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuPnt7aXRlbX19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImFkZENvdXJzZShpdGVtLCAnRnVuY3Rpb25hbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3IENvdXJzZTwvc3Bhbj48L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImZ1bmN0aW9uYWxDb3ZlcmFnZSA9PT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZThmNWU4OyBib3JkZXI6IDFweCBzb2xpZCAjNGNhZjUwOyBib3JkZXItcmFkaXVzOiA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjogIzJlN2QzMjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfjokgRXhjZWxsZW50ISBBbGwgZnVuY3Rpb25hbCBjb21wZXRlbmNpZXMgYXJlIGNvdmVyZWQgYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgY291cnNlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInZG9tYWluJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5Eb21haW48L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJkb21haW5Db3ZlcmFnZSAhPT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkRvbWFpbjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmF5LWJnLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkb21haW5Ob3RNYXRjaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj48c3Bhbj57e2l0ZW19fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJhZGRDb3Vyc2UoaXRlbSwgJ0RvbWFpbicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkLWJ0blwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPiBBZGQgTmV3IENvdXJzZSA8L3NwYW4+PC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJkb21haW5Db3ZlcmFnZSA9PT0gJzEwMCUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZThmNWU4OyBib3JkZXI6IDFweCBzb2xpZCAjNGNhZjUwOyBib3JkZXItcmFkaXVzOiA4cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjogIzJlN2QzMjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfjokgRXhjZWxsZW50ISBBbGwgZG9tYWluIGNvbXBldGVuY2llcyBhcmUgY292ZXJlZCBieSB0aGUgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3Vyc2VzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5QbGVhc2Ugc2VsZWN0IGEgY2F0ZWdvcnkuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PiA8IS0tIENsb3NlIG1haW4tY29udGVudCBkaXYgLS0+XG5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxkaXYgW2hpZGRlbl09XCIhaXNQREZEb3dubG9hZFwiIGNsYXNzPVwiZ2FwLWFuYWx5c2lzLXBkZi1jb250YWluZXJcIiAjcGRmQ29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiZ2FwLWFuYWx5c2lzLXBkZi1oZWFkZXJcIj5cbiAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2thcm1heW9naUxvZ28tbWluLnBuZ1wiIGFsdD1cIkthcm1heW9naSBCaGFyYXQgTG9nb1wiIGNsYXNzPVwibG9nb1wiIC8+XG4gICAgICA8aDE+PHNwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwic2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlID09PSAnc3RhdGUnXCI+e3tzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/LmRlcGFydG1lbnRfbmFtZT8ubmFtZX19PC9zcGFuPiBcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeSdcIj57e3NoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/Lm5hbWV9fTwvc3Bhbj4gICBcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJwbGFuRGF0YT8uZGVzaWduYXRpb25fbmFtZSBcIj4vIHt7cGxhbkRhdGE/LmRlc2lnbmF0aW9uX25hbWV9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPjwvaDE+XG4gICAgICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+QSBkZXRhaWxlZCBicmVha2Rvd24gb2YgY29tcGV0ZW5jaWVzIEdhcCBBbmFseXNpczwvcD5cbiAgICAgXG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXNuYXBzaG90XCI+XG4gICAgICA8aDI+Q29tcGV0ZW5jeSBTbmFwc2hvdDwvaDI+XG4gICAgICA8ZGl2IGNsYXNzPVwic25hcHNob3QtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlLXdyYXBwZXJcIj5cbiAgICAgICAgICA8c3ZnIGNsYXNzPVwicHJvZ3Jlc3MtcmluZ1wiIHdpZHRoPVwiMTIwXCIgaGVpZ2h0PVwiMTIwXCI+XG4gICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicHJvZ3Jlc3MtcmluZy1iZ1wiIGN4PVwiNjBcIiBjeT1cIjYwXCIgcj1cIjUyXCIgLz5cbiAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwcm9ncmVzcy1yaW5nLWNpcmNsZVwiIGN4PVwiNjBcIiBjeT1cIjYwXCIgcj1cIjUyXCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZS10ZXh0XCI+e3tvdmVyYWxsQ292ZXJhZ2V9fTxiciAvPjxzcGFuPk92ZXJhbGwgQ292ZXJhZ2U8L3NwYW4+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8IS0tIFRvdGFsIENvbXBldGVuY2llcyBCb3ggLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG90YWwtYm94XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlRvdGFsIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRcIj57e3RoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RofX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIFxuICAgICAgICAgICAgPCEtLSBQcm9ncmVzcyBCYXJzIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtdGV4dCBiZWhhdmlvcmFsXCI+QmVoYXZpb3VyYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3ZlcmVkLXRleHRcIj57e2JlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50fX0gLyB7e2JlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llc319IENvdmVyZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWZpbGwgYmVoYXZpb3JhbFwiIFtzdHlsZS53aWR0aC4lXT1cIihiZWhhdmlvcmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCAvIGJlaGF2aW9yYWxUb3RhbENvbXBldGVuY2llcykgKiAxMDBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHQgZnVuY3Rpb25hbFwiPkZ1bmN0aW9uYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3ZlcmVkLXRleHRcIj57e2Z1bmN0aW9uYWxDb21wZXRlbmN5Q292ZXJlZENvdW50fX0gLyB7e2Z1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llc319IENvdmVyZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWZpbGwgZnVuY3Rpb25hbFwiIFtzdHlsZS53aWR0aC4lXT1cIihmdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCAvIGZ1bmN0aW9uYWxUb3RhbENvbXBldGVuY2llcykgKiAxMDBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1ncm91cFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXRleHQgZG9tYWluXCI+RG9tYWluPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY292ZXJlZC10ZXh0XCI+e3tkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50fX0gLyB7e2RvbWFpblRvdGFsQ29tcGV0ZW5jaWVzfX0gQ292ZXJlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZmlsbCBkb21haW5cIiBbc3R5bGUud2lkdGguJV09XCIoZG9tYWluQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCAvIGRvbWFpblRvdGFsQ29tcGV0ZW5jaWVzKSAqIDEwMFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIFxuICAgIDxkaXYgY2xhc3M9XCJnYXAtc2VjdGlvbiBtYi00XCI+XG4gICAgICA8aDI+RGV0YWlsZWQgQ29tcGV0ZW5jeSBBbmFseXNpczwvaDI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZ2FwLWJveFwiPlxuICAgICAgICBCcmlkZ2UgWW91ciBDb21wZXRlbmNpZXMgR2FwXG4gICAgICAgIDxwIGNsYXNzPVwic3VidGl0bGVcIj5IZXJlIGFyZSB7e3RoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RoIC0gKGJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgKyBkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50KX19IGtleSBhcmVhcyBmb3IgZGV2ZWxvcG1lbnQuPC9wPlxuICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZyBtYi00XCI+XG4gICAgICAgIDxwPkdhcCB0byBBZGRyZXNzIDxzcGFuICpuZ0lmPVwiKHRoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcz8ubGVuZ3RoIC0gKGJlaGF2aW9yYWxDb21wZXRlbmN5Q292ZXJlZENvdW50ICsgZnVuY3Rpb25hbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgKyBkb21haW5Db21wZXRlbmN5Q292ZXJlZENvdW50KSkgPiAwXCI+KHt7dGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzPy5sZW5ndGggLSAoYmVoYXZpb3JhbENvbXBldGVuY3lDb3ZlcmVkQ291bnQgKyBmdW5jdGlvbmFsQ29tcGV0ZW5jeUNvdmVyZWRDb3VudCArIGRvbWFpbkNvbXBldGVuY3lDb3ZlcmVkQ291bnQpfX0pPC9zcGFuPjwvcD5cbiAgICAgICAgXG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktY2FyZCBiZWhhdmlvcmFsXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYmVoYXZpb3VyYWxOb3RNYXRjaGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7aXRlbSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgICZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgYmVoYXZpb3JhbFwiPkJlaGF2aW91cmFsPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktY2FyZCBmdW5jdGlvbmFsXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZnVuY3Rpb25hbE5vdE1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+XG4gICAgICAgICAgICZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgZnVuY3Rpb25hbFwiPkZ1bmN0aW9uYWw8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgZG9tYWluXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZG9tYWluTm90TWF0Y2hlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2l0ZW0gfCB0aXRsZWNhc2V9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VidGl0bGVcIj5cbiAgICAgICAgICA8IS0tIFByb2plY3QgTWFuYWdlbWVudCAgLS0+XG4gICAgICAgICAgJm5ic3A7IOKAoiAmbmJzcDtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBkb21haW5cIj5Eb21haW48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmcgbWItNFwiPlxuICAgICAgICA8cD5Db3ZlcmVkIENvbXBldGVuY2llcyA8c3Bhbj4oe3t0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmNpZXM/Lmxlbmd0aCAtIChiZWhhdmlvdXJhbE5vdE1hdGNoZWQ/Lmxlbmd0aCArIGZ1bmN0aW9uYWxOb3RNYXRjaGVkPy5sZW5ndGggKyBkb21haW5Ob3RNYXRjaGVkPy5sZW5ndGgpfX0pPC9zcGFuPjwvcD4gICAgICAgIFxuICAgICA8L2Rpdj5cbiAgICAgPGRpdiBjbGFzcz1cImdhcC1zZWN0aW9uIG1iLTRcIj5cbiAgICAgICAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJncmVlbi1iZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdi1ncmVlbi1sYWJlbCBtYi0yXCI+XG4gICAgICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zIVxuICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgXG4gICAgICAgICAgICA8cD5Zb3UgaGF2ZSBzdWNjZXNzZnVsbHkgY292ZXJlZCA8L3A+XG4gICAgICAgICAgPHAgY2xhc3M9XCJzdWJ0aXRsZVwiPnt7dGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzPy5sZW5ndGggLSAoYmVoYXZpb3VyYWxOb3RNYXRjaGVkPy5sZW5ndGggKyBmdW5jdGlvbmFsTm90TWF0Y2hlZD8ubGVuZ3RoICsgZG9tYWluTm90TWF0Y2hlZD8ubGVuZ3RoKX19IGtleSBjb21wZXRlbmNpZXMsIGZvcm1pbmcgYSBzdHJvbmcgcHJvZmVzc2lvbmFsIGZvdW5kYXRpb24uPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgYmVoYXZpb3JhbFwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJlaGF2aW91cmFsTWF0Y2hlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2l0ZW0/LnRoZW1lIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+XG4gICAgICAgICAge3tpdGVtPy5zdWJfdGhlbWV9fSZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgYmVoYXZpb3JhbFwiPkJlaGF2aW91cmFsPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktY2FyZCBmdW5jdGlvbmFsXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZnVuY3Rpb25hbE1hdGNoZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3tpdGVtPy50aGVtZSB8IHRpdGxlY2FzZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPlxuICAgICAgICAgICAge3tpdGVtPy5zdWJfdGhlbWV9fSZuYnNwOyDigKIgJm5ic3A7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgZnVuY3Rpb25hbFwiPkZ1bmN0aW9uYWw8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNhcmQgZG9tYWluXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZG9tYWluTWF0Y2hlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e2l0ZW0/LnRoZW1lIHwgdGl0bGVjYXNlfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+XG4gICAgICAgICAgPCEtLSBQcm9qZWN0IE1hbmFnZW1lbnQgIC0tPlxuICAgICAgICAgIHt7aXRlbT8uc3ViX3RoZW1lfX0mbmJzcDsg4oCiICZuYnNwO1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGRvbWFpblwiPkRvbWFpbjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnYXAtc2VjdGlvbiBtYi00XCI+XG4gICAgICAgIDxoMj5SZWNvbW1lbmRlZCBDb3Vyc2VzPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGFwcC1nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlIFtwbGFuRGF0YV09XCJwbGFuRGF0YVwiPjwvYXBwLWdhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2U+XG48L2Rpdj5cbiAgXG5cblxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJsb2FkaW5nICYmIGRhdGFMb2FkZWQgJiYgIWlzUmVnZW5lcmF0aW5nV2l0aFByb2dyZXNzXCI+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGVudFwiPlxuICAgICAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXRleHQgbXQtM1wiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYWluLW1lc3NhZ2VcIj57eyBjdXJyZW50UHJvY2Vzc2luZ1N0YWdlIHx8ICdQcmVwYXJpbmcgY291cnNlIHJlY29tbWVuZGF0aW9uIGdlbmVyYXRpb24uLi4nIH19PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtaW5kaWNhdG9yXCIgKm5nSWY9XCJwcm9ncmVzc1BlcmNlbnRhZ2UgPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cInByb2dyZXNzUGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJwcm9ncmVzcy10ZXh0XCI+e3sgcHJvZ3Jlc3NQZXJjZW50YWdlIH19JSBDb21wbGV0ZTwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGltZS1lc3RpbWF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICBSZWFsLXRpbWUgY291cnNlIGdlbmVyYXRpb24gaW4gcHJvZ3Jlc3MuIFRoaXMgbWF5IHRha2UgMS0yIG1pbnV0ZXMuXG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==