@tuki-io/tuki-widgets 0.0.219-dev.60 → 0.0.219-dev.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/di2mt/widgets/site-upgrade/site-upgrade.module.d.ts +9 -8
  2. package/di2mt/widgets/user-upgrade/user-upgrade.module.d.ts +11 -10
  3. package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +12 -11
  4. package/esm2020/di2mt/widgets/site-upgrade/site-upgrade.module.mjs +7 -3
  5. package/esm2020/di2mt/widgets/user-upgrade/user-upgrade-data-table/user-upgrade-data-table.component.mjs +12 -11
  6. package/esm2020/di2mt/widgets/user-upgrade/user-upgrade.module.mjs +7 -3
  7. package/esm2020/locations/src/locations.component.mjs +11 -11
  8. package/esm2020/locations/src/locations.module.mjs +7 -6
  9. package/esm2020/meetings/src/components/meeting-spaces/meeting-space/meeting-space.component.mjs +9 -9
  10. package/esm2020/meetings/src/components/meeting-spaces/meeting-spaces.component.mjs +17 -9
  11. package/esm2020/meetings/src/meetings.module.mjs +7 -6
  12. package/esm2020/shared/public-api.mjs +2 -1
  13. package/esm2020/shared/src/ui/tk-loader/tk-loader.component.mjs +34 -0
  14. package/esm2020/user-creation/src/user-creation.module.mjs +7 -6
  15. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +16 -16
  16. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.mjs +27 -10
  17. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.component.mjs +11 -11
  18. package/esm2020/user-device-manage/src/associate-lines/associate-lines.component.mjs +10 -10
  19. package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +11 -11
  20. package/esm2020/user-device-manage/src/device-settings/device-settings.component.mjs +9 -9
  21. package/esm2020/user-device-manage/src/line-key-config/line-key-config.component.mjs +9 -9
  22. package/esm2020/user-device-manage/src/user-device-manage.module.mjs +8 -7
  23. package/esm2020/user-manage/src/user-manage-widget.component.mjs +12 -12
  24. package/esm2020/user-manage/src/user-manage.module.mjs +8 -7
  25. package/esm2020/users-list/src/classes/site-option.mjs +2 -0
  26. package/esm2020/users-list/src/components/table-toolbar/table-toolbar.component.mjs +18 -4
  27. package/esm2020/users-list/src/move-user-wizard/move-user-stepper/move-user-stepper.component.mjs +15 -15
  28. package/esm2020/users-list/src/move-user-wizard/move-user-wizard.component.mjs +5 -5
  29. package/esm2020/users-list/src/users-list.component.mjs +104 -46
  30. package/esm2020/users-list/src/users-list.module.mjs +7 -6
  31. package/esm2020/workspaces/src/components/workspace-detail/workspace-detail.component.mjs +7 -7
  32. package/esm2020/workspaces/src/components/workspace-device-detail/workspace-device-detail.component.mjs +9 -9
  33. package/esm2020/workspaces/src/components/workspaces-filters/workspaces-filters.component.mjs +13 -3
  34. package/esm2020/workspaces/src/components/workspaces-table/workspaces-table.component.mjs +6 -6
  35. package/esm2020/workspaces/src/services/workspaces.service.mjs +3 -1
  36. package/esm2020/workspaces/src/types/workspace.mjs +6 -2
  37. package/esm2020/workspaces/src/workspaces.component.mjs +43 -9
  38. package/esm2020/workspaces/src/workspaces.module.mjs +7 -6
  39. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +26 -18
  40. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  41. package/fesm2015/tuki-io-tuki-widgets-locations.mjs +16 -24
  42. package/fesm2015/tuki-io-tuki-widgets-locations.mjs.map +1 -1
  43. package/fesm2015/tuki-io-tuki-widgets-meetings.mjs +31 -33
  44. package/fesm2015/tuki-io-tuki-widgets-meetings.mjs.map +1 -1
  45. package/fesm2015/tuki-io-tuki-widgets-shared.mjs +31 -1
  46. package/fesm2015/tuki-io-tuki-widgets-shared.mjs.map +1 -1
  47. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +52 -43
  48. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  49. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +43 -51
  50. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  51. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +20 -29
  52. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  53. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +136 -73
  54. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  55. package/fesm2015/tuki-io-tuki-widgets-workspaces.mjs +87 -43
  56. package/fesm2015/tuki-io-tuki-widgets-workspaces.mjs.map +1 -1
  57. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +26 -18
  58. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -1
  59. package/fesm2020/tuki-io-tuki-widgets-locations.mjs +16 -24
  60. package/fesm2020/tuki-io-tuki-widgets-locations.mjs.map +1 -1
  61. package/fesm2020/tuki-io-tuki-widgets-meetings.mjs +31 -33
  62. package/fesm2020/tuki-io-tuki-widgets-meetings.mjs.map +1 -1
  63. package/fesm2020/tuki-io-tuki-widgets-shared.mjs +31 -1
  64. package/fesm2020/tuki-io-tuki-widgets-shared.mjs.map +1 -1
  65. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +51 -43
  66. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  67. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +43 -51
  68. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -1
  69. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +20 -29
  70. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -1
  71. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +134 -71
  72. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  73. package/fesm2020/tuki-io-tuki-widgets-workspaces.mjs +87 -42
  74. package/fesm2020/tuki-io-tuki-widgets-workspaces.mjs.map +1 -1
  75. package/locations/src/locations.module.d.ts +2 -2
  76. package/meetings/src/meetings.module.d.ts +2 -2
  77. package/package.json +1 -1
  78. package/shared/public-api.d.ts +1 -0
  79. package/shared/src/ui/tk-loader/tk-loader.component.d.ts +15 -0
  80. package/user-creation/src/user-creation.module.d.ts +3 -3
  81. package/user-creation/src/widgets/user-creation-wizard/components/user-template-step/user-template-step.component.d.ts +2 -0
  82. package/user-device-manage/src/user-device-manage.module.d.ts +16 -16
  83. package/user-manage/src/user-manage.module.d.ts +12 -13
  84. package/users-list/src/classes/site-option.d.ts +4 -0
  85. package/users-list/src/components/table-toolbar/table-toolbar.component.d.ts +6 -1
  86. package/users-list/src/users-list.component.d.ts +11 -1
  87. package/users-list/src/users-list.module.d.ts +9 -9
  88. package/workspaces/src/components/workspace-detail/workspace-detail.component.d.ts +1 -1
  89. package/workspaces/src/components/workspaces-filters/workspaces-filters.component.d.ts +9 -1
  90. package/workspaces/src/components/workspaces-table/workspaces-table.component.d.ts +2 -2
  91. package/workspaces/src/types/workspace.d.ts +5 -0
  92. package/workspaces/src/workspaces.component.d.ts +6 -2
  93. package/workspaces/src/workspaces.module.d.ts +2 -2
  94. package/esm2020/locations/src/utils/app-loader/app-loader.mjs +0 -14
  95. package/esm2020/meetings/src/utils/app-loader/app-loader.mjs +0 -14
  96. package/esm2020/user-creation/src/utils/app-loader/app-loader.mjs +0 -14
  97. package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +0 -14
  98. package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +0 -14
  99. package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +0 -14
  100. package/esm2020/workspaces/src/utils/app-loader/app-loader.mjs +0 -14
  101. package/locations/src/utils/app-loader/app-loader.d.ts +0 -6
  102. package/meetings/src/utils/app-loader/app-loader.d.ts +0 -6
  103. package/user-creation/src/utils/app-loader/app-loader.d.ts +0 -6
  104. package/user-device-manage/src/utils/app-loader/app-loader.d.ts +0 -6
  105. package/user-manage/src/utils/app-loader/app-loader.d.ts +0 -6
  106. package/users-list/src/utils/app-loader/app-loader.d.ts +0 -6
  107. package/workspaces/src/utils/app-loader/app-loader.d.ts +0 -6
@@ -8,14 +8,15 @@ import { DEPENDENCIES_STATUS, STATUS_ENTRIES } from "../../../shared/types/const
8
8
  import { APIService } from "../../../shared/services/api.service";
9
9
  import { PAGINATION_SIZE_OPTIONS } from "../../../shared/constants/app.constants";
10
10
  import * as i0 from "@angular/core";
