@sunbird-cb/cbp-ai 0.1.111 → 0.1.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +10 -3
- package/fesm2022/sunbird-cb-cbp-ai.mjs +9 -2
- package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -1
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +3 -0
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/sunbird-cb-cbp-ai-0.1.112.tgz +0 -0
- package/sunbird-cb-cbp-ai-0.1.111.tgz +0 -0
|
@@ -75,6 +75,7 @@ export class RoleMappingListComponent {
|
|
|
75
75
|
this.pageSize = 5;
|
|
76
76
|
this.offset = 0;
|
|
77
77
|
this.totalRoleMappingListCount = 0;
|
|
78
|
+
this.isCompetencyInfoOpen = false;
|
|
78
79
|
}
|
|
79
80
|
ngAfterViewInit() {
|
|
80
81
|
// this.dataSource.paginator = this.paginator;
|
|
@@ -804,12 +805,18 @@ export class RoleMappingListComponent {
|
|
|
804
805
|
// Call your API if needed
|
|
805
806
|
// this.getData(this.offset, this.pageSize);
|
|
806
807
|
}
|
|
808
|
+
openCompetencyInfo() {
|
|
809
|
+
this.isCompetencyInfoOpen = true;
|
|
810
|
+
}
|
|
811
|
+
closeCompetencyInfo() {
|
|
812
|
+
this.isCompetencyInfoOpen = false;
|
|
813
|
+
}
|
|
807
814
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingListComponent, deps: [{ token: i1.SharedService }, { token: i2.MatDialog }, { token: i3.Router }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
808
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RoleMappingListComponent, selector: "app-role-mapping-list", inputs: { formData: "formData" }, outputs: { moveToInitialScreen: "moveToInitialScreen" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], ngImport: i0, template: "<div class=\"role-mapping-container\">\n <div class=\"container-fluid\">\n\n <mat-card class=\"mt-0 pt-0\">\n <div class=\"section-header\">\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span *ngIf=\"sharedService?.cbpPlanFinalObj?.department_name || originalData?.[0]?.department_name\">\n / {{ sharedService?.cbpPlanFinalObj?.department_name || originalData?.[0]?.department_name }}\n </span>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"moveToInitialScreenLayout('edit')\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <div>\n <div class=\"view-final-cbp-plan\">\n <!-- <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('cbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div> -->\n\n <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('acbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div>\n\n </div>\n\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"search-filter-section mt-2\">\n <div class=\"search flex margin-right-m search-flex\">\n <div class=\"mt-2\">\n <div class=\"search-container\">\n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" [(ngModel)]=\"searchText\" label=\"\"\n (input)=\"applyFilter()\" placeholder=\"Search by designation name\" type=\"Standard\">\n <mat-icon *ngIf=\"searchText.trim().length > 0\"\n class=\"color-60 clear-icon mat-icon notranslate material-icons mat-icon-no-color cursor-pointer\"\n (click)=\"clearSearch()\">clear</mat-icon>\n </div>\n <div class=\"pl-2 mt-2\">\n <input [disabled]=\"searchText.trim()?.length === 0\"\n [ngClass]=\"searchText.trim()?.length === 0 ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Search\" (click)=\"applyFilter()\" />\n </div>\n </div>\n\n\n </div>\n\n\n </div>\n <div class=\"filter-section flex margin-top-15\">\n <!-- <div>\n <label class=\"label\">Filter by competency type</label>\n <div>\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select [(value)]=\"selectedValue\" placeholder=\"Select Ministry\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"'test'\">Test</mat-option>\n <mat-option [value]=\"'another'\">Another</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div> -->\n <div class=\"btn-group\">\n <div class=\"ml-2\">\n <input class=\"btn-active\" type=\"button\" value=\"Add More Designation\"\n (click)=\"addMoreDesignation()\" />\n </div>\n <div class=\"ml-2\" *ngIf=\"activeTab === 'matched'\">\n <button\n [ngClass]=\"selection.selected.length ? 'btn-active-outline' : 'btn-active-outline-disable'\"\n (click)=\"sendForApprovalForm()\">\n <mat-icon>send</mat-icon>\n Send For Approval\n <span *ngIf=\"selection.selected.length\">({{selection.selected.length}})</span>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"role-mapping-tabs mt-3\">\n <button class=\"role-tab\" [class.active]=\"activeTab === 'matched'\" (click)=\"setDataSoure('matched')\">\n <span class=\"dot\"></span>\n Matched role mappings\n <span class=\"badge blue\">{{matchedRoleMapping}}</span>\n </button>\n\n <button class=\"role-tab table-body-unmatched\" [class.active]=\"activeTab === 'unmatched'\"\n (click)=\"setDataSoure('unmatched')\">\n <span class=\"dot red\"></span>\n Unmatched role mapping\n <span class=\"badge red\">{{unMatchedRoleMapping}}</span>\n </button>\n </div>\n <div class=\"nav-container\">\n <div class=\"sidenav-content\">\n <div class=\"table-class\">\n <ng-container *ngIf=\"dataSource?.filteredData?.length > 0\">\n <!-- <table mat-table [dataSource]=\"dataSource\">\n <ng-container matColumnDef=\"RequestId\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request ID </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.demand_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Title </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.title}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestor\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requestor </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.ownerName}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestType\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Type </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.requestType}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestStatus\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Status </th>\n\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <span [ngClass]=\"getStatusClass(element?.status)\">{{element?.status ===\n statusKey.fullfill ? 'Fulfilled'\n : element?.status}}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"assignee\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Assignee </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n {{element?.assignedProvider ?\n element?.assignedProvider : 'Not Assigned' }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestedOn\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requested On </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.createdOn |\n date}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"interests\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Interests</th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <a class=\"action-btn-view\" *ngIf=\"element?.interestCount!== 0\"\n href=\"javascript:void(0)\" [ngStyle]=\"getPointerEventsStyle(element)\">\n <span (click)=\"handleClick(element)\">\n {{element?.interestCount}}\n </span></a>\n <a class=\"\" *ngIf=\"element?.interestCount === 0\"\n href=\"javascript:void(0)\">{{element?.requestType ==\n 'Single' ? 'N/A' : element?.interestCount}}</a>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Details</th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon (click)=\"navigateToDetails(element?.demand_id)\"\n class=\"cursor-pointer\">visibility</mat-icon>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\"></th>\n <td mat-cell *matCellDef=\"let element\">\n\n\n <span>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onClickMenu(element,'viewContent')\">\n <span>View</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Unassigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid \"\n mat-menu-item (click)=\"onClickMenu(element,'invalidContent')\">\n <span>Mark as invalid</span>\n </button>\n <button mat-menu-item\n *ngIf=\"element?.status!== statusKey.Assigned && element?.interestCount >0 && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill\"\n (click)=\"onClickMenu(element,'assignContent')\">\n <span>Assign</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Assigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill \"\n mat-menu-item (click)=\"onClickMenu(element,'reAssignContent')\">\n <span> Re-Assign</span>\n </button>\n <button mat-menu-item (click)=\"onClickMenu(element,'copyContent')\">\n <span>Copy</span>\n </button>\n </mat-menu>\n </span>\n </td>\n\n\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\" class=\"table-row-data\"></tr>\n <tr mat-row *matRowDef=\"let row;columns:displayedColumns\"></tr>\n\n\n </table> -->\n <div class=\"table-container mt-4\" style=\"overflow: auto;\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z1\"\n [ngClass]=\"activeTab === 'matched'? 'table-body': 'table-body-unmatched'\">\n <!-- Selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [hidden]=\"activeTab !== 'matched'\">\n <mat-checkbox class=\"radio-style-checkbox\" (change)=\"toggleAllRows($event)\"\n [checked]=\"isAllSelected()\" [indeterminate]=\"isSomeSelected()\"\n [disabled]=\"!hasSelectableRows()\">\n </mat-checkbox>\n </th>\n\n <td mat-cell *matCellDef=\"let row\" [hidden]=\"activeTab !== 'matched'\">\n <span matTooltip=\"Please generate & save course recommendation to select. Course recommendation generation & save is pending.\"\n [matTooltipDisabled]=\"!getActivateCbpPlan(row)\">\n <mat-checkbox class=\"radio-style-checkbox\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"getActivateCbpPlan(row)\" [ngClass]=\" getActivateCbpPlan(row)? 'grayd-disable':''\">\n </mat-checkbox>\n </span>\n </td>\n </ng-container>\n <!-- Designation Name -->\n <ng-container matColumnDef=\"designation_name\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Designation\n </th>\n <td class=\"cursor-pointer\" mat-cell *matCellDef=\"let element\"\n (click)=\"viewCBPPlan(element)\">\n <div\n [ngClass]=\"activeTab === 'matched'? 'designation-text': 'designation-text-unmatched'\">\n <p class=\"designation\">{{ element?.designation_name }} </p>\n <p class=\"wing-text mt-2\">Wing/Division - {{\n element?.wing_division_section }} </p>\n </div>\n\n </td>\n </ng-container>\n\n <!-- Role & Responsibilities -->\n <ng-container matColumnDef=\"role_responsibilities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Role &\n Responsibilities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let role of (isResponisbilityExpanded(element.id) ? element.role_responsibilities : element.role_responsibilities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ role }}</li>\n <li *ngIf=\"element.role_responsibilities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'role_responsibilities')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n <!-- {{ isResponisbilityExpanded(element.id) ? 'View Less' : 'View More' }} -->\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n <!-- Activities -->\n <ng-container matColumnDef=\"activities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Activities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let activity of (isActivityExpanded(element.id) ? element.activities : element.activities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ activity }}</li>\n <li *ngIf=\"element.activities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'activity')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Behavioral Competencies -->\n <ng-container matColumnDef=\"behavioral\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Behavioral\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of (isBehavioralExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Behavioral') : getCompetenciesByType(element.competencies, 'Behavioral').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-behavioral\"> {{ comp.theme }} - {{\n comp.sub_theme }} </span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Behavioral').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'behavioral')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Functional Competencies -->\n <ng-container matColumnDef=\"functional\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Functional\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of (isFunctionalExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Functional') : getCompetenciesByType(element.competencies, 'Functional').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-functional\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Functional').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'functional')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Domain Competencies -->\n <ng-container matColumnDef=\"domain\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Domain\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of (isDomainExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Domain') : getCompetenciesByType(element.competencies, 'Domain').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-domain\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Domain').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'domain')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Actions -->\n <ng-container matColumnDef=\"action\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editRoleMapping(element)\">\n <mat-icon>edit</mat-icon>\n <span>Edit Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"viewCBPPlan(element)\">\n <mat-icon>visibility</mat-icon>\n <span>View Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"generateCourseRecommendation(element)\">\n <mat-icon>school</mat-icon>\n <span>Generate Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"viewCourseRecommendation(element)\">\n <mat-icon>preview</mat-icon>\n <span>View Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"deleteRoleMapping(element)\">\n <mat-icon>delete</mat-icon>\n <span>Delete Role Mapping</span>\n </button>\n <button *ngIf=\"activeTab !== 'matched'\" mat-menu-item (click)=\"sendForDesignationNameApproval(element)\">\n <mat-icon>send</mat-icon>\n <span>Send for Designation Name Approval</span>\n </button>\n </mat-menu>\n </td>\n </ng-container>\n\n <!-- Header & Rows -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <!-- Pagination -->\n <mat-paginator [length]=\"totalRoleMappingListCount\" [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\" (page)=\"pageChangeEvent($event)\"\n [pageSizeOptions]=\"[5, 10, 20]\" showFirstLastButtons>\n </mat-paginator>\n </div>\n\n </ng-container>\n\n <div class=\"no-cbp-data\" *ngIf=\"dataSource?.filteredData?.length === 0\">\n <!-- <div><img src=\"/mdo-assets/images/no-content-data.svg\" alt=\"no-content\"></div> -->\n <div class=\"sub-heading mt-4\">\n <p>No role mappings available in this category</p>\n </div>\n <!-- <div class=\" margin-top-m no-content-create\">\n <button mat-button type=\"button\" class=\"search-btns\"\n [routerLink]=\"['/app/home/create-request-form']\">Request Content</button>\n </div> -->\n\n </div>\n\n <!-- <mat-paginator *ngIf=\"dataSource?.filteredData?.length > 0\" [pageSize]=\"pageSize\"\n [length]=\"this.requestCount\" [pageSizeOptions]=\"[10,20,40]\"\n (page)=\"onChangePage($event)\"></mat-paginator> -->\n\n\n </div>\n\n\n\n </div>\n </div>\n </mat-card>\n </div>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".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:18px;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:18px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep input.mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;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:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}.search .clear-icon:hover{color:#333}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:600px}.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 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size: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:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.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:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.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}.designation{color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:700;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.wing-text{color:#000000e0;font-family:Lato;font-size:15px;font-style:normal;font-weight:400;line-height:normal}.role-item{color:#000000e0;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:1.75}.view-final-cbp-plan{display:flex;justify-content:end;align-items:center;gap:8px}.view-final-cbp-plan-text{padding:4px 16px;border-radius:24px;border:2px solid #F3962F;background:var(--white-kb-white-100, #FFF);box-shadow:0 1px 10px #276de599;color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:normal}.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}.cursor-pointer{cursor:pointer}.ml-10{margin-left:10px}.table-container{border-top-left-radius:16px;border-top-right-radius:16px;overflow:auto;background:#fff;max-height:70vh}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;background:#fff;box-shadow:0 2px 4px #0000001a}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}.table-header{font-size:16px;font-weight:600;background:#fff!important;color:#333}.table-header-unmatched{font-size:16px;font-weight:600;background:#f4dcde!important;color:#b42318}.table-body{background-color:#fff!important}.table-body-unmatched{background-color:#faf6f7!important}.designation-text-unmatched p{color:#b42318!important}.select-map-flex-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.select-map-flex{display:flex}.search-container-flex{display:flex;flex-direction:row;width:100%;justify-content:space-between;align-items:flex-start}.mt-6{margin-top:1.7rem}.mat-elevation-z1 .mat-mdc-cell{vertical-align:top!important;padding-top:8px;padding-bottom:8px}::ng-deep .radio-style-checkbox .mat-checkbox-frame{border-radius:50%}::ng-deep .radio-style-checkbox .mat-checkbox-background{border-radius:50%}.search-flex{display:flex;flex-direction:row;width:100%}.margin-top-15{margin-top:15px}.btn-active-outline{border-radius:10px;opacity:1;color:#1b4ca1;border:1px solid #1B4CA1!important;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;width:240px;border:none;background-color:transparent;cursor:pointer}.btn-active-outline-disable{border-radius:10px;opacity:.5;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;width:auto;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:240px;background-color:transparent;cursor:not-allowed}.role-mapping-tabs{display:flex;gap:16px;align-items:center;font-family:Inter,sans-serif}.role-tab{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:24px;border:1px solid #d0d5dd;background-color:#f9fafb;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease-in-out}.role-tab.active{border-color:#1b4ca1;background-color:#eff6ff;color:#1b4ca1}.dot{width:10px;height:10px;border-radius:50%;background-color:#1b4ca1}.dot.red{background-color:#b42318}.badge{font-size:12px;font-weight:600;padding:2px 8px;border-radius:12px}.badge.blue{background-color:#dbeafe;color:#1b4ca1}.badge.red{background-color:#fee2e2;color:#b42318}.grayd-disable{color:#d3d3d3!important}.competency-tags{display:flex;gap:6px;margin-top:6px;flex-wrap:wrap}.proficiency-tag,.delivery-mode-tag{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:4px;font-size:11px;line-height:16px;font-weight:500;white-space:nowrap}.delivery-mode-tag.online{background:#e6f4ea;color:#1a7f45;border:1px solid #9BD3B0}.delivery-mode-tag.offline{background:#fdf0e3;color:#a2590a;border:1px solid #F0C48A}.proficiency-tag.strategic{background:#1b4ca1;color:#fff;border:none}.proficiency-tag.tactical{background:#5b8def;color:#fff;border:none}.proficiency-tag.operational{background:#dbe6f7;color:#1b4ca1;border:none}.flex-col-theme{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.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: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i12.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i13.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i13.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i13.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
|
|
815
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RoleMappingListComponent, selector: "app-role-mapping-list", inputs: { formData: "formData" }, outputs: { moveToInitialScreen: "moveToInitialScreen" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], ngImport: i0, template: "<div class=\"role-mapping-container\">\n <div class=\"container-fluid\">\n\n <mat-card class=\"mt-0 pt-0\">\n <div class=\"section-header\">\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span *ngIf=\"sharedService?.cbpPlanFinalObj?.department_name || originalData?.[0]?.department_name\">\n / {{ sharedService?.cbpPlanFinalObj?.department_name || originalData?.[0]?.department_name }}\n </span>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"moveToInitialScreenLayout('edit')\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <div>\n <div class=\"view-final-cbp-plan\">\n <!-- <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('cbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div> -->\n\n <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('acbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div>\n\n </div>\n\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"search-filter-section mt-2\">\n <div class=\"search flex margin-right-m search-flex\">\n <div class=\"mt-2\">\n <div class=\"search-container\">\n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" [(ngModel)]=\"searchText\" label=\"\"\n (input)=\"applyFilter()\" placeholder=\"Search by designation name\" type=\"Standard\">\n <mat-icon *ngIf=\"searchText.trim().length > 0\"\n class=\"color-60 clear-icon mat-icon notranslate material-icons mat-icon-no-color cursor-pointer\"\n (click)=\"clearSearch()\">clear</mat-icon>\n </div>\n <div class=\"pl-2 mt-2\">\n <input [disabled]=\"searchText.trim()?.length === 0\"\n [ngClass]=\"searchText.trim()?.length === 0 ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Search\" (click)=\"applyFilter()\" />\n </div>\n </div>\n\n\n </div>\n\n\n </div>\n <div class=\"filter-section flex margin-top-15\">\n <!-- <div>\n <label class=\"label\">Filter by competency type</label>\n <div>\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select [(value)]=\"selectedValue\" placeholder=\"Select Ministry\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"'test'\">Test</mat-option>\n <mat-option [value]=\"'another'\">Another</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div> -->\n <div class=\"btn-group\">\n <div class=\"ml-2\">\n <input class=\"btn-active\" type=\"button\" value=\"Add More Designation\"\n (click)=\"addMoreDesignation()\" />\n </div>\n <div class=\"ml-2\" *ngIf=\"activeTab === 'matched'\">\n <button\n [ngClass]=\"selection.selected.length ? 'btn-active-outline' : 'btn-active-outline-disable'\"\n (click)=\"sendForApprovalForm()\">\n <mat-icon>send</mat-icon>\n Send For Approval\n <span *ngIf=\"selection.selected.length\">({{selection.selected.length}})</span>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"role-mapping-tabs mt-3\">\n <button class=\"role-tab\" [class.active]=\"activeTab === 'matched'\" (click)=\"setDataSoure('matched')\">\n <span class=\"dot\"></span>\n Matched role mappings\n <span class=\"badge blue\">{{matchedRoleMapping}}</span>\n </button>\n\n <button class=\"role-tab table-body-unmatched\" [class.active]=\"activeTab === 'unmatched'\"\n (click)=\"setDataSoure('unmatched')\">\n <span class=\"dot red\"></span>\n Unmatched role mapping\n <span class=\"badge red\">{{unMatchedRoleMapping}}</span>\n </button>\n </div>\n <div class=\"nav-container\">\n <div class=\"sidenav-content\">\n <div class=\"table-class\">\n <ng-container *ngIf=\"dataSource?.filteredData?.length > 0\">\n <!-- <table mat-table [dataSource]=\"dataSource\">\n <ng-container matColumnDef=\"RequestId\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request ID </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.demand_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Title </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.title}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestor\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requestor </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.ownerName}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestType\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Type </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.requestType}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestStatus\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Status </th>\n\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <span [ngClass]=\"getStatusClass(element?.status)\">{{element?.status ===\n statusKey.fullfill ? 'Fulfilled'\n : element?.status}}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"assignee\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Assignee </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n {{element?.assignedProvider ?\n element?.assignedProvider : 'Not Assigned' }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestedOn\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requested On </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.createdOn |\n date}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"interests\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Interests</th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <a class=\"action-btn-view\" *ngIf=\"element?.interestCount!== 0\"\n href=\"javascript:void(0)\" [ngStyle]=\"getPointerEventsStyle(element)\">\n <span (click)=\"handleClick(element)\">\n {{element?.interestCount}}\n </span></a>\n <a class=\"\" *ngIf=\"element?.interestCount === 0\"\n href=\"javascript:void(0)\">{{element?.requestType ==\n 'Single' ? 'N/A' : element?.interestCount}}</a>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Details</th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon (click)=\"navigateToDetails(element?.demand_id)\"\n class=\"cursor-pointer\">visibility</mat-icon>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\"></th>\n <td mat-cell *matCellDef=\"let element\">\n\n\n <span>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onClickMenu(element,'viewContent')\">\n <span>View</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Unassigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid \"\n mat-menu-item (click)=\"onClickMenu(element,'invalidContent')\">\n <span>Mark as invalid</span>\n </button>\n <button mat-menu-item\n *ngIf=\"element?.status!== statusKey.Assigned && element?.interestCount >0 && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill\"\n (click)=\"onClickMenu(element,'assignContent')\">\n <span>Assign</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Assigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill \"\n mat-menu-item (click)=\"onClickMenu(element,'reAssignContent')\">\n <span> Re-Assign</span>\n </button>\n <button mat-menu-item (click)=\"onClickMenu(element,'copyContent')\">\n <span>Copy</span>\n </button>\n </mat-menu>\n </span>\n </td>\n\n\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\" class=\"table-row-data\"></tr>\n <tr mat-row *matRowDef=\"let row;columns:displayedColumns\"></tr>\n\n\n </table> -->\n <div class=\"table-container mt-4\" style=\"overflow: auto;\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z1\"\n [ngClass]=\"activeTab === 'matched'? 'table-body': 'table-body-unmatched'\">\n <!-- Selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [hidden]=\"activeTab !== 'matched'\">\n <mat-checkbox class=\"radio-style-checkbox\" (change)=\"toggleAllRows($event)\"\n [checked]=\"isAllSelected()\" [indeterminate]=\"isSomeSelected()\"\n [disabled]=\"!hasSelectableRows()\">\n </mat-checkbox>\n </th>\n\n <td mat-cell *matCellDef=\"let row\" [hidden]=\"activeTab !== 'matched'\">\n <span matTooltip=\"Please generate & save course recommendation to select. Course recommendation generation & save is pending.\"\n [matTooltipDisabled]=\"!getActivateCbpPlan(row)\">\n <mat-checkbox class=\"radio-style-checkbox\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"getActivateCbpPlan(row)\" [ngClass]=\" getActivateCbpPlan(row)? 'grayd-disable':''\">\n </mat-checkbox>\n </span>\n </td>\n </ng-container>\n <!-- Designation Name -->\n <ng-container matColumnDef=\"designation_name\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Designation\n </th>\n <td class=\"cursor-pointer\" mat-cell *matCellDef=\"let element\"\n (click)=\"viewCBPPlan(element)\">\n <div\n [ngClass]=\"activeTab === 'matched'? 'designation-text': 'designation-text-unmatched'\">\n <p class=\"designation\">{{ element?.designation_name }} </p>\n <p class=\"wing-text mt-2\">Wing/Division - {{\n element?.wing_division_section }} </p>\n </div>\n\n </td>\n </ng-container>\n\n <!-- Role & Responsibilities -->\n <ng-container matColumnDef=\"role_responsibilities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Role &\n Responsibilities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let role of (isResponisbilityExpanded(element.id) ? element.role_responsibilities : element.role_responsibilities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ role }}</li>\n <li *ngIf=\"element.role_responsibilities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'role_responsibilities')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n <!-- {{ isResponisbilityExpanded(element.id) ? 'View Less' : 'View More' }} -->\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n <!-- Activities -->\n <ng-container matColumnDef=\"activities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Activities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let activity of (isActivityExpanded(element.id) ? element.activities : element.activities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ activity }}</li>\n <li *ngIf=\"element.activities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'activity')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Behavioral Competencies -->\n <ng-container matColumnDef=\"behavioral\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Behavioral\n Competencies <mat-icon (click)=\"openCompetencyInfo()\">info_outline</mat-icon> </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of (isBehavioralExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Behavioral') : getCompetenciesByType(element.competencies, 'Behavioral').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-behavioral\"> {{ comp.theme }} - {{\n comp.sub_theme }} </span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Behavioral').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'behavioral')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Functional Competencies -->\n <ng-container matColumnDef=\"functional\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Functional\n Competencies <mat-icon (click)=\"openCompetencyInfo()\">info_outline</mat-icon></th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of (isFunctionalExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Functional') : getCompetenciesByType(element.competencies, 'Functional').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-functional\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Functional').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'functional')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Domain Competencies -->\n <ng-container matColumnDef=\"domain\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Domain\n Competencies <mat-icon (click)=\"openCompetencyInfo()\">info_outline</mat-icon> </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of (isDomainExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Domain') : getCompetenciesByType(element.competencies, 'Domain').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-domain\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Domain').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'domain')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Actions -->\n <ng-container matColumnDef=\"action\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editRoleMapping(element)\">\n <mat-icon>edit</mat-icon>\n <span>Edit Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"viewCBPPlan(element)\">\n <mat-icon>visibility</mat-icon>\n <span>View Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"generateCourseRecommendation(element)\">\n <mat-icon>school</mat-icon>\n <span>Generate Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"viewCourseRecommendation(element)\">\n <mat-icon>preview</mat-icon>\n <span>View Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"deleteRoleMapping(element)\">\n <mat-icon>delete</mat-icon>\n <span>Delete Role Mapping</span>\n </button>\n <button *ngIf=\"activeTab !== 'matched'\" mat-menu-item (click)=\"sendForDesignationNameApproval(element)\">\n <mat-icon>send</mat-icon>\n <span>Send for Designation Name Approval</span>\n </button>\n </mat-menu>\n </td>\n </ng-container>\n\n <!-- Header & Rows -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <!-- Pagination -->\n <mat-paginator [length]=\"totalRoleMappingListCount\" [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\" (page)=\"pageChangeEvent($event)\"\n [pageSizeOptions]=\"[5, 10, 20]\" showFirstLastButtons>\n </mat-paginator>\n </div>\n\n </ng-container>\n\n <div class=\"no-cbp-data\" *ngIf=\"dataSource?.filteredData?.length === 0\">\n <!-- <div><img src=\"/mdo-assets/images/no-content-data.svg\" alt=\"no-content\"></div> -->\n <div class=\"sub-heading mt-4\">\n <p>No role mappings available in this category</p>\n </div>\n <!-- <div class=\" margin-top-m no-content-create\">\n <button mat-button type=\"button\" class=\"search-btns\"\n [routerLink]=\"['/app/home/create-request-form']\">Request Content</button>\n </div> -->\n\n </div>\n\n <!-- <mat-paginator *ngIf=\"dataSource?.filteredData?.length > 0\" [pageSize]=\"pageSize\"\n [length]=\"this.requestCount\" [pageSizeOptions]=\"[10,20,40]\"\n (page)=\"onChangePage($event)\"></mat-paginator> -->\n\n\n </div>\n\n\n\n </div>\n </div>\n </mat-card>\n </div>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div\n class=\"competency-modal-backdrop\"\n *ngIf=\"isCompetencyInfoOpen\"\n (click)=\"closeCompetencyInfo()\"\n>\n <div\n class=\"competency-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"competency-modal-title\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Close Button -->\n <button\n type=\"button\"\n class=\"modal-close-btn\"\n (click)=\"closeCompetencyInfo()\"\n aria-label=\"Close\"\n >\n \u00D7\n </button>\n\n <!-- Title -->\n <h2 id=\"competency-modal-title\">\n What do the competency tags mean?\n </h2>\n\n <!-- Description -->\n <p class=\"modal-description\">\n Every competency carries two tags: how deeply this designation needs it,\n and how the training for it is delivered.\n </p>\n\n <!-- Proficiency -->\n <div class=\"competency-section\">\n <h3>\n PROFICIENCY LEVEL \u2014 THE DEPTH THIS DESIGNATION NEEDS\n </h3>\n\n <div class=\"tag-info-row\">\n <span class=\"proficiency-tag strategic\">\n Strategic\n </span>\n\n <span class=\"tag-description\">\n Shapes policy, direction and outcomes\n </span>\n </div>\n\n <div class=\"tag-info-row\">\n <span class=\"proficiency-tag tactical\">\n Tactical\n </span>\n\n <span class=\"tag-description\">\n Plans, coordinates and turns direction into programmes\n </span>\n </div>\n\n <div class=\"tag-info-row\">\n <span class=\"proficiency-tag operational\">\n Operational\n </span>\n\n <span class=\"tag-description\">\n Executes and delivers the work on the ground\n </span>\n </div>\n </div>\n\n <!-- Delivery Mode -->\n <div class=\"competency-section delivery-section\">\n <h3>\n DELIVERY MODE \u2014 HOW THE TRAINING IS DELIVERED\n </h3>\n\n <div class=\"tag-info-row\">\n <span class=\"delivery-mode-tag online\">\n Online\n </span>\n\n <span class=\"tag-description\">\n Self-paced, knowledge-based content\n </span>\n </div>\n\n <div class=\"tag-info-row\">\n <span class=\"delivery-mode-tag offline\">\n Offline\n </span>\n\n <span class=\"tag-description\">\n Needs physical presence or supervised practice\n </span>\n </div>\n\n <div class=\"tag-info-row\">\n <span class=\"delivery-mode-tag blended\">\n Blended\n </span>\n\n <span class=\"tag-description\">\n Concept combined with applied practice or coaching\n </span>\n </div>\n </div>\n\n </div>\n</div>", styles: [".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:18px;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:18px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep input.mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;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:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}.search .clear-icon:hover{color:#333}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:600px}.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 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size: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:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.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:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.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}.designation{color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:700;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.wing-text{color:#000000e0;font-family:Lato;font-size:15px;font-style:normal;font-weight:400;line-height:normal}.role-item{color:#000000e0;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:1.75}.view-final-cbp-plan{display:flex;justify-content:end;align-items:center;gap:8px}.view-final-cbp-plan-text{padding:4px 16px;border-radius:24px;border:2px solid #F3962F;background:var(--white-kb-white-100, #FFF);box-shadow:0 1px 10px #276de599;color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:normal}.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}.cursor-pointer{cursor:pointer}.ml-10{margin-left:10px}.table-container{border-top-left-radius:16px;border-top-right-radius:16px;overflow:auto;background:#fff;max-height:70vh}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;background:#fff;box-shadow:0 2px 4px #0000001a}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}.table-header{font-size:16px;font-weight:600;background:#fff!important;color:#333}.table-header-unmatched{font-size:16px;font-weight:600;background:#f4dcde!important;color:#b42318}.table-body{background-color:#fff!important}.table-body-unmatched{background-color:#faf6f7!important}.designation-text-unmatched p{color:#b42318!important}.select-map-flex-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.select-map-flex{display:flex}.search-container-flex{display:flex;flex-direction:row;width:100%;justify-content:space-between;align-items:flex-start}.mt-6{margin-top:1.7rem}.mat-elevation-z1 .mat-mdc-cell{vertical-align:top!important;padding-top:8px;padding-bottom:8px}::ng-deep .radio-style-checkbox .mat-checkbox-frame{border-radius:50%}::ng-deep .radio-style-checkbox .mat-checkbox-background{border-radius:50%}.search-flex{display:flex;flex-direction:row;width:100%}.margin-top-15{margin-top:15px}.btn-active-outline{border-radius:10px;opacity:1;color:#1b4ca1;border:1px solid #1B4CA1!important;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;width:240px;border:none;background-color:transparent;cursor:pointer}.btn-active-outline-disable{border-radius:10px;opacity:.5;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;width:auto;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:240px;background-color:transparent;cursor:not-allowed}.role-mapping-tabs{display:flex;gap:16px;align-items:center;font-family:Inter,sans-serif}.role-tab{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:24px;border:1px solid #d0d5dd;background-color:#f9fafb;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease-in-out}.role-tab.active{border-color:#1b4ca1;background-color:#eff6ff;color:#1b4ca1}.dot{width:10px;height:10px;border-radius:50%;background-color:#1b4ca1}.dot.red{background-color:#b42318}.badge{font-size:12px;font-weight:600;padding:2px 8px;border-radius:12px}.badge.blue{background-color:#dbeafe;color:#1b4ca1}.badge.red{background-color:#fee2e2;color:#b42318}.grayd-disable{color:#d3d3d3!important}.competency-tags{display:flex;gap:6px;margin-top:6px;flex-wrap:wrap}.proficiency-tag,.delivery-mode-tag{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:16px;font-size:11px;line-height:16px;font-weight:500;white-space:nowrap}.proficiency-tag.strategic{background:#1b4ca1;color:#fff;border:none}.proficiency-tag.tactical{background:#5b8def;color:#fff;border:none}.proficiency-tag.operational{background:#dbe6f7;color:#1b4ca1;border:none}.flex-col-theme{display:flex;flex-direction:column}.competency-info-btn{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0}.info-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center;border:1px solid #1b4ca1;border-radius:50%;color:#1b4ca1;font-size:14px;font-weight:700}.competency-modal-backdrop{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;padding:20px;background:#1923328c;animation:fadeIn .2s ease}.competency-modal{position:relative;width:100%;max-width:1000px;max-height:calc(100vh - 40px);overflow-y:auto;background:#fff;border-radius:16px;padding:40px 42px 38px;box-sizing:border-box;box-shadow:0 20px 50px #00000040;animation:modalSlideIn .25s ease}.modal-close-btn{position:absolute;top:26px;right:36px;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border:none;background:transparent;color:#5b6778;font-size:44px;font-weight:300;line-height:1;cursor:pointer}.modal-close-btn:hover{color:#1b4ca1}.competency-modal h2{margin:0 0 16px;color:#293548;font-size:34px;font-weight:700;line-height:1.25}.modal-description{max-width:900px;margin:0 0 28px;color:#59687b;font-size:23px;font-weight:400;line-height:1.5}.competency-section{margin-top:26px}.delivery-section{margin-top:28px}.competency-section h3{margin:0 0 18px;color:#354154;font-size:21px;font-weight:700;letter-spacing:.5px;line-height:1.4}.tag-info-row{display:flex;align-items:center;gap:14px;margin-bottom:10px}.proficiency-tag,.delivery-mode-tag{width:140px;min-width:140px;display:inline-flex;align-items:center;justify-content:center;padding:6px 14px;border-radius:20px;font-size:17px;font-weight:600;line-height:1.2;box-sizing:border-box}.proficiency-tag.strategic{background:#1b4ca1;color:#fff}.proficiency-tag.tactical{background:#5b8def;color:#fff}.proficiency-tag.operational{background:#dbe6f7;color:#1b4ca1}.delivery-mode-tag.online{background:#e6f4ea;color:#1a7f45;border:1px solid #9BD3B0}.delivery-mode-tag.offline{background:#fdf0e3;color:#a2590a;border:1px solid #F0C48A}.delivery-mode-tag.blended{background:#efe9fb;color:#5b21b6;border:1px solid #C9B6F0}.tag-description{color:#526174;font-size:21px;font-weight:400;line-height:1.4}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes modalSlideIn{0%{opacity:0;transform:translateY(-10px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media (max-width: 768px){.competency-modal{padding:28px 22px}.competency-modal h2{padding-right:35px;font-size:26px}.modal-description{font-size:18px}.competency-section h3{font-size:17px}.tag-info-row{align-items:flex-start;flex-direction:column;gap:8px}.proficiency-tag,.delivery-mode-tag{width:140px}.tag-description{font-size:17px}.modal-close-btn{top:18px;right:18px}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.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: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i12.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i13.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i13.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i13.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
|
|
809
816
|
}
|
|
810
817
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingListComponent, decorators: [{
|
|
811
818
|
type: Component,
|
|
812
|
-
args: [{ selector: 'app-role-mapping-list', template: "<div class=\"role-mapping-container\">\n <div class=\"container-fluid\">\n\n <mat-card class=\"mt-0 pt-0\">\n <div class=\"section-header\">\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span *ngIf=\"sharedService?.cbpPlanFinalObj?.department_name || originalData?.[0]?.department_name\">\n / {{ sharedService?.cbpPlanFinalObj?.department_name || originalData?.[0]?.department_name }}\n </span>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"moveToInitialScreenLayout('edit')\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <div>\n <div class=\"view-final-cbp-plan\">\n <!-- <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('cbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div> -->\n\n <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('acbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div>\n\n </div>\n\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"search-filter-section mt-2\">\n <div class=\"search flex margin-right-m search-flex\">\n <div class=\"mt-2\">\n <div class=\"search-container\">\n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" [(ngModel)]=\"searchText\" label=\"\"\n (input)=\"applyFilter()\" placeholder=\"Search by designation name\" type=\"Standard\">\n <mat-icon *ngIf=\"searchText.trim().length > 0\"\n class=\"color-60 clear-icon mat-icon notranslate material-icons mat-icon-no-color cursor-pointer\"\n (click)=\"clearSearch()\">clear</mat-icon>\n </div>\n <div class=\"pl-2 mt-2\">\n <input [disabled]=\"searchText.trim()?.length === 0\"\n [ngClass]=\"searchText.trim()?.length === 0 ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Search\" (click)=\"applyFilter()\" />\n </div>\n </div>\n\n\n </div>\n\n\n </div>\n <div class=\"filter-section flex margin-top-15\">\n <!-- <div>\n <label class=\"label\">Filter by competency type</label>\n <div>\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select [(value)]=\"selectedValue\" placeholder=\"Select Ministry\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"'test'\">Test</mat-option>\n <mat-option [value]=\"'another'\">Another</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div> -->\n <div class=\"btn-group\">\n <div class=\"ml-2\">\n <input class=\"btn-active\" type=\"button\" value=\"Add More Designation\"\n (click)=\"addMoreDesignation()\" />\n </div>\n <div class=\"ml-2\" *ngIf=\"activeTab === 'matched'\">\n <button\n [ngClass]=\"selection.selected.length ? 'btn-active-outline' : 'btn-active-outline-disable'\"\n (click)=\"sendForApprovalForm()\">\n <mat-icon>send</mat-icon>\n Send For Approval\n <span *ngIf=\"selection.selected.length\">({{selection.selected.length}})</span>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"role-mapping-tabs mt-3\">\n <button class=\"role-tab\" [class.active]=\"activeTab === 'matched'\" (click)=\"setDataSoure('matched')\">\n <span class=\"dot\"></span>\n Matched role mappings\n <span class=\"badge blue\">{{matchedRoleMapping}}</span>\n </button>\n\n <button class=\"role-tab table-body-unmatched\" [class.active]=\"activeTab === 'unmatched'\"\n (click)=\"setDataSoure('unmatched')\">\n <span class=\"dot red\"></span>\n Unmatched role mapping\n <span class=\"badge red\">{{unMatchedRoleMapping}}</span>\n </button>\n </div>\n <div class=\"nav-container\">\n <div class=\"sidenav-content\">\n <div class=\"table-class\">\n <ng-container *ngIf=\"dataSource?.filteredData?.length > 0\">\n <!-- <table mat-table [dataSource]=\"dataSource\">\n <ng-container matColumnDef=\"RequestId\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request ID </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.demand_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Title </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.title}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestor\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requestor </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.ownerName}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestType\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Type </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.requestType}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestStatus\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Status </th>\n\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <span [ngClass]=\"getStatusClass(element?.status)\">{{element?.status ===\n statusKey.fullfill ? 'Fulfilled'\n : element?.status}}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"assignee\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Assignee </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n {{element?.assignedProvider ?\n element?.assignedProvider : 'Not Assigned' }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestedOn\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requested On </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.createdOn |\n date}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"interests\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Interests</th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <a class=\"action-btn-view\" *ngIf=\"element?.interestCount!== 0\"\n href=\"javascript:void(0)\" [ngStyle]=\"getPointerEventsStyle(element)\">\n <span (click)=\"handleClick(element)\">\n {{element?.interestCount}}\n </span></a>\n <a class=\"\" *ngIf=\"element?.interestCount === 0\"\n href=\"javascript:void(0)\">{{element?.requestType ==\n 'Single' ? 'N/A' : element?.interestCount}}</a>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Details</th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon (click)=\"navigateToDetails(element?.demand_id)\"\n class=\"cursor-pointer\">visibility</mat-icon>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\"></th>\n <td mat-cell *matCellDef=\"let element\">\n\n\n <span>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onClickMenu(element,'viewContent')\">\n <span>View</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Unassigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid \"\n mat-menu-item (click)=\"onClickMenu(element,'invalidContent')\">\n <span>Mark as invalid</span>\n </button>\n <button mat-menu-item\n *ngIf=\"element?.status!== statusKey.Assigned && element?.interestCount >0 && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill\"\n (click)=\"onClickMenu(element,'assignContent')\">\n <span>Assign</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Assigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill \"\n mat-menu-item (click)=\"onClickMenu(element,'reAssignContent')\">\n <span> Re-Assign</span>\n </button>\n <button mat-menu-item (click)=\"onClickMenu(element,'copyContent')\">\n <span>Copy</span>\n </button>\n </mat-menu>\n </span>\n </td>\n\n\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\" class=\"table-row-data\"></tr>\n <tr mat-row *matRowDef=\"let row;columns:displayedColumns\"></tr>\n\n\n </table> -->\n <div class=\"table-container mt-4\" style=\"overflow: auto;\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z1\"\n [ngClass]=\"activeTab === 'matched'? 'table-body': 'table-body-unmatched'\">\n <!-- Selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [hidden]=\"activeTab !== 'matched'\">\n <mat-checkbox class=\"radio-style-checkbox\" (change)=\"toggleAllRows($event)\"\n [checked]=\"isAllSelected()\" [indeterminate]=\"isSomeSelected()\"\n [disabled]=\"!hasSelectableRows()\">\n </mat-checkbox>\n </th>\n\n <td mat-cell *matCellDef=\"let row\" [hidden]=\"activeTab !== 'matched'\">\n <span matTooltip=\"Please generate & save course recommendation to select. Course recommendation generation & save is pending.\"\n [matTooltipDisabled]=\"!getActivateCbpPlan(row)\">\n <mat-checkbox class=\"radio-style-checkbox\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"getActivateCbpPlan(row)\" [ngClass]=\" getActivateCbpPlan(row)? 'grayd-disable':''\">\n </mat-checkbox>\n </span>\n </td>\n </ng-container>\n <!-- Designation Name -->\n <ng-container matColumnDef=\"designation_name\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Designation\n </th>\n <td class=\"cursor-pointer\" mat-cell *matCellDef=\"let element\"\n (click)=\"viewCBPPlan(element)\">\n <div\n [ngClass]=\"activeTab === 'matched'? 'designation-text': 'designation-text-unmatched'\">\n <p class=\"designation\">{{ element?.designation_name }} </p>\n <p class=\"wing-text mt-2\">Wing/Division - {{\n element?.wing_division_section }} </p>\n </div>\n\n </td>\n </ng-container>\n\n <!-- Role & Responsibilities -->\n <ng-container matColumnDef=\"role_responsibilities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Role &\n Responsibilities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let role of (isResponisbilityExpanded(element.id) ? element.role_responsibilities : element.role_responsibilities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ role }}</li>\n <li *ngIf=\"element.role_responsibilities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'role_responsibilities')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n <!-- {{ isResponisbilityExpanded(element.id) ? 'View Less' : 'View More' }} -->\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n <!-- Activities -->\n <ng-container matColumnDef=\"activities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Activities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let activity of (isActivityExpanded(element.id) ? element.activities : element.activities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ activity }}</li>\n <li *ngIf=\"element.activities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'activity')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Behavioral Competencies -->\n <ng-container matColumnDef=\"behavioral\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Behavioral\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of (isBehavioralExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Behavioral') : getCompetenciesByType(element.competencies, 'Behavioral').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-behavioral\"> {{ comp.theme }} - {{\n comp.sub_theme }} </span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Behavioral').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'behavioral')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Functional Competencies -->\n <ng-container matColumnDef=\"functional\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Functional\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of (isFunctionalExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Functional') : getCompetenciesByType(element.competencies, 'Functional').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-functional\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Functional').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'functional')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Domain Competencies -->\n <ng-container matColumnDef=\"domain\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Domain\n Competencies </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of (isDomainExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Domain') : getCompetenciesByType(element.competencies, 'Domain').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-domain\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Domain').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'domain')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Actions -->\n <ng-container matColumnDef=\"action\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editRoleMapping(element)\">\n <mat-icon>edit</mat-icon>\n <span>Edit Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"viewCBPPlan(element)\">\n <mat-icon>visibility</mat-icon>\n <span>View Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"generateCourseRecommendation(element)\">\n <mat-icon>school</mat-icon>\n <span>Generate Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"viewCourseRecommendation(element)\">\n <mat-icon>preview</mat-icon>\n <span>View Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"deleteRoleMapping(element)\">\n <mat-icon>delete</mat-icon>\n <span>Delete Role Mapping</span>\n </button>\n <button *ngIf=\"activeTab !== 'matched'\" mat-menu-item (click)=\"sendForDesignationNameApproval(element)\">\n <mat-icon>send</mat-icon>\n <span>Send for Designation Name Approval</span>\n </button>\n </mat-menu>\n </td>\n </ng-container>\n\n <!-- Header & Rows -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <!-- Pagination -->\n <mat-paginator [length]=\"totalRoleMappingListCount\" [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\" (page)=\"pageChangeEvent($event)\"\n [pageSizeOptions]=\"[5, 10, 20]\" showFirstLastButtons>\n </mat-paginator>\n </div>\n\n </ng-container>\n\n <div class=\"no-cbp-data\" *ngIf=\"dataSource?.filteredData?.length === 0\">\n <!-- <div><img src=\"/mdo-assets/images/no-content-data.svg\" alt=\"no-content\"></div> -->\n <div class=\"sub-heading mt-4\">\n <p>No role mappings available in this category</p>\n </div>\n <!-- <div class=\" margin-top-m no-content-create\">\n <button mat-button type=\"button\" class=\"search-btns\"\n [routerLink]=\"['/app/home/create-request-form']\">Request Content</button>\n </div> -->\n\n </div>\n\n <!-- <mat-paginator *ngIf=\"dataSource?.filteredData?.length > 0\" [pageSize]=\"pageSize\"\n [length]=\"this.requestCount\" [pageSizeOptions]=\"[10,20,40]\"\n (page)=\"onChangePage($event)\"></mat-paginator> -->\n\n\n </div>\n\n\n\n </div>\n </div>\n </mat-card>\n </div>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".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:18px;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:18px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep input.mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;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:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}.search .clear-icon:hover{color:#333}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:600px}.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 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size: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:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.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:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.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}.designation{color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:700;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.wing-text{color:#000000e0;font-family:Lato;font-size:15px;font-style:normal;font-weight:400;line-height:normal}.role-item{color:#000000e0;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:1.75}.view-final-cbp-plan{display:flex;justify-content:end;align-items:center;gap:8px}.view-final-cbp-plan-text{padding:4px 16px;border-radius:24px;border:2px solid #F3962F;background:var(--white-kb-white-100, #FFF);box-shadow:0 1px 10px #276de599;color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:normal}.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}.cursor-pointer{cursor:pointer}.ml-10{margin-left:10px}.table-container{border-top-left-radius:16px;border-top-right-radius:16px;overflow:auto;background:#fff;max-height:70vh}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;background:#fff;box-shadow:0 2px 4px #0000001a}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}.table-header{font-size:16px;font-weight:600;background:#fff!important;color:#333}.table-header-unmatched{font-size:16px;font-weight:600;background:#f4dcde!important;color:#b42318}.table-body{background-color:#fff!important}.table-body-unmatched{background-color:#faf6f7!important}.designation-text-unmatched p{color:#b42318!important}.select-map-flex-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.select-map-flex{display:flex}.search-container-flex{display:flex;flex-direction:row;width:100%;justify-content:space-between;align-items:flex-start}.mt-6{margin-top:1.7rem}.mat-elevation-z1 .mat-mdc-cell{vertical-align:top!important;padding-top:8px;padding-bottom:8px}::ng-deep .radio-style-checkbox .mat-checkbox-frame{border-radius:50%}::ng-deep .radio-style-checkbox .mat-checkbox-background{border-radius:50%}.search-flex{display:flex;flex-direction:row;width:100%}.margin-top-15{margin-top:15px}.btn-active-outline{border-radius:10px;opacity:1;color:#1b4ca1;border:1px solid #1B4CA1!important;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;width:240px;border:none;background-color:transparent;cursor:pointer}.btn-active-outline-disable{border-radius:10px;opacity:.5;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;width:auto;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:240px;background-color:transparent;cursor:not-allowed}.role-mapping-tabs{display:flex;gap:16px;align-items:center;font-family:Inter,sans-serif}.role-tab{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:24px;border:1px solid #d0d5dd;background-color:#f9fafb;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease-in-out}.role-tab.active{border-color:#1b4ca1;background-color:#eff6ff;color:#1b4ca1}.dot{width:10px;height:10px;border-radius:50%;background-color:#1b4ca1}.dot.red{background-color:#b42318}.badge{font-size:12px;font-weight:600;padding:2px 8px;border-radius:12px}.badge.blue{background-color:#dbeafe;color:#1b4ca1}.badge.red{background-color:#fee2e2;color:#b42318}.grayd-disable{color:#d3d3d3!important}.competency-tags{display:flex;gap:6px;margin-top:6px;flex-wrap:wrap}.proficiency-tag,.delivery-mode-tag{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:4px;font-size:11px;line-height:16px;font-weight:500;white-space:nowrap}.delivery-mode-tag.online{background:#e6f4ea;color:#1a7f45;border:1px solid #9BD3B0}.delivery-mode-tag.offline{background:#fdf0e3;color:#a2590a;border:1px solid #F0C48A}.proficiency-tag.strategic{background:#1b4ca1;color:#fff;border:none}.proficiency-tag.tactical{background:#5b8def;color:#fff;border:none}.proficiency-tag.operational{background:#dbe6f7;color:#1b4ca1;border:none}.flex-col-theme{display:flex;flex-direction:column}\n"] }]
|
|
819
|
+
args: [{ selector: 'app-role-mapping-list', template: "<div class=\"role-mapping-container\">\n <div class=\"container-fluid\">\n\n <mat-card class=\"mt-0 pt-0\">\n <div class=\"section-header\">\n\n </div>\n <div class=\"edit-section mt-4\">\n <div class=\"select-map-route-container\">\n <div class=\"select-map-flex-container\">\n <div class=\"select-map-flex\">\n <div class=\"selected-mapping-route\">\n <p>{{sharedService?.cbpPlanFinalObj?.ministry?.orgName}} <span *ngIf=\"sharedService?.cbpPlanFinalObj?.department_name || originalData?.[0]?.department_name\">\n / {{ sharedService?.cbpPlanFinalObj?.department_name || originalData?.[0]?.department_name }}\n </span>\n </div>\n <div class=\"edit-plan cursor-pointer\" (click)=\"moveToInitialScreenLayout('edit')\">\n <mat-icon>edit</mat-icon>Edit\n </div>\n <!-- <div class=\"cursor-pointer ml-10\">-->\n <!-- <button class=\"btn-active cursor-pointer\" (click)=\"moveToInitialScreenLayout('add')\">-->\n <!-- <mat-icon>add</mat-icon>-->\n <!-- Create New CBP-->\n <!-- </button>-->\n <!-- </div>-->\n </div>\n <div>\n <div class=\"view-final-cbp-plan\">\n <!-- <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('cbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div> -->\n\n <div class=\"view-final-cbp-plan-text cursor-pointer\" (click)=\"viewFinalCBPPlan('acbp')\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span><span>View\n Final CBP</span>\n </div>\n\n </div>\n\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"search-filter-section mt-2\">\n <div class=\"search flex margin-right-m search-flex\">\n <div class=\"mt-2\">\n <div class=\"search-container\">\n <div class=\"rsearch\">\n <mat-icon\n class=\"color-60 search-icon mat-icon notranslate material-icons mat-icon-no-color\">search</mat-icon>\n <input class=\"sinput color-60 w-full\" [(ngModel)]=\"searchText\" label=\"\"\n (input)=\"applyFilter()\" placeholder=\"Search by designation name\" type=\"Standard\">\n <mat-icon *ngIf=\"searchText.trim().length > 0\"\n class=\"color-60 clear-icon mat-icon notranslate material-icons mat-icon-no-color cursor-pointer\"\n (click)=\"clearSearch()\">clear</mat-icon>\n </div>\n <div class=\"pl-2 mt-2\">\n <input [disabled]=\"searchText.trim()?.length === 0\"\n [ngClass]=\"searchText.trim()?.length === 0 ? 'btn-disable':'btn-active'\"\n type=\"button\" value=\"Search\" (click)=\"applyFilter()\" />\n </div>\n </div>\n\n\n </div>\n\n\n </div>\n <div class=\"filter-section flex margin-top-15\">\n <!-- <div>\n <label class=\"label\">Filter by competency type</label>\n <div>\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select [(value)]=\"selectedValue\" placeholder=\"Select Ministry\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"'test'\">Test</mat-option>\n <mat-option [value]=\"'another'\">Another</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div> -->\n <div class=\"btn-group\">\n <div class=\"ml-2\">\n <input class=\"btn-active\" type=\"button\" value=\"Add More Designation\"\n (click)=\"addMoreDesignation()\" />\n </div>\n <div class=\"ml-2\" *ngIf=\"activeTab === 'matched'\">\n <button\n [ngClass]=\"selection.selected.length ? 'btn-active-outline' : 'btn-active-outline-disable'\"\n (click)=\"sendForApprovalForm()\">\n <mat-icon>send</mat-icon>\n Send For Approval\n <span *ngIf=\"selection.selected.length\">({{selection.selected.length}})</span>\n </button>\n </div>\n\n\n </div>\n </div>\n </div>\n <div class=\"role-mapping-tabs mt-3\">\n <button class=\"role-tab\" [class.active]=\"activeTab === 'matched'\" (click)=\"setDataSoure('matched')\">\n <span class=\"dot\"></span>\n Matched role mappings\n <span class=\"badge blue\">{{matchedRoleMapping}}</span>\n </button>\n\n <button class=\"role-tab table-body-unmatched\" [class.active]=\"activeTab === 'unmatched'\"\n (click)=\"setDataSoure('unmatched')\">\n <span class=\"dot red\"></span>\n Unmatched role mapping\n <span class=\"badge red\">{{unMatchedRoleMapping}}</span>\n </button>\n </div>\n <div class=\"nav-container\">\n <div class=\"sidenav-content\">\n <div class=\"table-class\">\n <ng-container *ngIf=\"dataSource?.filteredData?.length > 0\">\n <!-- <table mat-table [dataSource]=\"dataSource\">\n <ng-container matColumnDef=\"RequestId\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request ID </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.demand_id}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Title </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.title}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestor\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requestor </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.ownerName}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestType\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Type </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.requestType}}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestStatus\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Request Status </th>\n\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <span [ngClass]=\"getStatusClass(element?.status)\">{{element?.status ===\n statusKey.fullfill ? 'Fulfilled'\n : element?.status}}</span>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"assignee\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Assignee </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n {{element?.assignedProvider ?\n element?.assignedProvider : 'Not Assigned' }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"requestedOn\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Requested On </th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">{{element?.createdOn |\n date}}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"interests\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Interests</th>\n <td mat-cell class=\"title-class\" *matCellDef=\"let element\">\n <a class=\"action-btn-view\" *ngIf=\"element?.interestCount!== 0\"\n href=\"javascript:void(0)\" [ngStyle]=\"getPointerEventsStyle(element)\">\n <span (click)=\"handleClick(element)\">\n {{element?.interestCount}}\n </span></a>\n <a class=\"\" *ngIf=\"element?.interestCount === 0\"\n href=\"javascript:void(0)\">{{element?.requestType ==\n 'Single' ? 'N/A' : element?.interestCount}}</a>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"details\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\">Details</th>\n <td mat-cell *matCellDef=\"let element\">\n <mat-icon (click)=\"navigateToDetails(element?.demand_id)\"\n class=\"cursor-pointer\">visibility</mat-icon>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef class=\"row-heading\"></th>\n <td mat-cell *matCellDef=\"let element\">\n\n\n <span>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\"\n aria-label=\"Example icon-button with a menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"onClickMenu(element,'viewContent')\">\n <span>View</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Unassigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid \"\n mat-menu-item (click)=\"onClickMenu(element,'invalidContent')\">\n <span>Mark as invalid</span>\n </button>\n <button mat-menu-item\n *ngIf=\"element?.status!== statusKey.Assigned && element?.interestCount >0 && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill\"\n (click)=\"onClickMenu(element,'assignContent')\">\n <span>Assign</span>\n </button>\n <button\n *ngIf=\"element?.status === statusKey.Assigned && element?.status!== statusKey.Inprogress && element?.status!== statusKey.invalid && element?.status!==statusKey.fullfill \"\n mat-menu-item (click)=\"onClickMenu(element,'reAssignContent')\">\n <span> Re-Assign</span>\n </button>\n <button mat-menu-item (click)=\"onClickMenu(element,'copyContent')\">\n <span>Copy</span>\n </button>\n </mat-menu>\n </span>\n </td>\n\n\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\" class=\"table-row-data\"></tr>\n <tr mat-row *matRowDef=\"let row;columns:displayedColumns\"></tr>\n\n\n </table> -->\n <div class=\"table-container mt-4\" style=\"overflow: auto;\">\n <table mat-table [dataSource]=\"dataSource\" class=\"mat-elevation-z1\"\n [ngClass]=\"activeTab === 'matched'? 'table-body': 'table-body-unmatched'\">\n <!-- Selection Column -->\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef [hidden]=\"activeTab !== 'matched'\">\n <mat-checkbox class=\"radio-style-checkbox\" (change)=\"toggleAllRows($event)\"\n [checked]=\"isAllSelected()\" [indeterminate]=\"isSomeSelected()\"\n [disabled]=\"!hasSelectableRows()\">\n </mat-checkbox>\n </th>\n\n <td mat-cell *matCellDef=\"let row\" [hidden]=\"activeTab !== 'matched'\">\n <span matTooltip=\"Please generate & save course recommendation to select. Course recommendation generation & save is pending.\"\n [matTooltipDisabled]=\"!getActivateCbpPlan(row)\">\n <mat-checkbox class=\"radio-style-checkbox\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRow(row)\"\n [checked]=\"selection.isSelected(row)\"\n [disabled]=\"getActivateCbpPlan(row)\" [ngClass]=\" getActivateCbpPlan(row)? 'grayd-disable':''\">\n </mat-checkbox>\n </span>\n </td>\n </ng-container>\n <!-- Designation Name -->\n <ng-container matColumnDef=\"designation_name\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Designation\n </th>\n <td class=\"cursor-pointer\" mat-cell *matCellDef=\"let element\"\n (click)=\"viewCBPPlan(element)\">\n <div\n [ngClass]=\"activeTab === 'matched'? 'designation-text': 'designation-text-unmatched'\">\n <p class=\"designation\">{{ element?.designation_name }} </p>\n <p class=\"wing-text mt-2\">Wing/Division - {{\n element?.wing_division_section }} </p>\n </div>\n\n </td>\n </ng-container>\n\n <!-- Role & Responsibilities -->\n <ng-container matColumnDef=\"role_responsibilities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Role &\n Responsibilities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let role of (isResponisbilityExpanded(element.id) ? element.role_responsibilities : element.role_responsibilities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ role }}</li>\n <li *ngIf=\"element.role_responsibilities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'role_responsibilities')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n <!-- {{ isResponisbilityExpanded(element.id) ? 'View Less' : 'View More' }} -->\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n <!-- Activities -->\n <ng-container matColumnDef=\"activities\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Activities </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul>\n <li class=\"role-item\"\n *ngFor=\"let activity of (isActivityExpanded(element.id) ? element.activities : element.activities.slice(0, 2)); let i = index\">\n {{i+1}}. {{ activity }}</li>\n <li *ngIf=\"element.activities.length > 2\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'activity')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Behavioral Competencies -->\n <ng-container matColumnDef=\"behavioral\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Behavioral\n Competencies <mat-icon (click)=\"openCompetencyInfo()\">info_outline</mat-icon> </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"behavioural-pill\"\n *ngFor=\"let comp of (isBehavioralExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Behavioral') : getCompetenciesByType(element.competencies, 'Behavioral').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-behavioral\"> {{ comp.theme }} - {{\n comp.sub_theme }} </span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Behavioral').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'behavioral')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Functional Competencies -->\n <ng-container matColumnDef=\"functional\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Functional\n Competencies <mat-icon (click)=\"openCompetencyInfo()\">info_outline</mat-icon></th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"functional-pill\"\n *ngFor=\"let comp of (isFunctionalExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Functional') : getCompetenciesByType(element.competencies, 'Functional').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-functional\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Functional').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'functional')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Domain Competencies -->\n <ng-container matColumnDef=\"domain\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Domain\n Competencies <mat-icon (click)=\"openCompetencyInfo()\">info_outline</mat-icon> </th>\n <td mat-cell *matCellDef=\"let element\">\n <ul class=\"competency-list\">\n <li class=\"domain-pill\"\n *ngFor=\"let comp of (isDomainExpanded(element.id) ? getCompetenciesByType(element.competencies, 'Domain') : getCompetenciesByType(element.competencies, 'Domain').slice(0, 4))\">\n <div class=\"flex-col-theme\">\n <div>\n <span class=\"competency-text-domain\"> {{ comp.theme }} - {{\n comp.sub_theme }}</span>\n </div>\n <div class=\"competency-tags\">\n <span\n class=\"proficiency-tag\"\n [ngClass]=\"comp.proficiency_level?.toLowerCase()\"\n >\n {{ comp.proficiency_level }}\n </span>\n\n <span\n class=\"delivery-mode-tag\"\n [ngClass]=\"comp.delivery_mode?.toLowerCase()\"\n >\n {{ comp.delivery_mode }}\n </span>\n </div>\n </div>\n </li>\n <li *ngIf=\"getCompetenciesByType(element.competencies, 'Domain').length > 4\"\n class=\"view-more-less cursor-pointer\"\n (click)=\"openFullList(element, 'domain')\">\n <span style=\"color: #1B4CA1;font-size: 16px;\">\n View More\n </span>\n </li>\n </ul>\n </td>\n </ng-container>\n\n <!-- Actions -->\n <ng-container matColumnDef=\"action\">\n <th [ngClass]=\"activeTab === 'matched'? 'table-header': 'table-header-unmatched'\"\n mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let element\">\n <button mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"editRoleMapping(element)\">\n <mat-icon>edit</mat-icon>\n <span>Edit Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"viewCBPPlan(element)\">\n <mat-icon>visibility</mat-icon>\n <span>View Role Mapping</span>\n </button>\n <button mat-menu-item (click)=\"generateCourseRecommendation(element)\">\n <mat-icon>school</mat-icon>\n <span>Generate Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"viewCourseRecommendation(element)\">\n <mat-icon>preview</mat-icon>\n <span>View Course Recommendation</span>\n </button>\n <button mat-menu-item (click)=\"deleteRoleMapping(element)\">\n <mat-icon>delete</mat-icon>\n <span>Delete Role Mapping</span>\n </button>\n <button *ngIf=\"activeTab !== 'matched'\" mat-menu-item (click)=\"sendForDesignationNameApproval(element)\">\n <mat-icon>send</mat-icon>\n <span>Send for Designation Name Approval</span>\n </button>\n </mat-menu>\n </td>\n </ng-container>\n\n <!-- Header & Rows -->\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n\n <!-- Pagination -->\n <mat-paginator [length]=\"totalRoleMappingListCount\" [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\" (page)=\"pageChangeEvent($event)\"\n [pageSizeOptions]=\"[5, 10, 20]\" showFirstLastButtons>\n </mat-paginator>\n </div>\n\n </ng-container>\n\n <div class=\"no-cbp-data\" *ngIf=\"dataSource?.filteredData?.length === 0\">\n <!-- <div><img src=\"/mdo-assets/images/no-content-data.svg\" alt=\"no-content\"></div> -->\n <div class=\"sub-heading mt-4\">\n <p>No role mappings available in this category</p>\n </div>\n <!-- <div class=\" margin-top-m no-content-create\">\n <button mat-button type=\"button\" class=\"search-btns\"\n [routerLink]=\"['/app/home/create-request-form']\">Request Content</button>\n </div> -->\n\n </div>\n\n <!-- <mat-paginator *ngIf=\"dataSource?.filteredData?.length > 0\" [pageSize]=\"pageSize\"\n [length]=\"this.requestCount\" [pageSizeOptions]=\"[10,20,40]\"\n (page)=\"onChangePage($event)\"></mat-paginator> -->\n\n\n </div>\n\n\n\n </div>\n </div>\n </mat-card>\n </div>\n</div>\n\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div\n class=\"competency-modal-backdrop\"\n *ngIf=\"isCompetencyInfoOpen\"\n (click)=\"closeCompetencyInfo()\"\n>\n <div\n class=\"competency-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"competency-modal-title\"\n (click)=\"$event.stopPropagation()\"\n >\n <!-- Close Button -->\n <button\n type=\"button\"\n class=\"modal-close-btn\"\n (click)=\"closeCompetencyInfo()\"\n aria-label=\"Close\"\n >\n \u00D7\n </button>\n\n <!-- Title -->\n <h2 id=\"competency-modal-title\">\n What do the competency tags mean?\n </h2>\n\n <!-- Description -->\n <p class=\"modal-description\">\n Every competency carries two tags: how deeply this designation needs it,\n and how the training for it is delivered.\n </p>\n\n <!-- Proficiency -->\n <div class=\"competency-section\">\n <h3>\n PROFICIENCY LEVEL \u2014 THE DEPTH THIS DESIGNATION NEEDS\n </h3>\n\n <div class=\"tag-info-row\">\n <span class=\"proficiency-tag strategic\">\n Strategic\n </span>\n\n <span class=\"tag-description\">\n Shapes policy, direction and outcomes\n </span>\n </div>\n\n <div class=\"tag-info-row\">\n <span class=\"proficiency-tag tactical\">\n Tactical\n </span>\n\n <span class=\"tag-description\">\n Plans, coordinates and turns direction into programmes\n </span>\n </div>\n\n <div class=\"tag-info-row\">\n <span class=\"proficiency-tag operational\">\n Operational\n </span>\n\n <span class=\"tag-description\">\n Executes and delivers the work on the ground\n </span>\n </div>\n </div>\n\n <!-- Delivery Mode -->\n <div class=\"competency-section delivery-section\">\n <h3>\n DELIVERY MODE \u2014 HOW THE TRAINING IS DELIVERED\n </h3>\n\n <div class=\"tag-info-row\">\n <span class=\"delivery-mode-tag online\">\n Online\n </span>\n\n <span class=\"tag-description\">\n Self-paced, knowledge-based content\n </span>\n </div>\n\n <div class=\"tag-info-row\">\n <span class=\"delivery-mode-tag offline\">\n Offline\n </span>\n\n <span class=\"tag-description\">\n Needs physical presence or supervised practice\n </span>\n </div>\n\n <div class=\"tag-info-row\">\n <span class=\"delivery-mode-tag blended\">\n Blended\n </span>\n\n <span class=\"tag-description\">\n Concept combined with applied practice or coaching\n </span>\n </div>\n </div>\n\n </div>\n</div>", styles: [".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:18px;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:18px;font-style:normal;font-weight:700;line-height:150%}:host ::ng-deep input.mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}:host ::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}:host ::ng-deep .mat-select-panel{background-color:#fff!important}:host ::ng-deep .mat-select-panel .mat-option{border-radius:0!important}:host ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;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:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .clear-icon{position:absolute;top:15px;font-size:20px;right:10px;color:#666}.search .clear-icon:hover{color:#333}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:600px}.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 10px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size: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:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.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:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:4px 8px;justify-content:center;align-items:center;gap:6px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.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}.designation{color:#1b4ca1;font-family:Lato;font-size:17px;font-style:normal;font-weight:700;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.wing-text{color:#000000e0;font-family:Lato;font-size:15px;font-style:normal;font-weight:400;line-height:normal}.role-item{color:#000000e0;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:1.75}.view-final-cbp-plan{display:flex;justify-content:end;align-items:center;gap:8px}.view-final-cbp-plan-text{padding:4px 16px;border-radius:24px;border:2px solid #F3962F;background:var(--white-kb-white-100, #FFF);box-shadow:0 1px 10px #276de599;color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:normal}.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}.cursor-pointer{cursor:pointer}.ml-10{margin-left:10px}.table-container{border-top-left-radius:16px;border-top-right-radius:16px;overflow:auto;background:#fff;max-height:70vh}:host ::ng-deep .mat-mdc-header-row{position:sticky;top:0;background:#fff;box-shadow:0 2px 4px #0000001a}:host ::ng-deep .mat-mdc-header-cell{background:#fff;font-weight:600;border-bottom:2px solid #e0e0e0}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child){position:relative;border-right:none}:host ::ng-deep th.mat-mdc-header-cell:not(:last-child):after{content:\"\";position:absolute;top:12px;bottom:12px;right:0;width:1px;background-color:#e0e0e0}.table-header{font-size:16px;font-weight:600;background:#fff!important;color:#333}.table-header-unmatched{font-size:16px;font-weight:600;background:#f4dcde!important;color:#b42318}.table-body{background-color:#fff!important}.table-body-unmatched{background-color:#faf6f7!important}.designation-text-unmatched p{color:#b42318!important}.select-map-flex-container{display:flex;flex-direction:row;justify-content:space-between;width:100%}.select-map-flex{display:flex}.search-container-flex{display:flex;flex-direction:row;width:100%;justify-content:space-between;align-items:flex-start}.mt-6{margin-top:1.7rem}.mat-elevation-z1 .mat-mdc-cell{vertical-align:top!important;padding-top:8px;padding-bottom:8px}::ng-deep .radio-style-checkbox .mat-checkbox-frame{border-radius:50%}::ng-deep .radio-style-checkbox .mat-checkbox-background{border-radius:50%}.search-flex{display:flex;flex-direction:row;width:100%}.margin-top-15{margin-top:15px}.btn-active-outline{border-radius:10px;opacity:1;color:#1b4ca1;border:1px solid #1B4CA1!important;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;width:240px;border:none;background-color:transparent;cursor:pointer}.btn-active-outline-disable{border-radius:10px;opacity:.5;color:#1b4ca1;border:1px solid #1B4CA1!important;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;width:auto;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:240px;background-color:transparent;cursor:not-allowed}.role-mapping-tabs{display:flex;gap:16px;align-items:center;font-family:Inter,sans-serif}.role-tab{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:24px;border:1px solid #d0d5dd;background-color:#f9fafb;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease-in-out}.role-tab.active{border-color:#1b4ca1;background-color:#eff6ff;color:#1b4ca1}.dot{width:10px;height:10px;border-radius:50%;background-color:#1b4ca1}.dot.red{background-color:#b42318}.badge{font-size:12px;font-weight:600;padding:2px 8px;border-radius:12px}.badge.blue{background-color:#dbeafe;color:#1b4ca1}.badge.red{background-color:#fee2e2;color:#b42318}.grayd-disable{color:#d3d3d3!important}.competency-tags{display:flex;gap:6px;margin-top:6px;flex-wrap:wrap}.proficiency-tag,.delivery-mode-tag{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:16px;font-size:11px;line-height:16px;font-weight:500;white-space:nowrap}.proficiency-tag.strategic{background:#1b4ca1;color:#fff;border:none}.proficiency-tag.tactical{background:#5b8def;color:#fff;border:none}.proficiency-tag.operational{background:#dbe6f7;color:#1b4ca1;border:none}.flex-col-theme{display:flex;flex-direction:column}.competency-info-btn{width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;cursor:pointer;padding:0}.info-icon{width:22px;height:22px;display:flex;align-items:center;justify-content:center;border:1px solid #1b4ca1;border-radius:50%;color:#1b4ca1;font-size:14px;font-weight:700}.competency-modal-backdrop{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;padding:20px;background:#1923328c;animation:fadeIn .2s ease}.competency-modal{position:relative;width:100%;max-width:1000px;max-height:calc(100vh - 40px);overflow-y:auto;background:#fff;border-radius:16px;padding:40px 42px 38px;box-sizing:border-box;box-shadow:0 20px 50px #00000040;animation:modalSlideIn .25s ease}.modal-close-btn{position:absolute;top:26px;right:36px;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border:none;background:transparent;color:#5b6778;font-size:44px;font-weight:300;line-height:1;cursor:pointer}.modal-close-btn:hover{color:#1b4ca1}.competency-modal h2{margin:0 0 16px;color:#293548;font-size:34px;font-weight:700;line-height:1.25}.modal-description{max-width:900px;margin:0 0 28px;color:#59687b;font-size:23px;font-weight:400;line-height:1.5}.competency-section{margin-top:26px}.delivery-section{margin-top:28px}.competency-section h3{margin:0 0 18px;color:#354154;font-size:21px;font-weight:700;letter-spacing:.5px;line-height:1.4}.tag-info-row{display:flex;align-items:center;gap:14px;margin-bottom:10px}.proficiency-tag,.delivery-mode-tag{width:140px;min-width:140px;display:inline-flex;align-items:center;justify-content:center;padding:6px 14px;border-radius:20px;font-size:17px;font-weight:600;line-height:1.2;box-sizing:border-box}.proficiency-tag.strategic{background:#1b4ca1;color:#fff}.proficiency-tag.tactical{background:#5b8def;color:#fff}.proficiency-tag.operational{background:#dbe6f7;color:#1b4ca1}.delivery-mode-tag.online{background:#e6f4ea;color:#1a7f45;border:1px solid #9BD3B0}.delivery-mode-tag.offline{background:#fdf0e3;color:#a2590a;border:1px solid #F0C48A}.delivery-mode-tag.blended{background:#efe9fb;color:#5b21b6;border:1px solid #C9B6F0}.tag-description{color:#526174;font-size:21px;font-weight:400;line-height:1.4}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes modalSlideIn{0%{opacity:0;transform:translateY(-10px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media (max-width: 768px){.competency-modal{padding:28px 22px}.competency-modal h2{padding-right:35px;font-size:26px}.modal-description{font-size:18px}.competency-section h3{font-size:17px}.tag-info-row{align-items:flex-start;flex-direction:column;gap:8px}.proficiency-tag,.delivery-mode-tag{width:140px}.tag-description{font-size:17px}.modal-close-btn{top:18px;right:18px}}\n"] }]
|
|
813
820
|
}], ctorParameters: function () { return [{ type: i1.SharedService }, { type: i2.MatDialog }, { type: i3.Router }, { type: i3.ActivatedRoute }]; }, propDecorators: { formData: [{
|
|
814
821
|
type: Input
|
|
815
822
|
}], paginator: [{
|
|
@@ -818,4 +825,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
818
825
|
}], moveToInitialScreen: [{
|
|
819
826
|
type: Output
|
|
820
827
|
}] } });
|
|
821
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWxpc3Qvcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWxpc3Qvcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDRFQUE0RSxDQUFDO0FBQ25JLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSww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ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBWaWV3Q2JwUGxhbkNvbXBvbmVudCB9IGZyb20gJy4uL3ZpZXctY2JwLXBsYW4vdmlldy1jYnAtcGxhbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRWRpdENicFBsYW5Db21wb25lbnQgfSBmcm9tICcuLi9lZGl0LWNicC1wbGFuL2VkaXQtY2JwLXBsYW4uY29tcG9uZW50JztcbmltcG9ydCB7IEdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9nZW5lcmF0ZS1jb3Vyc2UtcmVjb21tZW5kYXRpb24vZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEZWxldGVSb2xlTWFwcGluZ0NvbXBvbmVudCB9IGZyb20gJy4uL2RlbGV0ZS1yb2xlLW1hcHBpbmcvZGVsZXRlLXJvbGUtbWFwcGluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlld0NvdXJzZVJlY29tbWVuZGF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy1jb3Vyc2UtcmVjb21tZW5kYXRpb24vdmlldy1jb3Vyc2UtcmVjb21tZW5kYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdGaW5hbENicFBsYW5Db21wb25lbnQgfSBmcm9tICcuLi92aWV3LWZpbmFsLWNicC1wbGFuL3ZpZXctZmluYWwtY2JwLXBsYW4uY29tcG9uZW50JztcbmltcG9ydCB7IExpc3RQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL2xpc3QtcG9wdXAvbGlzdC1wb3B1cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWRkRGVzaWduYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9hZGQtZGVzaWduYXRpb24vYWRkLWRlc2lnbmF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBBcHByb3ZhbFJlcXVlc3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vYXBwcm92YWwtcmVxdWVzdC1mb3JtL2FwcHJvdmFsLXJlcXVlc3QtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbmltcG9ydCB7IERlc2lnbmF0aW9uQXBwcm92YWxSZXF1ZXN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Rlc2lnbmF0aW9uLWFwcHJvdmFsLXJlcXVlc3QtZm9ybS9kZXNpZ25hdGlvbi1hcHByb3ZhbC1yZXF1ZXN0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yb2xlLW1hcHBpbmctbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9yb2xlLW1hcHBpbmctbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JvbGUtbWFwcGluZy1saXN0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUm9sZU1hcHBpbmdMaXN0Q29tcG9uZW50IHtcbiAgQElucHV0KCkgZm9ybURhdGE6IGFueSA9IHt9XG4gIHNlYXJjaFRleHQgPSAnJ1xuICBzZWxlY3RlZFZhbHVlID0gJydcbiAgLy8nc2VsZWN0J1xuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtcbiAgICAnc2VsZWN0JyxcbiAgICAnZGVzaWduYXRpb25fbmFtZScsXG4gICAgJ3JvbGVfcmVzcG9uc2liaWxpdGllcycsXG4gICAgJ2FjdGl2aXRpZXMnLFxuICAgICdiZWhhdmlvcmFsJyxcbiAgICAnZnVuY3Rpb25hbCcsXG4gICAgJ2RvbWFpbicsXG4gICAgJ2FjdGlvbidcbiAgXTtcbiAgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSk7XG4gIG9yaWdpbmFsRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSk7XG4gIGZpbHRlcmVkRGF0YSA9IFtdO1xuICBvcmlnaW5hbERhdGE6IGFueVtdID0gW107XG4gIHNlYXJjaFJlc3VsdHM6IGFueVtdID0gW107IC8vIFN0b3JlIHNlYXJjaCByZXN1bHRzIGZvciBwYWdpbmF0aW9uXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBwYWdpbmF0b3IhOiBNYXRQYWdpbmF0b3I7XG4gIGV4cGFuZGVkUmVzcG9uc2liaWxpdHlSb3dzOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIGV4cGFuZGVkQWN0aXZpdHlSb3dzOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIGV4cGFuZGVkRG9tYWluUm93czogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBleHBhbmRlZEJlaGF2aW9yYWxSb3dzOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIGV4cGFuZGVkRnVuY3Rpb25hbFJvd3M6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgYWN0aXZlUm93RWxlbWVudDogYW55XG4gIGNicEZpbmFsT2JqOiBhbnkgPSB7fVxuICBsb2FkaW5nID0gZmFsc2VcbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pOyAvLyB0cnVlID0gbXVsdGktc2VsZWN0XG4gIG1hdGNoZWRSb2xlTWFwcGluZyA9IDBcbiAgdW5NYXRjaGVkUm9sZU1hcHBpbmcgPSAwXG4gIG1hdGNoZWRSb2xlTWFwcGluZ0lkcyA9IFtdXG4gIG1hdGNoZWREZXNpZ25hdGlvbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBwb3J0YWxEYXRhOiBhbnkgPSB7fVxuICBAT3V0cHV0KCkgbW92ZVRvSW5pdGlhbFNjcmVlbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIGFjdGl2ZVRhYjogJ21hdGNoZWQnIHwgJ3VubWF0Y2hlZCcgPSAnbWF0Y2hlZCc7XG5cbiAgbWF0Y2hlZERlc2lnbmF0aW9uU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIG1hc3RlckRhdGE6IGFueVtdID0gW107XG4gIHRhYkZpbHRlcmVkRGF0YTogYW55W10gPSBbXTsgICAvLyBhZnRlciBtYXRjaGVkL3VubWF0Y2hlZCBmaWx0ZXJcbiAgbWF0Y2hlZFJvbGVNYXBwaW5nRGF0YTogYW55W10gPSBbXTtcbiAgcGFnZUluZGV4ID0gMDtcbiAgcGFnZVNpemUgPSA1O1xuICBvZmZzZXQgPSAwO1xuICB0b3RhbFJvbGVNYXBwaW5nTGlzdENvdW50ID0gMFxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7XG5cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgLy8gdGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIHRoaXMucG9ydGFsRGF0YSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QuZGF0YVsncGFyZW50RGF0YSddXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHRydWUpXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwZGF0ZURlc2lnbmF0aW9uSGllcmFyY2h5U3ViamVjdC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcnRhbERhdGEgJiYgdGhpcy5wb3J0YWxEYXRhPy5wYXJlbnRBcHBEYXRhICYmIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YT8uZnJvbVBvcnRhbCAmJlxuICAgICAgICAgIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YT8uZnJvbVBvcnRhbCA9PT0gJ21kbydcbiAgICAgICAgKSB7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KVxuICAgIGlmICh0aGlzLnBvcnRhbERhdGEgJiYgdGhpcy5wb3J0YWxEYXRhPy5wYXJlbnRBcHBEYXRhICYmIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YT8uZnJvbVBvcnRhbCAmJlxuICAgICAgdGhpcy5wb3J0YWxEYXRhPy5wYXJlbnRBcHBEYXRhPy5mcm9tUG9ydGFsID09PSAnbWRvJ1xuICAgICkge1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpXG4gICAgfVxuXG5cblxuICB9XG5cbiAgZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGNvbXBldGVuY2llczogYW55W10sIHR5cGU6IHN0cmluZyk6IGFueVtdIHtcbiAgICByZXR1cm4gY29tcGV0ZW5jaWVzPy5maWx0ZXIoYyA9PiBjLnR5cGUgPT09IHR5cGUpIHx8IFtdO1xuICB9XG5cbiAgdmlld0RldGFpbHMoZWxlbWVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1ZpZXcgY2xpY2tlZDonLCBlbGVtZW50KTtcblxuICB9XG5cbiAgZGVsZXRlSXRlbShlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRGVsZXRlIGNsaWNrZWQ6JywgZWxlbWVudCk7XG4gICAgLy8gT3B0aW9uYWxseSByZW1vdmUgZnJvbSBkYXRhU291cmNlXG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBlbGVtZW50LmlkKTtcbiAgfVxuXG4gIHNlYXJjaERhdGEoKSB7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIoKSB7XG4gICAgLy8gaWYgKHRoaXMuc2VhcmNoVGV4dC50cmltKCkpIHtcbiAgICAvLyAgIC8vIFNlYXJjaCBvbmx5IGluIGRlc2lnbmF0aW9uIG5hbWVzXG4gICAgLy8gICB0aGlzLnNlYXJjaFJlc3VsdHMgPSB0aGlzLmZpbHRlckJ5RGVzaWduYXRpb25OYW1lKHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgLy8gICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuc2VhcmNoUmVzdWx0cyk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIC8vIElmIHNlYXJjaCBpcyBjbGVhcmVkLCByZXN0b3JlIG9yaWdpbmFsIGRhdGFcbiAgICAvLyAgIHRoaXMuc2VhcmNoUmVzdWx0cyA9IFtdO1xuICAgIC8vICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLm9yaWdpbmFsRGF0YSk7XG4gICAgLy8gfVxuXG4gICAgLy8gLy8gU2V0IHVwIHBhZ2luYXRpb24gZm9yIGZpbHRlcmVkIHJlc3VsdHNcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgIC8vICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgLy8gICAgIHRoaXMucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xuICAgIC8vICAgfVxuICAgIC8vIH0sIDEwMCk7XG4gICAgdGhpcy5hcHBseUFsbEZpbHRlcnMoKTtcbiAgfVxuXG4gIGNsZWFyU2VhcmNoKCkge1xuICAgIC8vIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIC8vIHRoaXMuc2VhcmNoUmVzdWx0cyA9IFtdO1xuICAgIC8vIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5vcmlnaW5hbERhdGEpO1xuXG4gICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAvLyAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIC8vICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9LCAxMDApO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG4gIH1cblxuICByZWZyZXNoUm9sZU1hcHBpbmdEYXRhKCkge1xuICAgIGNvbnNvbGUubG9nKCdSZWZyZXNoaW5nIHJvbGUgbWFwcGluZyBkYXRhLi4uJyk7XG4gICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IG1pbmlzdHJ5VHlwZSA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuc2JPcmdUeXBlO1xuICAgICAgY29uc3QgbWluaXN0cnlJZCA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcjtcblxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKG1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cykge1xuICAgICAgICAgIGNvbnN0IGRlcGFydG1lbnRJZCA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHM7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnRCeVNlYXJjaChtaW5pc3RyeUlkLCBkZXBhcnRtZW50SWQsIHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMuYWN0aXZlVGFiKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdGF0ZSByb2xlIG1hcHBpbmcgZGF0YSByZWZyZXNoZWQ6JywgcmVzKTtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhU291cmNlKHJlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVmcmVzaGluZyBzdGF0ZSByb2xlIG1hcHBpbmcgZGF0YTonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckJ5U2VhcmNoKG1pbmlzdHJ5SWQsIHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMuYWN0aXZlVGFiKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDZW50ZXIgcm9sZSBtYXBwaW5nIGRhdGEgcmVmcmVzaGVkOicsIHJlcyk7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZShyZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlZnJlc2hpbmcgY2VudGVyIHJvbGUgbWFwcGluZyBkYXRhOicsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2UgaWYgKG1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICBjb25zdCBkZXBhcnRtZW50SWQgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzO1xuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudEJ5U2VhcmNoKG1pbmlzdHJ5SWQsIGRlcGFydG1lbnRJZCwgdGhpcy5zZWFyY2hUZXh0LCB0aGlzLnBhZ2VTaXplLCB0aGlzLm9mZnNldCwgdGhpcy5hY3RpdmVUYWIpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1N0YXRlIHJvbGUgbWFwcGluZyBkYXRhIHJlZnJlc2hlZDonLCByZXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhU291cmNlKHJlcyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlZnJlc2hpbmcgc3RhdGUgcm9sZSBtYXBwaW5nIGRhdGE6JywgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZURhdGFTb3VyY2UocmVzOiBhbnkpIHtcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gcmVzPy5kYXRhO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5yb2xlTWFwcGluZ0dlbmVyYXRpb25EYXRhID0gcmVzPy5kYXRhO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzPy5kYXRhKTtcbiAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcz8uZGF0YTtcbiAgICBpZiAoXG4gICF0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWUgJiZcbiAgdGhpcy5vcmlnaW5hbERhdGE/Lmxlbmd0aFxuKSB7XG4gIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lID1cbiAgICB0aGlzLm9yaWdpbmFsRGF0YVswXS5kZXBhcnRtZW50X25hbWU7XG5cbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgJ2NicFBsYW5GaW5hbE9iaicsXG4gICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgKTtcbn1cbiAgICB0aGlzLnNlYXJjaFJlc3VsdHMgPSBbXTsgLy8gQ2xlYXIgc2VhcmNoIHJlc3VsdHMgd2hlbiBkYXRhIGlzIHVwZGF0ZWRcblxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIC8vIH0sIDEwMCk7XG4gICAgY29uc29sZS5sb2coJ0RhdGFTb3VyY2UgdXBkYXRlZDonLCB0aGlzLmRhdGFTb3VyY2UpO1xuICB9XG5cbiAgZWRpdFJvbGVNYXBwaW5nKGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnRWRpdCBSb2xlIE1hcHBpbmcgY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIC8vIE5hdmlnYXRlIG9yIG9wZW4gbW9kYWxcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgZWxlbWVudFsnbWF0Y2hlZF9yb2xlX21hcHBpbmdzJ109IHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nRGF0YVxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRWRpdENicFBsYW5Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTAwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KCk7XG4gICAgICAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuXG4gICAgICB9XG4gICAgICBcbiAgICB9KTtcbiAgfVxuXG4gIHZpZXdDQlBQbGFuKGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihWaWV3Q2JwUGxhbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc4MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb24oZWxlbWVudDogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ0dlbmVyYXRlIENvdXJzZSBSZWNvbW1lbmRhdGlvbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgdGhpcy5hY3RpdmVSb3dFbGVtZW50ID0gZWxlbWVudFxuICAgIGNvbnNvbGUubG9nKCdFZGl0IFJvbGUgTWFwcGluZyBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgLy8gTmF2aWdhdGUgb3Igb3BlbiBtb2RhbFxuICAgIGNvbnNvbGUubG9nKCdWaWV3IENCUCBQbGFuIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTEwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICc0MDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG5cbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cykge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckJ5U2VhcmNoKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllciwgdGhpcy5zZWFyY2hUZXh0LCB0aGlzLnBhZ2VTaXplLCB0aGlzLm9mZnNldCwgdGhpcy5hY3RpdmVUYWIpLnN1YnNjcmliZSgocmVzOmFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnRCeVNlYXJjaCh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIsIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMsIHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMuYWN0aXZlVGFiKS5zdWJzY3JpYmUoKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkgJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudEJ5U2VhcmNoKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllciwgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cywgdGhpcy5zZWFyY2hUZXh0LCB0aGlzLnBhZ2VTaXplLCB0aGlzLm9mZnNldCwgdGhpcy5hY3RpdmVUYWIpLnN1YnNjcmliZSgocmVzOmFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmlld0NvdXJzZVJlY29tbWVuZGF0aW9uKGVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdWaWV3IENvdXJzZSBSZWNvbW1lbmRhdGlvbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgdGhpcy5hY3RpdmVSb3dFbGVtZW50ID0gZWxlbWVudFxuICAgIGNvbnNvbGUubG9nKCdFZGl0IFJvbGUgTWFwcGluZyBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgLy8gTmF2aWdhdGUgb3Igb3BlbiBtb2RhbFxuICAgIGNvbnNvbGUubG9nKCdWaWV3IENCUCBQbGFuIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFZpZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMDAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzQwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmogJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeSAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQnlTZWFyY2godGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyLCB0aGlzLnNlYXJjaFRleHQsIHRoaXMucGFnZVNpemUsIHRoaXMub2Zmc2V0LCB0aGlzLmFjdGl2ZVRhYikuc3Vic2NyaWJlKChyZXM6YW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXM/LmRhdGEpXG4gICAgICAgICAgICAvLyB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM/LmRhdGE7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGRhdGEgYnkgZGVzaWduYXRpb24gbmFtZSBvbmx5XG4gICAqIFN1cHBvcnRzIHNpbmdsZSBhbmQgbXVsdGlwbGUgd29yZCBzZWFyY2hlc1xuICAgKi9cbiAgZmlsdGVyQnlEZXNpZ25hdGlvbk5hbWUoc2VhcmNoVGV4dDogc3RyaW5nKTogYW55W10ge1xuICAgIGNvbnN0IHNlYXJjaFRlcm1zID0gc2VhcmNoVGV4dC50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuXG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxEYXRhLmZpbHRlcihpdGVtID0+IHtcbiAgICAgIGNvbnN0IGRlc2lnbmF0aW9uTmFtZSA9IChpdGVtLmRlc2lnbmF0aW9uX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFsbCBzZWFyY2ggdGVybXMgYXJlIGZvdW5kIGluIHRoZSBkZXNpZ25hdGlvbiBuYW1lXG4gICAgICByZXR1cm4gc2VhcmNoVGVybXMuZXZlcnkodGVybSA9PiBkZXNpZ25hdGlvbk5hbWUuaW5jbHVkZXModGVybSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZmxhdHRlbk9iamVjdFRvU3RyaW5nKG9iajogYW55KTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc3VsdCArPSAnICcgKyB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICcgJyArIHZhbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5mbGF0dGVuT2JqZWN0VG9TdHJpbmcodmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdCArPSAnICcgKyB0aGlzLmZsYXR0ZW5PYmplY3RUb1N0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldFNlY3RvcnMoc2VjdG9yKSB7XG4gICAgaWYgKHNlY3RvciAmJiBzZWN0b3IubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShzZWN0b3IpID8gc2VjdG9yLmpvaW4oJy8gJykgOiAnJ1xuICAgIH1cblxuICB9XG5cbiAgdG9nZ2xlUmVzcG9uc2liaWxpdHlFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3NbaWRdID0gIXRoaXMuZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3NbaWRdO1xuICB9XG5cbiAgaXNSZXNwb25pc2JpbGl0eUV4cGFuZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcblxuXG4gICAgLy8gY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihMaXN0UG9wdXBDb21wb25lbnQsIHtcbiAgICAvLyAgIHdpZHRoOiAnMTAwMHB4JyxcbiAgICAvLyAgIGRhdGE6IHRoaXMuYWN0aXZlUm93RWxlbWVudCxcbiAgICAvLyAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgLy8gICBtaW5IZWlnaHQ6ICc0MDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgIC8vICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgLy8gICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICAvLyB9KTtcblxuICAgIC8vIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgIC8vICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gfSk7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRSZXNwb25zaWJpbGl0eVJvd3NbaWRdO1xuICB9XG5cbiAgdG9nZ2xlQWN0aXZpdHlFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRBY3Rpdml0eVJvd3NbaWRdID0gIXRoaXMuZXhwYW5kZWRBY3Rpdml0eVJvd3NbaWRdO1xuICB9XG5cbiAgaXNBY3Rpdml0eUV4cGFuZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZEFjdGl2aXR5Um93c1tpZF07XG4gIH1cblxuICB0b2dnbGVEb21haW5FeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWREb21haW5Sb3dzW2lkXSA9ICF0aGlzLmV4cGFuZGVkRG9tYWluUm93c1tpZF07XG4gIH1cblxuICBpc0RvbWFpbkV4cGFuZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZERvbWFpblJvd3NbaWRdO1xuICB9XG5cbiAgdG9nZ2xlQmVoYXZpb3JhbEV4cGFuZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZEJlaGF2aW9yYWxSb3dzW2lkXSA9ICF0aGlzLmV4cGFuZGVkQmVoYXZpb3JhbFJvd3NbaWRdO1xuICB9XG5cbiAgaXNCZWhhdmlvcmFsRXhwYW5kZWQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkQmVoYXZpb3JhbFJvd3NbaWRdO1xuICB9XG5cbiAgdG9nZ2xlRnVuY3Rpb25hbEV4cGFuZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZEZ1bmN0aW9uYWxSb3dzW2lkXSA9ICF0aGlzLmV4cGFuZGVkRnVuY3Rpb25hbFJvd3NbaWRdO1xuICB9XG5cbiAgaXNGdW5jdGlvbmFsRXhwYW5kZWQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkRnVuY3Rpb25hbFJvd3NbaWRdO1xuICB9XG5cblxuXG4gIGFkZE1vcmVEZXNpZ25hdGlvbigpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFkZERlc2lnbmF0aW9uQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IHsgc3RhdGVfY2VudGVyX2lkOiAnJywgbWF0Y2hlZF9yb2xlX21hcHBpbmdzOiB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZ0RhdGEgfSxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcbiAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGVSb2xlTWFwcGluZyhlbGVtZW50KSB7XG4gICAgY29uc29sZS5sb2coJ0dlbmVyYXRlIENvdXJzZSBSZWNvbW1lbmRhdGlvbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgdGhpcy5hY3RpdmVSb3dFbGVtZW50ID0gZWxlbWVudFxuICAgIGNvbnNvbGUubG9nKCdFZGl0IFJvbGUgTWFwcGluZyBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgLy8gTmF2aWdhdGUgb3Igb3BlbiBtb2RhbFxuICAgIGNvbnNvbGUubG9nKCdWaWV3IENCUCBQbGFuIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERlbGV0ZVJvbGVNYXBwaW5nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZpZXdGaW5hbENCUFBsYW4oY29udGV4dDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihWaWV3RmluYWxDYnBQbGFuQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzExMDBweCcsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHBheWxvYWQ6IHRoaXMub3JpZ2luYWxEYXRhLFxuICAgICAgICBvcGVuZWRGcm9tOiBjb250ZXh0ICAgLy8g8J+RiCBCRVNUIFBSQUNUSUNFXG4gICAgICB9LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuXG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG1vdmVUb0luaXRpYWxTY3JlZW5MYXlvdXQoZXZlbnQpIHtcbiAgICAvLyB0aGlzLm1vdmVUb0luaXRpYWxTY3JlZW4uZW1pdChldmVudClcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9haS9pbml0aWFsJ10sIHtcbiAgICAgIG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnXG4gICAgfSk7XG4gIH1cblxuICBvcGVuRnVsbExpc3QoZWxlbWVudDogYW55LCB0eXBlOiBhbnkpIHtcbiAgICBjb25zdCBsaXN0VG9TaG93OiBzdHJpbmdbXSA9IGVsZW1lbnRbdHlwZV0gfHwgW107XG4gICAgY29uc3QgdGl0bGUgPSB0eXBlID09PSAncm9sZV9yZXNwb25zaWJpbGl0aWVzJyA/ICdSb2xlICYgUmVzcG9uc2liaWxpdGllcydcbiAgICAgIDogdHlwZSA9PT0gJ2FjdGl2aXR5JyA/ICdBY3Rpdml0aWVzJ1xuICAgICAgOiB0eXBlID09PSAnYmVoYXZpb3JhbCcgPyAnQmVoYXZpb3JhbCBDb21wZXRlbmNpZXMnXG4gICAgICA6IHR5cGUgPT09ICdmdW5jdGlvbmFsJyA/ICdGdW5jdGlvbmFsIENvbXBldGVuY2llcydcbiAgICAgIDogJ0RvbWFpbiBDb21wZXRlbmNpZXMnO1xuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihMaXN0UG9wdXBDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgZGF0YTogeyBlbGVtZW50OiBlbGVtZW50LCB0eXBlOiB0eXBlIH0sXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBtYXhIZWlnaHQ6ICc4MHZoJ1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBoZXJlIHRvIHJlc2V0IGlubGluZSBleHBhbmRlZCBzdGF0ZVxuICAgICAgLy8gQmVjYXVzZSB5b3UncmUgdXNpbmcgZGlhbG9nLCBub3QgaW5saW5lIGV4cGFuZCDigJMgdmlldyByZW1haW5zIGluIGluaXRpYWwgKGNvbGxhcHNlZCkgc3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRSb2xlTWFwcGluZ0xpc3QoKSB7XG5cbiAgICB0aGlzLmNicEZpbmFsT2JqID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENCUFBsYW5Mb2NhbFN0b3JhZ2UoKVxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5jYnBGaW5hbE9iaj8ucm9sZV9tYXBwaW5nX2dlbmVyYXRpb24pXG4gICAgdGhpcy5vcmlnaW5hbERhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuY2JwRmluYWxPYmo/LnJvbGVfbWFwcGluZ19nZW5lcmF0aW9uKVxuICAgIHRoaXMub3JpZ2luYWxEYXRhID0gdGhpcy5jYnBGaW5hbE9iaj8ucm9sZV9tYXBwaW5nX2dlbmVyYXRpb25cblxuICAgIGlmICh0aGlzLmNicEZpbmFsT2JqICYmIHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5ICYmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGUpKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqID0gdGhpcy5jYnBGaW5hbE9ialxuICAgICAgaWYgKHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5LnNiT3JnVHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0ge31cbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXSA9IHt9XG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ21pbmlzdHJ5VHlwZSddID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlXG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ21pbmlzdHJ5J10gPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllclxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddWydkZXBhcnRtZW50cyddID0gdGhpcy5jYnBGaW5hbE9iaj8uZGVwYXJ0bWVudHNcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAgIHRoaXMuZm9ybURhdGEgPSB7fVxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddID0ge31cbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXVsnbWluaXN0cnlUeXBlJ10gPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGVcbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXVsnbWluaXN0cnknXSA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ2RlcGFydG1lbnRzJ10gPSB0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50c1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5mb3JtRGF0YScsIHRoaXMuZm9ybURhdGEpXG4gICAgaWYgKHRoaXMuZm9ybURhdGEgJiYgdGhpcy5mb3JtRGF0YS52YWx1ZSAmJiB0aGlzLmZvcm1EYXRhLnZhbHVlLm1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgbGV0IHN0YXRlX2NlbnRlcl9pZCA9IHRoaXMuZm9ybURhdGEudmFsdWUubWluaXN0cnlcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgIGlmICh0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzPy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGRlcGFydG1lbnRfaWQgPSB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzXG4gICAgICAgIGlmICh0eXBlb2YgZGVwYXJ0bWVudF9pZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgc3RhdGVfY2VudGVyX2lkOiB0aGlzLmZvcm1EYXRhLnZhbHVlLm1pbmlzdHJ5XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIG9ialsnZGVwYXJ0bWVudF9pZCddID0gdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50c1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0TWF0Y2hlZFJvbGVNYXBwaW5nKG9iaikuc3Vic2NyaWJlKChtYXRjaGVkUm9sZU1hcHBpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYXRjaGVkUm9sZU1hcHBpbmcnLCBtYXRjaGVkUm9sZU1hcHBpbmcpXG4gICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZ0RhdGEgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscyB8fCBbXVxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFJvbGVNYXBwaW5nSWRzID1cbiAgICAgICAgICAgICAgbWF0Y2hlZFJvbGVNYXBwaW5nPy5tYXRjaGVkX2RldGFpbHM/Lm1hcChcbiAgICAgICAgICAgICAgICB4ID0+IHgucm9sZV9tYXBwaW5nX2lkXG4gICAgICAgICAgICAgICkgfHwgW107XG4gICAgICAgICAgICB0aGlzLm1hdGNoZWREZXNpZ25hdGlvblNldCA9IG5ldyBTZXQobWF0Y2hlZFJvbGVNYXBwaW5nSWRzKTtcblxuICAgICAgICAgICAgLy8gdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPSBtYXRjaGVkUm9sZU1hcHBpbmdJZHMubGVuZ3RoO1xuXG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudEJ5U2VhcmNoKHN0YXRlX2NlbnRlcl9pZCwgZGVwYXJ0bWVudF9pZCwgdGhpcy5zZWFyY2hUZXh0LCB0aGlzLnBhZ2VTaXplLCB0aGlzLm9mZnNldCwgdGhpcy5hY3RpdmVUYWIpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQ6IChyZXM6YW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXM/LmRhdGFcbiAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2Uucm9sZU1hcHBpbmdHZW5lcmF0aW9uRGF0YSA9IHJlcz8uZGF0YVxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZyA9cmVzPy50b3RhbF9tYXRjaGVkXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMubWF0Y2hlZFJvbGVNYXBwaW5nJywgdGhpcy5hY3RpdmVUYWIsIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nLCB0aGlzLnVuTWF0Y2hlZFJvbGVNYXBwaW5nKVxuICAgICAgICAgICAgICAgIHRoaXMudW5NYXRjaGVkUm9sZU1hcHBpbmcgPSByZXM/LnRvdGFsX3VubWF0Y2hlZFxuICAgICAgICAgICAgICAgIC8vIGFkZCBhIGNvbmRpdGlvbiBpZiB1bm1hdGNoZWQgdGFiIHRoZW4gc2VuZCB1bm1hdGNoZWQgdmFsdWUgaW4gcm9sZSBtYXBwaW5nXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5hcHBseUFsbEZpbHRlcnMoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzPy5kYXRhKVxuICAgICAgICAgICAgICAgIHRoaXMub3JpZ2luYWxEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXM/LmRhdGEpXG4gICAgICAgICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgICAgICAgLy8gfSwgMTAwMClcbiAgICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcz8uZGF0YSA7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXN0ZXJEYXRhID0gcmVzPy5kYXRhO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgIXRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmo/LmRlcGFydG1lbnRfbmFtZSAmJlxuICB0aGlzLm9yaWdpbmFsRGF0YT8ubGVuZ3RoXG4pIHtcbiAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50X25hbWUgPVxuICAgIHRoaXMub3JpZ2luYWxEYXRhWzBdLmRlcGFydG1lbnRfbmFtZTtcblxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAnY2JwUGxhbkZpbmFsT2JqJyxcbiAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKVxuICApO1xufVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VG90YWxSb2xlTWFwcGluZ0xpc3RDb3VudChyZXMpXG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgc3RhdGVfY2VudGVyX2lkOiB0aGlzLmZvcm1EYXRhLnZhbHVlLm1pbmlzdHJ5XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgb2JqWydkZXBhcnRtZW50X2lkJ10gPSB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNYXRjaGVkUm9sZU1hcHBpbmcob2JqKS5zdWJzY3JpYmUoKG1hdGNoZWRSb2xlTWFwcGluZykgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ21hdGNoZWRSb2xlTWFwcGluZycsIG1hdGNoZWRSb2xlTWFwcGluZylcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nRGF0YSA9IG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzIHx8IFtdXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkUm9sZU1hcHBpbmdJZHMgPVxuICAgICAgICAgICAgICBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscz8ubWFwKFxuICAgICAgICAgICAgICAgIHggPT4geC5yb2xlX21hcHBpbmdfaWRcbiAgICAgICAgICAgICAgKSB8fCBbXTtcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZERlc2lnbmF0aW9uU2V0ID0gbmV3IFNldChtYXRjaGVkUm9sZU1hcHBpbmdJZHMpO1xuXG4gICAgICAgICAgIC8vIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nID0gbWF0Y2hlZFJvbGVNYXBwaW5nSWRzLmxlbmd0aDtcblxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJCeVNlYXJjaChzdGF0ZV9jZW50ZXJfaWQsIHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5vZmZzZXQsdGhpcy5hY3RpdmVUYWIpLnN1YnNjcmliZSgocmVzOmFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IHJlcz8uZGF0YVxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnJvbGVNYXBwaW5nR2VuZXJhdGlvbkRhdGEgPSByZXM/LmRhdGFcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nID1yZXM/LnRvdGFsX21hdGNoZWRcbiAgICAgICAgICAgIHRoaXMudW5NYXRjaGVkUm9sZU1hcHBpbmcgPSByZXM/LnRvdGFsX3VubWF0Y2hlZDtcbiAgICAgICAgICAgIC8vIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG4gICAgICAgICAgdGhpcy5zZXRUb3RhbFJvbGVNYXBwaW5nTGlzdENvdW50KHJlcylcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlcz8uZGF0YSlcbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzPy5kYXRhKVxuICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgIC8vIH0sIDEwMDApXG5cbiAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcz8uZGF0YTtcbiAgICAgICAgICB0aGlzLm1hc3RlckRhdGEgPSByZXM/LmRhdGE7XG4gICAgICAgICAgaWYgKFxuICAhdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaj8uZGVwYXJ0bWVudF9uYW1lICYmXG4gIHRoaXMub3JpZ2luYWxEYXRhPy5sZW5ndGhcbikge1xuICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRfbmFtZSA9XG4gICAgdGhpcy5vcmlnaW5hbERhdGFbMF0uZGVwYXJ0bWVudF9uYW1lO1xuXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICdjYnBQbGFuRmluYWxPYmonLFxuICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICk7XG59XG4gICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgfVxuICAgIGlmICh0aGlzLmZvcm1EYXRhICYmIHRoaXMuZm9ybURhdGEudmFsdWUgJiYgdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmZvcm1EYXRhJywgdGhpcy5mb3JtRGF0YSlcbiAgICAgIGxldCBzdGF0ZV9jZW50ZXJfaWQgPSB0aGlzLmZvcm1EYXRhLnZhbHVlLm1pbmlzdHJ5XG4gICAgICBsZXQgZGVwYXJ0bWVudF9pZCA9IHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHNcbiAgICAgIGxldCBvYmogPSB7XG4gICAgICAgIHN0YXRlX2NlbnRlcl9pZDogdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzID09PSAnc3RyaW5nJykge1xuICAgICAgICBvYmpbJ2RlcGFydG1lbnRfaWQnXSA9IHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHNcbiAgICAgIH1cbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNYXRjaGVkUm9sZU1hcHBpbmcob2JqKS5zdWJzY3JpYmUoKG1hdGNoZWRSb2xlTWFwcGluZykgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnbWF0Y2hlZFJvbGVNYXBwaW5nJywgbWF0Y2hlZFJvbGVNYXBwaW5nKVxuICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZ0RhdGEgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscyB8fCBbXVxuICAgICAgICBjb25zdCBtYXRjaGVkUm9sZU1hcHBpbmdJZHMgPVxuICAgICAgICAgIG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzPy5tYXAoXG4gICAgICAgICAgICB4ID0+IHgucm9sZV9tYXBwaW5nX2lkXG4gICAgICAgICAgKSB8fCBbXTtcbiAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25TZXQgPSBuZXcgU2V0KG1hdGNoZWRSb2xlTWFwcGluZ0lkcyk7XG5cbiAgICAgIC8vICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZyA9IG1hdGNoZWRSb2xlTWFwcGluZ0lkcy5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnRCeVNlYXJjaChzdGF0ZV9jZW50ZXJfaWQsIGRlcGFydG1lbnRfaWQsIHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5vZmZzZXQsdGhpcy5hY3RpdmVUYWIpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXM/LmRhdGFcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5yb2xlTWFwcGluZ0dlbmVyYXRpb25EYXRhID0gcmVzPy5kYXRhXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZyA9cmVzPy50b3RhbF9tYXRjaGVkXG4gICAgICAgICAgICB0aGlzLnVuTWF0Y2hlZFJvbGVNYXBwaW5nID0gcmVzPy50b3RhbF91bm1hdGNoZWQ7XG4gICAgICAgICAgICAvLyB0aGlzLmFwcGx5QWxsRmlsdGVycygpO1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXM/LmRhdGEpXG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzPy5kYXRhKVxuICAgICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgICAgICAgIC8vIH0sIDEwMDApXG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHJlcz8uZGF0YTtcbiAgICAgICAgICAgIHRoaXMubWFzdGVyRGF0YSA9IHJlcz8uZGF0YTtcbiAgICAgICAgICAgIGlmIChcbiAgIXRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmo/LmRlcGFydG1lbnRfbmFtZSAmJlxuICB0aGlzLm9yaWdpbmFsRGF0YT8ubGVuZ3RoXG4pIHtcbiAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50X25hbWUgPVxuICAgIHRoaXMub3JpZ2luYWxEYXRhWzBdLmRlcGFydG1lbnRfbmFtZTtcblxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAnY2JwUGxhbkZpbmFsT2JqJyxcbiAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKVxuICApO1xufVxuICAgICAgICAgICAgdGhpcy5zZXRUb3RhbFJvbGVNYXBwaW5nTGlzdENvdW50KHJlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuXG5cblxuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBzZXRUb3RhbFJvbGVNYXBwaW5nTGlzdENvdW50KHJlczogYW55KSB7XG4gICAgY29uc3QgdGFiQ291bnQgPSB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3VubWF0Y2hlZCcgPyByZXM/LnRvdGFsX3VubWF0Y2hlZCA6IHJlcz8udG90YWxfbWF0Y2hlZFxuICAgIHRoaXMudG90YWxSb2xlTWFwcGluZ0xpc3RDb3VudCA9IHRhYkNvdW50ID8/IHJlcz8udG90YWwgPz8gMFxuICB9XG5cbiAgdG9nZ2xlUm93KHJvdzogYW55KSB7XG4gICAgaWYgKCFyb3c/LmNicF9wbGFucz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICB0aGlzLnNlbGVjdGlvbi50b2dnbGUocm93KTtcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0ZWQgcm93czonLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gIH1cblxuICBpc0FsbFNlbGVjdGVkKCkge1xuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICB9XG5cbiAgaXNTb21lU2VsZWN0ZWQoKSB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPiAwICYmIG51bVNlbGVjdGVkIDwgbnVtUm93cztcbiAgfVxuXG4gIHRvZ2dsZUFsbFJvd3MoZXZlbnQ6IGFueSkge1xuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG5cbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhXG4gICAgICAgIC5maWx0ZXIocm93ID0+IHJvdz8uY2JwX3BsYW5zPy5sZW5ndGgpXG4gICAgICAgIC5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGF0YVNvdXJlKHRhYj86ICdtYXRjaGVkJyB8ICd1bm1hdGNoZWQnKSB7XG5cbiAgICB0aGlzLmFjdGl2ZVRhYiA9IHRhYjtcblxuICAgIC8vIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG5cbiAgICB0aGlzLmFwcGx5QWxsRmlsdGVycygpO1xuXG4gIH1cblxuICBhcHBseUFsbEZpbHRlcnMoKSB7XG4gICAgXG5cbi8vICAgICBsZXQgZGF0YSA9IFsuLi50aGlzLm1hc3RlckRhdGFdO1xuLy8gdGhpcy5tYXN0ZXJEYXRhLmZvckVhY2goaXRlbSA9PiB7XG4vLyAgIGNvbnN0IHJvbGVNYXBwaW5nSWQgPSBpdGVtLmlkO1xuXG5cblxuLy8gfSk7XG4vLyAgICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnbWF0Y2hlZCcpIHtcblxuLy8gICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGl0ZW0gPT5cbi8vICAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25TZXQuaGFzKFxuLy8gICAgICAgICAgIGl0ZW0uaWRcbi8vICAgICAgICAgKVxuLy8gICAgICAgKTtcblxuLy8gICAgIH1cblxuLy8gICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ3VubWF0Y2hlZCcpIHtcblxuLy8gICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGl0ZW0gPT5cbi8vICAgICAgICAgIXRoaXMubWF0Y2hlZERlc2lnbmF0aW9uU2V0Lmhhcyhcbi8vICAgICAgICAgICBpdGVtLmlkXG4vLyAgICAgICAgIClcbi8vICAgICAgICk7XG5cbi8vICAgICB9XG5cbiAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICB0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXggPSAwO1xuICAgfVxuICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgLy8gIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoZGF0YSk7XG5cbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAvLyB9KTtcblxuICB9XG5cbiAgc2VuZEZvckFwcHJvdmFsRm9ybSgpIHtcbiAgICBjb25zb2xlLmxvZygndGhpcy5zZWxlY3Rpb24tLScsIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKVxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQXBwcm92YWxSZXF1ZXN0Rm9ybUNvbXBvbmVudCwge1xuICAgICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgICAgZGF0YTogdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQsXG4gICAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgICAgfSk7XG5cbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAvLyBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIC8vICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAgIC8vICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG5cbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpXG4gICAgICAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuICBoYXNTZWxlY3RhYmxlUm93cygpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5kYXRhPy5zb21lKChyb3c6IGFueSkgPT4gcm93Py5jYnBfcGxhbnM/Lmxlbmd0aCA+IDApO1xuICB9XG5cbiAgc2VuZEZvckRlc2lnbmF0aW9uTmFtZUFwcHJvdmFsKGVsZW1lbnQpIHtcbiAgICB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQgPSBlbGVtZW50XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXNpZ25hdGlvbkFwcHJvdmFsUmVxdWVzdEZvcm1Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgZGF0YTogZWxlbWVudCxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc4MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAvLyBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgLy8gICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcblxuICAgICAgLy8gfVxuICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KCk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIGdldEFjdGl2YXRlQ2JwUGxhbihyb3cpIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZVxuICAgIGlmIChyb3c/LmNicF9wbGFucyAmJiByb3c/LmNicF9wbGFucz8ubGVuZ3RoKSB7XG4gICAgICByb3cuY2JwX3BsYW5zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50Py5zZWxlY3RlZF9jb3Vyc2VzICYmIGVsZW1lbnQ/LnNlbGVjdGVkX2NvdXJzZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gIWZvdW5kXG4gIH1cblxuICBwYWdlQ2hhbmdlRXZlbnQoZXZlbnQ6IFBhZ2VFdmVudCk6IHZvaWQge1xuICB0aGlzLnBhZ2VJbmRleCA9IGV2ZW50LnBhZ2VJbmRleDtcbiAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xuICB0aGlzLm9mZnNldCA9IHRoaXMucGFnZUluZGV4ICogdGhpcy5wYWdlU2l6ZTtcbiAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcblxuICBjb25zb2xlLmxvZygnUGFnZSBJbmRleDonLCB0aGlzLnBhZ2VJbmRleCk7XG4gIGNvbnNvbGUubG9nKCdQYWdlIFNpemU6JywgdGhpcy5wYWdlU2l6ZSk7XG4gIGNvbnNvbGUubG9nKCdPZmZzZXQ6JywgdGhpcy5vZmZzZXQpO1xuXG4gIC8vIENhbGwgeW91ciBBUEkgaWYgbmVlZGVkXG4gIC8vIHRoaXMuZ2V0RGF0YSh0aGlzLm9mZnNldCwgdGhpcy5wYWdlU2l6ZSk7XG59XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJyb2xlLW1hcHBpbmctY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuXG4gICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm10LTAgcHQtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24taGVhZGVyXCI+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtc2VjdGlvbiBtdC00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1tYXAtcm91dGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtbWFwLWZsZXgtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LW1hcC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLW1hcHBpbmctcm91dGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+e3tzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5Py5vcmdOYW1lfX0gIDxzcGFuICpuZ0lmPVwic2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWUgfHwgb3JpZ2luYWxEYXRhPy5bMF0/LmRlcGFydG1lbnRfbmFtZVwiPlxuICAgIC8ge3sgc2hhcmVkU2VydmljZT8uY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWUgfHwgb3JpZ2luYWxEYXRhPy5bMF0/LmRlcGFydG1lbnRfbmFtZSB9fVxuICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVkaXQtcGxhbiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJtb3ZlVG9Jbml0aWFsU2NyZWVuTGF5b3V0KCdlZGl0JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPkVkaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBtbC0xMFwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tYWN0aXZlIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm1vdmVUb0luaXRpYWxTY3JlZW5MYXlvdXQoJ2FkZCcpXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENCUC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpZXctZmluYWwtY2JwLXBsYW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwidmlldy1maW5hbC1jYnAtcGxhbi10ZXh0IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInZpZXdGaW5hbENCUFBsYW4oJ2NicCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj48c3Bhbj5WaWV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluYWwgQ0JQPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpZXctZmluYWwtY2JwLXBsYW4tdGV4dCBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJ2aWV3RmluYWxDQlBQbGFuKCdhY2JwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPjxzcGFuPlZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5hbCBDQlA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZpbHRlci1zZWN0aW9uIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoIGZsZXggbWFyZ2luLXJpZ2h0LW0gc2VhcmNoLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJzZWFyY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbG9yLTYwIHNlYXJjaC1pY29uIG1hdC1pY29uIG5vdHJhbnNsYXRlIG1hdGVyaWFsLWljb25zIG1hdC1pY29uLW5vLWNvbG9yXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwic2lucHV0IGNvbG9yLTYwIHctZnVsbFwiIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiIGxhYmVsPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJhcHBseUZpbHRlcigpXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYnkgZGVzaWduYXRpb24gbmFtZVwiIHR5cGU9XCJTdGFuZGFyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzZWFyY2hUZXh0LnRyaW0oKS5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sb3ItNjAgY2xlYXItaWNvbiBtYXQtaWNvbiBub3RyYW5zbGF0ZSBtYXRlcmlhbC1pY29ucyBtYXQtaWNvbi1uby1jb2xvciBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiPmNsZWFyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGwtMiBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbZGlzYWJsZWRdPVwic2VhcmNoVGV4dC50cmltKCk/Lmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWFyY2hUZXh0LnRyaW0oKT8ubGVuZ3RoID09PSAwID8gJ2J0bi1kaXNhYmxlJzonYnRuLWFjdGl2ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiU2VhcmNoXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVyKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1zZWN0aW9uIGZsZXggbWFyZ2luLXRvcC0xNVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPkZpbHRlciBieSBjb21wZXRlbmN5IHR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyNXB4OyBwYWRkaW5nOiAwIDEycHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsodmFsdWUpXT1cInNlbGVjdGVkVmFsdWVcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBNaW5pc3RyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIid0ZXN0J1wiPlRlc3Q8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiJ2Fub3RoZXInXCI+QW5vdGhlcjwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1hY3RpdmVcIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJBZGQgTW9yZSBEZXNpZ25hdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRNb3JlRGVzaWduYXRpb24oKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA/ICdidG4tYWN0aXZlLW91dGxpbmUnIDogJ2J0bi1hY3RpdmUtb3V0bGluZS1kaXNhYmxlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZW5kRm9yQXBwcm92YWxGb3JtKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnNlbmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kIEZvciBBcHByb3ZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGhcIj4oe3tzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RofX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvbGUtbWFwcGluZy10YWJzIG10LTNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm9sZS10YWJcIiBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnXCIgKGNsaWNrKT1cInNldERhdGFTb3VyZSgnbWF0Y2hlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBNYXRjaGVkIHJvbGUgbWFwcGluZ3NcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBibHVlXCI+e3ttYXRjaGVkUm9sZU1hcHBpbmd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb2xlLXRhYiB0YWJsZS1ib2R5LXVubWF0Y2hlZFwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAndW5tYXRjaGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXREYXRhU291cmUoJ3VubWF0Y2hlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG90IHJlZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgVW5tYXRjaGVkIHJvbGUgbWFwcGluZ1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIHJlZFwiPnt7dW5NYXRjaGVkUm9sZU1hcHBpbmd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2lkZW5hdi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jbGFzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFTb3VyY2U/LmZpbHRlcmVkRGF0YT8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiUmVxdWVzdElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5SZXF1ZXN0IElEIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57e2VsZW1lbnQ/LmRlbWFuZF9pZH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5UaXRsZSA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGl0bGUtY2xhc3NcIiAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50Py50aXRsZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJyZXF1ZXN0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPlJlcXVlc3RvciA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGl0bGUtY2xhc3NcIiAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50Py5vd25lck5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJyZXF1ZXN0VHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+UmVxdWVzdCBUeXBlIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57e2VsZW1lbnQ/LnJlcXVlc3RUeXBlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicmVxdWVzdFN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+UmVxdWVzdCBTdGF0dXMgPC90aD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGl0bGUtY2xhc3NcIiAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQ2xhc3MoZWxlbWVudD8uc3RhdHVzKVwiPnt7ZWxlbWVudD8uc3RhdHVzID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNLZXkuZnVsbGZpbGwgPyAnRnVsZmlsbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVsZW1lbnQ/LnN0YXR1c319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhc3NpZ25lZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+QXNzaWduZWUgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZWxlbWVudD8uYXNzaWduZWRQcm92aWRlciA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudD8uYXNzaWduZWRQcm92aWRlciA6ICdOb3QgQXNzaWduZWQnIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJyZXF1ZXN0ZWRPblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+UmVxdWVzdGVkIE9uIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57e2VsZW1lbnQ/LmNyZWF0ZWRPbiB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZX19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbnRlcmVzdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPkludGVyZXN0czwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImFjdGlvbi1idG4tdmlld1wiICpuZ0lmPVwiZWxlbWVudD8uaW50ZXJlc3RDb3VudCE9PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIFtuZ1N0eWxlXT1cImdldFBvaW50ZXJFdmVudHNTdHlsZShlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAoY2xpY2spPVwiaGFuZGxlQ2xpY2soZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZWxlbWVudD8uaW50ZXJlc3RDb3VudH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJcIiAqbmdJZj1cImVsZW1lbnQ/LmludGVyZXN0Q291bnQgPT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+e3tlbGVtZW50Py5yZXF1ZXN0VHlwZSA9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2luZ2xlJyA/ICdOL0EnIDogZWxlbWVudD8uaW50ZXJlc3RDb3VudH19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5EZXRhaWxzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIChjbGljayk9XCJuYXZpZ2F0ZVRvRGV0YWlscyhlbGVtZW50Py5kZW1hbmRfaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiPnZpc2liaWxpdHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkV4YW1wbGUgaWNvbi1idXR0b24gd2l0aCBhIG1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkNsaWNrTWVudShlbGVtZW50LCd2aWV3Q29udGVudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+Vmlldzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZWxlbWVudD8uc3RhdHVzID09PSBzdGF0dXNLZXkuVW5hc3NpZ25lZCAmJiBlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LklucHJvZ3Jlc3MgJiYgIGVsZW1lbnQ/LnN0YXR1cyE9PSBzdGF0dXNLZXkuaW52YWxpZCBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uQ2xpY2tNZW51KGVsZW1lbnQsJ2ludmFsaWRDb250ZW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5NYXJrIGFzIGludmFsaWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZWxlbWVudD8uc3RhdHVzIT09IHN0YXR1c0tleS5Bc3NpZ25lZCAmJiBlbGVtZW50Py5pbnRlcmVzdENvdW50ID4wICYmIGVsZW1lbnQ/LnN0YXR1cyE9PSBzdGF0dXNLZXkuSW5wcm9ncmVzcyAmJiAgZWxlbWVudD8uc3RhdHVzIT09IHN0YXR1c0tleS5pbnZhbGlkICYmIGVsZW1lbnQ/LnN0YXR1cyE9PXN0YXR1c0tleS5mdWxsZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tNZW51KGVsZW1lbnQsJ2Fzc2lnbkNvbnRlbnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFzc2lnbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZWxlbWVudD8uc3RhdHVzID09PSBzdGF0dXNLZXkuQXNzaWduZWQgJiYgZWxlbWVudD8uc3RhdHVzIT09IHN0YXR1c0tleS5JbnByb2dyZXNzICYmICBlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LmludmFsaWQgJiYgZWxlbWVudD8uc3RhdHVzIT09c3RhdHVzS2V5LmZ1bGxmaWxsIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25DbGlja01lbnUoZWxlbWVudCwncmVBc3NpZ25Db250ZW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4gUmUtQXNzaWduPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uQ2xpY2tNZW51KGVsZW1lbnQsJ2NvcHlDb250ZW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Db3B5PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiIGNsYXNzPVwidGFibGUtcm93LWRhdGFcIj48L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdztjb2x1bW5zOmRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyIG10LTRcIiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICd0YWJsZS1ib2R5JzogJ3RhYmxlLWJvZHktdW5tYXRjaGVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxlY3Rpb24gQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtoaWRkZW5dPVwiYWN0aXZlVGFiICE9PSAnbWF0Y2hlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cInJhZGlvLXN0eWxlLWNoZWNrYm94XCIgKGNoYW5nZSk9XCJ0b2dnbGVBbGxSb3dzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZCgpXCIgW2luZGV0ZXJtaW5hdGVdPVwiaXNTb21lU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1NlbGVjdGFibGVSb3dzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbaGlkZGVuXT1cImFjdGl2ZVRhYiAhPT0gJ21hdGNoZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIG1hdFRvb2x0aXA9XCJQbGVhc2UgZ2VuZXJhdGUgJiBzYXZlIGNvdXJzZSByZWNvbW1lbmRhdGlvbiB0byBzZWxlY3QuIENvdXJzZSByZWNvbW1lbmRhdGlvbiBnZW5lcmF0aW9uICYgc2F2ZSBpcyBwZW5kaW5nLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT1cIiFnZXRBY3RpdmF0ZUNicFBsYW4ocm93KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cInJhZGlvLXN0eWxlLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGNoYW5nZSk9XCJ0b2dnbGVSb3cocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldEFjdGl2YXRlQ2JwUGxhbihyb3cpXCIgW25nQ2xhc3NdPVwiIGdldEFjdGl2YXRlQ2JwUGxhbihyb3cpPyAnZ3JheWQtZGlzYWJsZSc6JydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZXNpZ25hdGlvbiBOYW1lIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXNpZ25hdGlvbl9uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBEZXNpZ25hdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInZpZXdDQlBQbGFuKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAnZGVzaWduYXRpb24tdGV4dCc6ICdkZXNpZ25hdGlvbi10ZXh0LXVubWF0Y2hlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZGVzaWduYXRpb25cIj57eyBlbGVtZW50Py5kZXNpZ25hdGlvbl9uYW1lIH19IDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwid2luZy10ZXh0IG10LTJcIj5XaW5nL0RpdmlzaW9uIC0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Py53aW5nX2RpdmlzaW9uX3NlY3Rpb24gfX0gPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb2xlICYgUmVzcG9uc2liaWxpdGllcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicm9sZV9yZXNwb25zaWJpbGl0aWVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBSb2xlICZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2liaWxpdGllcyA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInJvbGUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJvbGUgb2YgKGlzUmVzcG9uaXNiaWxpdHlFeHBhbmRlZChlbGVtZW50LmlkKSA/IGVsZW1lbnQucm9sZV9yZXNwb25zaWJpbGl0aWVzIDogZWxlbWVudC5yb2xlX3Jlc3BvbnNpYmlsaXRpZXMuc2xpY2UoMCwgMikpOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpKzF9fS4ge3sgcm9sZSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJlbGVtZW50LnJvbGVfcmVzcG9uc2liaWxpdGllcy5sZW5ndGggPiAyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZpZXctbW9yZS1sZXNzIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZ1bGxMaXN0KGVsZW1lbnQsICdyb2xlX3Jlc3BvbnNpYmlsaXRpZXMnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMxQjRDQTE7Zm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHt7IGlzUmVzcG9uaXNiaWxpdHlFeHBhbmRlZChlbGVtZW50LmlkKSA/ICdWaWV3IExlc3MnIDogJ1ZpZXcgTW9yZScgfX0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY3Rpdml0aWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpdml0aWVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpdml0aWVzIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicm9sZS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aXZpdHkgb2YgKGlzQWN0aXZpdHlFeHBhbmRlZChlbGVtZW50LmlkKSA/IGVsZW1lbnQuYWN0aXZpdGllcyA6IGVsZW1lbnQuYWN0aXZpdGllcy5zbGljZSgwLCAyKSk7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2krMX19LiB7eyBhY3Rpdml0eSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJlbGVtZW50LmFjdGl2aXRpZXMubGVuZ3RoID4gMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2aWV3LW1vcmUtbGVzcyBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GdWxsTGlzdChlbGVtZW50LCAnYWN0aXZpdHknKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMxQjRDQTE7Zm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IE1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCZWhhdmlvcmFsIENvbXBldGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYmVoYXZpb3JhbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWhlYWRlcic6ICd0YWJsZS1oZWFkZXItdW5tYXRjaGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gQmVoYXZpb3JhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wZXRlbmNpZXMgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImJlaGF2aW91cmFsLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIChpc0JlaGF2aW9yYWxFeHBhbmRlZChlbGVtZW50LmlkKSA/IGdldENvbXBldGVuY2llc0J5VHlwZShlbGVtZW50LmNvbXBldGVuY2llcywgJ0JlaGF2aW9yYWwnKSA6IGdldENvbXBldGVuY2llc0J5VHlwZShlbGVtZW50LmNvbXBldGVuY2llcywgJ0JlaGF2aW9yYWwnKS5zbGljZSgwLCA0KSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtdGhlbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0LWJlaGF2aW9yYWxcIj4ge3sgY29tcC50aGVtZSB9fSAtIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc3ViX3RoZW1lIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktdGFnc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb2ZpY2llbmN5LXRhZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbXAucHJvZmljaWVuY3lfbGV2ZWw/LnRvTG93ZXJDYXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbXAucHJvZmljaWVuY3lfbGV2ZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGVsaXZlcnktbW9kZS10YWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb21wLmRlbGl2ZXJ5X21vZGU/LnRvTG93ZXJDYXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbXAuZGVsaXZlcnlfbW9kZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnQmVoYXZpb3JhbCcpLmxlbmd0aCA+IDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmlldy1tb3JlLWxlc3MgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRnVsbExpc3QoZWxlbWVudCwgJ2JlaGF2aW9yYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMxQjRDQTE7Zm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IE1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGdW5jdGlvbmFsIENvbXBldGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZnVuY3Rpb25hbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWhlYWRlcic6ICd0YWJsZS1oZWFkZXItdW5tYXRjaGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRnVuY3Rpb25hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wZXRlbmNpZXMgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZ1bmN0aW9uYWwtcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgKGlzRnVuY3Rpb25hbEV4cGFuZGVkKGVsZW1lbnQuaWQpID8gZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnRnVuY3Rpb25hbCcpIDogZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnRnVuY3Rpb25hbCcpLnNsaWNlKDAsIDQpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbC10aGVtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHQtZnVuY3Rpb25hbFwiPiB7eyBjb21wLnRoZW1lIH19IC0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5zdWJfdGhlbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS10YWdzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvZmljaWVuY3ktdGFnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29tcC5wcm9maWNpZW5jeV9sZXZlbD8udG9Mb3dlckNhc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29tcC5wcm9maWNpZW5jeV9sZXZlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZWxpdmVyeS1tb2RlLXRhZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbXAuZGVsaXZlcnlfbW9kZT8udG9Mb3dlckNhc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29tcC5kZWxpdmVyeV9tb2RlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoZWxlbWVudC5jb21wZXRlbmNpZXMsICdGdW5jdGlvbmFsJykubGVuZ3RoID4gNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2aWV3LW1vcmUtbGVzcyBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GdWxsTGlzdChlbGVtZW50LCAnZnVuY3Rpb25hbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzFCNENBMTtmb250LXNpemU6IDE2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERvbWFpbiBDb21wZXRlbmNpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRvbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWhlYWRlcic6ICd0YWJsZS1oZWFkZXItdW5tYXRjaGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRG9tYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBldGVuY2llcyA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZG9tYWluLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIChpc0RvbWFpbkV4cGFuZGVkKGVsZW1lbnQuaWQpID8gZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnRG9tYWluJykgOiBnZXRDb21wZXRlbmNpZXNCeVR5cGUoZWxlbWVudC5jb21wZXRlbmNpZXMsICdEb21haW4nKS5zbGljZSgwLCA0KSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtdGhlbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0LWRvbWFpblwiPiB7eyBjb21wLnRoZW1lIH19IC0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5zdWJfdGhlbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS10YWdzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvZmljaWVuY3ktdGFnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29tcC5wcm9maWNpZW5jeV9sZXZlbD8udG9Mb3dlckNhc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29tcC5wcm9maWNpZW5jeV9sZXZlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZWxpdmVyeS1tb2RlLXRhZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbXAuZGVsaXZlcnlfbW9kZT8udG9Mb3dlckNhc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29tcC5kZWxpdmVyeV9tb2RlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoZWxlbWVudC5jb21wZXRlbmNpZXMsICdEb21haW4nKS5sZW5ndGggPiA0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZpZXctbW9yZS1sZXNzIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZ1bGxMaXN0KGVsZW1lbnQsICdkb21haW4nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMxQjRDQTE7Zm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IE1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY3Rpb25zIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICd0YWJsZS1oZWFkZXInOiAndGFibGUtaGVhZGVyLXVubWF0Y2hlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFjdGlvbiA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJhY3Rpb25NZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjYWN0aW9uTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZWRpdFJvbGVNYXBwaW5nKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkVkaXQgUm9sZSBNYXBwaW5nPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInZpZXdDQlBQbGFuKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnZpc2liaWxpdHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlZpZXcgUm9sZSBNYXBwaW5nPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImdlbmVyYXRlQ291cnNlUmVjb21tZW5kYXRpb24oZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c2Nob29sPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5HZW5lcmF0ZSBDb3Vyc2UgUmVjb21tZW5kYXRpb248L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwidmlld0NvdXJzZVJlY29tbWVuZGF0aW9uKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnByZXZpZXc8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlZpZXcgQ291cnNlIFJlY29tbWVuZGF0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImRlbGV0ZVJvbGVNYXBwaW5nKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+RGVsZXRlIFJvbGUgTWFwcGluZzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJhY3RpdmVUYWIgIT09ICdtYXRjaGVkJ1wiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNlbmRGb3JEZXNpZ25hdGlvbk5hbWVBcHByb3ZhbChlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5zZW5kPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5TZW5kIGZvciBEZXNpZ25hdGlvbiBOYW1lIEFwcHJvdmFsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciAmIFJvd3MgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnM7XCI+PC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yIFtsZW5ndGhdPVwidG90YWxSb2xlTWFwcGluZ0xpc3RDb3VudFwiIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiIChwYWdlKT1cInBhZ2VDaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzUsIDEwLCAyMF1cIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWNicC1kYXRhXCIgKm5nSWY9XCJkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj48aW1nIHNyYz1cIi9tZG8tYXNzZXRzL2ltYWdlcy9uby1jb250ZW50LWRhdGEuc3ZnXCIgYWx0PVwibm8tY29udGVudFwiPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmcgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5ObyByb2xlIG1hcHBpbmdzIGF2YWlsYWJsZSBpbiB0aGlzIGNhdGVnb3J5PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIiBtYXJnaW4tdG9wLW0gbm8tY29udGVudC1jcmVhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlYXJjaC1idG5zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2FwcC9ob21lL2NyZWF0ZS1yZXF1ZXN0LWZvcm0nXVwiPlJlcXVlc3QgQ29udGVudDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1wYWdpbmF0b3IgKm5nSWY9XCJkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCA+IDBcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsZW5ndGhdPVwidGhpcy5yZXF1ZXN0Q291bnRcIiBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwyMCw0MF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlKT1cIm9uQ2hhbmdlUGFnZSgkZXZlbnQpXCI+PC9tYXQtcGFnaW5hdG9yPiAtLT5cblxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuXG48ZGl2IGNsYXNzPVwib3ZlcmxheS1sb2FkZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj4iXX0=
|
|
828
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWxpc3Qvcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWxpc3Qvcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDRFQUE0RSxDQUFDO0FBQ25JLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSww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QVM7K0JBQ0UsdUJBQXVCOzhLQUt4QixRQUFRO3NCQUFoQixLQUFLO2dCQW1CbUIsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQWViLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgVmlld0NicFBsYW5Db21wb25lbnQgfSBmcm9tICcuLi92aWV3LWNicC1wbGFuL3ZpZXctY2JwLXBsYW4uY29tcG9uZW50JztcbmltcG9ydCB7IEVkaXRDYnBQbGFuQ29tcG9uZW50IH0gZnJvbSAnLi4vZWRpdC1jYnAtcGxhbi9lZGl0LWNicC1wbGFuLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VuZXJhdGUtY291cnNlLXJlY29tbWVuZGF0aW9uL2dlbmVyYXRlLWNvdXJzZS1yZWNvbW1lbmRhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlUm9sZU1hcHBpbmdDb21wb25lbnQgfSBmcm9tICcuLi9kZWxldGUtcm9sZS1tYXBwaW5nL2RlbGV0ZS1yb2xlLW1hcHBpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IFZpZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3ZpZXctY291cnNlLXJlY29tbWVuZGF0aW9uL3ZpZXctY291cnNlLXJlY29tbWVuZGF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWaWV3RmluYWxDYnBQbGFuQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy1maW5hbC1jYnAtcGxhbi92aWV3LWZpbmFsLWNicC1wbGFuLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaXN0UG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9saXN0LXBvcHVwL2xpc3QtcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEFkZERlc2lnbmF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYWRkLWRlc2lnbmF0aW9uL2FkZC1kZXNpZ25hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgQXBwcm92YWxSZXF1ZXN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2FwcHJvdmFsLXJlcXVlc3QtZm9ybS9hcHByb3ZhbC1yZXF1ZXN0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5pbXBvcnQgeyBEZXNpZ25hdGlvbkFwcHJvdmFsUmVxdWVzdEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9kZXNpZ25hdGlvbi1hcHByb3ZhbC1yZXF1ZXN0LWZvcm0vZGVzaWduYXRpb24tYXBwcm92YWwtcmVxdWVzdC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcm9sZS1tYXBwaW5nLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vcm9sZS1tYXBwaW5nLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yb2xlLW1hcHBpbmctbGlzdC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJvbGVNYXBwaW5nTGlzdENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGZvcm1EYXRhOiBhbnkgPSB7fVxuICBzZWFyY2hUZXh0ID0gJydcbiAgc2VsZWN0ZWRWYWx1ZSA9ICcnXG4gIC8vJ3NlbGVjdCdcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgJ3NlbGVjdCcsXG4gICAgJ2Rlc2lnbmF0aW9uX25hbWUnLFxuICAgICdyb2xlX3Jlc3BvbnNpYmlsaXRpZXMnLFxuICAgICdhY3Rpdml0aWVzJyxcbiAgICAnYmVoYXZpb3JhbCcsXG4gICAgJ2Z1bmN0aW9uYWwnLFxuICAgICdkb21haW4nLFxuICAgICdhY3Rpb24nXG4gIF07XG4gIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oW10pO1xuICBvcmlnaW5hbERhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oW10pO1xuICBmaWx0ZXJlZERhdGEgPSBbXTtcbiAgb3JpZ2luYWxEYXRhOiBhbnlbXSA9IFtdO1xuICBzZWFyY2hSZXN1bHRzOiBhbnlbXSA9IFtdOyAvLyBTdG9yZSBzZWFyY2ggcmVzdWx0cyBmb3IgcGFnaW5hdGlvblxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgcGFnaW5hdG9yITogTWF0UGFnaW5hdG9yO1xuICBleHBhbmRlZFJlc3BvbnNpYmlsaXR5Um93czogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBleHBhbmRlZEFjdGl2aXR5Um93czogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBleHBhbmRlZERvbWFpblJvd3M6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgZXhwYW5kZWRCZWhhdmlvcmFsUm93czogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBleHBhbmRlZEZ1bmN0aW9uYWxSb3dzOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIGFjdGl2ZVJvd0VsZW1lbnQ6IGFueVxuICBjYnBGaW5hbE9iajogYW55ID0ge31cbiAgbG9hZGluZyA9IGZhbHNlXG4gIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTsgLy8gdHJ1ZSA9IG11bHRpLXNlbGVjdFxuICBtYXRjaGVkUm9sZU1hcHBpbmcgPSAwXG4gIHVuTWF0Y2hlZFJvbGVNYXBwaW5nID0gMFxuICBtYXRjaGVkUm9sZU1hcHBpbmdJZHMgPSBbXVxuICBtYXRjaGVkRGVzaWduYXRpb25OYW1lczogc3RyaW5nW10gPSBbXTtcbiAgcG9ydGFsRGF0YTogYW55ID0ge31cbiAgQE91dHB1dCgpIG1vdmVUb0luaXRpYWxTY3JlZW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBhY3RpdmVUYWI6ICdtYXRjaGVkJyB8ICd1bm1hdGNoZWQnID0gJ21hdGNoZWQnO1xuXG4gIG1hdGNoZWREZXNpZ25hdGlvblNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBtYXN0ZXJEYXRhOiBhbnlbXSA9IFtdO1xuICB0YWJGaWx0ZXJlZERhdGE6IGFueVtdID0gW107ICAgLy8gYWZ0ZXIgbWF0Y2hlZC91bm1hdGNoZWQgZmlsdGVyXG4gIG1hdGNoZWRSb2xlTWFwcGluZ0RhdGE6IGFueVtdID0gW107XG4gIHBhZ2VJbmRleCA9IDA7XG4gIHBhZ2VTaXplID0gNTtcbiAgb2Zmc2V0ID0gMDtcbiAgdG90YWxSb2xlTWFwcGluZ0xpc3RDb3VudCA9IDBcbiAgaXNDb21wZXRlbmN5SW5mb09wZW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge1xuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICB0aGlzLnBvcnRhbERhdGEgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LmRhdGFbJ3BhcmVudERhdGEnXVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jaGVja1JvbGVNYXBwaW5nRm9ybVZhbGlkYXRpb24ubmV4dCh0cnVlKVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS51cGRhdGVEZXNpZ25hdGlvbkhpZXJhcmNoeVN1YmplY3Quc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5wb3J0YWxEYXRhICYmIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YSAmJiB0aGlzLnBvcnRhbERhdGE/LnBhcmVudEFwcERhdGE/LmZyb21Qb3J0YWwgJiZcbiAgICAgICAgICB0aGlzLnBvcnRhbERhdGE/LnBhcmVudEFwcERhdGE/LmZyb21Qb3J0YWwgPT09ICdtZG8nXG4gICAgICAgICkge1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfSlcbiAgICBpZiAodGhpcy5wb3J0YWxEYXRhICYmIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YSAmJiB0aGlzLnBvcnRhbERhdGE/LnBhcmVudEFwcERhdGE/LmZyb21Qb3J0YWwgJiZcbiAgICAgIHRoaXMucG9ydGFsRGF0YT8ucGFyZW50QXBwRGF0YT8uZnJvbVBvcnRhbCA9PT0gJ21kbydcbiAgICApIHtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKVxuICAgIH1cblxuXG5cbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5VHlwZShjb21wZXRlbmNpZXM6IGFueVtdLCB0eXBlOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgcmV0dXJuIGNvbXBldGVuY2llcz8uZmlsdGVyKGMgPT4gYy50eXBlID09PSB0eXBlKSB8fCBbXTtcbiAgfVxuXG4gIHZpZXdEZXRhaWxzKGVsZW1lbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdWaWV3IGNsaWNrZWQ6JywgZWxlbWVudCk7XG5cbiAgfVxuXG4gIGRlbGV0ZUl0ZW0oZWxlbWVudDogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ0RlbGV0ZSBjbGlja2VkOicsIGVsZW1lbnQpO1xuICAgIC8vIE9wdGlvbmFsbHkgcmVtb3ZlIGZyb20gZGF0YVNvdXJjZVxuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5kYXRhU291cmNlLmRhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCAhPT0gZWxlbWVudC5pZCk7XG4gIH1cblxuICBzZWFyY2hEYXRhKCkge1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCkge1xuICAgIC8vIGlmICh0aGlzLnNlYXJjaFRleHQudHJpbSgpKSB7XG4gICAgLy8gICAvLyBTZWFyY2ggb25seSBpbiBkZXNpZ25hdGlvbiBuYW1lc1xuICAgIC8vICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gdGhpcy5maWx0ZXJCeURlc2lnbmF0aW9uTmFtZSh0aGlzLnNlYXJjaFRleHQpO1xuICAgIC8vICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLnNlYXJjaFJlc3VsdHMpO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICAvLyBJZiBzZWFyY2ggaXMgY2xlYXJlZCwgcmVzdG9yZSBvcmlnaW5hbCBkYXRhXG4gICAgLy8gICB0aGlzLnNlYXJjaFJlc3VsdHMgPSBbXTtcbiAgICAvLyAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5vcmlnaW5hbERhdGEpO1xuICAgIC8vIH1cblxuICAgIC8vIC8vIFNldCB1cCBwYWdpbmF0aW9uIGZvciBmaWx0ZXJlZCByZXN1bHRzXG4gICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAvLyAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIC8vICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9LCAxMDApO1xuICAgIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG4gIH1cblxuICBjbGVhclNlYXJjaCgpIHtcbiAgICAvLyB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICAvLyB0aGlzLnNlYXJjaFJlc3VsdHMgPSBbXTtcbiAgICAvLyB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMub3JpZ2luYWxEYXRhKTtcblxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgLy8gICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAvLyAgICAgdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgLy8gICB9XG4gICAgLy8gfSwgMTAwKTtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLmFwcGx5QWxsRmlsdGVycygpO1xuICB9XG5cbiAgcmVmcmVzaFJvbGVNYXBwaW5nRGF0YSgpIHtcbiAgICBjb25zb2xlLmxvZygnUmVmcmVzaGluZyByb2xlIG1hcHBpbmcgZGF0YS4uLicpO1xuICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkgJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCBtaW5pc3RyeVR5cGUgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LnNiT3JnVHlwZTtcbiAgICAgIGNvbnN0IG1pbmlzdHJ5SWQgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXI7XG5cbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChtaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMpIHtcbiAgICAgICAgICBjb25zdCBkZXBhcnRtZW50SWQgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzO1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJBbmREZXBhcnRtZW50QnlTZWFyY2gobWluaXN0cnlJZCwgZGVwYXJ0bWVudElkLCB0aGlzLnNlYXJjaFRleHQsIHRoaXMucGFnZVNpemUsIHRoaXMub2Zmc2V0LCB0aGlzLmFjdGl2ZVRhYikuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyZXM6YW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3RhdGUgcm9sZSBtYXBwaW5nIGRhdGEgcmVmcmVzaGVkOicsIHJlcyk7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZShyZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJlZnJlc2hpbmcgc3RhdGUgcm9sZSBtYXBwaW5nIGRhdGE6JywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJCeVNlYXJjaChtaW5pc3RyeUlkLCB0aGlzLnNlYXJjaFRleHQsIHRoaXMucGFnZVNpemUsIHRoaXMub2Zmc2V0LCB0aGlzLmFjdGl2ZVRhYikuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChyZXM6YW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ2VudGVyIHJvbGUgbWFwcGluZyBkYXRhIHJlZnJlc2hlZDonLCByZXMpO1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGFTb3VyY2UocmVzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIGNlbnRlciByb2xlIG1hcHBpbmcgZGF0YTonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChtaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgY29uc3QgZGVwYXJ0bWVudElkID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cztcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnRCeVNlYXJjaChtaW5pc3RyeUlkLCBkZXBhcnRtZW50SWQsIHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMuYWN0aXZlVGFiKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXM6YW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdGF0ZSByb2xlIG1hcHBpbmcgZGF0YSByZWZyZXNoZWQ6JywgcmVzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YVNvdXJjZShyZXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIHN0YXRlIHJvbGUgbWFwcGluZyBkYXRhOicsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEYXRhU291cmNlKHJlczogYW55KSB7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IHJlcz8uZGF0YTtcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2Uucm9sZU1hcHBpbmdHZW5lcmF0aW9uRGF0YSA9IHJlcz8uZGF0YTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlcz8uZGF0YSk7XG4gICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM/LmRhdGE7XG4gICAgaWYgKFxuICAhdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaj8uZGVwYXJ0bWVudF9uYW1lICYmXG4gIHRoaXMub3JpZ2luYWxEYXRhPy5sZW5ndGhcbikge1xuICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRfbmFtZSA9XG4gICAgdGhpcy5vcmlnaW5hbERhdGFbMF0uZGVwYXJ0bWVudF9uYW1lO1xuXG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICdjYnBQbGFuRmluYWxPYmonLFxuICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICk7XG59XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gW107IC8vIENsZWFyIHNlYXJjaCByZXN1bHRzIHdoZW4gZGF0YSBpcyB1cGRhdGVkXG5cbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAvLyB9LCAxMDApO1xuICAgIGNvbnNvbGUubG9nKCdEYXRhU291cmNlIHVwZGF0ZWQ6JywgdGhpcy5kYXRhU291cmNlKTtcbiAgfVxuXG4gIGVkaXRSb2xlTWFwcGluZyhlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQgPSBlbGVtZW50XG4gICAgY29uc29sZS5sb2coJ0VkaXQgUm9sZSBNYXBwaW5nIGNsaWNrZWQnLCBlbGVtZW50KTtcbiAgICAvLyBOYXZpZ2F0ZSBvciBvcGVuIG1vZGFsXG4gICAgY29uc29sZS5sb2coJ1ZpZXcgQ0JQIFBsYW4gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIGVsZW1lbnRbJ21hdGNoZWRfcm9sZV9tYXBwaW5ncyddPSB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZ0RhdGFcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEVkaXRDYnBQbGFuQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzEwMDBweCcsXG4gICAgICBkYXRhOiBlbGVtZW50LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcblxuICAgICAgfVxuICAgICAgXG4gICAgfSk7XG4gIH1cblxuICB2aWV3Q0JQUGxhbihlbGVtZW50OiBhbnkpIHtcbiAgICB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQgPSBlbGVtZW50XG4gICAgY29uc29sZS5sb2coJ1ZpZXcgQ0JQIFBsYW4gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVmlld0NicFBsYW5Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTAwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uKGVsZW1lbnQ6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHZW5lcmF0ZSBDb3Vyc2UgUmVjb21tZW5kYXRpb24gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnRWRpdCBSb2xlIE1hcHBpbmcgY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIC8vIE5hdmlnYXRlIG9yIG9wZW4gbW9kYWxcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihHZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzExMDBweCcsXG4gICAgICBkYXRhOiBlbGVtZW50LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnNDAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0NoYW5nZXMgc2F2ZWQhJyk7XG4gICAgICAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKVxuXG4gICAgICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkgJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJCeVNlYXJjaCh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIsIHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMuYWN0aXZlVGFiKS5zdWJzY3JpYmUoKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJBbmREZXBhcnRtZW50QnlTZWFyY2godGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyLCB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzLCB0aGlzLnNlYXJjaFRleHQsIHRoaXMucGFnZVNpemUsIHRoaXMub2Zmc2V0LCB0aGlzLmFjdGl2ZVRhYikuc3Vic2NyaWJlKChyZXM6YW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgICAgICAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaiAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5ICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllciAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnRCeVNlYXJjaCh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIsIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMsIHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMuYWN0aXZlVGFiKS5zdWJzY3JpYmUoKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZpZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbihlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnVmlldyBDb3Vyc2UgUmVjb21tZW5kYXRpb24gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnRWRpdCBSb2xlIE1hcHBpbmcgY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIC8vIE5hdmlnYXRlIG9yIG9wZW4gbW9kYWxcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihWaWV3Q291cnNlUmVjb21tZW5kYXRpb25Db21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMTAwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICc0MDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICAgICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkgJiYgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckJ5U2VhcmNoKHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllciwgdGhpcy5zZWFyY2hUZXh0LCB0aGlzLnBhZ2VTaXplLCB0aGlzLm9mZnNldCwgdGhpcy5hY3RpdmVUYWIpLnN1YnNjcmliZSgocmVzOmFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcycsIHJlcylcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzPy5kYXRhKVxuICAgICAgICAgICAgLy8gdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KClcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gcmVzPy5kYXRhO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGF0YVNvdXJjZScsIHRoaXMuZGF0YVNvdXJjZSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBkYXRhIGJ5IGRlc2lnbmF0aW9uIG5hbWUgb25seVxuICAgKiBTdXBwb3J0cyBzaW5nbGUgYW5kIG11bHRpcGxlIHdvcmQgc2VhcmNoZXNcbiAgICovXG4gIGZpbHRlckJ5RGVzaWduYXRpb25OYW1lKHNlYXJjaFRleHQ6IHN0cmluZyk6IGFueVtdIHtcbiAgICBjb25zdCBzZWFyY2hUZXJtcyA9IHNlYXJjaFRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1xccysvKTtcblxuICAgIHJldHVybiB0aGlzLm9yaWdpbmFsRGF0YS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCBkZXNpZ25hdGlvbk5hbWUgPSAoaXRlbS5kZXNpZ25hdGlvbl9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAvLyBDaGVjayBpZiBhbGwgc2VhcmNoIHRlcm1zIGFyZSBmb3VuZCBpbiB0aGUgZGVzaWduYXRpb24gbmFtZVxuICAgICAgcmV0dXJuIHNlYXJjaFRlcm1zLmV2ZXJ5KHRlcm0gPT4gZGVzaWduYXRpb25OYW1lLmluY2x1ZGVzKHRlcm0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZsYXR0ZW5PYmplY3RUb1N0cmluZyhvYmo6IGFueSk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXN1bHQgKz0gJyAnICsgdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnICcgKyB2YWw7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICcgJyArIHRoaXMuZmxhdHRlbk9iamVjdFRvU3RyaW5nKHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXN1bHQgKz0gJyAnICsgdGhpcy5mbGF0dGVuT2JqZWN0VG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRTZWN0b3JzKHNlY3Rvcikge1xuICAgIGlmIChzZWN0b3IgJiYgc2VjdG9yLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc2VjdG9yKSA/IHNlY3Rvci5qb2luKCcvICcpIDogJydcbiAgICB9XG5cbiAgfVxuXG4gIHRvZ2dsZVJlc3BvbnNpYmlsaXR5RXhwYW5kKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkUmVzcG9uc2liaWxpdHlSb3dzW2lkXSA9ICF0aGlzLmV4cGFuZGVkUmVzcG9uc2liaWxpdHlSb3dzW2lkXTtcbiAgfVxuXG4gIGlzUmVzcG9uaXNiaWxpdHlFeHBhbmRlZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cblxuICAgIC8vIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oTGlzdFBvcHVwQ29tcG9uZW50LCB7XG4gICAgLy8gICB3aWR0aDogJzEwMDBweCcsXG4gICAgLy8gICBkYXRhOiB0aGlzLmFjdGl2ZVJvd0VsZW1lbnQsXG4gICAgLy8gICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgIC8vICAgbWluSGVpZ2h0OiAnNDAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAvLyAgIG1heEhlaWdodDogJzkwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgIC8vICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgLy8gfSk7XG5cbiAgICAvLyBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAvLyAgIHJldHVybiBmYWxzZVxuICAgIC8vIH0pO1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkUmVzcG9uc2liaWxpdHlSb3dzW2lkXTtcbiAgfVxuXG4gIHRvZ2dsZUFjdGl2aXR5RXhwYW5kKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkQWN0aXZpdHlSb3dzW2lkXSA9ICF0aGlzLmV4cGFuZGVkQWN0aXZpdHlSb3dzW2lkXTtcbiAgfVxuXG4gIGlzQWN0aXZpdHlFeHBhbmRlZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRBY3Rpdml0eVJvd3NbaWRdO1xuICB9XG5cbiAgdG9nZ2xlRG9tYWluRXhwYW5kKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkRG9tYWluUm93c1tpZF0gPSAhdGhpcy5leHBhbmRlZERvbWFpblJvd3NbaWRdO1xuICB9XG5cbiAgaXNEb21haW5FeHBhbmRlZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWREb21haW5Sb3dzW2lkXTtcbiAgfVxuXG4gIHRvZ2dsZUJlaGF2aW9yYWxFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRCZWhhdmlvcmFsUm93c1tpZF0gPSAhdGhpcy5leHBhbmRlZEJlaGF2aW9yYWxSb3dzW2lkXTtcbiAgfVxuXG4gIGlzQmVoYXZpb3JhbEV4cGFuZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZEJlaGF2aW9yYWxSb3dzW2lkXTtcbiAgfVxuXG4gIHRvZ2dsZUZ1bmN0aW9uYWxFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5kZWRGdW5jdGlvbmFsUm93c1tpZF0gPSAhdGhpcy5leHBhbmRlZEZ1bmN0aW9uYWxSb3dzW2lkXTtcbiAgfVxuXG4gIGlzRnVuY3Rpb25hbEV4cGFuZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZEZ1bmN0aW9uYWxSb3dzW2lkXTtcbiAgfVxuXG5cblxuICBhZGRNb3JlRGVzaWduYXRpb24oKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihBZGREZXNpZ25hdGlvbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBkYXRhOiB7IHN0YXRlX2NlbnRlcl9pZDogJycsIG1hdGNoZWRfcm9sZV9tYXBwaW5nczogdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmdEYXRhIH0sXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG4gICAgICAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlUm9sZU1hcHBpbmcoZWxlbWVudCkge1xuICAgIGNvbnNvbGUubG9nKCdHZW5lcmF0ZSBDb3Vyc2UgUmVjb21tZW5kYXRpb24gY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIHRoaXMuYWN0aXZlUm93RWxlbWVudCA9IGVsZW1lbnRcbiAgICBjb25zb2xlLmxvZygnRWRpdCBSb2xlIE1hcHBpbmcgY2xpY2tlZCcsIGVsZW1lbnQpO1xuICAgIC8vIE5hdmlnYXRlIG9yIG9wZW4gbW9kYWxcbiAgICBjb25zb2xlLmxvZygnVmlldyBDQlAgUGxhbiBjbGlja2VkJywgZWxlbWVudCk7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZWxldGVSb2xlTWFwcGluZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBkYXRhOiBlbGVtZW50LFxuICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgbWluSGVpZ2h0OiAnMzAwcHgnLCAgICAgICAgICAvLyBTZXQgbWluaW11bSBoZWlnaHRcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICdzYXZlZCcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgdGhpcy5sb2FkUm9sZU1hcHBpbmdMaXN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2aWV3RmluYWxDQlBQbGFuKGNvbnRleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oVmlld0ZpbmFsQ2JwUGxhbkNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICcxMTAwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICBwYXlsb2FkOiB0aGlzLm9yaWdpbmFsRGF0YSxcbiAgICAgICAgb3BlbmVkRnJvbTogY29udGV4dCAgIC8vIPCfkYggQkVTVCBQUkFDVElDRVxuICAgICAgfSxcbiAgICAgIHBhbmVsQ2xhc3M6ICd2aWV3LWNicC1wbGFuLXBvcHVwJyxcbiAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICBtYXhIZWlnaHQ6ICc5MHZoJywgICAgICAgICAgIC8vIFByZXZlbnQgaXQgZnJvbSBnb2luZyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSAvLyBPcHRpb25hbDogcHJldmVudCBjbG9zaW5nIHdpdGggb3V0c2lkZSBjbGlja1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyBSZWZyZXNoIGRhdGEgb3Igc2hvdyBhIHRvYXN0IGhlcmVcblxuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBtb3ZlVG9Jbml0aWFsU2NyZWVuTGF5b3V0KGV2ZW50KSB7XG4gICAgLy8gdGhpcy5tb3ZlVG9Jbml0aWFsU2NyZWVuLmVtaXQoZXZlbnQpXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvaW5pdGlhbCddLCB7XG4gICAgICBvblNhbWVVcmxOYXZpZ2F0aW9uOiAncmVsb2FkJ1xuICAgIH0pO1xuICB9XG5cbiAgb3BlbkZ1bGxMaXN0KGVsZW1lbnQ6IGFueSwgdHlwZTogYW55KSB7XG4gICAgY29uc3QgbGlzdFRvU2hvdzogc3RyaW5nW10gPSBlbGVtZW50W3R5cGVdIHx8IFtdO1xuICAgIGNvbnN0IHRpdGxlID0gdHlwZSA9PT0gJ3JvbGVfcmVzcG9uc2liaWxpdGllcycgPyAnUm9sZSAmIFJlc3BvbnNpYmlsaXRpZXMnXG4gICAgICA6IHR5cGUgPT09ICdhY3Rpdml0eScgPyAnQWN0aXZpdGllcydcbiAgICAgIDogdHlwZSA9PT0gJ2JlaGF2aW9yYWwnID8gJ0JlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzJ1xuICAgICAgOiB0eXBlID09PSAnZnVuY3Rpb25hbCcgPyAnRnVuY3Rpb25hbCBDb21wZXRlbmNpZXMnXG4gICAgICA6ICdEb21haW4gQ29tcGV0ZW5jaWVzJztcblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oTGlzdFBvcHVwQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IHsgZWxlbWVudDogZWxlbWVudCwgdHlwZTogdHlwZSB9LFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgbWF4SGVpZ2h0OiAnODB2aCdcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAvLyBObyBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgaGVyZSB0byByZXNldCBpbmxpbmUgZXhwYW5kZWQgc3RhdGVcbiAgICAgIC8vIEJlY2F1c2UgeW91J3JlIHVzaW5nIGRpYWxvZywgbm90IGlubGluZSBleHBhbmQg4oCTIHZpZXcgcmVtYWlucyBpbiBpbml0aWFsIChjb2xsYXBzZWQpIHN0YXRlXG4gICAgfSk7XG4gIH1cblxuICBsb2FkUm9sZU1hcHBpbmdMaXN0KCkge1xuXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuY2JwRmluYWxPYmo/LnJvbGVfbWFwcGluZ19nZW5lcmF0aW9uKVxuICAgIHRoaXMub3JpZ2luYWxEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh0aGlzLmNicEZpbmFsT2JqPy5yb2xlX21hcHBpbmdfZ2VuZXJhdGlvbilcbiAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IHRoaXMuY2JwRmluYWxPYmo/LnJvbGVfbWFwcGluZ19nZW5lcmF0aW9uXG5cbiAgICBpZiAodGhpcy5jYnBGaW5hbE9iaiAmJiB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeSAmJiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlKSkge1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaiA9IHRoaXMuY2JwRmluYWxPYmpcbiAgICAgIGlmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHt9XG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ10gPSB7fVxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddWydtaW5pc3RyeVR5cGUnXSA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5LnNiT3JnVHlwZVxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddWydtaW5pc3RyeSddID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJcbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXVsnZGVwYXJ0bWVudHMnXSA9IHRoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0ge31cbiAgICAgICAgdGhpcy5mb3JtRGF0YVsndmFsdWUnXSA9IHt9XG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ21pbmlzdHJ5VHlwZSddID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkuc2JPcmdUeXBlXG4gICAgICAgIHRoaXMuZm9ybURhdGFbJ3ZhbHVlJ11bJ21pbmlzdHJ5J10gPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllclxuICAgICAgICB0aGlzLmZvcm1EYXRhWyd2YWx1ZSddWydkZXBhcnRtZW50cyddID0gdGhpcy5jYnBGaW5hbE9iaj8uZGVwYXJ0bWVudHNcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3RoaXMuZm9ybURhdGEnLCB0aGlzLmZvcm1EYXRhKVxuICAgIGlmICh0aGlzLmZvcm1EYXRhICYmIHRoaXMuZm9ybURhdGEudmFsdWUgJiYgdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgIGxldCBzdGF0ZV9jZW50ZXJfaWQgPSB0aGlzLmZvcm1EYXRhLnZhbHVlLm1pbmlzdHJ5XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICBpZiAodGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50cz8ubGVuZ3RoKSB7XG4gICAgICAgIGxldCBkZXBhcnRtZW50X2lkID0gdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50c1xuICAgICAgICBpZiAodHlwZW9mIGRlcGFydG1lbnRfaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIHN0YXRlX2NlbnRlcl9pZDogdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50cykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBvYmpbJ2RlcGFydG1lbnRfaWQnXSA9IHRoaXMuZm9ybURhdGEudmFsdWUuZGVwYXJ0bWVudHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldE1hdGNoZWRSb2xlTWFwcGluZyhvYmopLnN1YnNjcmliZSgobWF0Y2hlZFJvbGVNYXBwaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbWF0Y2hlZFJvbGVNYXBwaW5nJywgbWF0Y2hlZFJvbGVNYXBwaW5nKVxuICAgICAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmdEYXRhID0gbWF0Y2hlZFJvbGVNYXBwaW5nPy5tYXRjaGVkX2RldGFpbHMgfHwgW11cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRSb2xlTWFwcGluZ0lkcyA9XG4gICAgICAgICAgICAgIG1hdGNoZWRSb2xlTWFwcGluZz8ubWF0Y2hlZF9kZXRhaWxzPy5tYXAoXG4gICAgICAgICAgICAgICAgeCA9PiB4LnJvbGVfbWFwcGluZ19pZFxuICAgICAgICAgICAgICApIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVkRGVzaWduYXRpb25TZXQgPSBuZXcgU2V0KG1hdGNoZWRSb2xlTWFwcGluZ0lkcyk7XG5cbiAgICAgICAgICAgIC8vIHRoaXMubWF0Y2hlZFJvbGVNYXBwaW5nID0gbWF0Y2hlZFJvbGVNYXBwaW5nSWRzLmxlbmd0aDtcblxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnRCeVNlYXJjaChzdGF0ZV9jZW50ZXJfaWQsIGRlcGFydG1lbnRfaWQsIHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5wYWdlU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMuYWN0aXZlVGFiKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBuZXh0OiAocmVzOmFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gcmVzPy5kYXRhXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnJvbGVNYXBwaW5nR2VuZXJhdGlvbkRhdGEgPSByZXM/LmRhdGFcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPXJlcz8udG90YWxfbWF0Y2hlZFxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLm1hdGNoZWRSb2xlTWFwcGluZycsIHRoaXMuYWN0aXZlVGFiLCB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZywgdGhpcy51bk1hdGNoZWRSb2xlTWFwcGluZylcbiAgICAgICAgICAgICAgICB0aGlzLnVuTWF0Y2hlZFJvbGVNYXBwaW5nID0gcmVzPy50b3RhbF91bm1hdGNoZWRcbiAgICAgICAgICAgICAgICAvLyBhZGQgYSBjb25kaXRpb24gaWYgdW5tYXRjaGVkIHRhYiB0aGVuIHNlbmQgdW5tYXRjaGVkIHZhbHVlIGluIHJvbGUgbWFwcGluZ1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuYXBwbHlBbGxGaWx0ZXJzKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlcz8uZGF0YSlcbiAgICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzPy5kYXRhKVxuICAgICAgICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgICAgICAgICAgIC8vIH0sIDEwMDApXG4gICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM/LmRhdGEgO1xuICAgICAgICAgICAgICAgIHRoaXMubWFzdGVyRGF0YSA9IHJlcz8uZGF0YTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICF0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWUgJiZcbiAgdGhpcy5vcmlnaW5hbERhdGE/Lmxlbmd0aFxuKSB7XG4gIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lID1cbiAgICB0aGlzLm9yaWdpbmFsRGF0YVswXS5kZXBhcnRtZW50X25hbWU7XG5cbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgJ2NicFBsYW5GaW5hbE9iaicsXG4gICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgKTtcbn1cbiAgICAgICAgICAgICAgICB0aGlzLnNldFRvdGFsUm9sZU1hcHBpbmdMaXN0Q291bnQocmVzKVxuXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIHN0YXRlX2NlbnRlcl9pZDogdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG9ialsnZGVwYXJ0bWVudF9pZCddID0gdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50c1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0TWF0Y2hlZFJvbGVNYXBwaW5nKG9iaikuc3Vic2NyaWJlKChtYXRjaGVkUm9sZU1hcHBpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtYXRjaGVkUm9sZU1hcHBpbmcnLCBtYXRjaGVkUm9sZU1hcHBpbmcpXG4gICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZ0RhdGEgPSBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscyB8fCBbXVxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFJvbGVNYXBwaW5nSWRzID1cbiAgICAgICAgICAgICAgbWF0Y2hlZFJvbGVNYXBwaW5nPy5tYXRjaGVkX2RldGFpbHM/Lm1hcChcbiAgICAgICAgICAgICAgICB4ID0+IHgucm9sZV9tYXBwaW5nX2lkXG4gICAgICAgICAgICAgICkgfHwgW107XG4gICAgICAgICAgICB0aGlzLm1hdGNoZWREZXNpZ25hdGlvblNldCA9IG5ldyBTZXQobWF0Y2hlZFJvbGVNYXBwaW5nSWRzKTtcblxuICAgICAgICAgICAvLyB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZyA9IG1hdGNoZWRSb2xlTWFwcGluZ0lkcy5sZW5ndGg7XG5cbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQnlTZWFyY2goc3RhdGVfY2VudGVyX2lkLCB0aGlzLnNlYXJjaFRleHQsIHRoaXMucGFnZVNpemUsIHRoaXMub2Zmc2V0LHRoaXMuYWN0aXZlVGFiKS5zdWJzY3JpYmUoKHJlczphbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSByZXM/LmRhdGFcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5yb2xlTWFwcGluZ0dlbmVyYXRpb25EYXRhID0gcmVzPy5kYXRhXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgICAgICAgICB0aGlzLm1hdGNoZWRSb2xlTWFwcGluZyA9cmVzPy50b3RhbF9tYXRjaGVkXG4gICAgICAgICAgICB0aGlzLnVuTWF0Y2hlZFJvbGVNYXBwaW5nID0gcmVzPy50b3RhbF91bm1hdGNoZWQ7XG4gICAgICAgICAgICAvLyB0aGlzLmFwcGx5QWxsRmlsdGVycygpO1xuICAgICAgICAgIHRoaXMuc2V0VG90YWxSb2xlTWFwcGluZ0xpc3RDb3VudChyZXMpXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZXM/LmRhdGEpXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlcz8uZGF0YSlcbiAgICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAvLyAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICAgICAgICAvLyB9LCAxMDAwKVxuXG4gICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM/LmRhdGE7XG4gICAgICAgICAgdGhpcy5tYXN0ZXJEYXRhID0gcmVzPy5kYXRhO1xuICAgICAgICAgIGlmIChcbiAgIXRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmo/LmRlcGFydG1lbnRfbmFtZSAmJlxuICB0aGlzLm9yaWdpbmFsRGF0YT8ubGVuZ3RoXG4pIHtcbiAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50X25hbWUgPVxuICAgIHRoaXMub3JpZ2luYWxEYXRhWzBdLmRlcGFydG1lbnRfbmFtZTtcblxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAnY2JwUGxhbkZpbmFsT2JqJyxcbiAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKVxuICApO1xufVxuICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhdGFTb3VyY2UnLCB0aGlzLmRhdGFTb3VyY2UpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtRGF0YSAmJiB0aGlzLmZvcm1EYXRhLnZhbHVlICYmIHRoaXMuZm9ybURhdGEudmFsdWUubWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICBjb25zb2xlLmxvZygndGhpcy5mb3JtRGF0YScsIHRoaXMuZm9ybURhdGEpXG4gICAgICBsZXQgc3RhdGVfY2VudGVyX2lkID0gdGhpcy5mb3JtRGF0YS52YWx1ZS5taW5pc3RyeVxuICAgICAgbGV0IGRlcGFydG1lbnRfaWQgPSB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzXG4gICAgICBsZXQgb2JqID0ge1xuICAgICAgICBzdGF0ZV9jZW50ZXJfaWQ6IHRoaXMuZm9ybURhdGEudmFsdWUubWluaXN0cnlcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5mb3JtRGF0YS52YWx1ZS5kZXBhcnRtZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqWydkZXBhcnRtZW50X2lkJ10gPSB0aGlzLmZvcm1EYXRhLnZhbHVlLmRlcGFydG1lbnRzXG4gICAgICB9XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0TWF0Y2hlZFJvbGVNYXBwaW5nKG9iaikuc3Vic2NyaWJlKChtYXRjaGVkUm9sZU1hcHBpbmcpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ21hdGNoZWRSb2xlTWFwcGluZycsIG1hdGNoZWRSb2xlTWFwcGluZylcbiAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmdEYXRhID0gbWF0Y2hlZFJvbGVNYXBwaW5nPy5tYXRjaGVkX2RldGFpbHMgfHwgW11cbiAgICAgICAgY29uc3QgbWF0Y2hlZFJvbGVNYXBwaW5nSWRzID1cbiAgICAgICAgICBtYXRjaGVkUm9sZU1hcHBpbmc/Lm1hdGNoZWRfZGV0YWlscz8ubWFwKFxuICAgICAgICAgICAgeCA9PiB4LnJvbGVfbWFwcGluZ19pZFxuICAgICAgICAgICkgfHwgW107XG4gICAgICAgIHRoaXMubWF0Y2hlZERlc2lnbmF0aW9uU2V0ID0gbmV3IFNldChtYXRjaGVkUm9sZU1hcHBpbmdJZHMpO1xuXG4gICAgICAvLyAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPSBtYXRjaGVkUm9sZU1hcHBpbmdJZHMubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ0J5U3RhdGVDZW50ZXJBbmREZXBhcnRtZW50QnlTZWFyY2goc3RhdGVfY2VudGVyX2lkLCBkZXBhcnRtZW50X2lkLCB0aGlzLnNlYXJjaFRleHQsIHRoaXMucGFnZVNpemUsIHRoaXMub2Zmc2V0LHRoaXMuYWN0aXZlVGFiKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXM6YW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgXG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gcmVzPy5kYXRhXG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2Uucm9sZU1hcHBpbmdHZW5lcmF0aW9uRGF0YSA9IHJlcz8uZGF0YVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgICAgICAgICAgdGhpcy5tYXRjaGVkUm9sZU1hcHBpbmcgPXJlcz8udG90YWxfbWF0Y2hlZFxuICAgICAgICAgICAgdGhpcy51bk1hdGNoZWRSb2xlTWFwcGluZyA9IHJlcz8udG90YWxfdW5tYXRjaGVkO1xuICAgICAgICAgICAgLy8gdGhpcy5hcHBseUFsbEZpbHRlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVzPy5kYXRhKVxuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlcz8uZGF0YSlcbiAgICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICAgICAgICAvLyB9LCAxMDAwKVxuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSByZXM/LmRhdGE7XG4gICAgICAgICAgICB0aGlzLm1hc3RlckRhdGEgPSByZXM/LmRhdGE7XG4gICAgICAgICAgICBpZiAoXG4gICF0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50X25hbWUgJiZcbiAgdGhpcy5vcmlnaW5hbERhdGE/Lmxlbmd0aFxuKSB7XG4gIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lID1cbiAgICB0aGlzLm9yaWdpbmFsRGF0YVswXS5kZXBhcnRtZW50X25hbWU7XG5cbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgJ2NicFBsYW5GaW5hbE9iaicsXG4gICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgKTtcbn1cbiAgICAgICAgICAgIHRoaXMuc2V0VG90YWxSb2xlTWFwcGluZ0xpc3RDb3VudChyZXMpXG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhU291cmNlJywgdGhpcy5kYXRhU291cmNlKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcblxuXG5cbiAgICB9XG5cbiAgfVxuXG4gIHByaXZhdGUgc2V0VG90YWxSb2xlTWFwcGluZ0xpc3RDb3VudChyZXM6IGFueSkge1xuICAgIGNvbnN0IHRhYkNvdW50ID0gdGhpcy5hY3RpdmVUYWIgPT09ICd1bm1hdGNoZWQnID8gcmVzPy50b3RhbF91bm1hdGNoZWQgOiByZXM/LnRvdGFsX21hdGNoZWRcbiAgICB0aGlzLnRvdGFsUm9sZU1hcHBpbmdMaXN0Q291bnQgPSB0YWJDb3VudCA/PyByZXM/LnRvdGFsID8/IDBcbiAgfVxuXG4gIHRvZ2dsZVJvdyhyb3c6IGFueSkge1xuICAgIGlmICghcm93Py5jYnBfcGxhbnM/Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24udG9nZ2xlKHJvdyk7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIHJvd3M6JywgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICB9XG5cbiAgaXNBbGxTZWxlY3RlZCgpIHtcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcbiAgICBjb25zdCBudW1Sb3dzID0gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcbiAgfVxuXG4gIGlzU29tZVNlbGVjdGVkKCkge1xuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID4gMCAmJiBudW1TZWxlY3RlZCA8IG51bVJvd3M7XG4gIH1cblxuICB0b2dnbGVBbGxSb3dzKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YVxuICAgICAgICAuZmlsdGVyKHJvdyA9PiByb3c/LmNicF9wbGFucz8ubGVuZ3RoKVxuICAgICAgICAuZm9yRWFjaChyb3cgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIHNldERhdGFTb3VyZSh0YWI/OiAnbWF0Y2hlZCcgfCAndW5tYXRjaGVkJykge1xuXG4gICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG5cbiAgICAvLyB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuXG4gICAgdGhpcy5hcHBseUFsbEZpbHRlcnMoKTtcblxuICB9XG5cbiAgYXBwbHlBbGxGaWx0ZXJzKCkge1xuICAgIFxuXG4vLyAgICAgbGV0IGRhdGEgPSBbLi4udGhpcy5tYXN0ZXJEYXRhXTtcbi8vIHRoaXMubWFzdGVyRGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuLy8gICBjb25zdCByb2xlTWFwcGluZ0lkID0gaXRlbS5pZDtcblxuXG5cbi8vIH0pO1xuLy8gICAgIGlmICh0aGlzLmFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnKSB7XG5cbi8vICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+XG4vLyAgICAgICAgIHRoaXMubWF0Y2hlZERlc2lnbmF0aW9uU2V0Lmhhcyhcbi8vICAgICAgICAgICBpdGVtLmlkXG4vLyAgICAgICAgIClcbi8vICAgICAgICk7XG5cbi8vICAgICB9XG5cbi8vICAgICBpZiAodGhpcy5hY3RpdmVUYWIgPT09ICd1bm1hdGNoZWQnKSB7XG5cbi8vICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+XG4vLyAgICAgICAgICF0aGlzLm1hdGNoZWREZXNpZ25hdGlvblNldC5oYXMoXG4vLyAgICAgICAgICAgaXRlbS5pZFxuLy8gICAgICAgICApXG4vLyAgICAgICApO1xuXG4vLyAgICAgfVxuXG4gICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICB0aGlzLm9mZnNldCA9IDA7XG4gICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID0gMDtcbiAgIH1cbiAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpXG4gIC8vICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGRhdGEpO1xuXG4gICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgLy8gfSk7XG5cbiAgfVxuXG4gIHNlbmRGb3JBcHByb3ZhbEZvcm0oKSB7XG4gICAgY29uc29sZS5sb2coJ3RoaXMuc2VsZWN0aW9uLS0nLCB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZClcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFwcHJvdmFsUmVxdWVzdEZvcm1Db21wb25lbnQsIHtcbiAgICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICAgIGRhdGE6IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLFxuICAgICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICAgIG1heEhlaWdodDogJzgwdmgnLCAgICAgICAgICAgLy8gUHJldmVudCBpdCBmcm9tIGdvaW5nIGJleW9uZCB2aWV3cG9ydFxuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICAgIH0pO1xuXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgLy8gaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCdDaGFuZ2VzIHNhdmVkIScpO1xuICAgICAgICAvLyAgIC8vIFJlZnJlc2ggZGF0YSBvciBzaG93IGEgdG9hc3QgaGVyZVxuXG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKVxuICAgICAgICB0aGlzLmxvYWRSb2xlTWFwcGluZ0xpc3QoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICB9XG5cbiAgaGFzU2VsZWN0YWJsZVJvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8uc29tZSgocm93OiBhbnkpID0+IHJvdz8uY2JwX3BsYW5zPy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIHNlbmRGb3JEZXNpZ25hdGlvbk5hbWVBcHByb3ZhbChlbGVtZW50KSB7XG4gICAgdGhpcy5hY3RpdmVSb3dFbGVtZW50ID0gZWxlbWVudFxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVzaWduYXRpb25BcHByb3ZhbFJlcXVlc3RGb3JtQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzYwMHB4JyxcbiAgICAgIGRhdGE6IGVsZW1lbnQsXG4gICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgLy8gaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgLy8gICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgIC8vICAgLy8gUmVmcmVzaCBkYXRhIG9yIHNob3cgYSB0b2FzdCBoZXJlXG5cbiAgICAgIC8vIH1cbiAgICAgIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpO1xuICAgIH0pO1xuXG4gIH1cblxuICBnZXRBY3RpdmF0ZUNicFBsYW4ocm93KSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICBpZiAocm93Py5jYnBfcGxhbnMgJiYgcm93Py5jYnBfcGxhbnM/Lmxlbmd0aCkge1xuICAgICAgcm93LmNicF9wbGFucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudD8uc2VsZWN0ZWRfY291cnNlcyAmJiBlbGVtZW50Py5zZWxlY3RlZF9jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuICFmb3VuZFxuICB9XG5cbiAgcGFnZUNoYW5nZUV2ZW50KGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcbiAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XG4gIHRoaXMucGFnZVNpemUgPSBldmVudC5wYWdlU2l6ZTtcbiAgdGhpcy5vZmZzZXQgPSB0aGlzLnBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemU7XG4gIHRoaXMubG9hZFJvbGVNYXBwaW5nTGlzdCgpXG5cbiAgY29uc29sZS5sb2coJ1BhZ2UgSW5kZXg6JywgdGhpcy5wYWdlSW5kZXgpO1xuICBjb25zb2xlLmxvZygnUGFnZSBTaXplOicsIHRoaXMucGFnZVNpemUpO1xuICBjb25zb2xlLmxvZygnT2Zmc2V0OicsIHRoaXMub2Zmc2V0KTtcblxuICAvLyBDYWxsIHlvdXIgQVBJIGlmIG5lZWRlZFxuICAvLyB0aGlzLmdldERhdGEodGhpcy5vZmZzZXQsIHRoaXMucGFnZVNpemUpO1xuICB9XG5cbiAgb3BlbkNvbXBldGVuY3lJbmZvKCk6IHZvaWQge1xuICAgIHRoaXMuaXNDb21wZXRlbmN5SW5mb09wZW4gPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VDb21wZXRlbmN5SW5mbygpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ29tcGV0ZW5jeUluZm9PcGVuID0gZmFsc2U7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInJvbGUtbWFwcGluZy1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG5cbiAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibXQtMCBwdC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1zZWN0aW9uIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LW1hcC1yb3V0ZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1tYXAtZmxleC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtbWFwLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtbWFwcGluZy1yb3V0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57e3NoYXJlZFNlcnZpY2U/LmNicFBsYW5GaW5hbE9iaj8ubWluaXN0cnk/Lm9yZ05hbWV9fSAgPHNwYW4gKm5nSWY9XCJzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/LmRlcGFydG1lbnRfbmFtZSB8fCBvcmlnaW5hbERhdGE/LlswXT8uZGVwYXJ0bWVudF9uYW1lXCI+XG4gICAgLyB7eyBzaGFyZWRTZXJ2aWNlPy5jYnBQbGFuRmluYWxPYmo/LmRlcGFydG1lbnRfbmFtZSB8fCBvcmlnaW5hbERhdGE/LlswXT8uZGVwYXJ0bWVudF9uYW1lIH19XG4gIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWRpdC1wbGFuIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm1vdmVUb0luaXRpYWxTY3JlZW5MYXlvdXQoJ2VkaXQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+RWRpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIG1sLTEwXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1hY3RpdmUgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwibW92ZVRvSW5pdGlhbFNjcmVlbkxheW91dCgnYWRkJylcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgQ0JQLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1maW5hbC1jYnAtcGxhblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJ2aWV3LWZpbmFsLWNicC1wbGFuLXRleHQgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidmlld0ZpbmFsQ0JQUGxhbignY2JwJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPjxzcGFuPlZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5hbCBDQlA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1maW5hbC1jYnAtcGxhbi10ZXh0IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInZpZXdGaW5hbENCUFBsYW4oJ2FjYnAnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+PHNwYW4+Vmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsIENCUDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtZmlsdGVyLXNlY3Rpb24gbXQtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2ggZmxleCBtYXJnaW4tcmlnaHQtbSBzZWFyY2gtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnNlYXJjaFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sb3ItNjAgc2VhcmNoLWljb24gbWF0LWljb24gbm90cmFuc2xhdGUgbWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tbm8tY29sb3JcIj5zZWFyY2g8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJzaW5wdXQgY29sb3ItNjAgdy1mdWxsXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgbGFiZWw9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImFwcGx5RmlsdGVyKClcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBieSBkZXNpZ25hdGlvbiBuYW1lXCIgdHlwZT1cIlN0YW5kYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInNlYXJjaFRleHQudHJpbSgpLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2xvci02MCBjbGVhci1pY29uIG1hdC1pY29uIG5vdHJhbnNsYXRlIG1hdGVyaWFsLWljb25zIG1hdC1pY29uLW5vLWNvbG9yIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclNlYXJjaCgpXCI+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwbC0yIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtkaXNhYmxlZF09XCJzZWFyY2hUZXh0LnRyaW0oKT8ubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNlYXJjaFRleHQudHJpbSgpPy5sZW5ndGggPT09IDAgPyAnYnRuLWRpc2FibGUnOididG4tYWN0aXZlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJTZWFyY2hcIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXNlY3Rpb24gZmxleCBtYXJnaW4tdG9wLTE1XCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+RmlsdGVyIGJ5IGNvbXBldGVuY3kgdHlwZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDI1cHg7IHBhZGRpbmc6IDAgMTJweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyh2YWx1ZSldPVwic2VsZWN0ZWRWYWx1ZVwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IE1pbmlzdHJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweDsgYmFja2dyb3VuZDogd2hpdGU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiJ3Rlc3QnXCI+VGVzdDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCInYW5vdGhlcidcIj5Bbm90aGVyPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkFkZCBNb3JlIERlc2lnbmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZE1vcmVEZXNpZ25hdGlvbigpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTJcIiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID8gJ2J0bi1hY3RpdmUtb3V0bGluZScgOiAnYnRuLWFjdGl2ZS1vdXRsaW5lLWRpc2FibGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbmRGb3JBcHByb3ZhbEZvcm0oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c2VuZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmQgRm9yIEFwcHJvdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aFwiPih7e3NlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGh9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm9sZS1tYXBwaW5nLXRhYnMgbXQtM1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb2xlLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCdcIiAoY2xpY2spPVwic2V0RGF0YVNvdXJlKCdtYXRjaGVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIE1hdGNoZWQgcm9sZSBtYXBwaW5nc1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJsdWVcIj57e21hdGNoZWRSb2xlTWFwcGluZ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvbGUtdGFiIHRhYmxlLWJvZHktdW5tYXRjaGVkXCIgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVUYWIgPT09ICd1bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldERhdGFTb3VyZSgndW5tYXRjaGVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3QgcmVkXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBVbm1hdGNoZWQgcm9sZSBtYXBwaW5nXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgcmVkXCI+e3t1bk1hdGNoZWRSb2xlTWFwcGluZ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlbmF2LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZT8uZmlsdGVyZWREYXRhPy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJSZXF1ZXN0SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPlJlcXVlc3QgSUQgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8uZGVtYW5kX2lkfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPlRpdGxlIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57e2VsZW1lbnQ/LnRpdGxlfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlcXVlc3RvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+UmVxdWVzdG9yIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57e2VsZW1lbnQ/Lm93bmVyTmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlcXVlc3RUeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5SZXF1ZXN0IFR5cGUgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8ucmVxdWVzdFR5cGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJyZXF1ZXN0U3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5SZXF1ZXN0IFN0YXR1cyA8L3RoPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRTdGF0dXNDbGFzcyhlbGVtZW50Py5zdGF0dXMpXCI+e3tlbGVtZW50Py5zdGF0dXMgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0tleS5mdWxsZmlsbCA/ICdGdWxmaWxsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZWxlbWVudD8uc3RhdHVzfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFzc2lnbmVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5Bc3NpZ25lZSA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwidGl0bGUtY2xhc3NcIiAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbGVtZW50Py5hc3NpZ25lZFByb3ZpZGVyID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Py5hc3NpZ25lZFByb3ZpZGVyIDogJ05vdCBBc3NpZ25lZCcgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlcXVlc3RlZE9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWhlYWRpbmdcIj5SZXF1ZXN0ZWQgT24gPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7ZWxlbWVudD8uY3JlYXRlZE9uIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImludGVyZXN0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+SW50ZXJlc3RzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCBjbGFzcz1cInRpdGxlLWNsYXNzXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYWN0aW9uLWJ0bi12aWV3XCIgKm5nSWY9XCJlbGVtZW50Py5pbnRlcmVzdENvdW50IT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgW25nU3R5bGVdPVwiZ2V0UG9pbnRlckV2ZW50c1N0eWxlKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJoYW5kbGVDbGljayhlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tlbGVtZW50Py5pbnRlcmVzdENvdW50fX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIlwiICpuZ0lmPVwiZWxlbWVudD8uaW50ZXJlc3RDb3VudCA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIj57e2VsZW1lbnQ/LnJlcXVlc3RUeXBlID09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaW5nbGUnID8gJ04vQScgOiBlbGVtZW50Py5pbnRlcmVzdENvdW50fX08L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJyb3ctaGVhZGluZ1wiPkRldGFpbHM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cIm5hdmlnYXRlVG9EZXRhaWxzKGVsZW1lbnQ/LmRlbWFuZF9pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCI+dmlzaWJpbGl0eTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1oZWFkaW5nXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiRXhhbXBsZSBpY29uLWJ1dHRvbiB3aXRoIGEgbWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uQ2xpY2tNZW51KGVsZW1lbnQsJ3ZpZXdDb250ZW50JylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5WaWV3PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5zdGF0dXMgPT09IHN0YXR1c0tleS5VbmFzc2lnbmVkICYmIGVsZW1lbnQ/LnN0YXR1cyE9PSBzdGF0dXNLZXkuSW5wcm9ncmVzcyAmJiAgZWxlbWVudD8uc3RhdHVzIT09IHN0YXR1c0tleS5pbnZhbGlkIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25DbGlja01lbnUoZWxlbWVudCwnaW52YWxpZENvbnRlbnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1hcmsgYXMgaW52YWxpZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LkFzc2lnbmVkICYmIGVsZW1lbnQ/LmludGVyZXN0Q291bnQgPjAgJiYgZWxlbWVudD8uc3RhdHVzIT09IHN0YXR1c0tleS5JbnByb2dyZXNzICYmICBlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LmludmFsaWQgJiYgZWxlbWVudD8uc3RhdHVzIT09c3RhdHVzS2V5LmZ1bGxmaWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja01lbnUoZWxlbWVudCwnYXNzaWduQ29udGVudCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QXNzaWduPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5zdGF0dXMgPT09IHN0YXR1c0tleS5Bc3NpZ25lZCAmJiBlbGVtZW50Py5zdGF0dXMhPT0gc3RhdHVzS2V5LklucHJvZ3Jlc3MgJiYgIGVsZW1lbnQ/LnN0YXR1cyE9PSBzdGF0dXNLZXkuaW52YWxpZCAmJiBlbGVtZW50Py5zdGF0dXMhPT1zdGF0dXNLZXkuZnVsbGZpbGwgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkNsaWNrTWVudShlbGVtZW50LCdyZUFzc2lnbkNvbnRlbnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiBSZS1Bc3NpZ248L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25DbGlja01lbnUoZWxlbWVudCwnY29weUNvbnRlbnQnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkNvcHk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCIgY2xhc3M9XCJ0YWJsZS1yb3ctZGF0YVwiPjwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93O2NvbHVtbnM6ZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXIgbXQtNFwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIGNsYXNzPVwibWF0LWVsZXZhdGlvbi16MVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWJvZHknOiAndGFibGUtYm9keS11bm1hdGNoZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdGlvbiBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2hpZGRlbl09XCJhY3RpdmVUYWIgIT09ICdtYXRjaGVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwicmFkaW8tc3R5bGUtY2hlY2tib3hcIiAoY2hhbmdlKT1cInRvZ2dsZUFsbFJvd3MoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbFNlbGVjdGVkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJpc1NvbWVTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzU2VsZWN0YWJsZVJvd3MoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtoaWRkZW5dPVwiYWN0aXZlVGFiICE9PSAnbWF0Y2hlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIlBsZWFzZSBnZW5lcmF0ZSAmIHNhdmUgY291cnNlIHJlY29tbWVuZGF0aW9uIHRvIHNlbGVjdC4gQ291cnNlIHJlY29tbWVuZGF0aW9uIGdlbmVyYXRpb24gJiBzYXZlIGlzIHBlbmRpbmcuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwRGlzYWJsZWRdPVwiIWdldEFjdGl2YXRlQ2JwUGxhbihyb3cpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwicmFkaW8tc3R5bGUtY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cInRvZ2dsZVJvdyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0QWN0aXZhdGVDYnBQbGFuKHJvdylcIiBbbmdDbGFzc109XCIgZ2V0QWN0aXZhdGVDYnBQbGFuKHJvdyk/ICdncmF5ZC1kaXNhYmxlJzonJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlc2lnbmF0aW9uIE5hbWUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlc2lnbmF0aW9uX25hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICd0YWJsZS1oZWFkZXInOiAndGFibGUtaGVhZGVyLXVubWF0Y2hlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IERlc2lnbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld0NCUFBsYW4oZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICdkZXNpZ25hdGlvbi10ZXh0JzogJ2Rlc2lnbmF0aW9uLXRleHQtdW5tYXRjaGVkJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJkZXNpZ25hdGlvblwiPnt7IGVsZW1lbnQ/LmRlc2lnbmF0aW9uX25hbWUgfX0gPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ3aW5nLXRleHQgbXQtMlwiPldpbmcvRGl2aXNpb24gLSB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ/LndpbmdfZGl2aXNpb25fc2VjdGlvbiB9fSA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJvbGUgJiBSZXNwb25zaWJpbGl0aWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJyb2xlX3Jlc3BvbnNpYmlsaXRpZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICd0YWJsZS1oZWFkZXInOiAndGFibGUtaGVhZGVyLXVubWF0Y2hlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IFJvbGUgJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zaWJpbGl0aWVzIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicm9sZS1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcm9sZSBvZiAoaXNSZXNwb25pc2JpbGl0eUV4cGFuZGVkKGVsZW1lbnQuaWQpID8gZWxlbWVudC5yb2xlX3Jlc3BvbnNpYmlsaXRpZXMgOiBlbGVtZW50LnJvbGVfcmVzcG9uc2liaWxpdGllcy5zbGljZSgwLCAyKSk7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2krMX19LiB7eyByb2xlIH19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImVsZW1lbnQucm9sZV9yZXNwb25zaWJpbGl0aWVzLmxlbmd0aCA+IDJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmlldy1tb3JlLWxlc3MgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRnVsbExpc3QoZWxlbWVudCwgJ3JvbGVfcmVzcG9uc2liaWxpdGllcycpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzFCNENBMTtmb250LXNpemU6IDE2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3sgaXNSZXNwb25pc2JpbGl0eUV4cGFuZGVkKGVsZW1lbnQuaWQpID8gJ1ZpZXcgTGVzcycgOiAnVmlldyBNb3JlJyB9fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFjdGl2aXRpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGl2aXRpZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwiYWN0aXZlVGFiID09PSAnbWF0Y2hlZCc/ICd0YWJsZS1oZWFkZXInOiAndGFibGUtaGVhZGVyLXVubWF0Y2hlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFjdGl2aXRpZXMgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJyb2xlLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpdml0eSBvZiAoaXNBY3Rpdml0eUV4cGFuZGVkKGVsZW1lbnQuaWQpID8gZWxlbWVudC5hY3Rpdml0aWVzIDogZWxlbWVudC5hY3Rpdml0aWVzLnNsaWNlKDAsIDIpKTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aSsxfX0uIHt7IGFjdGl2aXR5IH19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImVsZW1lbnQuYWN0aXZpdGllcy5sZW5ndGggPiAyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZpZXctbW9yZS1sZXNzIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkZ1bGxMaXN0KGVsZW1lbnQsICdhY3Rpdml0eScpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzFCNENBMTtmb250LXNpemU6IDE2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJiZWhhdmlvcmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBCZWhhdmlvcmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBldGVuY2llcyA8bWF0LWljb24gKGNsaWNrKT1cIm9wZW5Db21wZXRlbmN5SW5mbygpXCI+aW5mb19vdXRsaW5lPC9tYXQtaWNvbj4gPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImJlaGF2aW91cmFsLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIChpc0JlaGF2aW9yYWxFeHBhbmRlZChlbGVtZW50LmlkKSA/IGdldENvbXBldGVuY2llc0J5VHlwZShlbGVtZW50LmNvbXBldGVuY2llcywgJ0JlaGF2aW9yYWwnKSA6IGdldENvbXBldGVuY2llc0J5VHlwZShlbGVtZW50LmNvbXBldGVuY2llcywgJ0JlaGF2aW9yYWwnKS5zbGljZSgwLCA0KSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtdGhlbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0LWJlaGF2aW9yYWxcIj4ge3sgY29tcC50aGVtZSB9fSAtIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc3ViX3RoZW1lIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktdGFnc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb2ZpY2llbmN5LXRhZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbXAucHJvZmljaWVuY3lfbGV2ZWw/LnRvTG93ZXJDYXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbXAucHJvZmljaWVuY3lfbGV2ZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGVsaXZlcnktbW9kZS10YWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb21wLmRlbGl2ZXJ5X21vZGU/LnRvTG93ZXJDYXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbXAuZGVsaXZlcnlfbW9kZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnQmVoYXZpb3JhbCcpLmxlbmd0aCA+IDRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidmlldy1tb3JlLWxlc3MgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRnVsbExpc3QoZWxlbWVudCwgJ2JlaGF2aW9yYWwnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMxQjRDQTE7Zm9udC1zaXplOiAxNnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IE1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGdW5jdGlvbmFsIENvbXBldGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZnVuY3Rpb25hbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWhlYWRlcic6ICd0YWJsZS1oZWFkZXItdW5tYXRjaGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRnVuY3Rpb25hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wZXRlbmNpZXMgPG1hdC1pY29uIChjbGljayk9XCJvcGVuQ29tcGV0ZW5jeUluZm8oKVwiPmluZm9fb3V0bGluZTwvbWF0LWljb24+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZ1bmN0aW9uYWwtcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgKGlzRnVuY3Rpb25hbEV4cGFuZGVkKGVsZW1lbnQuaWQpID8gZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnRnVuY3Rpb25hbCcpIDogZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnRnVuY3Rpb25hbCcpLnNsaWNlKDAsIDQpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbC10aGVtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHQtZnVuY3Rpb25hbFwiPiB7eyBjb21wLnRoZW1lIH19IC0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5zdWJfdGhlbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS10YWdzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvZmljaWVuY3ktdGFnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29tcC5wcm9maWNpZW5jeV9sZXZlbD8udG9Mb3dlckNhc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29tcC5wcm9maWNpZW5jeV9sZXZlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZWxpdmVyeS1tb2RlLXRhZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbXAuZGVsaXZlcnlfbW9kZT8udG9Mb3dlckNhc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29tcC5kZWxpdmVyeV9tb2RlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoZWxlbWVudC5jb21wZXRlbmNpZXMsICdGdW5jdGlvbmFsJykubGVuZ3RoID4gNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2aWV3LW1vcmUtbGVzcyBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GdWxsTGlzdChlbGVtZW50LCAnZnVuY3Rpb25hbCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzFCNENBMTtmb250LXNpemU6IDE2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERvbWFpbiBDb21wZXRlbmNpZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRvbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBbbmdDbGFzc109XCJhY3RpdmVUYWIgPT09ICdtYXRjaGVkJz8gJ3RhYmxlLWhlYWRlcic6ICd0YWJsZS1oZWFkZXItdW5tYXRjaGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRG9tYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBldGVuY2llcyA8bWF0LWljb24gKGNsaWNrKT1cIm9wZW5Db21wZXRlbmN5SW5mbygpXCI+aW5mb19vdXRsaW5lPC9tYXQtaWNvbj4gPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRvbWFpbi1waWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29tcCBvZiAoaXNEb21haW5FeHBhbmRlZChlbGVtZW50LmlkKSA/IGdldENvbXBldGVuY2llc0J5VHlwZShlbGVtZW50LmNvbXBldGVuY2llcywgJ0RvbWFpbicpIDogZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnRG9tYWluJykuc2xpY2UoMCwgNCkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sLXRoZW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dC1kb21haW5cIj4ge3sgY29tcC50aGVtZSB9fSAtIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuc3ViX3RoZW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktdGFnc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb2ZpY2llbmN5LXRhZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbXAucHJvZmljaWVuY3lfbGV2ZWw/LnRvTG93ZXJDYXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbXAucHJvZmljaWVuY3lfbGV2ZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGVsaXZlcnktbW9kZS10YWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb21wLmRlbGl2ZXJ5X21vZGU/LnRvTG93ZXJDYXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbXAuZGVsaXZlcnlfbW9kZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKGVsZW1lbnQuY29tcGV0ZW5jaWVzLCAnRG9tYWluJykubGVuZ3RoID4gNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2aWV3LW1vcmUtbGVzcyBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5GdWxsTGlzdChlbGVtZW50LCAnZG9tYWluJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjMUI0Q0ExO2ZvbnQtc2l6ZTogMTZweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWN0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cImFjdGl2ZVRhYiA9PT0gJ21hdGNoZWQnPyAndGFibGUtaGVhZGVyJzogJ3RhYmxlLWhlYWRlci11bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBBY3Rpb24gPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWN0aW9uTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI2FjdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImVkaXRSb2xlTWFwcGluZyhlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5FZGl0IFJvbGUgTWFwcGluZzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJ2aWV3Q0JQUGxhbihlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj52aXNpYmlsaXR5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5WaWV3IFJvbGUgTWFwcGluZzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJnZW5lcmF0ZUNvdXJzZVJlY29tbWVuZGF0aW9uKGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnNjaG9vbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+R2VuZXJhdGUgQ291cnNlIFJlY29tbWVuZGF0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInZpZXdDb3Vyc2VSZWNvbW1lbmRhdGlvbihlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5wcmV2aWV3PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5WaWV3IENvdXJzZSBSZWNvbW1lbmRhdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJkZWxldGVSb2xlTWFwcGluZyhlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkRlbGV0ZSBSb2xlIE1hcHBpbmc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiYWN0aXZlVGFiICE9PSAnbWF0Y2hlZCdcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzZW5kRm9yRGVzaWduYXRpb25OYW1lQXBwcm92YWwoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c2VuZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2VuZCBmb3IgRGVzaWduYXRpb24gTmFtZSBBcHByb3ZhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgJiBSb3dzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXBhZ2luYXRvciBbbGVuZ3RoXT1cInRvdGFsUm9sZU1hcHBpbmdMaXN0Q291bnRcIiBbcGFnZUluZGV4XT1cInBhZ2VJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIiAocGFnZSk9XCJwYWdlQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cIls1LCAxMCwgMjBdXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhZ2luYXRvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1jYnAtZGF0YVwiICpuZ0lmPVwiZGF0YVNvdXJjZT8uZmlsdGVyZWREYXRhPy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXY+PGltZyBzcmM9XCIvbWRvLWFzc2V0cy9pbWFnZXMvbm8tY29udGVudC1kYXRhLnN2Z1wiIGFsdD1cIm5vLWNvbnRlbnRcIj48L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Tm8gcm9sZSBtYXBwaW5ncyBhdmFpbGFibGUgaW4gdGhpcyBjYXRlZ29yeTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCIgbWFyZ2luLXRvcC1tIG5vLWNvbnRlbnQtY3JlYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWFyY2gtYnRuc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9hcHAvaG9tZS9jcmVhdGUtcmVxdWVzdC1mb3JtJ11cIj5SZXF1ZXN0IENvbnRlbnQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwiZGF0YVNvdXJjZT8uZmlsdGVyZWREYXRhPy5sZW5ndGggPiAwXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGVuZ3RoXT1cInRoaXMucmVxdWVzdENvdW50XCIgW3BhZ2VTaXplT3B0aW9uc109XCJbMTAsMjAsNDBdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiPjwvbWF0LXBhZ2luYXRvcj4gLS0+XG5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1jYXJkPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cblxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuPC9kaXY+XG5cbjxkaXZcbiAgY2xhc3M9XCJjb21wZXRlbmN5LW1vZGFsLWJhY2tkcm9wXCJcbiAgKm5nSWY9XCJpc0NvbXBldGVuY3lJbmZvT3BlblwiXG4gIChjbGljayk9XCJjbG9zZUNvbXBldGVuY3lJbmZvKClcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjb21wZXRlbmN5LW1vZGFsXCJcbiAgICByb2xlPVwiZGlhbG9nXCJcbiAgICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gICAgYXJpYS1sYWJlbGxlZGJ5PVwiY29tcGV0ZW5jeS1tb2RhbC10aXRsZVwiXG4gICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gID5cbiAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwibW9kYWwtY2xvc2UtYnRuXCJcbiAgICAgIChjbGljayk9XCJjbG9zZUNvbXBldGVuY3lJbmZvKClcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICA+XG4gICAgICDDl1xuICAgIDwvYnV0dG9uPlxuXG4gICAgPCEtLSBUaXRsZSAtLT5cbiAgICA8aDIgaWQ9XCJjb21wZXRlbmN5LW1vZGFsLXRpdGxlXCI+XG4gICAgICBXaGF0IGRvIHRoZSBjb21wZXRlbmN5IHRhZ3MgbWVhbj9cbiAgICA8L2gyPlxuXG4gICAgPCEtLSBEZXNjcmlwdGlvbiAtLT5cbiAgICA8cCBjbGFzcz1cIm1vZGFsLWRlc2NyaXB0aW9uXCI+XG4gICAgICBFdmVyeSBjb21wZXRlbmN5IGNhcnJpZXMgdHdvIHRhZ3M6IGhvdyBkZWVwbHkgdGhpcyBkZXNpZ25hdGlvbiBuZWVkcyBpdCxcbiAgICAgIGFuZCBob3cgdGhlIHRyYWluaW5nIGZvciBpdCBpcyBkZWxpdmVyZWQuXG4gICAgPC9wPlxuXG4gICAgPCEtLSBQcm9maWNpZW5jeSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zZWN0aW9uXCI+XG4gICAgICA8aDM+XG4gICAgICAgIFBST0ZJQ0lFTkNZIExFVkVMIOKAlCBUSEUgREVQVEggVEhJUyBERVNJR05BVElPTiBORUVEU1xuICAgICAgPC9oMz5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhZy1pbmZvLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInByb2ZpY2llbmN5LXRhZyBzdHJhdGVnaWNcIj5cbiAgICAgICAgICBTdHJhdGVnaWNcbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFnLWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgU2hhcGVzIHBvbGljeSwgZGlyZWN0aW9uIGFuZCBvdXRjb21lc1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhZy1pbmZvLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInByb2ZpY2llbmN5LXRhZyB0YWN0aWNhbFwiPlxuICAgICAgICAgIFRhY3RpY2FsXG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cInRhZy1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgIFBsYW5zLCBjb29yZGluYXRlcyBhbmQgdHVybnMgZGlyZWN0aW9uIGludG8gcHJvZ3JhbW1lc1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhZy1pbmZvLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInByb2ZpY2llbmN5LXRhZyBvcGVyYXRpb25hbFwiPlxuICAgICAgICAgIE9wZXJhdGlvbmFsXG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cInRhZy1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgIEV4ZWN1dGVzIGFuZCBkZWxpdmVycyB0aGUgd29yayBvbiB0aGUgZ3JvdW5kXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEZWxpdmVyeSBNb2RlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXNlY3Rpb24gZGVsaXZlcnktc2VjdGlvblwiPlxuICAgICAgPGgzPlxuICAgICAgICBERUxJVkVSWSBNT0RFIOKAlCBIT1cgVEhFIFRSQUlOSU5HIElTIERFTElWRVJFRFxuICAgICAgPC9oMz5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhZy1pbmZvLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRlbGl2ZXJ5LW1vZGUtdGFnIG9ubGluZVwiPlxuICAgICAgICAgIE9ubGluZVxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWctZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICBTZWxmLXBhY2VkLCBrbm93bGVkZ2UtYmFzZWQgY29udGVudFxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhZy1pbmZvLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImRlbGl2ZXJ5LW1vZGUtdGFnIG9mZmxpbmVcIj5cbiAgICAgICAgICBPZmZsaW5lXG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cInRhZy1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgIE5lZWRzIHBoeXNpY2FsIHByZXNlbmNlIG9yIHN1cGVydmlzZWQgcHJhY3RpY2VcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWctaW5mby1yb3dcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkZWxpdmVyeS1tb2RlLXRhZyBibGVuZGVkXCI+XG4gICAgICAgICAgQmxlbmRlZFxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWctZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICBDb25jZXB0IGNvbWJpbmVkIHdpdGggYXBwbGllZCBwcmFjdGljZSBvciBjb2FjaGluZ1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|