11
- import * as i1 from "@angular/common";
12
- import * as i2 from "@angular/material/table";
13
- import * as i3 from "@angular/material/checkbox";
14
- import * as i4 from "@angular/material/button";
15
- import * as i5 from "../../../shared/components/summary-card/summary-card.component";
16
- import * as i6 from "../../../shared/components/table-filters/table-filters.component";
17
- import * as i7 from "@angular/material/progress-spinner";
18
- import * as i8 from "@angular/material/paginator";
11
+ import * as i1 from "@tuki-io/tuki-widgets/shared";
12
+ import * as i2 from "@angular/common";
13
+ import * as i3 from "@angular/material/table";
14
+ import * as i4 from "@angular/material/checkbox";
15
+ import * as i5 from "@angular/material/button";
16
+ import * as i6 from "../../../shared/components/summary-card/summary-card.component";
17
+ import * as i7 from "../../../shared/components/table-filters/table-filters.component";
18
+ import * as i8 from "@angular/material/progress-spinner";
19
+ import * as i9 from "@angular/material/paginator";
19
20
  export class UserUpgradeDataTableComponent {
20
21
  constructor() {
21
22
  this.destroy$ = new Subject();
@@ -352,10 +353,10 @@ export class UserUpgradeDataTableComponent {
352
353
  }
353
354
  }
354
355
  UserUpgradeDataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeDataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
355
- UserUpgradeDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserUpgradeDataTableComponent, selector: "tk-user-upgrade-data-table", inputs: { host: "host", token: "token", customerId: "customerId" }, ngImport: i0, template: "<div *ngIf=\"dataPending\" class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"70\"\r\n strokeWidth=\"3\"\r\n ></mat-progress-spinner>\r\n</div>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n color=\"primary\"\r\n class=\"upgrade-bulk-button\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getSiteUpgradeStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th class=\"device-td\" mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devicesWithExtensions; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.deviceName || device }}</span>\r\n <span class=\"device-model\">\r\n {{ device.extensions?.length ? 'Ext: ' + device.extensions.join(\", \") : 'No Extension' }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div class=\"multiple-dev-link\" *ngIf=\"element.devicesWithExtensions?.length > 1; else oneDevice\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <ng-template #oneDevice>\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devicesWithExtensions[0].deviceName}}</span>\r\n </div>\r\n <div class=\"device-model one-dev-extensions\">\r\n {{ element.devicesWithExtensions[0].extensions?.length ?\r\n 'Ext: ' + element.devicesWithExtensions[0].extensions?.join(\", \") : 'No Extension' }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff6;z-index:200}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}#userUpgradeDataTable .flex-container{padding:0!important}.multiple-dev-link{margin:0 0 0 13px}:host ::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}:host ::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}:host ::ng-deep .progress-spinner-td{position:relative}:host ::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem;align-items:stretch}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#737480}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:5px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .one-dev-extensions{margin:0 0 0 13px}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .device-td{padding:0 0 0 13px}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1170cf}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important;background-color:#fff!important;border:2px solid black!important;border-radius:1rem!important;color:#000!important}.user-upgrade-table .upgrade-button:hover{background-color:#000000ce!important;color:#fff!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease;z-index:1000}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}:host ::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}:host ::ng-deep .action-wrapper .mat-button .mat-button-wrapper{margin:0}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-checked .mat-checkbox-background{background-color:#1170cf!important;border-color:#00000080!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled):hover:not(.mat-checkbox-checked) .mat-checkbox-background{background-color:#0000004d!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background{background-color:#1170cf!important;border-color:#00000080!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background .mat-checkbox-mixedmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox .mat-checkbox-background{border-color:#00000080!important;transition:background-color .2s,border-color .2s,box-shadow .2s}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled) .mat-checkbox-ripple .mat-ripple-element{background-color:#1170cf40}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).cdk-focused .mat-checkbox-ripple .mat-ripple-element{background-color:#1170cf59}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#00000080!important;transition:background-color .2s,border-color .2s,box-shadow .2s;background-color:#1170cf!important}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}.user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}.user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#00000080!important}.user-upgrade-table .mat-checkbox-checkmark{color:#fff!important;transform:scale(.75)}.user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}.user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i4.MatButton, 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: i5.SummaryCardComponent, selector: "tk-summary-card", inputs: ["value", "status", "description"] }, { kind: "component", type: i6.TableFiltersComponent, selector: "tk-table-filters", inputs: ["filters"], outputs: ["filter"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i8.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }] });
356
+ UserUpgradeDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserUpgradeDataTableComponent, selector: "tk-user-upgrade-data-table", inputs: { host: "host", token: "token", customerId: "customerId" }, ngImport: i0, template: "<tk-loader *ngIf=\"dataPending\" backdrop=\"rgba(255, 255, 255, 0.4)\"></tk-loader>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n color=\"primary\"\r\n class=\"upgrade-bulk-button\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getSiteUpgradeStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th class=\"device-td\" mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devicesWithExtensions; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.deviceName || device }}</span>\r\n <span class=\"device-model\">\r\n {{ device.extensions?.length ? 'Ext: ' + device.extensions.join(\", \") : 'No Extension' }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div class=\"multiple-dev-link\" *ngIf=\"element.devicesWithExtensions?.length > 1; else oneDevice\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <ng-template #oneDevice>\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devicesWithExtensions[0].deviceName}}</span>\r\n </div>\r\n <div class=\"device-model one-dev-extensions\">\r\n {{ element.devicesWithExtensions[0].extensions?.length ?\r\n 'Ext: ' + element.devicesWithExtensions[0].extensions?.join(\", \") : 'No Extension' }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}#userUpgradeDataTable .flex-container{padding:0!important}.multiple-dev-link{margin:0 0 0 13px}:host ::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}:host ::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}:host ::ng-deep .progress-spinner-td{position:relative}:host ::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem;align-items:stretch}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#737480}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:5px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .one-dev-extensions{margin:0 0 0 13px}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .device-td{padding:0 0 0 13px}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1170cf}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important;background-color:#fff!important;border:2px solid black!important;border-radius:1rem!important;color:#000!important}.user-upgrade-table .upgrade-button:hover{background-color:#000000ce!important;color:#fff!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease;z-index:1000}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}:host ::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}:host ::ng-deep .action-wrapper .mat-button .mat-button-wrapper{margin:0}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-checked .mat-checkbox-background{background-color:#1170cf!important;border-color:#00000080!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled):hover:not(.mat-checkbox-checked) .mat-checkbox-background{background-color:#0000004d!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background{background-color:#1170cf!important;border-color:#00000080!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background .mat-checkbox-mixedmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox .mat-checkbox-background{border-color:#00000080!important;transition:background-color .2s,border-color .2s,box-shadow .2s}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled) .mat-checkbox-ripple .mat-ripple-element{background-color:#1170cf40}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).cdk-focused .mat-checkbox-ripple .mat-ripple-element{background-color:#1170cf59}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#00000080!important;transition:background-color .2s,border-color .2s,box-shadow .2s;background-color:#1170cf!important}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}.user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}.user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#00000080!important}.user-upgrade-table .mat-checkbox-checkmark{color:#fff!important;transform:scale(.75)}.user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}.user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"], dependencies: [{ kind: "component", type: i1.TkLoaderComponent, selector: "tk-loader", inputs: ["diameter", "strokeWidth", "backdrop", "color"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatButton, 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: i6.SummaryCardComponent, selector: "tk-summary-card", inputs: ["value", "status", "description"] }, { kind: "component", type: i7.TableFiltersComponent, selector: "tk-table-filters", inputs: ["filters"], outputs: ["filter"] }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i9.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }] });
356
357
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeDataTableComponent, decorators: [{
357
358
  type: Component,
358
- args: [{ selector: 'tk-user-upgrade-data-table', template: "<div *ngIf=\"dataPending\" class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"70\"\r\n strokeWidth=\"3\"\r\n ></mat-progress-spinner>\r\n</div>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n color=\"primary\"\r\n class=\"upgrade-bulk-button\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getSiteUpgradeStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th class=\"device-td\" mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devicesWithExtensions; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.deviceName || device }}</span>\r\n <span class=\"device-model\">\r\n {{ device.extensions?.length ? 'Ext: ' + device.extensions.join(\", \") : 'No Extension' }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div class=\"multiple-dev-link\" *ngIf=\"element.devicesWithExtensions?.length > 1; else oneDevice\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <ng-template #oneDevice>\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devicesWithExtensions[0].deviceName}}</span>\r\n </div>\r\n <div class=\"device-model one-dev-extensions\">\r\n {{ element.devicesWithExtensions[0].extensions?.length ?\r\n 'Ext: ' + element.devicesWithExtensions[0].extensions?.join(\", \") : 'No Extension' }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff6;z-index:200}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}#userUpgradeDataTable .flex-container{padding:0!important}.multiple-dev-link{margin:0 0 0 13px}:host ::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}:host ::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}:host ::ng-deep .progress-spinner-td{position:relative}:host ::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem;align-items:stretch}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#737480}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:5px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .one-dev-extensions{margin:0 0 0 13px}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .device-td{padding:0 0 0 13px}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1170cf}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important;background-color:#fff!important;border:2px solid black!important;border-radius:1rem!important;color:#000!important}.user-upgrade-table .upgrade-button:hover{background-color:#000000ce!important;color:#fff!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease;z-index:1000}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}:host ::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}:host ::ng-deep .action-wrapper .mat-button .mat-button-wrapper{margin:0}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-checked .mat-checkbox-background{background-color:#1170cf!important;border-color:#00000080!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled):hover:not(.mat-checkbox-checked) .mat-checkbox-background{background-color:#0000004d!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background{background-color:#1170cf!important;border-color:#00000080!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background .mat-checkbox-mixedmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox .mat-checkbox-background{border-color:#00000080!important;transition:background-color .2s,border-color .2s,box-shadow .2s}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled) .mat-checkbox-ripple .mat-ripple-element{background-color:#1170cf40}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).cdk-focused .mat-checkbox-ripple .mat-ripple-element{background-color:#1170cf59}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#00000080!important;transition:background-color .2s,border-color .2s,box-shadow .2s;background-color:#1170cf!important}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}.user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}.user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#00000080!important}.user-upgrade-table .mat-checkbox-checkmark{color:#fff!important;transform:scale(.75)}.user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}.user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"] }]
359
+ args: [{ selector: 'tk-user-upgrade-data-table', template: "<tk-loader *ngIf=\"dataPending\" backdrop=\"rgba(255, 255, 255, 0.4)\"></tk-loader>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n color=\"primary\"\r\n class=\"upgrade-bulk-button\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getSiteUpgradeStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th class=\"device-td\" mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devicesWithExtensions; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.deviceName || device }}</span>\r\n <span class=\"device-model\">\r\n {{ device.extensions?.length ? 'Ext: ' + device.extensions.join(\", \") : 'No Extension' }}\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div class=\"multiple-dev-link\" *ngIf=\"element.devicesWithExtensions?.length > 1; else oneDevice\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <ng-template #oneDevice>\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devicesWithExtensions[0].deviceName}}</span>\r\n </div>\r\n <div class=\"device-model one-dev-extensions\">\r\n {{ element.devicesWithExtensions[0].extensions?.length ?\r\n 'Ext: ' + element.devicesWithExtensions[0].extensions?.join(\", \") : 'No Extension' }}\r\n </div>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}#userUpgradeDataTable .flex-container{padding:0!important}.multiple-dev-link{margin:0 0 0 13px}:host ::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}:host ::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}:host ::ng-deep .progress-spinner-td{position:relative}:host ::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem;align-items:stretch}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#737480}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:5px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .one-dev-extensions{margin:0 0 0 13px}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .device-td{padding:0 0 0 13px}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1170cf}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important;background-color:#fff!important;border:2px solid black!important;border-radius:1rem!important;color:#000!important}.user-upgrade-table .upgrade-button:hover{background-color:#000000ce!important;color:#fff!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease;z-index:1000}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}:host ::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}:host ::ng-deep .action-wrapper .mat-button .mat-button-wrapper{margin:0}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-checked .mat-checkbox-background{background-color:#1170cf!important;border-color:#00000080!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled):hover:not(.mat-checkbox-checked) .mat-checkbox-background{background-color:#0000004d!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background{background-color:#1170cf!important;border-color:#00000080!important}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox-indeterminate .mat-checkbox-background .mat-checkbox-mixedmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox .mat-checkbox-background{border-color:#00000080!important;transition:background-color .2s,border-color .2s,box-shadow .2s}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).mat-checkbox .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled) .mat-checkbox-ripple .mat-ripple-element{background-color:#1170cf40}:host ::ng-deep .user-upgrade-table .mat-accent:not(.mat-checkbox-disabled).cdk-focused .mat-checkbox-ripple .mat-ripple-element{background-color:#1170cf59}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#00000080!important;transition:background-color .2s,border-color .2s,box-shadow .2s;background-color:#1170cf!important}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background .mat-checkbox-checkmark{transform:scale(.75)}.user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}.user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}.user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#00000080!important}.user-upgrade-table .mat-checkbox-checkmark{color:#fff!important;transform:scale(.75)}.user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}.user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"] }]
359
360
  }], propDecorators: { host: [{
360
361
  type: Input
361
362
  }], token: [{
@@ -376,4 +377,4 @@ const PAGINATION_DATA_DEFAULTS = {
376
377
  SIZE: 10,
377
378
  PAGE_INDEX: 0
378
379
  };
379
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL2RpMm10L3dpZGdldHMvdXNlci11cGdyYWRlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9kaTJtdC93aWRnZXRzL3VzZXItdXBncmFkZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUFrQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUNMLGNBQWMsRUFJZCxrQkFBa0IsRUFDbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsbUJBQW1CLEVBQVUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7Ozs7O0FBU2xGLE1BQU0sT0FBTyw2QkFBNkI7SUFOMUM7UUFPVSxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztR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LENBQUM7UUFDeEUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLHdCQUF3QixHQUFHO0lBQy9CLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQztJQUMxQixJQUFJLEVBQUUsRUFBRTtJQUNSLFVBQVUsRUFBRSxDQUFDO0NBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2xsZWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBpbmplY3QsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90YWJsZVwiO1xyXG5pbXBvcnQgeyBUYWJsZUNvbHVtbiB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvdHlwZXMvZGF0YS10YWJsZVwiO1xyXG5pbXBvcnQgeyBUYWJsZUZpbHRlciB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvdHlwZXMvdGFibGUvZmlsdGVyXCI7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1xyXG4gIEZJTFRFUl9LRVlfTUFQLFxyXG4gIFVpRmlsdGVyS2V5LFxyXG4gIFVzZXIyVXBncmFkZVN0YXR1c0RUTyxcclxuICBVc2VyU2VhcmNoUGFyYW1zLFxyXG4gIFVzZXJVcGdyYWRlU2VydmljZVxyXG59IGZyb20gXCIuLi91c2VyLXVwZ3JhZGUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBERVBFTkRFTkNJRVNfU1RBVFVTLCBTdGF0dXMsIFNUQVRVU19FTlRSSUVTIH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZC90eXBlcy9jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgVXNlclVwZ3JhZGVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdXNlci11cGdyYWRlXCI7XHJcbmltcG9ydCB7IEFQSVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2FwaS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBBR0lOQVRJT05fU0laRV9PUFRJT05TIH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZC9jb25zdGFudHMvYXBwLmNvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0ay11c2VyLXVwZ3JhZGUtZGF0YS10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIC8vIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLlNoYWRvd0RvbVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlclVwZ3JhZGVEYXRhVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSB1c2VyVXBncmFkZVNlcnZpY2UgPSBpbmplY3QoVXNlclVwZ3JhZGVTZXJ2aWNlKTtcclxuICBwcml2YXRlIGFwaVNlcnZpY2UgPSBpbmplY3QoQVBJU2VydmljZSk7XHJcbiAgcmVhZG9ubHkgU1RBVFVTX0VOVFJJRVMgPSBTVEFUVVNfRU5UUklFUztcclxuICByZWFkb25seSBERVBFTkRFTkNJRVNfU1RBVFVTID0gREVQRU5ERU5DSUVTX1NUQVRVUztcclxuXHJcbiAgQElucHV0KCkgaG9zdCE6IHN0cmluZztcclxuICBASW5wdXQoKSB0b2tlbiE6IHN0cmluZztcclxuICBASW5wdXQoKSBjdXN0b21lcklkITogc3RyaW5nO1xyXG5cclxuICBjb2x1bW5zITogVGFibGVDb2x1bW5bXTtcclxuICBkYXRhUGVuZGluZyA9IGZhbHNlO1xyXG4gIGRhdGEhOiBNYXRUYWJsZURhdGFTb3VyY2U8VXNlclVwZ3JhZGVSZWNvcmQ+O1xyXG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gWydzZWxlY3QnLCAndXNlcicsICdzaXRlJywgJ2RldmljZScsICdkaWFsUGxhblN0YXR1cycsICdkZXBlbmRlbmNpZXMnLCAndXNlclVwZ3JhZGVTdGF0dXMnLCAndXNlclVwZ3JhZGVMb2FkZXInXTtcclxuICBzZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8VXNlclVwZ3JhZGVSZWNvcmQ+KHRydWUsIFtdKTtcclxuICBmaWx0ZXJzOiBUYWJsZUZpbHRlcltdID0gW107XHJcbiAgcGFnaW5hdGlvbiA9IG5ldyBQYWdpbmF0aW9uRGF0YUR0bygpO1xyXG4gIHVzZXJzOiBVc2VyVXBncmFkZVJlY29yZFtdID0gW107XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICBzdGF0dXNDb3VudHM6IGFueSA9IHt9O1xyXG5cclxuICBwcml2YXRlIGFjdGl2ZUZpbHRlcnM6IFBhcnRpYWw8VXNlclNlYXJjaFBhcmFtcz4gPSB7fTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGFQZW5kaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuYXBpU2VydmljZS50b2tlbiA9IHRoaXMudG9rZW47XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuYXBpVXJsID0gdGhpcy5ob3N0O1xyXG5cclxuICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmN1c3RvbWVySWQgPSB0aGlzLmN1c3RvbWVySWQ7XHJcblxyXG4gICAgY29uc3Qgc3Vic2MxID0gdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlclVwZ3JhZGVSZWNvcmRzKHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSwgdGhpcy5wYWdpbmF0aW9uLnBhZ2VJbmRleCwgdGhpcy5hY3RpdmVGaWx0ZXJzKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdHM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlY29yZHMgPSByZXN1bHRzLmNvbnRlbnQgYXMgVXNlclVwZ3JhZGVSZWNvcmRbXVxyXG4gICAgICAgIHJlY29yZHMuZm9yRWFjaChyZWNvcmQgPT4ge1xyXG4gICAgICAgICAgcmVjb3JkLmRldmljZXNXaXRoRXh0ZW5zaW9ucyA9IHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLm1hcERldmljZXNXaXRoRXh0ZW5zaW9ucyhyZWNvcmQuZGV2aWNlcywgcmVjb3JkLmRldmljZURldGFpbHMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UocmVjb3Jkcyk7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnRvdGFsID0gcmVzdWx0cy50b3RhbEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNldHVwQ3VzdG9tRmlsdGVyKCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRmlsdGVycyhyZWNvcmRzKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHN1YnNjMSk7XHJcblxyXG4gICAgY29uc3Qgc3Vic2MyID0gdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlclVwZ3JhZGVTdGF0dXNDb3VudHMoKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXR1c0NvdW50cykgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQ291bnRzWydSZWFkeSddID0gc3RhdHVzQ291bnRzWydSRUFEWSddIHx8IDA7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNDb3VudHNbJ05vdCBSZWFkeSddID0gc3RhdHVzQ291bnRzWydOT1RfUkVBRFknXSB8fCAwO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQ291bnRzWydDb21wbGV0ZWQnXSA9IHN0YXR1c0NvdW50c1snQ09NUExFVEVEJ10gfHwgMDtcclxuICAgICAgICB0aGlzLnN0YXR1c0NvdW50c1snRmFpbGVkJ10gPSBzdGF0dXNDb3VudHNbJ0ZBSUxFRCddIHx8IDA7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzYzIpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIHRoaXMuZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25NdWx0aXBsZURldmljZXModXNlcjogVXNlclVwZ3JhZGVSZWNvcmQpOiB2b2lkIHtcclxuICAgIHVzZXIuc2hvd0RldmljZXMgPSAhdXNlci5zaG93RGV2aWNlcztcclxuICB9XHJcblxyXG4gIHBhZ2VFdmVudChldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2luYXRpb24ucGFnZUluZGV4ID0gZXZlbnQucGFnZUluZGV4O1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gZXZlbnQucGFnZVNpemU7XHJcbiAgICB0aGlzLmdldERhdGEoKTtcclxuICB9XHJcblxyXG4gIGdldFNpdGVVcGdyYWRlU3RhdHVzQ2xhc3Moc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChzdGF0dXMudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdyZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdzdGF0dXMtcmVhZHknO1xyXG4gICAgICBjYXNlICdwYXJ0aWFsIHJlYWR5JzpcclxuICAgICAgICByZXR1cm4gJ3BhcnRpYWwtcmVhZHknO1xyXG4gICAgICBjYXNlICdjb21wbGV0ZWQnOlxyXG4gICAgICAgIHJldHVybiAnY29tcGxldGVkJztcclxuICAgICAgY2FzZSAnZmFpbGVkJzpcclxuICAgICAgICByZXR1cm4gJ2ZhaWxlZCc7XHJcbiAgICAgIGNhc2UgJ25vdCByZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdub3QtcmVhZHknO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnbm90LXJlYWR5JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoYW5nZVBlclBhZ2VOdW1iZXIocGFnZVNpemVFdmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBwYWdlU2l6ZUV2ZW50LnZhbHVlO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VJbmRleCA9IDA7XHJcbiAgICB0aGlzLmdldERhdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGF0YShwYXJhbXM/OiBVc2VyU2VhcmNoUGFyYW1zKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGFQZW5kaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHN1YnNjMSA9IHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmdldFVzZXJVcGdyYWRlUmVjb3Jkcyh0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUsIHRoaXMucGFnaW5hdGlvbi5wYWdlSW5kZXgsIHBhcmFtcyB8fCB7fSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICBjb25zdCByZWNvcmRzID0gcmVzdWx0LmNvbnRlbnQgYXMgVXNlclVwZ3JhZGVSZWNvcmRbXVxyXG4gICAgICAgIHJlY29yZHMuZm9yRWFjaChyZWNvcmQgPT4ge1xyXG4gICAgICAgICAgcmVjb3JkLmRldmljZXNXaXRoRXh0ZW5zaW9ucyA9IHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLm1hcERldmljZXNXaXRoRXh0ZW5zaW9ucyhyZWNvcmQuZGV2aWNlcywgcmVjb3JkLmRldmljZURldGFpbHMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlY29yZHMpO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvbi50b3RhbCA9IHJlc3VsdC50b3RhbEVsZW1lbnRzO1xyXG4gICAgICAgIHRoaXMuZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHN1YnNjMSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVGaWx0ZXJzKHJlY29yZHM6IFVzZXJVcGdyYWRlUmVjb3JkW10pOiB2b2lkIHtcclxuICAgIGlmICghcmVjb3Jkcz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVycyA9IFtdO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXh0cmFjdCB1bmlxdWUgc2l0ZXMgKHNraXAgZW1wdHkvbnVsbClcclxuICAgIGNvbnN0IHVuaXF1ZVNpdGVzID0gW1xyXG4gICAgICAuLi5uZXcgU2V0KFxyXG4gICAgICAgIHJlY29yZHNcclxuICAgICAgICAgIC5tYXAocmVjb3JkID0+IHJlY29yZC5zaXRlTmFtZT8udHJpbSgpKVxyXG4gICAgICAgICAgLmZpbHRlcigoc2l0ZSk6IHNpdGUgaXMgc3RyaW5nID0+ICEhc2l0ZSlcclxuICAgICAgKVxyXG4gICAgXTtcclxuXHJcbiAgICBjb25zdCBzaXRlT3B0aW9ucyA9IHVuaXF1ZVNpdGVzLm1hcChzaXRlID0+ICh7XHJcbiAgICAgIGxhYmVsOiBzaXRlLFxyXG4gICAgICB2YWx1ZTogc2l0ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKVxyXG4gICAgfSkpO1xyXG5cclxuICAgIC8vIEV4dHJhY3QgdW5pcXVlIHN0YXR1c2VzIChza2lwIGVtcHR5L251bGwpXHJcbiAgICBjb25zdCB1bmlxdWVTdGF0dXNlcyA9IFtcclxuICAgICAgLi4ubmV3IFNldChcclxuICAgICAgICByZWNvcmRzXHJcbiAgICAgICAgICAubWFwKHJlY29yZCA9PiByZWNvcmQudXBncmFkZVN0YXR1cz8udHJpbSgpKVxyXG4gICAgICAgICAgLmZpbHRlcigoc3RhdHVzKTogc3RhdHVzIGlzIHN0cmluZyA9PiAhIXN0YXR1cylcclxuICAgICAgKVxyXG4gICAgXTtcclxuXHJcbiAgICBjb25zdCBzdGF0dXNPcHRpb25zID0gdW5pcXVlU3RhdHVzZXMubWFwKHN0YXR1cyA9PiAoe1xyXG4gICAgICBsYWJlbDogU1RBVFVTX0VOVFJJRVNbc3RhdHVzXSxcclxuICAgICAgdmFsdWU6IHN0YXR1cy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKVxyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVycyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIGlkOiAndXNlck5hbWUnLFxyXG4gICAgICAgIHR5cGU6ICdzZWFyY2gnLFxyXG4gICAgICAgIGNvbHVtbktleTogJ1VzZXInLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2VhcmNoIHVzZXJzLi4uJyxcclxuICAgICAgICBvcHRpb25zOiBbXVxyXG4gICAgICB9XHJcbiAgICBdO1xyXG5cclxuICAgIGlmIChzaXRlT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5maWx0ZXJzLnB1c2goe1xyXG4gICAgICAgIGlkOiAnc2l0ZXMnLFxyXG4gICAgICAgIHR5cGU6ICdzZWxlY3QnLFxyXG4gICAgICAgIGNvbHVtbktleTogJ1NpdGUnLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnU2l0ZXMnLFxyXG4gICAgICAgIG9wdGlvbnM6IHNpdGVPcHRpb25zXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdGF0dXNPcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmZpbHRlcnMucHVzaCh7XHJcbiAgICAgICAgaWQ6ICdzdGF0dXMnLFxyXG4gICAgICAgIHR5cGU6ICdzZWxlY3QnLFxyXG4gICAgICAgIGNvbHVtbktleTogJ1VzZXIgVXBncmFkZSBTdGF0dXMnLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiAnVXBncmFkZSBTdGF0dXMnLFxyXG4gICAgICAgIG9wdGlvbnM6IHN0YXR1c09wdGlvbnNcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVsZW1lbnRzIG1hdGNoZXMgdGhlIHRvdGFsIG51bWJlciBvZiByb3dzLiAqL1xyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGE/LmRhdGEubGVuZ3RoID8/IDA7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICAvKiogU2VsZWN0cyBhbGwgcm93cyBpZiB0aGV5IGFyZSBub3QgYWxsIHNlbGVjdGVkOyBvdGhlcndpc2UgY2xlYXIgc2VsZWN0aW9uLiAqL1xyXG4gIG1hc3RlclRvZ2dsZSgpIHtcclxuICAgIC8vIHRoaXMuaXNBbGxTZWxlY3RlZCgpID9cclxuICAgIC8vICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKSA6XHJcbiAgICAvLyAgIHRoaXMuZGF0YT8uZGF0YS5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XHJcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YT8uZGF0YS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgICAgaWYgKHJvdy51cGdyYWRlU3RhdHVzID09PSAnUkVBRFknKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGdyYWRlVXNlcih1c2VyOiBVc2VyVXBncmFkZVJlY29yZCk6IHZvaWQge1xyXG4gICAgaWYgKHVzZXI/LnVwZ3JhZGVTdGF0dXMgPT09ICdSRUFEWScpXHJcbiAgICAgIHVzZXIucGVuZGluZyA9IHRydWU7XHJcblxyXG4gICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuY29sbGVjdFVzZXJzKFt1c2VyXSlcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5idWxrVXBncmFkZShbdXNlcl0pXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXR1c0FmdGVyVXBncmFkZShbdXNlcl0pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVVc2Vyc1N0YXR1c0FmdGVyVXBncmFkZSh1c2VyczogVXNlclVwZ3JhZGVSZWNvcmRbXSk6IHZvaWQge1xyXG4gICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlcnNVcGdyYWRlU3RhdHVzZXModXNlcnMpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgodXBncmFkZWRTdGF0dXNlczogVXNlcjJVcGdyYWRlU3RhdHVzRFRPW10pID0+IHtcclxuICAgICAgICB1cGdyYWRlZFN0YXR1c2VzLmZvckVhY2goc3RhdHVzSXRlbSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbmQgPSB0aGlzLmdldFVzZXJJbmRleChzdGF0dXNJdGVtLnVzZXJJZCk7XHJcbiAgICAgICAgICBpZiAoaW5kID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLmRhdGFbaW5kXS51cGdyYWRlU3RhdHVzID0gc3RhdHVzSXRlbS51cGdyYWRlU3RhdHVzO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuZGF0YVtpbmRdLnBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckluZGV4KHVzZXJJZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGEuZGF0YS5maW5kSW5kZXgoKHJlY29yZDogVXNlclVwZ3JhZGVSZWNvcmQpID0+IHJlY29yZC51c2VySWQgPT09IHVzZXJJZCk7XHJcbiAgfVxyXG5cclxuICB1cGdyYWRlU2VsZWN0ZWRVc2VycygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCAmJiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5jb2xsZWN0VXNlcnModGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuYnVsa1VwZ3JhZGUodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXR1c0FmdGVyVXBncmFkZSh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuYnVsa1VwZ3JhZGUodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXJWYWx1ZShpbnB1dDogYW55KTogYW55IHtcclxuICAgIGlmIChpbnB1dCAmJiBpbnB1dC52YWx1ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gaW5wdXQudmFsdWU7ICAgICAgLy8gZS5nLiB7dmFsdWUsbGFiZWx9XHJcbiAgICBpZiAoaW5wdXQgJiYgaW5wdXQudGFyZ2V0KSByZXR1cm4gaW5wdXQudGFyZ2V0LnZhbHVlOyAgICAgICAgICAgIC8vIERPTSBldmVudFxyXG4gICAgcmV0dXJuIGlucHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFpbiB2YWx1ZVxyXG4gIH1cclxuICBwcml2YXRlIGlzRW1wdHlGaWx0ZXIodjogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCBzID0gdi50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgcmV0dXJuIHMgPT09ICcnIHx8IHMgPT09ICdhbGwnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXIoZmlsdGVyRXZlbnQ6IHsga2V5OiBVaUZpbHRlcktleTsgdmFsdWU6IGFueSB9KSB7XHJcbiAgICBjb25zdCByYXdLZXkgPSBmaWx0ZXJFdmVudC5rZXk7XHJcbiAgICBjb25zdCBzZXJ2ZXJLZXkgPSBGSUxURVJfS0VZX01BUFtyYXdLZXldO1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldEZpbHRlclZhbHVlKGZpbHRlckV2ZW50LnZhbHVlKTtcclxuXHJcbiAgICBjb25zdCBuZXh0OiBQYXJ0aWFsPFVzZXJTZWFyY2hQYXJhbXM+ID0geyAuLi50aGlzLmFjdGl2ZUZpbHRlcnMgfTtcclxuXHJcbiAgICBpZiAodGhpcy5pc0VtcHR5RmlsdGVyKHZhbHVlKSkge1xyXG4gICAgICBkZWxldGUgbmV4dFtzZXJ2ZXJLZXldO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gbm9ybWFsaXplIHRvIHN0cmluZyBmb3IgQVBJICh0cmltKVxyXG4gICAgICBuZXh0W3NlcnZlcktleV0gPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudHJpbSgpIDogU3RyaW5nKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjdGl2ZUZpbHRlcnMgPSBuZXh0O1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VJbmRleCA9IDA7XHJcblxyXG4gICAgLy8gcXVpY2sgZml4IGZvciBkZW1vXHJcbiAgICBpZiAodGhpcy5hY3RpdmVGaWx0ZXJzWyd1cGdyYWRlU3RhdHVzJ10pIHtcclxuICAgICAgdGhpcy5hY3RpdmVGaWx0ZXJzWyd1cGdyYWRlU3RhdHVzJ10gPSB0aGlzLmFjdGl2ZUZpbHRlcnNbJ3VwZ3JhZGVTdGF0dXMnXT8udG9VcHBlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldERhdGEodGhpcy5hY3RpdmVGaWx0ZXJzIGFzIFVzZXJTZWFyY2hQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgLypvbkZpbHRlcihmaWx0ZXJFdmVudDogeyBrZXk6IHN0cmluZywgdmFsdWU6IGFueSB9KSB7XHJcbiAgICBjb25zdCB7a2V5LCB2YWx1ZX0gPSBmaWx0ZXJFdmVudDtcclxuXHJcbiAgICBsZXQgZmlsdGVyVmFsdWU6IGFueTtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpbHRlclZhbHVlID0gdmFsdWUudmFsdWU7XHJcbiAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHZhbHVlLnRhcmdldCkge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9IHZhbHVlLnRhcmdldC52YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZpbHRlclZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIFwiQWxsXCIgb3B0aW9uIG9yIGVtcHR5IHZhbHVlcyAtIHJlbW92ZSB0aGUgZmlsdGVyXHJcbiAgICBpZiAoZmlsdGVyVmFsdWUgPT09ICdhbGwnIHx8ICFmaWx0ZXJWYWx1ZSB8fCBmaWx0ZXJWYWx1ZSA9PT0gJycpIHtcclxuICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlRmlsdGVyc1trZXldO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVGaWx0ZXJzW2tleV0gPSBmaWx0ZXJWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xyXG4gIH0qL1xyXG5cclxuICBwcml2YXRlIHNldHVwQ3VzdG9tRmlsdGVyKCkge1xyXG4gICAgdGhpcy5kYXRhLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhOiBhbnksIGZpbHRlcjogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSBKU09OLnBhcnNlKGZpbHRlciB8fCAne30nKTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgY29udGludWU7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgICBjYXNlICdVc2VyJzpcclxuICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9ICh2YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGlmICghZGF0YS51c2VyTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnU2l0ZSc6XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnNpdGVOYW1lICE9PSB0aGlzLmdldFNpdGVOYW1lRnJvbVZhbHVlKHZhbHVlIGFzIHN0cmluZykpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdVc2VyIFVwZ3JhZGUgU3RhdHVzJzpcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoZXNVcGdyYWRlU3RhdHVzKGRhdGEudXBncmFkZVN0YXR1cywgdmFsdWUgYXMgc3RyaW5nKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJzKCkge1xyXG4gICAgdGhpcy5kYXRhLmZpbHRlciA9IEpTT04uc3RyaW5naWZ5KHRoaXMuYWN0aXZlRmlsdGVycyk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWREYXRhQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGE/LmZpbHRlcmVkRGF0YT8ubGVuZ3RoIHx8IDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNpdGVOYW1lRnJvbVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgLy8gU2luY2Ugd2UncmUgbm93IHVzaW5nIGFjdHVhbCBzaXRlIG5hbWVzLCBqdXN0IGNvbnZlcnQgYmFjayBmcm9tIHNsdWcgZm9ybWF0XHJcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJy0nKS5tYXAod29yZCA9PlxyXG4gICAgICB3b3JkLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKVxyXG4gICAgKS5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hdGNoZXNVcGdyYWRlU3RhdHVzKHN0YXR1czogc3RyaW5nLCBmaWx0ZXJWYWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBIYW5kbGUgZGlyZWN0IHN0YXR1cyBtYXRjaGluZyBmb3IgY2xlYW5lciBpbXBsZW1lbnRhdGlvblxyXG4gICAgcmV0dXJuIHN0YXR1cy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKSA9PT0gZmlsdGVyVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIGdldFN0YXR1c0NsYXNzKHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoc3RhdHVzLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgY2FzZSAncmVhZHknOlxyXG4gICAgICAgIHJldHVybiAncmVhZHknO1xyXG4gICAgICBjYXNlICdub3QgcmVhZHknOlxyXG4gICAgICAgIHJldHVybiAnbm90LXJlYWR5JztcclxuICAgICAgY2FzZSAncGFydGlhbCByZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdwYXJ0aWFsLXJlYWR5JztcclxuICAgICAgY2FzZSAnY29tcGxldGVkJzpcclxuICAgICAgICByZXR1cm4gJ2NvbXBsZXRlZCc7XHJcbiAgICAgIGNhc2UgJ2ZhaWxlZCc6XHJcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnbm90LXJlYWR5JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWFkb25seSBwYWdlU2l6ZU9wdGlvbnMgPSBQQUdJTkFUSU9OX1NJWkVfT1BUSU9OUztcclxufVxyXG5cclxuaW50ZXJmYWNlIFBhZ2luYXRpb25EYXRhRHRvSW50ZXJmYWNlIHtcclxuICB0b3RhbDogbnVtYmVyO1xyXG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW107XHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICBwYWdlSW5kZXg6IG51bWJlcjtcclxufVxyXG5jbGFzcyBQYWdpbmF0aW9uRGF0YUR0byB7XHJcbiAgdG90YWwhOiBudW1iZXI7XHJcbiAgcGFnZVNpemVPcHRpb25zITogbnVtYmVyW107XHJcbiAgcGFnZVNpemUhOiBudW1iZXI7XHJcbiAgcGFnZUluZGV4ITogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihkYXRhPzogUGFnaW5hdGlvbkRhdGFEdG9JbnRlcmZhY2UpIHtcclxuICAgIHRoaXMucGFnZVNpemVPcHRpb25zID0gZGF0YT8ucGFnZVNpemVPcHRpb25zIHx8IFBBR0lOQVRJT05fREFUQV9ERUZBVUxUUy5PUFRJT05TO1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IGRhdGE/LnBhZ2VTaXplIHx8IFBBR0lOQVRJT05fREFUQV9ERUZBVUxUUy5TSVpFO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSBkYXRhPy5wYWdlSW5kZXggfHwgUEFHSU5BVElPTl9EQVRBX0RFRkFVTFRTLlBBR0VfSU5ERVg7XHJcbiAgICB0aGlzLnRvdGFsID0gZGF0YT8udG90YWwgfHwgMDtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IFBBR0lOQVRJT05fREFUQV9ERUZBVUxUUyA9IHtcclxuICBPUFRJT05TOiBbMTAsIDIwLCA1MCwgMTAwXSxcclxuICBTSVpFOiAxMCxcclxuICBQQUdFX0lOREVYOiAwXHJcbn07XHJcbiIsIjxkaXYgKm5nSWY9XCJkYXRhUGVuZGluZ1wiIGNsYXNzPVwib3ZlcmxheVwiPlxyXG4gIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxyXG4gICAgY2xhc3M9XCJwYWdlLXNwaW5uZXJcIlxyXG4gICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxyXG4gICAgW2RpYW1ldGVyXT1cIjcwXCJcclxuICAgIHN0cm9rZVdpZHRoPVwiM1wiXHJcbiAgICA+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGlkPVwidXNlclVwZ3JhZGVEYXRhVGFibGVcIiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLXVwZ3JhZGUtc3RhdHVzLXdyYXBwZXJcIj5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInVXNlcnMgYXJlIHJlYWR5IHRvIHVwZ3JhZGUnXCIgW3ZhbHVlXT1cInN0YXR1c0NvdW50c1snUmVhZHknXVwiPjwvdGstc3VtbWFyeS1jYXJkPlxyXG4gICAgICAgIDx0ay1zdW1tYXJ5LWNhcmQgW2Rlc2NyaXB0aW9uXT1cIidVc2VycyBhcmUgbm90IHJlYWR5J1wiIFt2YWx1ZV09XCJzdGF0dXNDb3VudHNbJ05vdCBSZWFkeSddXCIgW3N0YXR1c109XCInTm90IFJlYWR5J1wiPjwvdGstc3VtbWFyeS1jYXJkPlxyXG4gICAgICAgIDx0ay1zdW1tYXJ5LWNhcmQgW2Rlc2NyaXB0aW9uXT1cIidVc2VycyBmYWlsZWQgdG8gdXBncmFkZSdcIiBbdmFsdWVdPVwic3RhdHVzQ291bnRzWydGYWlsZWQnXVwiIFtzdGF0dXNdPVwiJ0ZhaWxlZCdcIj48L3RrLXN1bW1hcnktY2FyZD5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInU3VjY2Vzc2Z1bGx5IHVwZ3JhZGVkJ1wiIFt2YWx1ZV09XCJzdGF0dXNDb3VudHNbJ0NvbXBsZXRlZCddXCIgW3N0YXR1c109XCInQ29tcGxldGVkJ1wiPjwvdGstc3VtbWFyeS1jYXJkPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtYWN0aW9uLXBhbmVsXCI+XHJcbiAgICAgICAgPHRrLXRhYmxlLWZpbHRlcnMgKm5nSWY9XCJmaWx0ZXJzLmxlbmd0aCA+IDBcIiBbZmlsdGVyc109XCJmaWx0ZXJzXCIgKGZpbHRlcik9XCJvbkZpbHRlcigkZXZlbnQpXCI+PC90ay10YWJsZS1maWx0ZXJzPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24td3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57e2ZpbHRlcmVkRGF0YUNvdW50fX0gVXNlcnM8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInVwZ3JhZGUtYnVsay1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPT09IDBcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZ3JhZGVTZWxlY3RlZFVzZXJzKClcIj5cclxuICAgICAgICAgICAgICAgIFVwZ3JhZGUge3sgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCA/ICcnIDogJygnICsgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCArICcpJyB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhXCIgY2xhc3M9XCJ1c2VyLXVwZ3JhZGUtdGFibGVcIj5cclxuXHJcbiAgICAgICAgPCEtLSBDaGVja2JveCBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZSgpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUocm93KSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJTVEFUVVNfRU5UUklFU1tyb3cudXBncmFkZVN0YXR1c10gIT09ICdSZWFkeScgfHwgcm93LnBlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBVc2VyIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5Vc2VyPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1uYW1lXCI+e3tlbGVtZW50LnVzZXJOYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1lbWFpbFwiPnt7ZWxlbWVudC51c2VyTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBTaXRlIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNpdGVcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5TaXRlPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXRlLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yXCIgW25nQ2xhc3NdPVwiZ2V0U2l0ZVVwZ3JhZGVTdGF0dXNDbGFzcyhlbGVtZW50LnVwZ3JhZGVTdGF0dXMpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ZWxlbWVudC5zaXRlTmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGV2aWNlIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRldmljZVwiPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJkZXZpY2UtdGRcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+RGV2aWNlPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cIm11bHRpLWRldi1ib3hcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWxlbWVudC5zaG93RGV2aWNlc1wiIGNsYXNzPVwiZGV2aWNlLWxpc3Qgc2hvdy1kZXYtbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZGV2aWNlIG9mIGVsZW1lbnQuZGV2aWNlc1dpdGhFeHRlbnNpb25zOyBsZXQgbGFzdCA9IGxhc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldmljZS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5vLWJvcmRlcl09XCJsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLWluZGljYXRvclwiIFtuZ0NsYXNzXT1cInsnZGV2aWNlLWluZGljYXRvci1yZWFkeSc6IGVsZW1lbnQuZGV2aWNlU3RhdHVzID09PSAnUkVBRFknfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXZpY2UtbmFtZVwiPnt7IGRldmljZS5kZXZpY2VOYW1lIHx8IGRldmljZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXZpY2UtbW9kZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBkZXZpY2UuZXh0ZW5zaW9ucz8ubGVuZ3RoID8gJ0V4dDogJyArIGRldmljZS5leHRlbnNpb25zLmpvaW4oXCIsIFwiKSA6ICdObyBFeHRlbnNpb24nIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpcGxlLWRldi1saW5rXCIgKm5nSWY9XCJlbGVtZW50LmRldmljZXNXaXRoRXh0ZW5zaW9ucz8ubGVuZ3RoID4gMTsgZWxzZSBvbmVEZXZpY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZS1uYW1lLXdyYXBwZXIgY2xpY2thYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbk11bHRpcGxlRGV2aWNlcyhlbGVtZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25NdWx0aXBsZURldmljZXMoZWxlbWVudClcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1uYW1lXCI+TXVsdGlwbGUgZGV2aWNlcyA+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNvbmVEZXZpY2U+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZS1uYW1lLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLWluZGljYXRvclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLW5hbWVcIj57e2VsZW1lbnQuZGV2aWNlc1dpdGhFeHRlbnNpb25zWzBdLmRldmljZU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV2aWNlLW1vZGVsIG9uZS1kZXYtZXh0ZW5zaW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgZWxlbWVudC5kZXZpY2VzV2l0aEV4dGVuc2lvbnNbMF0uZXh0ZW5zaW9ucz8ubGVuZ3RoID9cclxuICAgICAgICAgICAgICAgICAgICAgICdFeHQ6ICcgKyBlbGVtZW50LmRldmljZXNXaXRoRXh0ZW5zaW9uc1swXS5leHRlbnNpb25zPy5qb2luKFwiLCBcIikgOiAnTm8gRXh0ZW5zaW9uJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGlhbCBQbGFuIFN0YXR1cyBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkaWFsUGxhblN0YXR1c1wiPlxyXG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkRpYWwgUGxhbiBTdGF0dXM8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQ2xhc3MoZWxlbWVudC5kaWFsUGxhblN0YXR1cylcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsnc3RhdHVzLXJlYWR5JzogZWxlbWVudC5kaWFsUGxhblN0YXR1cyA9PT0gJ1JFQURZJ31cIj57e1NUQVRVU19FTlRSSUVTW2VsZW1lbnQuZGlhbFBsYW5TdGF0dXNdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBEZXBlbmRlbmNpZXMgQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGVwZW5kZW5jaWVzXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+RGVwZW5kZW5jaWVzPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiREVQRU5ERU5DSUVTX1NUQVRVU1tlbGVtZW50LmRlcGVuZGVuY2llc1N0YXR1c10gPT09ICdEZXBlbmRlbmNpZXMgZm91bmQnXCIgY2xhc3M9XCJkZXBlbmRlbmNpZXMtdGV4dFwiPnt7REVQRU5ERU5DSUVTX1NUQVRVU1tlbGVtZW50LmRlcGVuZGVuY2llc1N0YXR1c119fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiREVQRU5ERU5DSUVTX1NUQVRVU1tlbGVtZW50LmRlcGVuZGVuY2llc1N0YXR1c10gPT09ICdObyBkZXBlbmRlbmNpZXMnXCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIFVzZXIgVXBncmFkZSBTdGF0dXMgQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXNlclVwZ3JhZGVTdGF0dXNcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5Vc2VyIFVwZ3JhZGUgU3RhdHVzPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGdyYWRlLXN0YXR1cy1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlNUQVRVU19FTlRSSUVTW2VsZW1lbnQudXBncmFkZVN0YXR1c10gPT09ICdSZWFkeSc7IGVsc2Ugc3RhdHVzQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwidXBncmFkZS1idXR0b25cIiAoY2xpY2spPVwidXBncmFkZVVzZXIoZWxlbWVudClcIj5VcGdyYWRlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdGF0dXNCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pbmRpY2F0b3JcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNDbGFzcyhlbGVtZW50LnVwZ3JhZGVTdGF0dXMpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tTVEFUVVNfRU5UUklFU1tlbGVtZW50LnVwZ3JhZGVTdGF0dXNdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJVcGdyYWRlTG9hZGVyXCI+XHJcbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1wcm9ncmVzcy1zcGlubmVyLXRkXCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG5cclxuICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxyXG4gICAgICAgICAgICAqbmdJZj1cImVsZW1lbnQucGVuZGluZ1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3Bpbm5lclwiXHJcbiAgICAgICAgICAgIFtkaWFtZXRlcl09XCIyMFwiXHJcbiAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCI+XHJcbiAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxyXG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZC1yb3ddPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiPjwvdHI+XHJcbiAgICA8L3RhYmxlPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJhcHAtcGFnaW5hdGlvblwiPlxyXG4gIDxtYXQtcGFnaW5hdG9yXHJcbiAgICBbbGVuZ3RoXT1cInBhZ2luYXRpb24udG90YWxcIlxyXG4gICAgW3BhZ2VTaXplXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxyXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdpbmF0aW9uLnBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICBbcGFnZUluZGV4XT1cInBhZ2luYXRpb24ucGFnZUluZGV4XCJcclxuICAgIChwYWdlKT1cInBhZ2VFdmVudCgkZXZlbnQpXCJcclxuICAgIHNob3dGaXJzdExhc3RCdXR0b25zPlxyXG4gIDwvbWF0LXBhZ2luYXRvcj5cclxuXHJcbiAgPCEtLTxkaXYgY2xhc3M9XCJwYWdlLWluZGV4ZXMtYm94XCI+XHJcbiAgICA8bWF0LXBhZ2luYXRvclxyXG4gICAgICBbaWRdPVwiJ2NvbW1vblBhZ2luYXRpb24nXCJcclxuICAgICAgW2hpZGVQYWdlU2l6ZV09XCJ0cnVlXCJcclxuICAgICAgW2xlbmd0aF09XCJwYWdpbmF0aW9uLnRvdGFsXCJcclxuICAgICAgW3BhZ2VJbmRleF09XCJwYWdpbmF0aW9uLnBhZ2VJbmRleFwiXHJcbiAgICAgIFtwYWdlU2l6ZV09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcclxuICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdpbmF0aW9uLnBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgIChwYWdlKT1cInBhZ2VFdmVudCgkZXZlbnQpXCI+XHJcbiAgICA8L21hdC1wYWdpbmF0b3I+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJwZXItcGFnZS1ibG9ja1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cIml0ZW1fcGVyX3BhZ2VcIj5JdGVtcyBwZXIgcGFnZTo8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtYm94IHNlbGVjdC1wYWdlLXNpemVcIj5cclxuICAgICAgPG1hdC1zZWxlY3QgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VQZXJQYWdlTnVtYmVyKCRldmVudClcIiAjcGFnZVxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiJ2NvbW1vblBhZ2luYXRpb25TZWxlY3QnXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwYWdlU2l6ZU9wdGlvbnM7IGxldCBpID0gaW5kZXg7XCIgW2lkXT1cIidwYWdpbmF0aW9uU2VsZWN0T3B0XycgKyBpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9ufX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj4tLT5cclxuPC9kaXY+XHJcbiJdfQ==
380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL2RpMm10L3dpZGdldHMvdXNlci11cGdyYWRlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9kaTJtdC93aWRnZXRzL3VzZXItdXBncmFkZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUFrQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUNMLGNBQWMsRUFJZCxrQkFBa0IsRUFDbkIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsbUJBQW1CLEVBQVUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7Ozs7OztBQVNsRixNQUFNLE9BQU8sNkJBQTZCO0lBTjFDO1FBT1UsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7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VSxDQUFDO1FBQ3hFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQsTUFBTSx3QkFBd0IsR0FBRztJQUMvQixPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDMUIsSUFBSSxFQUFFLEVBQUU7SUFDUixVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgaW5qZWN0LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL3R5cGVzL2RhdGEtdGFibGVcIjtcclxuaW1wb3J0IHsgVGFibGVGaWx0ZXIgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL3R5cGVzL3RhYmxlL2ZpbHRlclwiO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtcclxuICBGSUxURVJfS0VZX01BUCxcclxuICBVaUZpbHRlcktleSxcclxuICBVc2VyMlVwZ3JhZGVTdGF0dXNEVE8sXHJcbiAgVXNlclNlYXJjaFBhcmFtcyxcclxuICBVc2VyVXBncmFkZVNlcnZpY2VcclxufSBmcm9tIFwiLi4vdXNlci11cGdyYWRlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgREVQRU5ERU5DSUVTX1NUQVRVUywgU3RhdHVzLCBTVEFUVVNfRU5UUklFUyB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvdHlwZXMvY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IFVzZXJVcGdyYWRlUmVjb3JkIH0gZnJvbSBcIi4uL3R5cGVzL3VzZXItdXBncmFkZVwiO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQQUdJTkFUSU9OX1NJWkVfT1BUSU9OUyB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvY29uc3RhbnRzL2FwcC5jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGstdXNlci11cGdyYWRlLWRhdGEtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICAvLyBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb21cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJVcGdyYWRlRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgdXNlclVwZ3JhZGVTZXJ2aWNlID0gaW5qZWN0KFVzZXJVcGdyYWRlU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFQSVNlcnZpY2UpO1xyXG4gIHJlYWRvbmx5IFNUQVRVU19FTlRSSUVTID0gU1RBVFVTX0VOVFJJRVM7XHJcbiAgcmVhZG9ubHkgREVQRU5ERU5DSUVTX1NUQVRVUyA9IERFUEVOREVOQ0lFU19TVEFUVVM7XHJcblxyXG4gIEBJbnB1dCgpIGhvc3QhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdG9rZW4hOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY3VzdG9tZXJJZCE6IHN0cmluZztcclxuXHJcbiAgY29sdW1ucyE6IFRhYmxlQ29sdW1uW107XHJcbiAgZGF0YVBlbmRpbmcgPSBmYWxzZTtcclxuICBkYXRhITogTWF0VGFibGVEYXRhU291cmNlPFVzZXJVcGdyYWRlUmVjb3JkPjtcclxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFsnc2VsZWN0JywgJ3VzZXInLCAnc2l0ZScsICdkZXZpY2UnLCAnZGlhbFBsYW5TdGF0dXMnLCAnZGVwZW5kZW5jaWVzJywgJ3VzZXJVcGdyYWRlU3RhdHVzJywgJ3VzZXJVcGdyYWRlTG9hZGVyJ107XHJcbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPFVzZXJVcGdyYWRlUmVjb3JkPih0cnVlLCBbXSk7XHJcbiAgZmlsdGVyczogVGFibGVGaWx0ZXJbXSA9IFtdO1xyXG4gIHBhZ2luYXRpb24gPSBuZXcgUGFnaW5hdGlvbkRhdGFEdG8oKTtcclxuICB1c2VyczogVXNlclVwZ3JhZGVSZWNvcmRbXSA9IFtdO1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgc3RhdHVzQ291bnRzOiBhbnkgPSB7fTtcclxuXHJcbiAgcHJpdmF0ZSBhY3RpdmVGaWx0ZXJzOiBQYXJ0aWFsPFVzZXJTZWFyY2hQYXJhbXM+ID0ge307XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UudG9rZW4gPSB0aGlzLnRva2VuO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLmFwaVVybCA9IHRoaXMuaG9zdDtcclxuXHJcbiAgICB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5jdXN0b21lcklkID0gdGhpcy5jdXN0b21lcklkO1xyXG5cclxuICAgIGNvbnN0IHN1YnNjMSA9IHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmdldFVzZXJVcGdyYWRlUmVjb3Jkcyh0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUsIHRoaXMucGFnaW5hdGlvbi5wYWdlSW5kZXgsIHRoaXMuYWN0aXZlRmlsdGVycylcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHRzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCByZWNvcmRzID0gcmVzdWx0cy5jb250ZW50IGFzIFVzZXJVcGdyYWRlUmVjb3JkW11cclxuICAgICAgICByZWNvcmRzLmZvckVhY2gocmVjb3JkID0+IHtcclxuICAgICAgICAgIHJlY29yZC5kZXZpY2VzV2l0aEV4dGVuc2lvbnMgPSB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5tYXBEZXZpY2VzV2l0aEV4dGVuc2lvbnMocmVjb3JkLmRldmljZXMsIHJlY29yZC5kZXZpY2VEZXRhaWxzKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlY29yZHMpO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvbi50b3RhbCA9IHJlc3VsdHMudG90YWxFbGVtZW50cztcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXR1cEN1c3RvbUZpbHRlcigpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZpbHRlcnMocmVjb3Jkcyk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzYzEpO1xyXG5cclxuICAgIGNvbnN0IHN1YnNjMiA9IHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmdldFVzZXJVcGdyYWRlU3RhdHVzQ291bnRzKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChzdGF0dXNDb3VudHMpID0+IHtcclxuICAgICAgICB0aGlzLnN0YXR1c0NvdW50c1snUmVhZHknXSA9IHN0YXR1c0NvdW50c1snUkVBRFknXSB8fCAwO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQ291bnRzWydOb3QgUmVhZHknXSA9IHN0YXR1c0NvdW50c1snTk9UX1JFQURZJ10gfHwgMDtcclxuICAgICAgICB0aGlzLnN0YXR1c0NvdW50c1snQ29tcGxldGVkJ10gPSBzdGF0dXNDb3VudHNbJ0NPTVBMRVRFRCddIHx8IDA7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNDb3VudHNbJ0ZhaWxlZCddID0gc3RhdHVzQ291bnRzWydGQUlMRUQnXSB8fCAwO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc3Vic2MyKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTXVsdGlwbGVEZXZpY2VzKHVzZXI6IFVzZXJVcGdyYWRlUmVjb3JkKTogdm9pZCB7XHJcbiAgICB1c2VyLnNob3dEZXZpY2VzID0gIXVzZXIuc2hvd0RldmljZXM7XHJcbiAgfVxyXG5cclxuICBwYWdlRXZlbnQoZXZlbnQ6IFBhZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VJbmRleCA9IGV2ZW50LnBhZ2VJbmRleDtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xyXG4gICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBnZXRTaXRlVXBncmFkZVN0YXR1c0NsYXNzKHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAoc3RhdHVzLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgY2FzZSAncmVhZHknOlxyXG4gICAgICAgIHJldHVybiAnc3RhdHVzLXJlYWR5JztcclxuICAgICAgY2FzZSAncGFydGlhbCByZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdwYXJ0aWFsLXJlYWR5JztcclxuICAgICAgY2FzZSAnY29tcGxldGVkJzpcclxuICAgICAgICByZXR1cm4gJ2NvbXBsZXRlZCc7XHJcbiAgICAgIGNhc2UgJ2ZhaWxlZCc6XHJcbiAgICAgICAgcmV0dXJuICdmYWlsZWQnO1xyXG4gICAgICBjYXNlICdub3QgcmVhZHknOlxyXG4gICAgICAgIHJldHVybiAnbm90LXJlYWR5JztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ25vdC1yZWFkeSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VQZXJQYWdlTnVtYmVyKHBhZ2VTaXplRXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gcGFnZVNpemVFdmVudC52YWx1ZTtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlSW5kZXggPSAwO1xyXG4gICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERhdGEocGFyYW1zPzogVXNlclNlYXJjaFBhcmFtcyk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBzdWJzYzEgPSB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5nZXRVc2VyVXBncmFkZVJlY29yZHModGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplLCB0aGlzLnBhZ2luYXRpb24ucGFnZUluZGV4LCBwYXJhbXMgfHwge30pXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVjb3JkcyA9IHJlc3VsdC5jb250ZW50IGFzIFVzZXJVcGdyYWRlUmVjb3JkW11cclxuICAgICAgICByZWNvcmRzLmZvckVhY2gocmVjb3JkID0+IHtcclxuICAgICAgICAgIHJlY29yZC5kZXZpY2VzV2l0aEV4dGVuc2lvbnMgPSB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5tYXBEZXZpY2VzV2l0aEV4dGVuc2lvbnMocmVjb3JkLmRldmljZXMsIHJlY29yZC5kZXZpY2VEZXRhaWxzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyZWNvcmRzKTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb24udG90YWwgPSByZXN1bHQudG90YWxFbGVtZW50cztcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzYzEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplRmlsdGVycyhyZWNvcmRzOiBVc2VyVXBncmFkZVJlY29yZFtdKTogdm9pZCB7XHJcbiAgICBpZiAoIXJlY29yZHM/Lmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmZpbHRlcnMgPSBbXTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEV4dHJhY3QgdW5pcXVlIHNpdGVzIChza2lwIGVtcHR5L251bGwpXHJcbiAgICBjb25zdCB1bmlxdWVTaXRlcyA9IFtcclxuICAgICAgLi4ubmV3IFNldChcclxuICAgICAgICByZWNvcmRzXHJcbiAgICAgICAgICAubWFwKHJlY29yZCA9PiByZWNvcmQuc2l0ZU5hbWU/LnRyaW0oKSlcclxuICAgICAgICAgIC5maWx0ZXIoKHNpdGUpOiBzaXRlIGlzIHN0cmluZyA9PiAhIXNpdGUpXHJcbiAgICAgIClcclxuICAgIF07XHJcblxyXG4gICAgY29uc3Qgc2l0ZU9wdGlvbnMgPSB1bmlxdWVTaXRlcy5tYXAoc2l0ZSA9PiAoe1xyXG4gICAgICBsYWJlbDogc2l0ZSxcclxuICAgICAgdmFsdWU6IHNpdGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJylcclxuICAgIH0pKTtcclxuXHJcbiAgICAvLyBFeHRyYWN0IHVuaXF1ZSBzdGF0dXNlcyAoc2tpcCBlbXB0eS9udWxsKVxyXG4gICAgY29uc3QgdW5pcXVlU3RhdHVzZXMgPSBbXHJcbiAgICAgIC4uLm5ldyBTZXQoXHJcbiAgICAgICAgcmVjb3Jkc1xyXG4gICAgICAgICAgLm1hcChyZWNvcmQgPT4gcmVjb3JkLnVwZ3JhZGVTdGF0dXM/LnRyaW0oKSlcclxuICAgICAgICAgIC5maWx0ZXIoKHN0YXR1cyk6IHN0YXR1cyBpcyBzdHJpbmcgPT4gISFzdGF0dXMpXHJcbiAgICAgIClcclxuICAgIF07XHJcblxyXG4gICAgY29uc3Qgc3RhdHVzT3B0aW9ucyA9IHVuaXF1ZVN0YXR1c2VzLm1hcChzdGF0dXMgPT4gKHtcclxuICAgICAgbGFiZWw6IFNUQVRVU19FTlRSSUVTW3N0YXR1c10sXHJcbiAgICAgIHZhbHVlOiBzdGF0dXMudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJylcclxuICAgIH0pKTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnMgPSBbXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogJ3VzZXJOYW1lJyxcclxuICAgICAgICB0eXBlOiAnc2VhcmNoJyxcclxuICAgICAgICBjb2x1bW5LZXk6ICdVc2VyJyxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCB1c2Vycy4uLicsXHJcbiAgICAgICAgb3B0aW9uczogW11cclxuICAgICAgfVxyXG4gICAgXTtcclxuXHJcbiAgICBpZiAoc2l0ZU9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVycy5wdXNoKHtcclxuICAgICAgICBpZDogJ3NpdGVzJyxcclxuICAgICAgICB0eXBlOiAnc2VsZWN0JyxcclxuICAgICAgICBjb2x1bW5LZXk6ICdTaXRlJyxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NpdGVzJyxcclxuICAgICAgICBvcHRpb25zOiBzaXRlT3B0aW9uc1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RhdHVzT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5maWx0ZXJzLnB1c2goe1xyXG4gICAgICAgIGlkOiAnc3RhdHVzJyxcclxuICAgICAgICB0eXBlOiAnc2VsZWN0JyxcclxuICAgICAgICBjb2x1bW5LZXk6ICdVc2VyIFVwZ3JhZGUgU3RhdHVzJyxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ1VwZ3JhZGUgU3RhdHVzJyxcclxuICAgICAgICBvcHRpb25zOiBzdGF0dXNPcHRpb25zXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbGVtZW50cyBtYXRjaGVzIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cy4gKi9cclxuICBpc0FsbFNlbGVjdGVkKCkge1xyXG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XHJcbiAgICBjb25zdCBudW1Sb3dzID0gdGhpcy5kYXRhPy5kYXRhLmxlbmd0aCA/PyAwO1xyXG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNlbGVjdHMgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cclxuICBtYXN0ZXJUb2dnbGUoKSB7XHJcbiAgICAvLyB0aGlzLmlzQWxsU2VsZWN0ZWQoKSA/XHJcbiAgICAvLyAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCkgOlxyXG4gICAgLy8gICB0aGlzLmRhdGE/LmRhdGEuZm9yRWFjaChyb3cgPT4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdykpO1xyXG4gICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGE/LmRhdGEuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICAgIGlmIChyb3cudXBncmFkZVN0YXR1cyA9PT0gJ1JFQURZJykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KHJvdylcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBncmFkZVVzZXIodXNlcjogVXNlclVwZ3JhZGVSZWNvcmQpOiB2b2lkIHtcclxuICAgIGlmICh1c2VyPy51cGdyYWRlU3RhdHVzID09PSAnUkVBRFknKVxyXG4gICAgICB1c2VyLnBlbmRpbmcgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmNvbGxlY3RVc2VycyhbdXNlcl0pXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuYnVsa1VwZ3JhZGUoW3VzZXJdKVxyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0dXNBZnRlclVwZ3JhZGUoW3VzZXJdKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVXNlcnNTdGF0dXNBZnRlclVwZ3JhZGUodXNlcnM6IFVzZXJVcGdyYWRlUmVjb3JkW10pOiB2b2lkIHtcclxuICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmdldFVzZXJzVXBncmFkZVN0YXR1c2VzKHVzZXJzKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHVwZ3JhZGVkU3RhdHVzZXM6IFVzZXIyVXBncmFkZVN0YXR1c0RUT1tdKSA9PiB7XHJcbiAgICAgICAgdXBncmFkZWRTdGF0dXNlcy5mb3JFYWNoKHN0YXR1c0l0ZW0gPT4ge1xyXG4gICAgICAgICAgY29uc3QgaW5kID0gdGhpcy5nZXRVc2VySW5kZXgoc3RhdHVzSXRlbS51c2VySWQpO1xyXG4gICAgICAgICAgaWYgKGluZCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5kYXRhW2luZF0udXBncmFkZVN0YXR1cyA9IHN0YXR1c0l0ZW0udXBncmFkZVN0YXR1cztcclxuICAgICAgICAgICAgdGhpcy5kYXRhLmRhdGFbaW5kXS5wZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5kYXRhUGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFVzZXJJbmRleCh1c2VySWQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhLmRhdGEuZmluZEluZGV4KChyZWNvcmQ6IFVzZXJVcGdyYWRlUmVjb3JkKSA9PiByZWNvcmQudXNlcklkID09PSB1c2VySWQpO1xyXG4gIH1cclxuXHJcbiAgdXBncmFkZVNlbGVjdGVkVXNlcnMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuZGF0YVBlbmRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuY29sbGVjdFVzZXJzKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmJ1bGtVcGdyYWRlKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKVxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlcnNTdGF0dXNBZnRlclVwZ3JhZGUodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmJ1bGtVcGdyYWRlKHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmlsdGVyVmFsdWUoaW5wdXQ6IGFueSk6IGFueSB7XHJcbiAgICBpZiAoaW5wdXQgJiYgaW5wdXQudmFsdWUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGlucHV0LnZhbHVlOyAgICAgIC8vIGUuZy4ge3ZhbHVlLGxhYmVsfVxyXG4gICAgaWYgKGlucHV0ICYmIGlucHV0LnRhcmdldCkgcmV0dXJuIGlucHV0LnRhcmdldC52YWx1ZTsgICAgICAgICAgICAvLyBET00gZXZlbnRcclxuICAgIHJldHVybiBpbnB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxhaW4gdmFsdWVcclxuICB9XHJcbiAgcHJpdmF0ZSBpc0VtcHR5RmlsdGVyKHY6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgcyA9IHYudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIHJldHVybiBzID09PSAnJyB8fCBzID09PSAnYWxsJztcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uRmlsdGVyKGZpbHRlckV2ZW50OiB7IGtleTogVWlGaWx0ZXJLZXk7IHZhbHVlOiBhbnkgfSkge1xyXG4gICAgY29uc3QgcmF3S2V5ID0gZmlsdGVyRXZlbnQua2V5O1xyXG4gICAgY29uc3Qgc2VydmVyS2V5ID0gRklMVEVSX0tFWV9NQVBbcmF3S2V5XTtcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRGaWx0ZXJWYWx1ZShmaWx0ZXJFdmVudC52YWx1ZSk7XHJcblxyXG4gICAgY29uc3QgbmV4dDogUGFydGlhbDxVc2VyU2VhcmNoUGFyYW1zPiA9IHsgLi4udGhpcy5hY3RpdmVGaWx0ZXJzIH07XHJcblxyXG4gICAgaWYgKHRoaXMuaXNFbXB0eUZpbHRlcih2YWx1ZSkpIHtcclxuICAgICAgZGVsZXRlIG5leHRbc2VydmVyS2V5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIG5vcm1hbGl6ZSB0byBzdHJpbmcgZm9yIEFQSSAodHJpbSlcclxuICAgICAgbmV4dFtzZXJ2ZXJLZXldID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRyaW0oKSA6IFN0cmluZyh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hY3RpdmVGaWx0ZXJzID0gbmV4dDtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlSW5kZXggPSAwO1xyXG5cclxuICAgIC8vIHF1aWNrIGZpeCBmb3IgZGVtb1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlRmlsdGVyc1sndXBncmFkZVN0YXR1cyddKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlRmlsdGVyc1sndXBncmFkZVN0YXR1cyddID0gdGhpcy5hY3RpdmVGaWx0ZXJzWyd1cGdyYWRlU3RhdHVzJ10/LnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXREYXRhKHRoaXMuYWN0aXZlRmlsdGVycyBhcyBVc2VyU2VhcmNoUGFyYW1zKTtcclxuICB9XHJcblxyXG4gIC8qb25GaWx0ZXIoZmlsdGVyRXZlbnQ6IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkgfSkge1xyXG4gICAgY29uc3Qge2tleSwgdmFsdWV9ID0gZmlsdGVyRXZlbnQ7XHJcblxyXG4gICAgbGV0IGZpbHRlclZhbHVlOiBhbnk7XHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9IHZhbHVlLnZhbHVlO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS50YXJnZXQpIHtcclxuICAgICAgZmlsdGVyVmFsdWUgPSB2YWx1ZS50YXJnZXQudmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBcIkFsbFwiIG9wdGlvbiBvciBlbXB0eSB2YWx1ZXMgLSByZW1vdmUgdGhlIGZpbHRlclxyXG4gICAgaWYgKGZpbHRlclZhbHVlID09PSAnYWxsJyB8fCAhZmlsdGVyVmFsdWUgfHwgZmlsdGVyVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZUZpbHRlcnNba2V5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlRmlsdGVyc1trZXldID0gZmlsdGVyVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcclxuICB9Ki9cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEN1c3RvbUZpbHRlcigpIHtcclxuICAgIHRoaXMuZGF0YS5maWx0ZXJQcmVkaWNhdGUgPSAoZGF0YTogYW55LCBmaWx0ZXI6IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJzID0gSlNPTi5wYXJzZShmaWx0ZXIgfHwgJ3t9Jyk7XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXJzKSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGtleSkge1xyXG4gICAgICAgICAgY2FzZSAnVXNlcic6XHJcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSAodmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAoIWRhdGEudXNlck5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ1NpdGUnOlxyXG4gICAgICAgICAgICBpZiAoZGF0YS5zaXRlTmFtZSAhPT0gdGhpcy5nZXRTaXRlTmFtZUZyb21WYWx1ZSh2YWx1ZSBhcyBzdHJpbmcpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnVXNlciBVcGdyYWRlIFN0YXR1cyc6XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaGVzVXBncmFkZVN0YXR1cyhkYXRhLnVwZ3JhZGVTdGF0dXMsIHZhbHVlIGFzIHN0cmluZykpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5RmlsdGVycygpIHtcclxuICAgIHRoaXMuZGF0YS5maWx0ZXIgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZUZpbHRlcnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkRGF0YUNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCB8fCAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTaXRlTmFtZUZyb21WYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIC8vIFNpbmNlIHdlJ3JlIG5vdyB1c2luZyBhY3R1YWwgc2l0ZSBuYW1lcywganVzdCBjb252ZXJ0IGJhY2sgZnJvbSBzbHVnIGZvcm1hdFxyXG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KCctJykubWFwKHdvcmQgPT5cclxuICAgICAgd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSlcclxuICAgICkuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXRjaGVzVXBncmFkZVN0YXR1cyhzdGF0dXM6IHN0cmluZywgZmlsdGVyVmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgLy8gSGFuZGxlIGRpcmVjdCBzdGF0dXMgbWF0Y2hpbmcgZm9yIGNsZWFuZXIgaW1wbGVtZW50YXRpb25cclxuICAgIHJldHVybiBzdGF0dXMudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICctJykgPT09IGZpbHRlclZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0dXNDbGFzcyhzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKHN0YXR1cy50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIGNhc2UgJ3JlYWR5JzpcclxuICAgICAgICByZXR1cm4gJ3JlYWR5JztcclxuICAgICAgY2FzZSAnbm90IHJlYWR5JzpcclxuICAgICAgICByZXR1cm4gJ25vdC1yZWFkeSc7XHJcbiAgICAgIGNhc2UgJ3BhcnRpYWwgcmVhZHknOlxyXG4gICAgICAgIHJldHVybiAncGFydGlhbC1yZWFkeSc7XHJcbiAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XHJcbiAgICAgICAgcmV0dXJuICdjb21wbGV0ZWQnO1xyXG4gICAgICBjYXNlICdmYWlsZWQnOlxyXG4gICAgICAgIHJldHVybiAnZmFpbGVkJztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ25vdC1yZWFkeSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFnZVNpemVPcHRpb25zID0gUEFHSU5BVElPTl9TSVpFX09QVElPTlM7XHJcbn1cclxuXHJcbmludGVyZmFjZSBQYWdpbmF0aW9uRGF0YUR0b0ludGVyZmFjZSB7XHJcbiAgdG90YWw6IG51bWJlcjtcclxuICBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdO1xyXG4gIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgcGFnZUluZGV4OiBudW1iZXI7XHJcbn1cclxuY2xhc3MgUGFnaW5hdGlvbkRhdGFEdG8ge1xyXG4gIHRvdGFsITogbnVtYmVyO1xyXG4gIHBhZ2VTaXplT3B0aW9ucyE6IG51bWJlcltdO1xyXG4gIHBhZ2VTaXplITogbnVtYmVyO1xyXG4gIHBhZ2VJbmRleCE6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoZGF0YT86IFBhZ2luYXRpb25EYXRhRHRvSW50ZXJmYWNlKSB7XHJcbiAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IGRhdGE/LnBhZ2VTaXplT3B0aW9ucyB8fCBQQUdJTkFUSU9OX0RBVEFfREVGQVVMVFMuT1BUSU9OUztcclxuICAgIHRoaXMucGFnZVNpemUgPSBkYXRhPy5wYWdlU2l6ZSB8fCBQQUdJTkFUSU9OX0RBVEFfREVGQVVMVFMuU0laRTtcclxuICAgIHRoaXMucGFnZUluZGV4ID0gZGF0YT8ucGFnZUluZGV4IHx8IFBBR0lOQVRJT05fREFUQV9ERUZBVUxUUy5QQUdFX0lOREVYO1xyXG4gICAgdGhpcy50b3RhbCA9IGRhdGE/LnRvdGFsIHx8IDA7XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBQQUdJTkFUSU9OX0RBVEFfREVGQVVMVFMgPSB7XHJcbiAgT1BUSU9OUzogWzEwLCAyMCwgNTAsIDEwMF0sXHJcbiAgU0laRTogMTAsXHJcbiAgUEFHRV9JTkRFWDogMFxyXG59O1xyXG4iLCI8dGstbG9hZGVyICpuZ0lmPVwiZGF0YVBlbmRpbmdcIiBiYWNrZHJvcD1cInJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KVwiPjwvdGstbG9hZGVyPlxyXG5cclxuPGRpdiBpZD1cInVzZXJVcGdyYWRlRGF0YVRhYmxlXCIgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidXNlci11cGdyYWRlLXN0YXR1cy13cmFwcGVyXCI+XHJcbiAgICAgICAgPHRrLXN1bW1hcnktY2FyZCBbZGVzY3JpcHRpb25dPVwiJ1VzZXJzIGFyZSByZWFkeSB0byB1cGdyYWRlJ1wiIFt2YWx1ZV09XCJzdGF0dXNDb3VudHNbJ1JlYWR5J11cIj48L3RrLXN1bW1hcnktY2FyZD5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInVXNlcnMgYXJlIG5vdCByZWFkeSdcIiBbdmFsdWVdPVwic3RhdHVzQ291bnRzWydOb3QgUmVhZHknXVwiIFtzdGF0dXNdPVwiJ05vdCBSZWFkeSdcIj48L3RrLXN1bW1hcnktY2FyZD5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInVXNlcnMgZmFpbGVkIHRvIHVwZ3JhZGUnXCIgW3ZhbHVlXT1cInN0YXR1c0NvdW50c1snRmFpbGVkJ11cIiBbc3RhdHVzXT1cIidGYWlsZWQnXCI+PC90ay1zdW1tYXJ5LWNhcmQ+XHJcbiAgICAgICAgPHRrLXN1bW1hcnktY2FyZCBbZGVzY3JpcHRpb25dPVwiJ1N1Y2Nlc3NmdWxseSB1cGdyYWRlZCdcIiBbdmFsdWVdPVwic3RhdHVzQ291bnRzWydDb21wbGV0ZWQnXVwiIFtzdGF0dXNdPVwiJ0NvbXBsZXRlZCdcIj48L3RrLXN1bW1hcnktY2FyZD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWFjdGlvbi1wYW5lbFwiPlxyXG4gICAgICAgIDx0ay10YWJsZS1maWx0ZXJzICpuZ0lmPVwiZmlsdGVycy5sZW5ndGggPiAwXCIgW2ZpbHRlcnNdPVwiZmlsdGVyc1wiIChmaWx0ZXIpPVwib25GaWx0ZXIoJGV2ZW50KVwiPjwvdGstdGFibGUtZmlsdGVycz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3tmaWx0ZXJlZERhdGFDb3VudH19IFVzZXJzPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ1cGdyYWRlLWJ1bGstYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID09PSAwXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGdyYWRlU2VsZWN0ZWRVc2VycygpXCI+XHJcbiAgICAgICAgICAgICAgICBVcGdyYWRlIHt7IHNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPT09IDAgPyAnJyA6ICcoJyArIHNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggKyAnKScgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVwiIGNsYXNzPVwidXNlci11cGdyYWRlLXRhYmxlXCI+XHJcblxyXG4gICAgICAgIDwhLS0gQ2hlY2tib3ggQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIGlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBzZWxlY3Rpb24udG9nZ2xlKHJvdykgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiU1RBVFVTX0VOVFJJRVNbcm93LnVwZ3JhZGVTdGF0dXNdICE9PSAnUmVhZHknIHx8IHJvdy5wZW5kaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gVXNlciBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1c2VyXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+VXNlcjwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItbmFtZVwiPnt7ZWxlbWVudC51c2VyTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItZW1haWxcIj57e2VsZW1lbnQudXNlck5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gU2l0ZSBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzaXRlXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+U2l0ZTwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2l0ZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWluZGljYXRvclwiIFtuZ0NsYXNzXT1cImdldFNpdGVVcGdyYWRlU3RhdHVzQ2xhc3MoZWxlbWVudC51cGdyYWRlU3RhdHVzKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2VsZW1lbnQuc2l0ZU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIERldmljZSBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXZpY2VcIj5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiZGV2aWNlLXRkXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkRldmljZTwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgY2xhc3M9XCJtdWx0aS1kZXYtYm94XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVsZW1lbnQuc2hvd0RldmljZXNcIiBjbGFzcz1cImRldmljZS1saXN0IHNob3ctZGV2LWxpc3RcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRldmljZSBvZiBlbGVtZW50LmRldmljZXNXaXRoRXh0ZW5zaW9uczsgbGV0IGxhc3QgPSBsYXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXZpY2UtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5uby1ib3JkZXJdPVwibGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1pbmRpY2F0b3JcIiBbbmdDbGFzc109XCJ7J2RldmljZS1pbmRpY2F0b3ItcmVhZHknOiBlbGVtZW50LmRldmljZVN0YXR1cyA9PT0gJ1JFQURZJ31cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLW5hbWVcIj57eyBkZXZpY2UuZGV2aWNlTmFtZSB8fCBkZXZpY2UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLW1vZGVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZGV2aWNlLmV4dGVuc2lvbnM/Lmxlbmd0aCA/ICdFeHQ6ICcgKyBkZXZpY2UuZXh0ZW5zaW9ucy5qb2luKFwiLCBcIikgOiAnTm8gRXh0ZW5zaW9uJyB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aXBsZS1kZXYtbGlua1wiICpuZ0lmPVwiZWxlbWVudC5kZXZpY2VzV2l0aEV4dGVuc2lvbnM/Lmxlbmd0aCA+IDE7IGVsc2Ugb25lRGV2aWNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtbmFtZS13cmFwcGVyIGNsaWNrYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25NdWx0aXBsZURldmljZXMoZWxlbWVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uTXVsdGlwbGVEZXZpY2VzKGVsZW1lbnQpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXZpY2UtbmFtZVwiPk11bHRpcGxlIGRldmljZXMgPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb25lRGV2aWNlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtbmFtZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1pbmRpY2F0b3JcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1uYW1lXCI+e3tlbGVtZW50LmRldmljZXNXaXRoRXh0ZW5zaW9uc1swXS5kZXZpY2VOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldmljZS1tb2RlbCBvbmUtZGV2LWV4dGVuc2lvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGVsZW1lbnQuZGV2aWNlc1dpdGhFeHRlbnNpb25zWzBdLmV4dGVuc2lvbnM/Lmxlbmd0aCA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAnRXh0OiAnICsgZWxlbWVudC5kZXZpY2VzV2l0aEV4dGVuc2lvbnNbMF0uZXh0ZW5zaW9ucz8uam9pbihcIiwgXCIpIDogJ05vIEV4dGVuc2lvbicgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIERpYWwgUGxhbiBTdGF0dXMgQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGlhbFBsYW5TdGF0dXNcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5EaWFsIFBsYW4gU3RhdHVzPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWluZGljYXRvclwiIFtuZ0NsYXNzXT1cImdldFN0YXR1c0NsYXNzKGVsZW1lbnQuZGlhbFBsYW5TdGF0dXMpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJ7J3N0YXR1cy1yZWFkeSc6IGVsZW1lbnQuZGlhbFBsYW5TdGF0dXMgPT09ICdSRUFEWSd9XCI+e3tTVEFUVVNfRU5UUklFU1tlbGVtZW50LmRpYWxQbGFuU3RhdHVzXX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGVwZW5kZW5jaWVzIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlcGVuZGVuY2llc1wiPlxyXG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkRlcGVuZGVuY2llczwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIkRFUEVOREVOQ0lFU19TVEFUVVNbZWxlbWVudC5kZXBlbmRlbmNpZXNTdGF0dXNdID09PSAnRGVwZW5kZW5jaWVzIGZvdW5kJ1wiIGNsYXNzPVwiZGVwZW5kZW5jaWVzLXRleHRcIj57e0RFUEVOREVOQ0lFU19TVEFUVVNbZWxlbWVudC5kZXBlbmRlbmNpZXNTdGF0dXNdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIkRFUEVOREVOQ0lFU19TVEFUVVNbZWxlbWVudC5kZXBlbmRlbmNpZXNTdGF0dXNdID09PSAnTm8gZGVwZW5kZW5jaWVzJ1wiPuKAlDwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBVc2VyIFVwZ3JhZGUgU3RhdHVzIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJVcGdyYWRlU3RhdHVzXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+VXNlciBVcGdyYWRlIFN0YXR1czwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXBncmFkZS1zdGF0dXMtY2VsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJTVEFUVVNfRU5UUklFU1tlbGVtZW50LnVwZ3JhZGVTdGF0dXNdID09PSAnUmVhZHknOyBlbHNlIHN0YXR1c0Jsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cInVwZ3JhZGUtYnV0dG9uXCIgKGNsaWNrKT1cInVwZ3JhZGVVc2VyKGVsZW1lbnQpXCI+VXBncmFkZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdHVzQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQ2xhc3MoZWxlbWVudC51cGdyYWRlU3RhdHVzKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7U1RBVFVTX0VOVFJJRVNbZWxlbWVudC51cGdyYWRlU3RhdHVzXX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ1c2VyVXBncmFkZUxvYWRlclwiPlxyXG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+PC90aD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci10ZFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuXHJcbiAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcclxuICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50LnBlbmRpbmdcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZpZWxkLXNwaW5uZXJcIlxyXG4gICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMjBcIlxyXG4gICAgICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPlxyXG4gICAgICAgICAgPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cclxuICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIlxyXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWQtcm93XT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIj48L3RyPlxyXG4gICAgPC90YWJsZT5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiYXBwLXBhZ2luYXRpb25cIj5cclxuICA8bWF0LXBhZ2luYXRvclxyXG4gICAgW2xlbmd0aF09XCJwYWdpbmF0aW9uLnRvdGFsXCJcclxuICAgIFtwYWdlU2l6ZV09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcclxuICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnaW5hdGlvbi5wYWdlU2l6ZU9wdGlvbnNcIlxyXG4gICAgW3BhZ2VJbmRleF09XCJwYWdpbmF0aW9uLnBhZ2VJbmRleFwiXHJcbiAgICAocGFnZSk9XCJwYWdlRXZlbnQoJGV2ZW50KVwiXHJcbiAgICBzaG93Rmlyc3RMYXN0QnV0dG9ucz5cclxuICA8L21hdC1wYWdpbmF0b3I+XHJcblxyXG4gIDwhLS08ZGl2IGNsYXNzPVwicGFnZS1pbmRleGVzLWJveFwiPlxyXG4gICAgPG1hdC1wYWdpbmF0b3JcclxuICAgICAgW2lkXT1cIidjb21tb25QYWdpbmF0aW9uJ1wiXHJcbiAgICAgIFtoaWRlUGFnZVNpemVdPVwidHJ1ZVwiXHJcbiAgICAgIFtsZW5ndGhdPVwicGFnaW5hdGlvbi50b3RhbFwiXHJcbiAgICAgIFtwYWdlSW5kZXhdPVwicGFnaW5hdGlvbi5wYWdlSW5kZXhcIlxyXG4gICAgICBbcGFnZVNpemVdPVwicGFnaW5hdGlvbi5wYWdlU2l6ZVwiXHJcbiAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnaW5hdGlvbi5wYWdlU2l6ZU9wdGlvbnNcIlxyXG4gICAgICAocGFnZSk9XCJwYWdlRXZlbnQoJGV2ZW50KVwiPlxyXG4gICAgPC9tYXQtcGFnaW5hdG9yPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwicGVyLXBhZ2UtYmxvY2tcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJpdGVtX3Blcl9wYWdlXCI+SXRlbXMgcGVyIHBhZ2U6PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWJveCBzZWxlY3QtcGFnZS1zaXplXCI+XHJcbiAgICAgIDxtYXQtc2VsZWN0IChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hhbmdlUGVyUGFnZU51bWJlcigkZXZlbnQpXCIgI3BhZ2VcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidjb21tb25QYWdpbmF0aW9uU2VsZWN0J1wiPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcGFnZVNpemVPcHRpb25zOyBsZXQgaSA9IGluZGV4O1wiIFtpZF09XCIncGFnaW5hdGlvblNlbGVjdE9wdF8nICsgaVwiIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbn19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+LS0+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -6,6 +6,7 @@ import { MatTableModule } from "@angular/material/table";
6
6
  import { SharedModule } from "../../shared/shared.module";
7
7
  import { MatCheckboxModule } from "@angular/material/checkbox";
8
8
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
9
+ import { TkLoaderComponent } from '@tuki-io/tuki-widgets/shared';
9
10
  import { MatOptionModule } from '@angular/material/core';
10
11
  import { MatPaginatorModule } from '@angular/material/paginator';
11
12
  import { MatSelectModule } from '@angular/material/select';
@@ -13,7 +14,8 @@ import * as i0 from "@angular/core";
13
14
  export class UserUpgradeModule {
14
15
  }
15
16
  UserUpgradeModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
16
- UserUpgradeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeModule, declarations: [UserUpgradeDataTableComponent], imports: [CommonModule,
17
+ UserUpgradeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeModule, declarations: [UserUpgradeDataTableComponent], imports: [TkLoaderComponent,
18
+ CommonModule,
17
19
  SharedModule,
18
20
  MatTableModule,
19
21
  MatButtonModule,
@@ -23,7 +25,8 @@ UserUpgradeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versi
23
25
  MatOptionModule,
24
26
  MatPaginatorModule,
25
27
  MatSelectModule], exports: [UserUpgradeDataTableComponent] });
26
- UserUpgradeModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeModule, imports: [CommonModule,
28
+ UserUpgradeModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeModule, imports: [TkLoaderComponent,
29
+ CommonModule,
27
30
  SharedModule,
28
31
  MatTableModule,
29
32
  MatButtonModule,
@@ -40,6 +43,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
40
43
  UserUpgradeDataTableComponent
41
44
  ],
42
45
  imports: [
46
+ TkLoaderComponent,
43
47
  CommonModule,
44
48
  SharedModule,
45
49
  MatTableModule,
@@ -56,4 +60,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
56
60
  ]
57
61
  }]
58
62
  }] });
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci11cGdyYWRlLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9kaTJtdC93aWRnZXRzL3VzZXItdXBncmFkZS91c2VyLXVwZ3JhZGUubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDNUcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBc0IzRCxNQUFNLE9BQU8saUJBQWlCOzsrR0FBakIsaUJBQWlCO2dIQUFqQixpQkFBaUIsaUJBbEIxQiw2QkFBNkIsYUFHN0IsWUFBWTtRQUNaLFlBQVk7UUFDWixjQUFjO1FBQ2QsZUFBZTtRQUNmLGlCQUFpQjtRQUNqQixlQUFlO1FBQ2Ysd0JBQXdCO1FBQ3hCLGVBQWU7UUFDZixrQkFBa0I7UUFDbEIsZUFBZSxhQUdmLDZCQUE2QjtnSEFHcEIsaUJBQWlCLFlBZjFCLFlBQVk7UUFDWixZQUFZO1FBQ1osY0FBYztRQUNkLGVBQWU7UUFDZixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLHdCQUF3QjtRQUN4QixlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLGVBQWU7NEZBTU4saUJBQWlCO2tCQXBCN0IsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osNkJBQTZCO3FCQUM5QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGVBQWU7d0JBQ2Ysd0JBQXdCO3dCQUN4QixlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsZUFBZTtxQkFDaEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLDZCQUE2QjtxQkFDOUI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFVzZXJVcGdyYWRlRGF0YVRhYmxlQ29tcG9uZW50IH0gZnJvbSBcIi4vdXNlci11cGdyYWRlLWRhdGEtdGFibGUvdXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xyXG5pbXBvcnQgeyBNYXRUYWJsZU1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90YWJsZVwiO1xyXG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3NoYXJlZC5tb2R1bGVcIjtcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XHJcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIFVzZXJVcGdyYWRlRGF0YVRhYmxlQ29tcG9uZW50XHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBTaGFyZWRNb2R1bGUsXHJcbiAgICBNYXRUYWJsZU1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxyXG4gICAgTWF0T3B0aW9uTW9kdWxlLFxyXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlXHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBVc2VyVXBncmFkZURhdGFUYWJsZUNvbXBvbmVudFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJVcGdyYWRlTW9kdWxlIHtcclxufVxyXG4iXX0=
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci11cGdyYWRlLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9kaTJtdC93aWRnZXRzL3VzZXItdXBncmFkZS91c2VyLXVwZ3JhZGUubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDNUcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBdUIzRCxNQUFNLE9BQU8saUJBQWlCOzsrR0FBakIsaUJBQWlCO2dIQUFqQixpQkFBaUIsaUJBbkIxQiw2QkFBNkIsYUFHN0IsaUJBQWlCO1FBQ2pCLFlBQVk7UUFDWixZQUFZO1FBQ1osY0FBYztRQUNkLGVBQWU7UUFDZixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLHdCQUF3QjtRQUN4QixlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLGVBQWUsYUFHZiw2QkFBNkI7Z0hBR3BCLGlCQUFpQixZQWhCMUIsaUJBQWlCO1FBQ2pCLFlBQVk7UUFDWixZQUFZO1FBQ1osY0FBYztRQUNkLGVBQWU7UUFDZixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLHdCQUF3QjtRQUN4QixlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLGVBQWU7NEZBTU4saUJBQWlCO2tCQXJCN0IsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osNkJBQTZCO3FCQUM5QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsaUJBQWlCO3dCQUNqQixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZix3QkFBd0I7d0JBQ3hCLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixlQUFlO3FCQUNoQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsNkJBQTZCO3FCQUM5QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlclVwZ3JhZGVEYXRhVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7IE1hdFRhYmxlTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3RhYmxlXCI7XHJcbmltcG9ydCB7IFNoYXJlZE1vZHVsZSB9IGZyb20gXCIuLi8uLi9zaGFyZWQvc2hhcmVkLm1vZHVsZVwiO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcclxuaW1wb3J0IHsgVGtMb2FkZXJDb21wb25lbnQgfSBmcm9tICdAdHVraS1pby90dWtpLXdpZGdldHMvc2hhcmVkJztcclxuaW1wb3J0IHsgTWF0T3B0aW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGRlY2xhcmF0aW9uczogW1xyXG4gICAgVXNlclVwZ3JhZGVEYXRhVGFibGVDb21wb25lbnRcclxuICBdLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIFRrTG9hZGVyQ29tcG9uZW50LFxyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgU2hhcmVkTW9kdWxlLFxyXG4gICAgTWF0VGFibGVNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcclxuICAgIE1hdE9wdGlvbk1vZHVsZSxcclxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZVxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgVXNlclVwZ3JhZGVEYXRhVGFibGVDb21wb25lbnRcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyVXBncmFkZU1vZHVsZSB7XHJcbn1cclxuIl19