tango-app-ui-shared 3.7.3-dev17 → 3.7.3-dev18

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.
@@ -282,12 +282,12 @@ export class TraxWithoutdateComponent {
282
282
  });
283
283
  }
284
284
  isAllLocationsSelected() {
285
- return this.filteredLocations.every(location => location.checked);
285
+ return this.filteredLocations.every((location) => location.checked);
286
286
  }
287
287
  selectedLocationsLabel() {
288
288
  const selectedLocations = this.locationLabel = this.searchLocationText.length ? this.locations
289
289
  .filter(location => location.checked).map(location => location.city) : this.filteredLocations
290
- .filter(location => location.checked).map(location => location.city);
290
+ .filter((location) => location.checked).map((location) => location.city);
291
291
  return selectedLocations.length === 0
292
292
  ? ''
293
293
  : selectedLocations.length === 1
@@ -416,14 +416,14 @@ export class TraxWithoutdateComponent {
416
416
  store.checked = true; // Sync the checked state with full store list
417
417
  });
418
418
  // No previously selected stores, mark all as checked
419
- this.filteredStores = this.selectedFilters.stores = this.filteredStores.map(store => ({
419
+ this.filteredStores = this.selectedFilters.stores = this.filteredStores.map((store) => ({
420
420
  ...store,
421
421
  checked: true
422
422
  }));
423
423
  }
424
424
  else {
425
425
  // Update selectedFilters to reflect current state of stores
426
- this.selectedFilters.stores = this.filteredStores.map(store => ({
426
+ this.selectedFilters.stores = this.filteredStores.map((store) => ({
427
427
  ...store,
428
428
  checked: store.checked
429
429
  }));
@@ -439,7 +439,7 @@ export class TraxWithoutdateComponent {
439
439
  this.stores = [];
440
440
  this.selectedFilters.stores = [];
441
441
  this.filteredStores = [];
442
- this.selectedFilters.stores = this.filteredStores.map(store => ({
442
+ this.selectedFilters.stores = this.filteredStores.map((store) => ({
443
443
  ...store,
444
444
  checked: false
445
445
  }));
@@ -450,7 +450,7 @@ export class TraxWithoutdateComponent {
450
450
  this.stores = [];
451
451
  this.selectedFilters.stores = [];
452
452
  this.filteredStores = [];
453
- this.selectedFilters.stores = this.filteredStores.map(store => ({
453
+ this.selectedFilters.stores = this.filteredStores.map((store) => ({
454
454
  ...store,
455
455
  checked: false
456
456
  }));
@@ -472,11 +472,11 @@ export class TraxWithoutdateComponent {
472
472
  : `${selectedStores.length} Stores`;
473
473
  }
474
474
  isAllStoresSelected() {
475
- return this.filteredStores.length > 0 && this.filteredStores.every(store => store.checked);
475
+ return this.filteredStores.length > 0 && this.filteredStores.every((store) => store.checked);
476
476
  }
477
477
  // Method to handle dropdown item selection
478
478
  updateSelectedStores() {
479
- this.filteredStores.forEach(store => {
479
+ this.filteredStores.forEach((store) => {
480
480
  const filteredStore = this.stores.findIndex(fStore => fStore.storeId === store.storeId);
481
481
  if (filteredStore != -1) {
482
482
  this.stores[filteredStore].checked = store.checked; // Sync the checked state with full store list
@@ -499,9 +499,9 @@ export class TraxWithoutdateComponent {
499
499
  toggleSelectAllStores(event) {
500
500
  const checked = event.target.checked;
501
501
  // Apply the selection to both filtered and full list of stores
502
- this.filteredStores.forEach(store => store.checked = checked);
502
+ this.filteredStores.forEach((store) => store.checked = checked);
503
503
  this.stores.forEach(store => {
504
- const filteredStore = this.filteredStores.find(fStore => fStore.storeId === store.storeId);
504
+ const filteredStore = this.filteredStores.find((fStore) => fStore.storeId === store.storeId);
505
505
  if (filteredStore) {
506
506
  store.checked = checked; // Sync the checked state with full store list
507
507
  }
@@ -647,7 +647,7 @@ export class TraxWithoutdateComponent {
647
647
  this.filteredLocations = this.locations
648
648
  .map(location => ({
649
649
  ...location,
650
- checked: this.filteredLocations.find(l => l.city === location.city)?.checked || false
650
+ checked: this.filteredLocations.find((l) => l.city === location.city)?.checked || false
651
651
  }))
652
652
  .filter(location => location?.city?.toLowerCase().includes(searchText));
653
653
  }
@@ -666,7 +666,7 @@ export class TraxWithoutdateComponent {
666
666
  this.filteredGroups = this.groupsData
667
667
  .map(group => ({
668
668
  ...group,
669
- checked: this.filteredGroups.find(g => g.groupName === group.groupName)?.checked || false
669
+ checked: this.filteredGroups.find((g) => g.groupName === group.groupName)?.checked || false
670
670
  }))
671
671
  .filter(group => group?.groupName?.toLowerCase().includes(searchText));
672
672
  }
@@ -716,7 +716,7 @@ export class TraxWithoutdateComponent {
716
716
  selectedLocationsLabel1() {
717
717
  const selectedLocations = this.locationLabel = this.searchLocationText.length ? this.locations
718
718
  .filter(location => location.checked).map(location => location.city) : this.filteredLocations
719
- .filter(location => location.checked).map(location => location.city);
719
+ .filter((location) => location.checked).map((location) => location.city);
720
720
  return selectedLocations.length === 0
721
721
  ? ''
722
722
  : `${selectedLocations.length}`;
@@ -764,11 +764,11 @@ export class TraxWithoutdateComponent {
764
764
  this.activeDropdown = type;
765
765
  }
766
766
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TraxWithoutdateComponent, deps: [{ token: i1.AuthService }, { token: i2.Router }, { token: i3.GlobalStateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
767
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TraxWithoutdateComponent, selector: "lib-trax-withoutdate", host: { listeners: { "document:click": "clickOutside($event)" } }, ngImport: i0, template: "<div class=\"me-3\">\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2 cursor-pointer\" (click)=\"showClick('region', $event)\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2 cursor-pointer\" (click)=\"showClick('clusters', $event)\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default cursor-pointer\" (click)=\"showClick('stores', $event)\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-outline mx-2 rounded-3 text-nowrap border-val\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"17\" viewBox=\"0 0 19 17\" fill=\"none\">\r\n<path d=\"M17.5026 0.835938H0.835938L7.5026 8.71927V14.1693L10.8359 15.8359V8.71927L17.5026 0.835938Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n <span class=\"ms-2\">Filter</span>\r\n </button>\r\n \r\n <div *ngIf=\"Opendropdown\" class=\"card dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important; min-width: 350px;\" (clickOutside)=\"closeDropdown1()\">\r\n \r\n <!-- Header Section -->\r\n <div class=\"d-flex px-3 justify-content-between pt-1 px-0 border-bottom align-items-center mb-1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-5\">\r\n <h6 class=\"mb-0 header-filter ps-2 my-4\">Filter by</h6>\r\n </div>\r\n <div class=\"col-7 text-muted mt-2\"> \r\n <!-- Search from 2000 stores -->\r\n <div *ngIf=\"activeDropdown === 'region'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n </div>\r\n <div *ngIf=\"activeDropdown === 'clusters'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n </div>\r\n <div *ngIf=\"activeDropdown === 'stores'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"row\">\r\n <!-- Left Side - Filter Categories -->\r\n <div class=\"col-5 border-end pe-3\">\r\n <!-- Filter Stats -->\r\n <div class=\"filter-categories px-3 my-2\">\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('region')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'region', \r\n 'text-item': activeDropdown !== 'region'\r\n }\">Region <span *ngIf=\"selectedLocationsLabel1()\" [ngClass]=\"activeDropdown=== 'region' ? 'text-border-priamry' : 'text-border'\" class=\"mx-2\">{{ selectedLocationsLabel1() }}</span></div>\r\n <!-- <div class=\"fw-bold\"></div> -->\r\n </div>\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('clusters')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'clusters', \r\n 'text-item': activeDropdown !== 'clusters'\r\n }\">Clusters <span *ngIf=\"selectedGroupsLabel1()\" [ngClass]=\"activeDropdown=== 'clusters' ? 'text-border-priamry' : 'text-border'\" class=\"mx-2\">{{ selectedGroupsLabel1() }}</span></div>\r\n \r\n </div>\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('stores')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'stores', \r\n 'text-item': activeDropdown !== 'stores'\r\n }\" >Stores <span [ngClass]=\"activeDropdown=== 'stores' ? 'text-border-priamry' : 'text-border'\" *ngIf=\"selectedStoresLabel1()\" class=\"mx-2\">{{ selectedStoresLabel1() }}</span></div>\r\n \r\n </div>\r\n </div>\r\n\r\n <!-- Downtime Section -->\r\n <!-- <div class=\"mt-4\">\r\n <div class=\"small text-muted mb-2\">Downtime</div>\r\n <div class=\"text-center py-1\">\r\n <span class=\"text-muted\">Downtime section</span>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Right Side - Dropdown Content -->\r\n <div class=\"col-7 ps-3\">\r\n <div class=\"dropdown-content-area\" style=\"min-height: 200px;\">\r\n \r\n\r\n <!-- Region Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'region'\" class=\"dropdown-full-view\">\r\n <div class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocationsFull\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocationsFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-3\" *ngFor=\"let location of filteredLocations\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"'location-full-' + location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'location-full-' + location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Clusters Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'clusters'\" class=\"dropdown-full-view\">\r\n <div class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroupsFull\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroupsFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-2\" *ngFor=\"let group of filteredGroups\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"'group-full-' + group.groupName\" \r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'group-full-' + group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Stores Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'stores'\" class=\"dropdown-full-view\">\r\n \r\n <div class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStoresFull\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStoresFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-2\" *ngFor=\"let store of filteredStores\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"'store-full-' + store.storeId\" \r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'store-full-' + store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Default View when no dropdown selected -->\r\n <div *ngIf=\"!activeDropdown\" class=\"text-center text-muted py-5\">\r\n <div>Select a filter category to see options</div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"d-flex justify-content-between p-3 border-top mt-3\">\r\n <button class=\"btn btn-outline-secondary text-muted btn-sm ps-2\" (click)=\"Reset()\">Reset Filters</button>\r\n <div>\r\n <button class=\"btn btn-outline btn-sm me-2\" (click)=\"closeDropdown1()\">Cancel</button>\r\n <button class=\"btn btn-primary btn-sm\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:24px}.form-check{display:block;min-height:1.5rem;padding-left:.25rem!important}.dropdown2{position:absolute;top:60px;min-width:470px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:6px 15px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-category-item{padding:6px 0;border-radius:4px;transition:background-color .2s}.cursor-pointer{cursor:pointer}.dropdown-full-view{height:100%}.header-filter{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#98a2b3}.w-75{width:58%!important}.active-item{border:none;border-radius:6px;font-size:14px;color:var(--Primary-700, #009BF3);background:var(--Primary-50, #EAF8FF);padding:10px 8px}.text-border-priamry{border-radius:30px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.text-border{border-radius:30px;background:var(--Gray-100, #F2F4F7)!important;color:var(--Gray-700, #344054);text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important}.text-item{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#344054!important;padding:10px 8px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.CustomSelectComponent, selector: "lib-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
767
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TraxWithoutdateComponent, selector: "lib-trax-withoutdate", host: { listeners: { "document:click": "clickOutside($event)" } }, ngImport: i0, template: "<div class=\"me-3\">\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2 cursor-pointer\" (click)=\"showClick('region', $event)\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2 cursor-pointer\" (click)=\"showClick('clusters', $event)\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default cursor-pointer\" (click)=\"showClick('stores', $event)\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-outline mx-2 rounded-3 text-nowrap border-val\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"17\" viewBox=\"0 0 19 17\" fill=\"none\">\r\n<path d=\"M17.5026 0.835938H0.835938L7.5026 8.71927V14.1693L10.8359 15.8359V8.71927L17.5026 0.835938Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n <span class=\"ms-2\">Filter</span>\r\n </button>\r\n \r\n <div *ngIf=\"Opendropdown\" class=\"card dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important; min-width: 350px;\" (clickOutside)=\"closeDropdown1()\">\r\n \r\n <!-- Header Section -->\r\n <div class=\"d-flex px-3 justify-content-between pt-1 px-0 border-bottom align-items-center mb-1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-5\">\r\n <h6 class=\"mb-0 header-filter ps-2 my-4\">Filter by</h6>\r\n </div>\r\n <div class=\"col-7 text-muted mt-2\"> \r\n <!-- Search from 2000 stores -->\r\n <div *ngIf=\"activeDropdown === 'region'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n </div>\r\n <div *ngIf=\"activeDropdown === 'clusters'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n </div>\r\n <div *ngIf=\"activeDropdown === 'stores'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"row\">\r\n <!-- Left Side - Filter Categories -->\r\n <div class=\"col-5 border-end pe-3\">\r\n <!-- Filter Stats -->\r\n <div class=\"filter-categories px-3 my-2\">\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('region')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'region', \r\n 'text-item': activeDropdown !== 'region'\r\n }\">Region <span *ngIf=\"selectedLocationsLabel1()\" [ngClass]=\"activeDropdown=== 'region' ? 'text-border-priamry' : 'text-border'\" class=\"mx-2\">{{ selectedLocationsLabel1() }}</span></div>\r\n <!-- <div class=\"fw-bold\"></div> -->\r\n </div>\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('clusters')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'clusters', \r\n 'text-item': activeDropdown !== 'clusters'\r\n }\">Clusters <span *ngIf=\"selectedGroupsLabel1()\" [ngClass]=\"activeDropdown=== 'clusters' ? 'text-border-priamry' : 'text-border'\" class=\"mx-2\">{{ selectedGroupsLabel1() }}</span></div>\r\n \r\n </div>\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('stores')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'stores', \r\n 'text-item': activeDropdown !== 'stores'\r\n }\" >Stores <span [ngClass]=\"activeDropdown=== 'stores' ? 'text-border-priamry' : 'text-border'\" *ngIf=\"selectedStoresLabel1()\" class=\"mx-2\">{{ selectedStoresLabel1() }}</span></div>\r\n \r\n </div>\r\n </div>\r\n\r\n <!-- Downtime Section -->\r\n <!-- <div class=\"mt-4\">\r\n <div class=\"small text-muted mb-2\">Downtime</div>\r\n <div class=\"text-center py-1\">\r\n <span class=\"text-muted\">Downtime section</span>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Right Side - Dropdown Content -->\r\n <div class=\"col-7 ps-3\">\r\n <div class=\"dropdown-content-area\" style=\"min-height: 200px;\">\r\n \r\n\r\n <!-- Region Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'region'\" class=\"dropdown-full-view\">\r\n <div *ngIf=\"filteredLocations?.length\" class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocationsFull\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocationsFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div *ngIf=\"!filteredLocations?.length\" >\r\n <div class=\"col-lg-12 mt-20 mb-6\">\r\n <div class=\" mt-20 card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-3\" *ngFor=\"let location of filteredLocations\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"'location-full-' + location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'location-full-' + location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Clusters Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'clusters'\" class=\"dropdown-full-view\">\r\n <div *ngIf=\"filteredGroups?.length\" class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroupsFull\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroupsFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div *ngIf=\"!filteredGroups?.length\" >\r\n <div class=\"col-lg-12 mt-20 mb-6\">\r\n <div class=\" mt-20 card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-2\" *ngFor=\"let group of filteredGroups\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"'group-full-' + group.groupName\" \r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'group-full-' + group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Stores Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'stores'\" class=\"dropdown-full-view\">\r\n \r\n <div *ngIf=\"filteredStores?.length\" class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStoresFull\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStoresFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div *ngIf=\"!filteredStores?.length\" >\r\n <div class=\"col-lg-12 mt-20 mb-6\">\r\n <div class=\" mt-20 card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-2\" *ngFor=\"let store of filteredStores\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"'store-full-' + store.storeId\" \r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'store-full-' + store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Default View when no dropdown selected -->\r\n <div *ngIf=\"!activeDropdown\" class=\"text-center text-muted py-5\">\r\n <div>Select a filter category to see options</div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"d-flex justify-content-between p-3 border-top mt-3\">\r\n <button class=\"btn btn-outline-secondary text-muted btn-sm ps-2\" (click)=\"Reset()\">Reset Filters</button>\r\n <div>\r\n <button class=\"btn btn-outline btn-sm me-2\" (click)=\"closeDropdown1()\">Cancel</button>\r\n <button class=\"btn btn-primary btn-sm\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:24px}.form-check{display:block;min-height:1.5rem;padding-left:.25rem!important}.dropdown2{position:absolute;top:60px;min-width:470px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:6px 15px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-category-item{padding:6px 0;border-radius:4px;transition:background-color .2s}.cursor-pointer{cursor:pointer}.dropdown-full-view{height:100%}.header-filter{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#98a2b3}.w-75{width:58%!important}.active-item{border:none;border-radius:6px;font-size:14px;color:var(--Primary-700, #009BF3);background:var(--Primary-50, #EAF8FF);padding:10px 8px}.text-border-priamry{border-radius:30px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.text-border{border-radius:30px;background:var(--Gray-100, #F2F4F7)!important;color:var(--Gray-700, #344054);text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important}.text-item{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#344054!important;padding:10px 8px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.CustomSelectComponent, selector: "lib-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
768
768
  }
769
769
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TraxWithoutdateComponent, decorators: [{
770
770
  type: Component,
771
- args: [{ selector: 'lib-trax-withoutdate', template: "<div class=\"me-3\">\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2 cursor-pointer\" (click)=\"showClick('region', $event)\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2 cursor-pointer\" (click)=\"showClick('clusters', $event)\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default cursor-pointer\" (click)=\"showClick('stores', $event)\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-outline mx-2 rounded-3 text-nowrap border-val\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"17\" viewBox=\"0 0 19 17\" fill=\"none\">\r\n<path d=\"M17.5026 0.835938H0.835938L7.5026 8.71927V14.1693L10.8359 15.8359V8.71927L17.5026 0.835938Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n <span class=\"ms-2\">Filter</span>\r\n </button>\r\n \r\n <div *ngIf=\"Opendropdown\" class=\"card dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important; min-width: 350px;\" (clickOutside)=\"closeDropdown1()\">\r\n \r\n <!-- Header Section -->\r\n <div class=\"d-flex px-3 justify-content-between pt-1 px-0 border-bottom align-items-center mb-1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-5\">\r\n <h6 class=\"mb-0 header-filter ps-2 my-4\">Filter by</h6>\r\n </div>\r\n <div class=\"col-7 text-muted mt-2\"> \r\n <!-- Search from 2000 stores -->\r\n <div *ngIf=\"activeDropdown === 'region'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n </div>\r\n <div *ngIf=\"activeDropdown === 'clusters'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n </div>\r\n <div *ngIf=\"activeDropdown === 'stores'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"row\">\r\n <!-- Left Side - Filter Categories -->\r\n <div class=\"col-5 border-end pe-3\">\r\n <!-- Filter Stats -->\r\n <div class=\"filter-categories px-3 my-2\">\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('region')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'region', \r\n 'text-item': activeDropdown !== 'region'\r\n }\">Region <span *ngIf=\"selectedLocationsLabel1()\" [ngClass]=\"activeDropdown=== 'region' ? 'text-border-priamry' : 'text-border'\" class=\"mx-2\">{{ selectedLocationsLabel1() }}</span></div>\r\n <!-- <div class=\"fw-bold\"></div> -->\r\n </div>\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('clusters')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'clusters', \r\n 'text-item': activeDropdown !== 'clusters'\r\n }\">Clusters <span *ngIf=\"selectedGroupsLabel1()\" [ngClass]=\"activeDropdown=== 'clusters' ? 'text-border-priamry' : 'text-border'\" class=\"mx-2\">{{ selectedGroupsLabel1() }}</span></div>\r\n \r\n </div>\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('stores')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'stores', \r\n 'text-item': activeDropdown !== 'stores'\r\n }\" >Stores <span [ngClass]=\"activeDropdown=== 'stores' ? 'text-border-priamry' : 'text-border'\" *ngIf=\"selectedStoresLabel1()\" class=\"mx-2\">{{ selectedStoresLabel1() }}</span></div>\r\n \r\n </div>\r\n </div>\r\n\r\n <!-- Downtime Section -->\r\n <!-- <div class=\"mt-4\">\r\n <div class=\"small text-muted mb-2\">Downtime</div>\r\n <div class=\"text-center py-1\">\r\n <span class=\"text-muted\">Downtime section</span>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Right Side - Dropdown Content -->\r\n <div class=\"col-7 ps-3\">\r\n <div class=\"dropdown-content-area\" style=\"min-height: 200px;\">\r\n \r\n\r\n <!-- Region Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'region'\" class=\"dropdown-full-view\">\r\n <div class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocationsFull\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocationsFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-3\" *ngFor=\"let location of filteredLocations\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"'location-full-' + location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'location-full-' + location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Clusters Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'clusters'\" class=\"dropdown-full-view\">\r\n <div class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroupsFull\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroupsFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-2\" *ngFor=\"let group of filteredGroups\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"'group-full-' + group.groupName\" \r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'group-full-' + group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Stores Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'stores'\" class=\"dropdown-full-view\">\r\n \r\n <div class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStoresFull\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStoresFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-2\" *ngFor=\"let store of filteredStores\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"'store-full-' + store.storeId\" \r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'store-full-' + store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Default View when no dropdown selected -->\r\n <div *ngIf=\"!activeDropdown\" class=\"text-center text-muted py-5\">\r\n <div>Select a filter category to see options</div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"d-flex justify-content-between p-3 border-top mt-3\">\r\n <button class=\"btn btn-outline-secondary text-muted btn-sm ps-2\" (click)=\"Reset()\">Reset Filters</button>\r\n <div>\r\n <button class=\"btn btn-outline btn-sm me-2\" (click)=\"closeDropdown1()\">Cancel</button>\r\n <button class=\"btn btn-primary btn-sm\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:24px}.form-check{display:block;min-height:1.5rem;padding-left:.25rem!important}.dropdown2{position:absolute;top:60px;min-width:470px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:6px 15px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-category-item{padding:6px 0;border-radius:4px;transition:background-color .2s}.cursor-pointer{cursor:pointer}.dropdown-full-view{height:100%}.header-filter{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#98a2b3}.w-75{width:58%!important}.active-item{border:none;border-radius:6px;font-size:14px;color:var(--Primary-700, #009BF3);background:var(--Primary-50, #EAF8FF);padding:10px 8px}.text-border-priamry{border-radius:30px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.text-border{border-radius:30px;background:var(--Gray-100, #F2F4F7)!important;color:var(--Gray-700, #344054);text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important}.text-item{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#344054!important;padding:10px 8px}\n"] }]
771
+ args: [{ selector: 'lib-trax-withoutdate', template: "<div class=\"me-3\">\r\n <label *ngIf=\"selectedLocationsLabel()\" class=\"badge badge-light-default mx-2 cursor-pointer\" (click)=\"showClick('region', $event)\">{{selectedLocationsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeLocation()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label *ngIf=\"selectedGroupsLabel()\" class=\"badge badge-light-default mx-2 cursor-pointer\" (click)=\"showClick('clusters', $event)\">{{selectedGroupsLabel()}} \r\n <span class=\"cursor-pointer\" (click)=\"removeGroup()\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n </label>\r\n <label class=\"badge badge-light-default cursor-pointer\" (click)=\"showClick('stores', $event)\">{{selectedStoresLabel()}}</label>\r\n</div>\r\n\r\n\r\n<div class=\"wrapper me-3\" *ngIf=\"(gs.userAccess | async)?.userType === 'tango'\">\r\n<lib-select [items]=\"clientList\" [multi]=\"false\" [searchField]=\"'clientName'\" [disabled]=\"false\" [idField]=\"'clientId'\"\r\n(selected)=\"onClientSelect($event)\" [selectedValues]=\"[selectedClient]\"></lib-select>\r\n</div>\r\n\r\n<div class=\"position-relative\">\r\n <button type=\"button\" (click)=\"opendropdown($event)\" class=\"btn btn-outline mx-2 rounded-3 text-nowrap border-val\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"19\" height=\"17\" viewBox=\"0 0 19 17\" fill=\"none\">\r\n<path d=\"M17.5026 0.835938H0.835938L7.5026 8.71927V14.1693L10.8359 15.8359V8.71927L17.5026 0.835938Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n</svg>\r\n <span class=\"ms-2\">Filter</span>\r\n </button>\r\n \r\n <div *ngIf=\"Opendropdown\" class=\"card dropdown2 position-absolute z-1 end-0\" style=\"z-index: 1 !important; min-width: 350px;\" (clickOutside)=\"closeDropdown1()\">\r\n \r\n <!-- Header Section -->\r\n <div class=\"d-flex px-3 justify-content-between pt-1 px-0 border-bottom align-items-center mb-1\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-5\">\r\n <h6 class=\"mb-0 header-filter ps-2 my-4\">Filter by</h6>\r\n </div>\r\n <div class=\"col-7 text-muted mt-2\"> \r\n <!-- Search from 2000 stores -->\r\n <div *ngIf=\"activeDropdown === 'region'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search region\" \r\n [(ngModel)]=\"searchLocationText\" \r\n (ngModelChange)=\"filterLocations()\" \r\n />\r\n </div>\r\n <div *ngIf=\"activeDropdown === 'clusters'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search clusters\" \r\n [(ngModel)]=\"searchGroupText\" \r\n (ngModelChange)=\"filterGroups()\" \r\n />\r\n </div>\r\n <div *ngIf=\"activeDropdown === 'stores'\">\r\n <input \r\n type=\"text\" \r\n class=\"form-control form-control-sm mb-3\" \r\n placeholder=\"Search stores\" \r\n [(ngModel)]=\"searchStoreText\" \r\n (ngModelChange)=\"filterStores()\" \r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"row\">\r\n <!-- Left Side - Filter Categories -->\r\n <div class=\"col-5 border-end pe-3\">\r\n <!-- Filter Stats -->\r\n <div class=\"filter-categories px-3 my-2\">\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('region')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'region', \r\n 'text-item': activeDropdown !== 'region'\r\n }\">Region <span *ngIf=\"selectedLocationsLabel1()\" [ngClass]=\"activeDropdown=== 'region' ? 'text-border-priamry' : 'text-border'\" class=\"mx-2\">{{ selectedLocationsLabel1() }}</span></div>\r\n <!-- <div class=\"fw-bold\"></div> -->\r\n </div>\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('clusters')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'clusters', \r\n 'text-item': activeDropdown !== 'clusters'\r\n }\">Clusters <span *ngIf=\"selectedGroupsLabel1()\" [ngClass]=\"activeDropdown=== 'clusters' ? 'text-border-priamry' : 'text-border'\" class=\"mx-2\">{{ selectedGroupsLabel1() }}</span></div>\r\n \r\n </div>\r\n <div class=\"filter-category-item cursor-pointer\" (click)=\"showDropdown('stores')\">\r\n <div [ngClass]=\"{\r\n 'active-item': activeDropdown === 'stores', \r\n 'text-item': activeDropdown !== 'stores'\r\n }\" >Stores <span [ngClass]=\"activeDropdown=== 'stores' ? 'text-border-priamry' : 'text-border'\" *ngIf=\"selectedStoresLabel1()\" class=\"mx-2\">{{ selectedStoresLabel1() }}</span></div>\r\n \r\n </div>\r\n </div>\r\n\r\n <!-- Downtime Section -->\r\n <!-- <div class=\"mt-4\">\r\n <div class=\"small text-muted mb-2\">Downtime</div>\r\n <div class=\"text-center py-1\">\r\n <span class=\"text-muted\">Downtime section</span>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n <!-- Right Side - Dropdown Content -->\r\n <div class=\"col-7 ps-3\">\r\n <div class=\"dropdown-content-area\" style=\"min-height: 200px;\">\r\n \r\n\r\n <!-- Region Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'region'\" class=\"dropdown-full-view\">\r\n <div *ngIf=\"filteredLocations?.length\" class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllLocationsFull\" \r\n [checked]=\"isAllLocationsSelected()\" \r\n (change)=\"toggleSelectAllLocations($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllLocationsFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div *ngIf=\"!filteredLocations?.length\" >\r\n <div class=\"col-lg-12 mt-20 mb-6\">\r\n <div class=\" mt-20 card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-3\" *ngFor=\"let location of filteredLocations\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"'location-full-' + location.city\" \r\n [(ngModel)]=\"location.checked\"\r\n (change)=\"updateSelectedLocations()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'location-full-' + location.city\">\r\n {{ location.city }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Clusters Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'clusters'\" class=\"dropdown-full-view\">\r\n <div *ngIf=\"filteredGroups?.length\" class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllGroupsFull\" \r\n [checked]=\"isAllGroupsSelected()\" \r\n (change)=\"toggleSelectAllGroups($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllGroupsFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div *ngIf=\"!filteredGroups?.length\" >\r\n <div class=\"col-lg-12 mt-20 mb-6\">\r\n <div class=\" mt-20 card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-2\" *ngFor=\"let group of filteredGroups\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n [id]=\"'group-full-' + group.groupName\" \r\n [(ngModel)]=\"group.checked\"\r\n (change)=\"updateSelectedGroups()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'group-full-' + group.groupName\">\r\n {{ group.groupName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Stores Dropdown Content -->\r\n <div *ngIf=\"activeDropdown === 'stores'\" class=\"dropdown-full-view\">\r\n \r\n <div *ngIf=\"filteredStores?.length\" class=\"form-check mb-3\">\r\n <input \r\n class=\"form-check-input cursor-pointer\" \r\n type=\"checkbox\" \r\n id=\"selectAllStoresFull\" \r\n [checked]=\"isAllStoresSelected()\" \r\n (change)=\"toggleSelectAllStores($event)\" \r\n />\r\n <label class=\"form-check-label\" for=\"selectAllStoresFull\">\r\n Select All\r\n </label>\r\n </div>\r\n <div *ngIf=\"!filteredStores?.length\" >\r\n <div class=\"col-lg-12 mt-20 mb-6\">\r\n <div class=\" mt-20 card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-nodata-table\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodata-title\">No data found</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dropdown-list text-nowrap\" style=\"max-height: 250px; overflow-y: auto;\">\r\n <div class=\"form-check mb-2\" *ngFor=\"let store of filteredStores\">\r\n <input \r\n class=\"form-check-input\" \r\n type=\"checkbox\" \r\n [id]=\"'store-full-' + store.storeId\" \r\n [(ngModel)]=\"store.checked\"\r\n (change)=\"updateSelectedStores()\" \r\n />\r\n <label class=\"form-check-label py-1\" [for]=\"'store-full-' + store.storeId\">\r\n {{ store.storeName }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Default View when no dropdown selected -->\r\n <div *ngIf=\"!activeDropdown\" class=\"text-center text-muted py-5\">\r\n <div>Select a filter category to see options</div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"d-flex justify-content-between p-3 border-top mt-3\">\r\n <button class=\"btn btn-outline-secondary text-muted btn-sm ps-2\" (click)=\"Reset()\">Reset Filters</button>\r\n <div>\r\n <button class=\"btn btn-outline btn-sm me-2\" (click)=\"closeDropdown1()\">Cancel</button>\r\n <button class=\"btn btn-primary btn-sm\" (click)=\"Apply()\">Apply</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".daterangepicker{display:block!important;top:153.85px!important;left:900px!important;right:0}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize}::ng-deep .applyBtn{display:none!important}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;left:-470px!important;height:365px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}.wrapper{min-width:200px}.btn-primary{line-height:18px!important}.filter-label{color:var(--Gray-500, #667085)!important;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-transform:capitalize}.position-relative{position:relative}.filter-icon{cursor:pointer}.dropdown-container{position:relative;display:inline-block;width:100%}.dropdown-header{cursor:pointer;width:100%}.form-control{color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600;line-height:20px;text-transform:capitalize;width:100%;box-sizing:border-box}.dropdown-menu{position:absolute;top:100%;left:0;right:0;border:1px solid #ccc;background-color:#fff;z-index:1000;max-height:230px;overflow-y:auto;display:block;box-sizing:border-box;padding:10px 5px}.dropdown-item{padding:6px 0}.dropdown-item:hover{background-color:#f1f1f1}.dropdown-item input[type=checkbox]{margin-right:10px}.custom-dropdown-menu{border-radius:4px;box-shadow:0 1px 2px #1018280d}.custom-dropdown-item{display:flex;align-items:center}.custom-dropdown-item input{margin-left:10px}.btn-resize{font-size:13px!important;height:29px!important;line-height:11px!important;padding:3px!important}.form-check-label{color:var(--Gray-700, #344054)!important;font-size:14px;font-style:normal;font-weight:500;line-height:24px}.form-check{display:block;min-height:1.5rem;padding-left:.25rem!important}.dropdown2{position:absolute;top:60px;min-width:470px!important}.dropdown2 .dropdown-title{color:var(--Gray-900, #101828);font-size:14px;font-weight:600;line-height:24px}.dropdown2 .dropdown{position:relative;display:inline-block}.dropdown2 .dropdown span{color:var(--Gray-700, #344054);font-size:14px;font-weight:600;line-height:20px}input[type=checkbox]{width:16px!important;height:16px!important;margin:6px 15px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.2em;padding-left:0;padding-top:9px;padding-right:4px}.filter-category-item{padding:6px 0;border-radius:4px;transition:background-color .2s}.cursor-pointer{cursor:pointer}.dropdown-full-view{height:100%}.header-filter{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#98a2b3}.w-75{width:58%!important}.active-item{border:none;border-radius:6px;font-size:14px;color:var(--Primary-700, #009BF3);background:var(--Primary-50, #EAF8FF);padding:10px 8px}.text-border-priamry{border-radius:30px;background:var(--Primary-50, #EAF8FF);color:var(--Primary-700, #009BF3);text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important;mix-blend-mode:multiply!important}.text-border{border-radius:30px;background:var(--Gray-100, #F2F4F7)!important;color:var(--Gray-700, #344054);text-align:center;font-size:14px;font-weight:500;line-height:20px;padding:2px 10px!important}.text-item{font-weight:400;font-size:14px;line-height:20px;letter-spacing:0%;color:#344054!important;padding:10px 8px}\n"] }]
772
772
  }], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.Router }, { type: i3.GlobalStateService }, { type: i0.ChangeDetectorRef }], propDecorators: { onClick: [{
773
773
  type: HostListener,
774
774
  args: ['document:click', ['$event']]
@@ -776,4 +776,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
776
776
  type: HostListener,
777
777
  args: ["document:click", ["$event"]]
778
778
  }] } });
779
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJheC13aXRob3V0ZGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hcHAtc2hhcmVkL3NyYy9saWIvbW9kdWxlcy9sYXlvdXQvdG9vbGJhci90cmF4LXdpdGhvdXRkYXRlL3RyYXgtd2l0aG91dGRhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYXBwLXNoYXJlZC9zcmMvbGliL21vZHVsZXMvbGF5b3V0L3Rvb2xiYXIvdHJheC13aXRob3V0ZGF0ZS90cmF4LXdpdGhvdXRkYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxHQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLGlCQUFpQixDQUFDOzs7Ozs7OztBQVV6QixNQUFNLE9BQU8sd0JBQXdCO0lBcUN6QjtJQUEwQjtJQUMzQjtJQUNDO0lBdENYLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDYixZQUFZLEdBQUcsQ0FBQyxDQUFjLEVBQUUsRUFBRTtRQUNoQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFFRixpQkFBaUIsR0FBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRSxDQUFDO0lBQ3pDLGVBQWUsR0FBUTtRQUNyQixNQUFNLEVBQUUsSUFB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Q0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFFMUIseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxTQUFTLENBQUMsSUFBUyxFQUFDLENBQVk7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO3dHQWwxQlksd0JBQXdCOzRGQUF4Qix3QkFBd0IsK0hDakJyQyx3eVZBNk5NOzs0RkQ1TU8sd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjtzS0ErQ2hDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvdUIxQyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgT25Jbml0LFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcclxuaW1wb3J0IFwiZGF5anMvbG9jYWxlL2VuXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10cmF4LXdpdGhvdXRkYXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJheC13aXRob3V0ZGF0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3RyYXgtd2l0aG91dGRhdGUuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmF4V2l0aG91dGRhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gZGF5anMgPSBkYXlqcztcclxuICBpc0N1c3RvbURhdGUgPSAobTogZGF5anMuRGF5anMpID0+IHtcclxuICAgIGNvbnN0IGlzVmFsaWREYXRlID0gbSA+IHRoaXMuZGF5anMoKTtcclxuICAgIHJldHVybiBpc1ZhbGlkRGF0ZSA/IFwiaW52YWxpZC1kYXRlXCIgOiBmYWxzZTtcclxuICB9O1xyXG5cclxuICBzZWxlY3RlZERhdGVSYW5nZTogYW55ID0geyBzdGFydERhdGU6IGRheWpzKCkuc3VidHJhY3QoMzAsICdkYXlzJyksXHJcbiAgICBlbmREYXRlOiBkYXlqcygpLnN1YnRyYWN0KDEsIFwiZGF5c1wiKSx9O1xyXG4gIHNlbGVjdGVkRmlsdGVyczogYW55ID0ge1xyXG4gICAgY2xpZW50OiBudWxsLFxyXG4gICAgY2xpZW50TmFtZTogbnVsbCxcclxuICAgIGNsaWVudHM6IFtdLFxyXG4gICAgc3RvcmU6IG51bGwsXHJcbiAgICBzdG9yZXM6IFtdLFxyXG4gICAgZGF0ZTogbnVsbCxcclxuICAgIGdyb3VwOiBbXSxcclxuICAgIGxvY2F0aW9uOiBbXSxcclxuICB9O1xyXG4gIE9wZW5kcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duT3Blbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vICdsb2NhdGlvbicgb3IgJ2dyb3VwJ1xyXG4gIHNlYXJjaExvY2F0aW9uVGV4dDogc3RyaW5nID0gXCJcIjtcclxuICBzZWFyY2hHcm91cFRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgbG9jYXRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkTG9jYXRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIGdyb3Vwc0RhdGE6IGFueVtdID0gW107XHJcbiAgZmlsdGVyZWRHcm91cHM6IGFueVtdID0gW107XHJcbiAgZmlsdGVyZWRTdG9yZXM6IGFueVtdID0gW107XHJcbiAgc3RvcmVzOmFueVtdID0gW11cclxuICBzZWFyY2hTdG9yZVRleHQ6c3RyaW5nID0gJyc7XHJcbiAgY2xpZW50TGlzdDphbnkgPSBbXVxyXG4gIHNlbGVjdGVkQ2xpZW50OmFueVxyXG4gIGxvY2F0aW9uTGFiZWw6IGFueVtdPVtdO1xyXG4gIGdyb3VwTGFiZWw6IGFueVtdPVtdO1xyXG4gIHVzZXJzOiBhbnk7XHJcbiAgdXJsOiBhbnk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGF1dGg6IEF1dGhTZXJ2aWNlLHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICkge31cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uQ2xpY2sgKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZighdGFyZ2V0LmNsb3Nlc3QoJy5kcm9wZG93bjInKSkge1xyXG4gICAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBjbG9zZURyb3Bkb3duMSgpe1xyXG4gICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVybCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIj9cIilbMF0uc3BsaXQoJy8nKTtcclxuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSBhcyBzdHJpbmcpO1xyXG4gICAgdGhpcy51c2VycyA9IHVzZXI7XHJcbiAgICB0aGlzLmdzPy5tYW5hZ2VSZWZyZXNoVHJpZ2dlcj8uc3Vic2NyaWJlKChlKSA9PiB7ICAgICAgXHJcbiAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgaWYgKHVzZXIudXNlclR5cGUgPT09ICd0YW5nbycpIHtcclxuICAgICAgICB0aGlzLmdldENsaWVudCgpO1xyXG4gICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgIGNvbnN0IHN0b3JlZEZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpO1xyXG4gICAgICAgICAgaWYgKHN0b3JlZEZpbHRlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnMgPSBKU09OLnBhcnNlKHN0b3JlZEZpbHRlcnMpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IGhlYWRlckZpbHRlcnM/LnN0b3Jlcy5tYXAoKHN0b3JlOmFueSkgPT4gKHtcclxuICAgICAgICAgICAgLi4uc3RvcmUsXHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHN0b3JlLmNoZWNrZWRcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodXNlci51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICB0aGlzLmdldENsaWVudCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuICAgICAgdGhpcy5nZXRHcm91cHMoKTtcclxuICAgICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgY29uc3Qgc3RvcmVkRmlsdGVycyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIik7XHJcbiAgICBpZiAoc3RvcmVkRmlsdGVycykge1xyXG4gICAgICBjb25zdCBoZWFkZXJGaWx0ZXJzID0gSlNPTi5wYXJzZShzdG9yZWRGaWx0ZXJzKTtcclxuICBcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBzZWxlY3RlZEZpbHRlcnMgd2l0aCBkZWZhdWx0cyBvciBleGlzdGluZyB2YWx1ZXNcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMgPSB7XHJcbiAgICAgICAgY2xpZW50OiBoZWFkZXJGaWx0ZXJzLmNsaWVudCB8fCB0aGlzLnVzZXJzLmNsaWVudCxcclxuICAgICAgICBjbGllbnROYW1lOiBoZWFkZXJGaWx0ZXJzLmNsaWVudE5hbWUgfHwgJycsXHJcbiAgICAgICAgY2xpZW50czogaGVhZGVyRmlsdGVycy5jbGllbnRzIHx8IFtdLFxyXG4gICAgICAgIHN0b3JlOiBoZWFkZXJGaWx0ZXJzLnN0b3JlIHx8IG51bGwsXHJcbiAgICAgICAgZGF0ZTogaGVhZGVyRmlsdGVycy5kYXRlIHx8IHt9LFxyXG4gICAgICAgIHN0b3JlczogaGVhZGVyRmlsdGVycy5zdG9yZXMgfHwgW10sXHJcbiAgICAgICAgZ3JvdXA6IGhlYWRlckZpbHRlcnMuZ3JvdXAgfHwgW10sXHJcbiAgICAgICAgbG9jYXRpb246IGhlYWRlckZpbHRlcnMubG9jYXRpb24gfHwgW11cclxuICAgICAgfTtcclxuICBcclxuICAgICAgLy8gU3luYyBmaWx0ZXJlZCBkYXRhIHdpdGggc3RvcmVkIHNlbGVjdGlvbnNcclxuICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHRoaXMuc3luY1dpdGhMb2NhbFN0b3JhZ2UoaGVhZGVyRmlsdGVycy5sb2NhdGlvbik7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSB0aGlzLnN5bmNXaXRoTG9jYWxTdG9yYWdlKGhlYWRlckZpbHRlcnMuZ3JvdXApO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zeW5jV2l0aExvY2FsU3RvcmFnZShoZWFkZXJGaWx0ZXJzLnN0b3Jlcyk7XHJcbiAgICAgIC8vIEZvcm1hdCBkYXRlIHJhbmdlIGlmIGl0IGV4aXN0c1xyXG4gICAgICAvLyBFbWl0IGRhdGEgdmlhIHNlcnZpY2UgYW5kIHVwZGF0ZSBsb2NhbFN0b3JhZ2VcclxudGhpcy5lbWl0QW5kU3RvcmVGaWx0ZXJzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBJbml0aWFsaXplIGVtcHR5IHN0YXRlcyBpZiBubyBoZWFkZXIgZmlsdGVycyBhcmUgcHJlc2VudCBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgdGhpcy5yZXNldEZpbHRlcnMoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBzeW5jV2l0aExvY2FsU3RvcmFnZShpdGVtczogYW55W10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gaXRlbXNcclxuICAgICAgPyBpdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBjaGVja2VkOiBpdGVtLmNoZWNrZWQgPT09IHRydWVcclxuICAgICAgICB9KSlcclxuICAgICAgOiBbXTtcclxuICB9XHJcbiAgcHJpdmF0ZSBlbWl0QW5kU3RvcmVGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycyA9IHtcclxuICAgICAgY2xpZW50OiBudWxsLFxyXG4gICAgICBjbGllbnROYW1lOiAnJyxcclxuICAgICAgY2xpZW50czogW10sXHJcbiAgICAgIHN0b3JlOiBudWxsLFxyXG4gICAgICBkYXRlOiB7fSxcclxuICAgICAgc3RvcmVzOiBbXSxcclxuICAgICAgZ3JvdXA6IFtdLFxyXG4gICAgICBsb2NhdGlvbjogW11cclxuICAgIH07XHJcbiAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gW107XHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107XHJcbiAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gW107XHJcbiAgfVxyXG5nZXRDbGllbnQoKXtcclxuICB0aGlzLmF1dGguZ2V0Q2xpZW50cygpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50TGlzdCA9IGUuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoaGVhZGVyRmlsdGVycy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50TGlzdC5maW5kKChvYmo6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAob2JqLmNsaWVudElkID09PSBoZWFkZXJGaWx0ZXJzLmNsaWVudCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID0gaGVhZGVyRmlsdGVycy5jbGllbnQ7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnROYW1lID0gaGVhZGVyRmlsdGVycy5jbGllbnROYW1lO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50cyA9IGhlYWRlckZpbHRlcnMuY2xpZW50cztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlID0gaGVhZGVyRmlsdGVycy5zdG9yZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmRhdGUgPSBoZWFkZXJGaWx0ZXJzLmRhdGU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlcztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gaGVhZGVyRmlsdGVycy5ncm91cDtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gaGVhZGVyRmlsdGVycy5sb2NhdGlvbjtcclxuICAgICAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBsb2FkZWQgYmVmb3JlIGZldGNoaW5nIHN0b3Jlc1xyXG4gdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgLy8gRmV0Y2ggc3RvcmVzIG9ubHkgYWZ0ZXIgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIHNldFxyXG4gIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0gdGhpcy5jbGllbnRMaXN0WzBdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9ICB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudElkO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudE5hbWUgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudE5hbWVcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50cyA9IGhlYWRlckZpbHRlcnMuY2xpZW50cztcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmUgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5kYXRlID0gaGVhZGVyRmlsdGVycy5kYXRlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlcztcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBoZWFkZXJGaWx0ZXJzLmdyb3VwO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IGhlYWRlckZpbHRlcnMubG9jYXRpb247XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICBcImhlYWRlci1maWx0ZXJzXCIsXHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykgXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAvLyBFbnN1cmUgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIGxvYWRlZCBiZWZvcmUgZmV0Y2hpbmcgc3RvcmVzXHJcbiB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gdGhpcy5nZXRHcm91cHMoKTtcclxuICAvLyBGZXRjaCBzdG9yZXMgb25seSBhZnRlciBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgc2V0XHJcbiAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSB0aGlzLmNsaWVudExpc3RbMF07XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9ICB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudElkO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnROYW1lID0gdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnROYW1lXHJcbiAgICAgICAvLyBFbnN1cmUgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIGxvYWRlZCBiZWZvcmUgZmV0Y2hpbmcgc3RvcmVzXHJcbiB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gdGhpcy5nZXRHcm91cHMoKTtcclxuIC8vIEZldGNoIHN0b3JlcyBvbmx5IGFmdGVyIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBzZXRcclxuIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgXCJoZWFkZXItZmlsdGVyc1wiLFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSBcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCI0XCIpXHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5vbkNsaWVudFNlbGVjdChldmVudDogYW55KTogdm9pZCB7XHJcbiAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCBjbGllbnRcclxuICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0gZXZlbnQ7XHJcbiAgLy8gQ2xlYXIgcHJldmlvdXMgZmlsdGVyZWQgZGF0YSBhbmQgc2VsZWN0aW9uc1xyXG4gIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBbXTtcclxuICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gW107XHJcbiAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gW107XHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSBbXTtcclxuXHJcbiAgLy8gRmV0Y2ggaGVhZGVyIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcclxuICBjb25zdCBoZWFkZXJGaWx0ZXJzOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiKTtcclxuICBcclxuICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIGZpbHRlcnMgd2l0aCB0aGUgbmV3IGNsaWVudFxyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50SWQ7XHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50TmFtZSA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50TmFtZTtcclxuICBcclxuICAvLyBSZW1vdmUgb2xkIHN0b3JlLCBncm91cCwgYW5kIGxvY2F0aW9uIGRhdGEgZnJvbSB0aGUgaGVhZGVyIGZpbHRlcnNcclxuICBkZWxldGUgaGVhZGVyRmlsdGVycy5zdG9yZXM7XHJcbiAgZGVsZXRlIGhlYWRlckZpbHRlcnMuZ3JvdXBzO1xyXG4gIGRlbGV0ZSBoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uO1xyXG4gIFxyXG4gIC8vIEZldGNoIG5ldyBkYXRhIGJhc2VkIG9uIHRoZSBuZXcgY2xpZW50XHJcbiAgdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgdGhpcy5nZXRHcm91cHMoKTtcclxuXHJcbiAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSB3aXRoIHRoZSBuZXcgY2xpZW50IHNlbGVjdGlvbiBhbmQgZW1wdHkgZmlsdGVyIGRhdGFcclxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gIG9wZW5kcm9wZG93bihlOk1vdXNlRXZlbnQpIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9ICF0aGlzLk9wZW5kcm9wZG93bjtcclxuICB9XHJcbiAgZ2V0TG9jYXRpb25zKCk6IHZvaWQge1xyXG4gICAgLy8gY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIik7XHJcbiAgICBsZXQgb2JqID17XHJcbiAgICAgY2xpZW50SWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA/IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA6dGhpcy51c2Vycy5jbGllbnRJZCxcclxuICAgICBjaXR5OiBbXSxcclxuICAgICBncm91cDogW10sXHJcbiAgICB9XHJcbiAgICB0aGlzLmF1dGguZ2V0TG9jYXRpb24ob2JqKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgY2l0eUxpc3QgPSB0aGlzLnNlbGVjdGVkRmlsdGVycz8ubG9jYXRpb24/LmZpbHRlcigobG9jYXRpb246YW55KSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvYzphbnkpID0+IGxvYy5jaXR5KTtcclxuICAgICAgICAvLyBNYXAgdGhlIGZldGNoZWQgbG9jYXRpb25zIHdpdGggZGVmYXVsdCB1bmNoZWNrZWQgc3RhdGVcclxuICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHJlcz8uZGF0YT8ubG9jYXRpb25EYXRhLm1hcCgoY2l0eTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgY2l0eTogY2l0eS5jaXR5LFxyXG4gICAgICAgICAgY2hlY2tlZDogY2l0eUxpc3Q/LmluY2x1ZGVzKGNpdHkuY2l0eSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgfSkpO1xyXG4gIFxyXG4gICAgICAgIC8vIFN5bmMgdGhlIGZldGNoZWQgbG9jYXRpb25zIHdpdGggYW55IHN0b3JlZCBjaGVja2VkIHZhbHVlcyBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5tYXAobG9jYXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkTG9jYXRpb24gPSB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbi5maW5kKChsb2M6IGFueSkgPT4gbG9jLmNpdHkgPT09IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlZExvY2F0aW9uID8geyAuLi5sb2NhdGlvbiwgY2hlY2tlZDogbWF0Y2hlZExvY2F0aW9uLmNoZWNrZWQgfSA6IGxvY2F0aW9uO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0KSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnMuZmlsdGVyKChsb2NhdGlvbjphbnkpID0+IGxvY2F0aW9uLmNpdHkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC50b0xvd2VyQ2FzZSgpKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLmdldFN0b3JlKCk7IC8vIEZldGNoIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgICAgIH0sMTAwMClcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCBsb2NhdGlvbnNcIiwgZXJyKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuICBpc0FsbExvY2F0aW9uc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMuZXZlcnkobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCk7XHJcblxyXG4gIH1cclxuICBcclxuICBzZWxlY3RlZExvY2F0aW9uc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25MYWJlbCA9IHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0Lmxlbmd0aCA/IHRoaXMubG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpIDogIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcihsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAobG9jYXRpb24gPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gJydcclxuICAgICAgOiBzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGggPT09IDFcclxuICAgICAgPyBzZWxlY3RlZExvY2F0aW9uc1swXVxyXG4gICAgICA6IGAke3NlbGVjdGVkTG9jYXRpb25zLmxlbmd0aH0gbG9jYXRpb25zYDtcclxuICB9XHJcblxyXG4gIHJlbW92ZUxvY2F0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5SZXNldCgpO1xyXG4gIH1cclxuICBcclxuICBnZXRHcm91cHMoKTogdm9pZCB7ICAgIFxyXG4gICAgY29uc3QgY2l0eSA9IHRoaXMubG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZClcclxuICAgICAgLm1hcChsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgIGNvbnN0IG9iaiA9IHsgY2l0eSxjbGllbnRJZDp0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPyB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgOnRoaXMudXNlcnMuY2xpZW50SWQsZ3JvdXA6W10gfTtcclxuICAgIHRoaXMuYXV0aC5nZXRHcm91cHMob2JqKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgY2hlY2tlZEdyb3VwID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/Lmdyb3VwPy5maWx0ZXIoKGdyb3VwOmFueSkgPT4gZ3JvdXAuY2hlY2tlZCkubWFwKChncm91cDphbnkpID0+IGdyb3VwLmdyb3VwTmFtZSk7XHJcbiAgICAgICAgY29uc3QgY29tYmluZWRHcm91cHMgPSByZXM/LmRhdGE/Lmdyb3VwRGF0YT8ubWFwKChncm91cE5hbWU6IGFueSkgPT4gKHtcclxuICAgICAgICAgIGdyb3VwTmFtZTogZ3JvdXBOYW1lLmdyb3VwTmFtZSxcclxuICAgICAgICAgIGNoZWNrZWQ6IGNoZWNrZWRHcm91cD8uaW5jbHVkZXMoZ3JvdXBOYW1lLmdyb3VwTmFtZSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuZ3JvdXBzRGF0YSA9IGNvbWJpbmVkR3JvdXBzO1xyXG4gICAgICAgIGlmKHRoaXMuc2VhcmNoR3JvdXBUZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IGNvbWJpbmVkR3JvdXBzLmZpbHRlcigoaXRlbTphbnkpID0+IGl0ZW0uZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hHcm91cFRleHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gY29tYmluZWRHcm91cHM7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIC8vIEF1dG8tZmV0Y2ggc3RvcmVzIHdoZW4gZ3JvdXBzIGFyZSBzZWxlY3RlZFxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBzID0gdGhpcy5ncm91cHNEYXRhLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmNoZWNrZWQpLm1hcCgoZ3JvdXApID0+IGdyb3VwLmdyb3VwTmFtZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAgICAgICAgICAgdGhpcy5nZXRTdG9yZSgpOyAvLyBGZXRjaCBzdG9yZXMgYmFzZWQgb24gc2VsZWN0ZWQgZ3JvdXBzXHJcbiAgICAgICAgICB9LDEwMDApXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggZ3JvdXBzXCIsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZURyb3Bkb3duKHR5cGU6ICdsb2NhdGlvbicgfCAnZ3JvdXAnIHwgJ3N0b3JlJyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZHJvcGRvd25PcGVuID09PSB0eXBlKSB7XHJcbiAgICAgIC8vIElmIHRoZSBkcm9wZG93biBpcyBvcGVuLCBjbG9zZSBpdCBhbmQgYXZvaWQgcmVzZXR0aW5nIHRoZSBzZWxlY3RlZCB2YWx1ZXMgdW5uZWNlc3NhcmlseVxyXG4gICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBPcGVuIHRoZSBzcGVjaWZpYyBkcm9wZG93biBhbmQgaGFuZGxlIGRhdGEgZmV0Y2hpbmcgb25seSBpZiBuZWNlc3NhcnlcclxuICAgICAgdGhpcy5kcm9wZG93bk9wZW4gPSB0eXBlO1xyXG4gIFxyXG4gICAgICBpZiAodHlwZSA9PT0gJ2dyb3VwJykge1xyXG4gICAgICAgIC8vIEZldGNoIGdyb3VwcyBvbmx5IGlmIHRoZXJlIGFyZSBzZWxlY3RlZCBjaXRpZXMgYW5kIG5vIGFjdGl2ZSBzZWFyY2ggdGV4dFxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2l0aWVzID0gdGhpcy5sb2NhdGlvbnNcclxuICAgICAgICAgIC5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKVxyXG4gICAgICAgICAgLm1hcCgobG9jYXRpb24pID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gIFxyXG4gICAgICAgIC8vIEZldGNoIGdyb3VwcyBvbmx5IGlmIGxvY2F0aW9ucyBhcmUgc2VsZWN0ZWQsIG5vIHNlYXJjaCB0ZXh0IGV4aXN0cywgYW5kIGRyb3Bkb3duIGlzIG9wZW5lZFxyXG4gICAgICBpZiAodGhpcy5maWx0ZXJlZExvY2F0aW9ucy5sZW5ndGggPiAwIHx8IChzZWxlY3RlZENpdGllcy5sZW5ndGggPiAwICYmICF0aGlzLnNlYXJjaEdyb3VwVGV4dC50cmltKCkpKSB7XHJcbiAgICAgICAgdGhpcy5nZXRHcm91cHMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107IC8vIENsZWFyIGdyb3VwcyBpZiBubyBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAvLyBGZXRjaCBzdG9yZXMgb25seSBpZiBub3QgYWxyZWFkeSBmZXRjaGVkIGFuZCBubyBzZWFyY2ggdGV4dCBpcyBhY3RpdmVcclxuICAgICAgaWYgKCghdGhpcy5maWx0ZXJlZFN0b3JlcyB8fCB0aGlzLmZpbHRlcmVkU3RvcmVzLmxlbmd0aCA9PT0gMCkgJiYgIXRoaXMuc2VhcmNoU3RvcmVUZXh0LnRyaW0oKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgfSBcclxuICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgaGFuZGxlR3JvdXBEcm9wZG93bkNsaWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZHJvcGRvd25PcGVuID09PSAnZ3JvdXAnKSB7XHJcbiAgICAgIHRoaXMucmVzZXRTZWxlY3RlZEdyb3VwcygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50b2dnbGVEcm9wZG93bignZ3JvdXAnKTtcclxuICB9XHJcblxyXG4gIHJlc2V0U2VsZWN0ZWRHcm91cHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiAoZ3JvdXAuY2hlY2tlZCA9IGZhbHNlKSk7XHJcbiAgICB0aGlzLnNlYXJjaEdyb3VwVGV4dCA9IFwiXCI7XHJcbiAgfVxyXG4gIHNlbGVjdGVkR3JvdXBzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBzID0gdGhpcy5ncm91cExhYmVsID0gdGhpcy5zZWFyY2hHcm91cFRleHQubGVuZ3RoID8gdGhpcy5ncm91cHNEYXRhLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmNoZWNrZWQpIDogdGhpcy5maWx0ZXJlZEdyb3Vwcy5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKTtcclxuICAgIHJldHVybiBzZWxlY3RlZEdyb3Vwcy5sZW5ndGggPT09IDBcclxuICAgICAgPyBcIlwiXHJcbiAgICAgIDogc2VsZWN0ZWRHcm91cHMubGVuZ3RoID09PSAxXHJcbiAgICAgID8gc2VsZWN0ZWRHcm91cHNbMF0uZ3JvdXBOYW1lXHJcbiAgICAgIDogYCR7c2VsZWN0ZWRHcm91cHMubGVuZ3RofSBDbHVzdGVyc2A7XHJcbiAgfVxyXG4gIHJlbW92ZUdyb3VwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5SZXNldCgpO1xyXG4gICBcclxuICB9XHJcbiAgXHJcblxyXG4gIGlzQWxsR3JvdXBzU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICBcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkR3JvdXBzLmxlbmd0aCA/IHRoaXMuZmlsdGVyZWRHcm91cHMuZXZlcnkoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKSA6IGZhbHNlO1xyXG4gIH1cclxuICAgICAgICBcclxuICBnZXRTdG9yZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNpdHkgPSB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAobG9jYXRpb24gPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgXHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzRGF0YVxyXG4gICAgICAuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoZ3JvdXAgPT4gZ3JvdXAuZ3JvdXBOYW1lKTtcclxuICBcclxuICAgIGNvbnN0IGRhdGEgPSB7IGNpdHksIGNsdXN0ZXJzOmdyb3VwLCBjbGllbnRJZDogdGhpcy51c2Vycy5jbGllbnRJZCA/IHRoaXMudXNlcnMuY2xpZW50SWQgOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgfTtcclxuICBcclxuICAgIHRoaXMuYXV0aC5nZXRIZWFkZXJ0cmF4U3RvcmVzKGRhdGEpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmKHJlcyAmJnJlcy5jb2RlID09PTIwMCl7XHJcbiAgICAgICAgdGhpcy5zdG9yZXMgPSByZXMuZGF0YS5zdG9yZXNEYXRhOyAgICAgIFxyXG4gICAgICAgIC8vIFJldHJpZXZlIGNoZWNrZWQgc3RvcmUgSURzIGZyb20gc2VsZWN0ZWRGaWx0ZXJzXHJcbiAgICAgICAgY29uc3QgY2hlY2tlZFN0b3JlSWRzID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/LnN0b3Jlc1xyXG4gICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMuZmlsdGVyKChzdG9yZTogYW55KSA9PiBzdG9yZS5jaGVja2VkKS5tYXAoKHN0b3JlOiBhbnkpID0+IHN0b3JlLnN0b3JlSWQpXHJcbiAgICAgICAgICA6IFtdO1xyXG5cclxuICAgICAgICB0aGlzLnN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHtcclxuICAgICAgICAgIGlmIChjaGVja2VkU3RvcmVJZHMuaW5jbHVkZXMoc3RvcmUuc3RvcmVJZCkpIHtcclxuICAgICAgICAgICAgc3RvcmUuY2hlY2tlZCA9IHRydWU7IC8vIFN5bmMgdGhlIGNoZWNrZWQgc3RhdGUgd2l0aCBmdWxsIHN0b3JlIGxpc3RcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICBcclxuICAgICAgICAvLyBNYXAgdGhlIHN0b3JlcyBhbmQgcmV0YWluIHRoZSAnY2hlY2tlZCcgc3RhdHVzXHJcbiAgICAgICAgaWYodGhpcy5zZWFyY2hTdG9yZVRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXM/LmZpbHRlcihzdG9yZSA9PiBzdG9yZS5zdG9yZU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaFN0b3JlVGV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3JlcztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRW5zdXJlIHNlbGVjdGVkRmlsdGVycyBpcyBpbiBzeW5jIHdpdGggZmlsdGVyZWRTdG9yZXNcclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyB8fCAhdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZXMuZm9yRWFjaChzdG9yZSA9PiB7XHJcbiAgICAgICAgICAgIHN0b3JlLmNoZWNrZWQgPSB0cnVlOyAvLyBTeW5jIHRoZSBjaGVja2VkIHN0YXRlIHdpdGggZnVsbCBzdG9yZSBsaXN0XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gTm8gcHJldmlvdXNseSBzZWxlY3RlZCBzdG9yZXMsIG1hcmsgYWxsIGFzIGNoZWNrZWRcclxuICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSB0aGlzLmZpbHRlcmVkU3RvcmVzLm1hcChzdG9yZSA9PiAoe1xyXG4gICAgICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAgICAgY2hlY2tlZDogdHJ1ZVxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRGaWx0ZXJzIHRvIHJlZmxlY3QgY3VycmVudCBzdGF0ZSBvZiBzdG9yZXNcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuZmlsdGVyZWRTdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBzdG9yZS5jaGVja2VkXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2Ugd2l0aCB0aGUgbGF0ZXN0IHNlbGVjdGVkRmlsdGVyc1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgXHJcbiAgICAgICAgLy8gRW1pdCBkYXRhIHZpYSBzZXJ2aWNlXHJcbiAgICAgICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gdG8gcmVmbGVjdCBjaGFuZ2VzIGluIHRoZSBVSVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcmVzID1bXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXM9W107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9W107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAgICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgICAgY2hlY2tlZDogZmFsc2VcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVzID1bXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXM9W107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9W107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAgICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgICAgY2hlY2tlZDogZmFsc2VcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIHN0b3Jlc1wiLCBlcnIpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG5cclxuICByZXNldFNlbGVjdGVkU3RvcmVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3Jlcy5mb3JFYWNoKChzdG9yZSkgPT4gKHN0b3JlLmNoZWNrZWQgPSBmYWxzZSkpO1xyXG4gICAgdGhpcy5zZWFyY2hTdG9yZVRleHQgPSBcIlwiO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRTdG9yZXNMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRTdG9yZXMgPSB0aGlzLnNlYXJjaFN0b3JlVGV4dC5sZW5ndGggPyB0aGlzLnN0b3Jlcy5maWx0ZXIoKHN0b3JlKSA9PiBzdG9yZS5jaGVja2VkKSA6IHRoaXMuZmlsdGVyZWRTdG9yZXMuZmlsdGVyKChzdG9yZSkgPT4gc3RvcmUuY2hlY2tlZCk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gXCIwIFN0b3Jlc1wiXHJcbiAgICAgIDogc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSAxXHJcbiAgICAgID8gc2VsZWN0ZWRTdG9yZXNbMF0uc3RvcmVOYW1lXHJcbiAgICAgIDogYCR7c2VsZWN0ZWRTdG9yZXMubGVuZ3RofSBTdG9yZXNgO1xyXG4gIH1cclxuXHJcbiAgaXNBbGxTdG9yZXNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkU3RvcmVzLmxlbmd0aCA+IDAgJiYgdGhpcy5maWx0ZXJlZFN0b3Jlcy5ldmVyeShzdG9yZSA9PiBzdG9yZS5jaGVja2VkKTtcclxuICB9XHJcbi8vIE1ldGhvZCB0byBoYW5kbGUgZHJvcGRvd24gaXRlbSBzZWxlY3Rpb25cclxudXBkYXRlU2VsZWN0ZWRTdG9yZXMoKTogdm9pZCB7XHJcbiAgdGhpcy5maWx0ZXJlZFN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHtcclxuICAgIGNvbnN0IGZpbHRlcmVkU3RvcmUgPSB0aGlzLnN0b3Jlcy5maW5kSW5kZXgoZlN0b3JlID0+IGZTdG9yZS5zdG9yZUlkID09PSBzdG9yZS5zdG9yZUlkKTtcclxuICAgIGlmIChmaWx0ZXJlZFN0b3JlICE9IC0xKSB7XHJcbiAgICAgIHRoaXMuc3RvcmVzW2ZpbHRlcmVkU3RvcmVdLmNoZWNrZWQgPSBzdG9yZS5jaGVja2VkOyAvLyBTeW5jIHRoZSBjaGVja2VkIHN0YXRlIHdpdGggZnVsbCBzdG9yZSBsaXN0XHJcbiAgICB9XHJcbiAgfSk7ICBcclxuICAvLyBVcGRhdGUgc2VsZWN0ZWRGaWx0ZXJzIGJhc2VkIG9uIHRoZSBjdXJyZW50IHN0b3JlIHNlbGVjdGlvblxyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuc3RvcmVzLmZpbHRlcihzdG9yZSA9PiBzdG9yZS5jaGVja2VkKTtcclxuXHJcbiAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSB3aXRoIHRoZSBsYXRlc3Qgc2VsZWN0aW9uXHJcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuXHJcbiAgLy8gRW1pdCB1cGRhdGVkIGZpbHRlcnMgdmlhIHNlcnZpY2VcclxuICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG5cclxuICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaWYgbmVjZXNzYXJ5XHJcbiAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbn1cclxuICB0b2dnbGVTZWxlY3RBbGxMb2NhdGlvbnMoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uKSA9PiAobG9jYXRpb24uY2hlY2tlZCA9IGlzQ2hlY2tlZCkpO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsU3RvcmVzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcclxuICBcclxuICAgIC8vIEFwcGx5IHRoZSBzZWxlY3Rpb24gdG8gYm90aCBmaWx0ZXJlZCBhbmQgZnVsbCBsaXN0IG9mIHN0b3Jlc1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHN0b3JlLmNoZWNrZWQgPSBjaGVja2VkKTtcclxuICAgIHRoaXMuc3RvcmVzLmZvckVhY2goc3RvcmUgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFN0b3JlID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5maW5kKGZTdG9yZSA9PiBmU3RvcmUuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk7XHJcbiAgICAgIGlmIChmaWx0ZXJlZFN0b3JlKSB7XHJcbiAgICAgICAgc3RvcmUuY2hlY2tlZCA9IGNoZWNrZWQ7IC8vIFN5bmMgdGhlIGNoZWNrZWQgc3RhdGUgd2l0aCBmdWxsIHN0b3JlIGxpc3RcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIHN0b3JlcyBhbmQgcGVyc2lzdCB0aGUgc2VsZWN0aW9uXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkU3RvcmVzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpOiB2b2lkIHtcclxuICAgIC8vIFdoZW4gbG9jYXRpb25zIGFyZSBzZWxlY3RlZCwgZmV0Y2ggdGhlIHJlbGF0ZWQgZ3JvdXBzXHJcbiAgICBjb25zdCBzZWxlY3RlZENpdGllcyA9IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcigobG9jYXRpb24pID0+IGxvY2F0aW9uLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb246YW55KSA9PiB7XHJcbiAgICAgIGxldCBmaW5kTG9jYXRpb25JbmRleCA9IHRoaXMubG9jYXRpb25zLmZpbmRJbmRleCgobG9jOmFueSkgPT4gbG9jLmNpdHkgPT0gbG9jYXRpb24uY2l0eSk7XHJcbiAgICAgIGlmKGZpbmRMb2NhdGlvbkluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbnNbZmluZExvY2F0aW9uSW5kZXhdLmNoZWNrZWQgPSBsb2NhdGlvbi5jaGVja2VkO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKHNlbGVjdGVkQ2l0aWVzLmxlbmd0aCA+IDAgfHwgIXNlbGVjdGVkQ2l0aWVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPVtdO1xyXG4gICAgICB0aGlzLmdyb3Vwc0RhdGEgPVtdXHJcbiAgICAgIHRoaXMuZ2V0R3JvdXBzKCk7IC8vIEZldGNoIGdyb3VwcyBiYXNlZCBvbiBzZWxlY3RlZCBjaXRpZXNcclxuICAgICAgLy8gSWYgdGhlcmUgYXJlIHNlbGVjdGVkIGdyb3VwcywgZmV0Y2ggdGhlIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb25zO1xyXG4gICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdOyAvLyBDbGVhciBncm91cHMgaWYgbm8gbG9jYXRpb25zIGFyZSBzZWxlY3RlZFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IFtdO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IFtdO1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdOyAvLyBSZXNldCBzdG9yZXMgYXMgd2VsbFxyXG4gICAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSAnJztcclxuICAgIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gJyc7XHJcbiAgICAvLyB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsR3JvdXBzKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xyXG4gICAgdGhpcy5maWx0ZXJlZEdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gKGdyb3VwLmNoZWNrZWQgPSBpc0NoZWNrZWQpKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRHcm91cHMoKTtcclxuICAgIC8vIGlmICghaXNDaGVja2VkKSB7XHJcbiAgICAvLyAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9W107XHJcbiAgICAvLyAgICAvLyBJZiB0aGVyZSBhcmUgc2VsZWN0ZWQgZ3JvdXBzLCBmZXRjaCB0aGUgc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgLy8gICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgLy8gIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlbGVjdGVkR3JvdXBzKCk6IHZvaWQge1xyXG4gICAgLy8gRmV0Y2ggdGhlIHJlbGV2YW50IHN0b3JlcyBhZnRlciBncm91cHMgYXJlIHNlbGVjdGVkXHJcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZmlsdGVyZWRHcm91cHNcclxuICAgICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoKGdyb3VwKSA9PiBncm91cC5ncm91cE5hbWUpO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyZWRHcm91cHMuZm9yRWFjaCgoZ3JvdXA6YW55KSA9PiB7XHJcbiAgICAgIGxldCBmaW5kR3JvdXBJbmRleCA9IHRoaXMuZ3JvdXBzRGF0YS5maW5kSW5kZXgoKGl0ZW06YW55KSA9PiBpdGVtLmdyb3VwTmFtZSA9PSBncm91cC5ncm91cE5hbWUpO1xyXG4gICAgICBpZihmaW5kR3JvdXBJbmRleCAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMuZ3JvdXBzRGF0YVtmaW5kR3JvdXBJbmRleF0uY2hlY2tlZCA9IGdyb3VwLmNoZWNrZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pIFxyXG4gICAgaWYgKHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA+IDAgfHwgIXNlbGVjdGVkR3JvdXBzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPVtdO1xyXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgc2VsZWN0ZWQgZ3JvdXBzLCBmZXRjaCB0aGUgc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gdGhpcy5ncm91cHNEYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgbm8gZ3JvdXBzIGFyZSBzZWxlY3RlZCwgY2xlYXIgdGhlIHN0b3JlcyBsaXN0XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTtcclxuICAgICAgXHJcbiAgICAgIC8vIEFsc28sIHVwZGF0ZSBsb2NhbFN0b3JhZ2UgdG8gcmVmbGVjdCB0aGUgY2xlYXJlZCBzdG9yZSBzZWxlY3Rpb25cclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gW107XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgXHJcbiAgICAgIC8vIEVtaXQgZGF0YSB2aWEgc2VydmljZVxyXG4gICAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgLy8gQ2xlYXIgdGhlIHNlYXJjaCBzdG9yZSB0ZXh0IHdoZW4gZ3JvdXBzIGFyZSB1cGRhdGVkXHJcbiAgICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9ICcnO1xyXG4gIH1cclxuICBcclxuICBSZXNldCgpOiB2b2lkIHtcclxuICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAgICAvLyBDbGVhciBzZWxlY3RlZCBncm91cHMsIHN0b3JlcywgYW5kIGxvY2F0aW9uc1xyXG4gIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBbXTtcclxuICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gW107XHJcbiAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IFtdOyAvLyBSZXNldCBsb2NhdGlvbnMgYXMgd2VsbFxyXG50aGlzLmxvY2F0aW9ucyA9W107dGhpcy5ncm91cHNEYXRhID1bXTsgdGhpcy5zdG9yZXMgPVtdO1xyXG4gIC8vIENsZWFyIHNlYXJjaCBpbnB1dCBmaWVsZHNcclxuICB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dCA9IFwiXCI7XHJcbiAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSBcIlwiO1xyXG4gIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gXCJcIjtcclxudGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID1bXTtcclxudGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPVtdO1xyXG50aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9W107XHJcblxyXG4gXHJcbiAgLy8gRmV0Y2ggbG9jYXRpb25zLCBncm91cHMsIGFuZCBzdG9yZXMgYWdhaW5cclxuICB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gIHRoaXMuZ2V0U3RvcmUoKTtcclxuICB0aGlzLmdldEdyb3VwcygpO1xyXG4gIC8vIFJlc2V0IHRoZSBmaWx0ZXJzIGluIHNlbGVjdGVkRmlsdGVyc1xyXG5cclxuXHJcbiAgLy8gLy8gT25jZSBzdG9yZXMgYXJlIGZldGNoZWQsIG1hcmsgYWxsIGFzIGNoZWNrZWRcclxuICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAvLyAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAvLyAgICAgLi4uc3RvcmUsXHJcbiAgLy8gICAgIGNoZWNrZWQ6IHRydWUgIC8vIE1hcmsgYWxsIHN0b3JlcyBhcyBjaGVja2VkXHJcbiAgLy8gICB9KSk7XHJcblxyXG4gIC8vICAgLy8gU3luYyBzZWxlY3RlZEZpbHRlcnMgd2l0aCB0aGUgdXBkYXRlZCBzdG9yZSBzdGF0ZVxyXG4gIC8vICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5tYXAoc3RvcmUgPT4gKHtcclxuICAvLyAgICAgLi4uc3RvcmUsXHJcbiAgLy8gICAgIGNoZWNrZWQ6IHRydWVcclxuICAvLyAgIH0pKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIHdpdGggdGhlIGxhdGVzdCBzZWxlY3RlZEZpbHRlcnNcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcclxuICAgIC8vIEVtaXQgdGhlIHJlc2V0IGZpbHRlcnMgdG8gdXBkYXRlIG90aGVyIGNvbXBvbmVudHMgaWYgbmVlZGVkXHJcbiAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgLy8gQWRkaW5nIGEgc2xpZ2h0IGRlbGF5IHRvIGVuc3VyZSBzdG9yZXMgYXJlIGZldGNoZWQgZmlyc3RcclxuIFxyXG4gIFxyXG4gICAgLy8gQ2xvc2UgZHJvcGRvd24gYWZ0ZXIgcmVzZXQgaWYgbmVjZXNzYXJ5XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIH0sMTAwKVxyXG4gIH1cclxuICBcclxuICBcclxuICBcclxuICBBcHBseSgpOiB2b2lkIHtcclxuICAgIC8vIENsb3NlIHRoZSBkcm9wZG93blxyXG4gICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICBcclxuICAgIC8vIEZldGNoIGV4aXN0aW5nIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcclxuICAgIGNvbnN0IGhlYWRlckZpbHRlcnM6IGFueSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiKSB8fCBcInt9XCIpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmUgPSAgbnVsbFxyXG4gICAgLy8gRW5zdXJlIGN1cnJlbnQgc2VsZWN0aW9ucyBhcmUgcmVmbGVjdGVkXHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb25zO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSB0aGlzLmdyb3Vwc0RhdGE7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlcyA/IGhlYWRlckZpbHRlcnMuc3RvcmVzIDogdGhpcy5zdG9yZXM7XHJcbiAgXHJcbiAgXHJcbiAgICAvLyBTdG9yZSB1cGRhdGVkIGZpbHRlcnMgYmFjayBpbiBsb2NhbFN0b3JhZ2VcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gICAgLy8gRW1pdCB0aGUgdXBkYXRlZCBmaWx0ZXJzIHZpYSB0aGUgc2VydmljZVxyXG4gICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIC8vIFRyaWdnZXIgcmVmcmVzaCBpZiBuZWNlc3NhcnlcclxuICAgIC8vIHRoaXMuZ3MubWFuYWdlUmVmcmVzaFRyaWdnZXIubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBcclxuICBmaWx0ZXJMb2NhdGlvbnMoKTogdm9pZCB7ICAgIFxyXG4gICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgICBcclxuICAgIGlmIChzZWFyY2hUZXh0KSB7XHJcbiAgICAgIC8vIFByZXNlcnZlIHRoZSBjaGVja2VkIHN0YXRlIGR1cmluZyBmaWx0ZXJpbmdcclxuICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25zXHJcbiAgICAgICAgLm1hcChsb2NhdGlvbiA9PiAoe1xyXG4gICAgICAgICAgLi4ubG9jYXRpb24sXHJcbiAgICAgICAgICBjaGVja2VkOiB0aGlzLmZpbHRlcmVkTG9jYXRpb25zLmZpbmQobCA9PiBsLmNpdHkgPT09IGxvY2F0aW9uLmNpdHkpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgLmZpbHRlcihsb2NhdGlvbiA9PlxyXG4gICAgICAgICAgbG9jYXRpb24/LmNpdHk/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGV4dClcclxuICAgICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgY2hlY2tlZCBzdGF0ZSB3aGVuIHNlYXJjaCB0ZXh0IGlzIGNsZWFyZWRcclxuICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25zLm1hcChsb2NhdGlvbiA9PiAoe1xyXG4gICAgICAgIC4uLmxvY2F0aW9uLFxyXG4gICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uLmZpbmQoKGw6YW55KSA9PiBsLmNpdHkgPT09IGxvY2F0aW9uLmNpdHkpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcblxyXG4gIGZpbHRlckdyb3VwcygpOiB2b2lkIHsgIFxyXG4gICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoR3JvdXBUZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgICBcclxuICAgIGlmIChzZWFyY2hUZXh0KSB7XHJcbiAgICAgIC8vIFByZXNlcnZlIHRoZSBjaGVja2VkIHN0YXRlIGR1cmluZyBmaWx0ZXJpbmdcclxuICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IHRoaXMuZ3JvdXBzRGF0YVxyXG4gICAgICAgIC5tYXAoZ3JvdXAgPT4gKHtcclxuICAgICAgICAgIC4uLmdyb3VwLFxyXG4gICAgICAgICAgY2hlY2tlZDogdGhpcy5maWx0ZXJlZEdyb3Vwcy5maW5kKGcgPT4gZy5ncm91cE5hbWUgPT09IGdyb3VwLmdyb3VwTmFtZSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9KSlcclxuICAgICAgICAuZmlsdGVyKGdyb3VwID0+XHJcbiAgICAgICAgICBncm91cD8uZ3JvdXBOYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpXHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGNoZWNrZWQgc3RhdGUgd2hlbiBzZWFyY2ggdGV4dCBpcyBjbGVhcmVkXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSB0aGlzLmdyb3Vwc0RhdGEubWFwKGdyb3VwID0+ICh7XHJcbiAgICAgICAgLi4uZ3JvdXAsXHJcbiAgICAgICAgY2hlY2tlZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAuZmluZCgoZzphbnkpID0+IGcuZ3JvdXBOYW1lID09PSBncm91cC5ncm91cE5hbWUpPy5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgZmlsdGVyU3RvcmVzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VhcmNoVGV4dCA9IHRoaXMuc2VhcmNoU3RvcmVUZXh0LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAvLyBQcmVzZXJ2ZSBjaGVja2VkIHN0YXRlcyBkdXJpbmcgZmlsdGVyaW5nXHJcbiAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICAvLyBGaWx0ZXIgYmFzZWQgb24gc2VhcmNoIHRleHQgd2hpbGUgcHJlc2VydmluZyBjaGVja2VkIHN0YXRlXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3Jlc1xyXG4gICAgICAgIC5tYXAoc3RvcmUgPT4gKHtcclxuICAgICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0b3JlIGlzIGFscmVhZHkgY2hlY2tlZCBpbiBmaWx0ZXJlZFN0b3JlcywgZmFsbGJhY2sgdG8gb3JpZ2luYWwgc3RvcmVzJyBjaGVja2VkIHN0YXRlXHJcbiAgICAgICAgICBjaGVja2VkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMuZmluZCgoczogYW55KSA9PiBzLnN0b3JlSWQgPT09IHN0b3JlLnN0b3JlSWQpPy5jaGVja2VkIHx8IHN0b3JlLmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9KSlcclxuICAgICAgICAuZmlsdGVyKHN0b3JlID0+IHN0b3JlLnN0b3JlTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFdoZW4gdGhlIHNlYXJjaCB0ZXh0IGlzIGNsZWFyZWQsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGxpc3Qgd2l0aCBwcmVzZXJ2ZWQgY2hlY2tlZCBzdGF0ZXNcclxuICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IHRoaXMuc3RvcmVzLm1hcChzdG9yZSA9PiAoe1xyXG4gICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSBjaGVja2VkIHN0YXRlIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBmaWx0ZXJzXHJcbiAgICAgICAgY2hlY2tlZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzLmZpbmQoKHM6IGFueSkgPT4gcy5zdG9yZUlkID09PSBzdG9yZS5zdG9yZUlkKT8uY2hlY2tlZCB8fCBzdG9yZS5jaGVja2VkIHx8IGZhbHNlXHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgIFxyXG4gIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKFwiZG9jdW1lbnQ6Y2xpY2tcIiwgW1wiJGV2ZW50XCJdKVxyXG4gIGNsaWNrT3V0c2lkZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2xpY2tlZEluc2lkZSA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXHJcbiAgICAgIFwiLmRyb3Bkb3duLWNvbnRhaW5lclwiXHJcbiAgICApO1xyXG4gICAgY29uc3QgY2xpY2tlZG91dFNpZGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFxyXG4gICAgICBcIi5kcm9wZG93bjJcIlxyXG4gICAgKTtcclxuICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xyXG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcclxuICAgIH1cclxuICAgIGlmKCFjbGlja2Vkb3V0U2lkZSkge1xyXG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd24xKCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBzZWxlY3RlZExvY2F0aW9uc0xhYmVsMSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9uTGFiZWwgPSB0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC5sZW5ndGggPyB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpLm1hcChsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaXR5KSA6ICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkTG9jYXRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/ICcnXHJcbiAgICAgIDogYCR7c2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RofWA7XHJcbiAgfVxyXG4gICAgICAgIHNlbGVjdGVkR3JvdXBzTGFiZWwxKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZ3JvdXBMYWJlbCA9IHRoaXMuc2VhcmNoR3JvdXBUZXh0Lmxlbmd0aCA/IHRoaXMuZ3JvdXBzRGF0YS5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKSA6IHRoaXMuZmlsdGVyZWRHcm91cHMuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAuY2hlY2tlZCk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRHcm91cHMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gXCJcIlxyXG4gICAgICA6IGAke3NlbGVjdGVkR3JvdXBzLmxlbmd0aH1gO1xyXG4gIH1cclxuXHJcbiAgICBzZWxlY3RlZFN0b3Jlc0xhYmVsMSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRTdG9yZXMgPSB0aGlzLnNlYXJjaFN0b3JlVGV4dC5sZW5ndGggPyB0aGlzLnN0b3Jlcy5maWx0ZXIoKHN0b3JlKSA9PiBzdG9yZS5jaGVja2VkKSA6IHRoaXMuZmlsdGVyZWRTdG9yZXMuZmlsdGVyKChzdG9yZSkgPT4gc3RvcmUuY2hlY2tlZCk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRTdG9yZXMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gXCIwXCJcclxuICAgICAgOiBgJHtzZWxlY3RlZFN0b3Jlcy5sZW5ndGh9YDtcclxuICB9XHJcbiAgXHJcbiAgZ2V0U2VsZWN0ZWRDb3VudCh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHN3aXRjaCAodHlwZSkge1xyXG4gICAgY2FzZSAnbG9jYXRpb24nOlxyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZExvY2F0aW9uc0xhYmVsMSgpO1xyXG4gICAgY2FzZSAnZ3JvdXAnOlxyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEdyb3Vwc0xhYmVsMSgpO1xyXG4gICAgY2FzZSAnc3RvcmUnOlxyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFN0b3Jlc0xhYmVsMSgpO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICcnO1xyXG4gIH1cclxufVxyXG4gIGFjdGl2ZURyb3Bkb3duOiBzdHJpbmcgPSAnJztcclxuXHJcbi8vIEFkZCB0aGlzIG1ldGhvZCB0byBoYW5kbGUgY2F0ZWdvcnkgY2xpY2tzXHJcbnNob3dEcm9wZG93bih0eXBlOiBzdHJpbmcpIHtcclxuICB0aGlzLmFjdGl2ZURyb3Bkb3duID0gdHlwZTtcclxuICAvLyBSZXNldCBzZWFyY2ggdGV4dHMgd2hlbiBzd2l0Y2hpbmcgZHJvcGRvd25zXHJcbiAgdGhpcy5zZWFyY2hMb2NhdGlvblRleHQgPSAnJztcclxuICB0aGlzLnNlYXJjaEdyb3VwVGV4dCA9ICcnO1xyXG4gIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gJyc7XHJcbiAgXHJcbiAgLy8gUmVzZXQgZmlsdGVyZWQgbGlzdHMgdG8gc2hvdyBhbGwgaXRlbXNcclxuICB0aGlzLmZpbHRlckxvY2F0aW9ucygpO1xyXG4gIHRoaXMuZmlsdGVyR3JvdXBzKCk7XHJcbiAgdGhpcy5maWx0ZXJTdG9yZXMoKTtcclxufVxyXG5zaG93Q2xpY2sodHlwZTogYW55LGU6TW91c2VFdmVudCkge1xyXG4gIHRoaXMub3BlbmRyb3Bkb3duKGUpXHJcbiAgdGhpcy5PcGVuZHJvcGRvd24gPSB0cnVlO1xyXG4gIHRoaXMuYWN0aXZlRHJvcGRvd24gPSB0eXBlO1xyXG59XHJcbn1cclxuaW50ZXJmYWNlIENpdHkge1xyXG4gIGNpdHk6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIExvY2F0aW9uIHtcclxuICBjaXR5OiBDaXR5O1xyXG4gIGNoZWNrZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwibWUtM1wiPlxyXG4gICAgPGxhYmVsICpuZ0lmPVwic2VsZWN0ZWRMb2NhdGlvbnNMYWJlbCgpXCIgY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1kZWZhdWx0IG14LTIgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic2hvd0NsaWNrKCdyZWdpb24nLCAkZXZlbnQpXCI+e3tzZWxlY3RlZExvY2F0aW9uc0xhYmVsKCl9fSBcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInJlbW92ZUxvY2F0aW9uKClcIj48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgPC9zdmc+PC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuICAgIDxsYWJlbCAqbmdJZj1cInNlbGVjdGVkR3JvdXBzTGFiZWwoKVwiICBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LWRlZmF1bHQgbXgtMiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzaG93Q2xpY2soJ2NsdXN0ZXJzJywgJGV2ZW50KVwiPnt7c2VsZWN0ZWRHcm91cHNMYWJlbCgpfX0gXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVHcm91cCgpXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8bGFiZWwgIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdCBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzaG93Q2xpY2soJ3N0b3JlcycsICRldmVudClcIj57e3NlbGVjdGVkU3RvcmVzTGFiZWwoKX19PC9sYWJlbD5cclxuPC9kaXY+XHJcblxyXG5cclxuPGRpdiBjbGFzcz1cIndyYXBwZXIgbWUtM1wiICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/LnVzZXJUeXBlID09PSAndGFuZ28nXCI+XHJcbjxsaWItc2VsZWN0IFtpdGVtc109XCJjbGllbnRMaXN0XCIgW211bHRpXT1cImZhbHNlXCIgW3NlYXJjaEZpZWxkXT1cIidjbGllbnROYW1lJ1wiIFtkaXNhYmxlZF09XCJmYWxzZVwiIFtpZEZpZWxkXT1cIidjbGllbnRJZCdcIlxyXG4oc2VsZWN0ZWQpPVwib25DbGllbnRTZWxlY3QoJGV2ZW50KVwiIFtzZWxlY3RlZFZhbHVlc109XCJbc2VsZWN0ZWRDbGllbnRdXCI+PC9saWItc2VsZWN0PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvcGVuZHJvcGRvd24oJGV2ZW50KVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIG14LTIgcm91bmRlZC0zIHRleHQtbm93cmFwIGJvcmRlci12YWxcIj5cclxuICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDE5IDE3XCIgZmlsbD1cIm5vbmVcIj5cclxuPHBhdGggZD1cIk0xNy41MDI2IDAuODM1OTM4SDAuODM1OTM4TDcuNTAyNiA4LjcxOTI3VjE0LjE2OTNMMTAuODM1OSAxNS44MzU5VjguNzE5MjdMMTcuNTAyNiAwLjgzNTkzOFpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuPC9zdmc+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj5GaWx0ZXI8L3NwYW4+XHJcbiAgPC9idXR0b24+XHJcbiAgXHJcbiAgPGRpdiAqbmdJZj1cIk9wZW5kcm9wZG93blwiIGNsYXNzPVwiY2FyZCBkcm9wZG93bjIgcG9zaXRpb24tYWJzb2x1dGUgei0xIGVuZC0wXCIgc3R5bGU9XCJ6LWluZGV4OiAxICFpbXBvcnRhbnQ7IG1pbi13aWR0aDogMzUwcHg7XCIgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZURyb3Bkb3duMSgpXCI+XHJcbiAgICBcclxuICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHB4LTMganVzdGlmeS1jb250ZW50LWJldHdlZW4gcHQtMSBweC0wIGJvcmRlci1ib3R0b20gYWxpZ24taXRlbXMtY2VudGVyIG1iLTFcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNVwiPlxyXG4gICAgICA8aDYgY2xhc3M9XCJtYi0wIGhlYWRlci1maWx0ZXIgcHMtMiBteS00XCI+RmlsdGVyIGJ5PC9oNj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNyB0ZXh0LW11dGVkIG10LTJcIj4gXHJcbiAgICAgICAgPCEtLSBTZWFyY2ggZnJvbSAyMDAwIHN0b3JlcyAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZURyb3Bkb3duID09PSAncmVnaW9uJ1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gbWItM1wiIFxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHJlZ2lvblwiIFxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoTG9jYXRpb25UZXh0XCIgXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyTG9jYXRpb25zKClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVEcm9wZG93biA9PT0gJ2NsdXN0ZXJzJ1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gbWItM1wiIFxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNsdXN0ZXJzXCIgXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hHcm91cFRleHRcIiBcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJHcm91cHMoKVwiIFxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZURyb3Bkb3duID09PSAnc3RvcmVzJ1wiPlxyXG4gICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSBtYi0zXCIgXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBzdG9yZXNcIiBcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoU3RvcmVUZXh0XCIgXHJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJTdG9yZXMoKVwiIFxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIE1haW4gQ29udGVudCBBcmVhIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICA8IS0tIExlZnQgU2lkZSAtIEZpbHRlciBDYXRlZ29yaWVzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTUgYm9yZGVyLWVuZCBwZS0zXCI+XHJcbiAgICAgICAgPCEtLSBGaWx0ZXIgU3RhdHMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1jYXRlZ29yaWVzIHB4LTMgbXktMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1jYXRlZ29yeS1pdGVtICBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJzaG93RHJvcGRvd24oJ3JlZ2lvbicpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwie1xyXG4gICAgJ2FjdGl2ZS1pdGVtJzogYWN0aXZlRHJvcGRvd24gPT09ICdyZWdpb24nLCBcclxuICAgICd0ZXh0LWl0ZW0nOiBhY3RpdmVEcm9wZG93biAhPT0gJ3JlZ2lvbidcclxuICB9XCI+UmVnaW9uIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRMb2NhdGlvbnNMYWJlbDEoKVwiICBbbmdDbGFzc109XCJhY3RpdmVEcm9wZG93bj09PSAncmVnaW9uJyA/ICd0ZXh0LWJvcmRlci1wcmlhbXJ5JyA6ICd0ZXh0LWJvcmRlcidcIiBjbGFzcz1cIm14LTJcIj57eyBzZWxlY3RlZExvY2F0aW9uc0xhYmVsMSgpIH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmdy1ib2xkXCI+PC9kaXY+IC0tPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWNhdGVnb3J5LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic2hvd0Ryb3Bkb3duKCdjbHVzdGVycycpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwie1xyXG4gICAgJ2FjdGl2ZS1pdGVtJzogYWN0aXZlRHJvcGRvd24gPT09ICdjbHVzdGVycycsIFxyXG4gICAgJ3RleHQtaXRlbSc6IGFjdGl2ZURyb3Bkb3duICE9PSAnY2x1c3RlcnMnXHJcbiAgfVwiPkNsdXN0ZXJzIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRHcm91cHNMYWJlbDEoKVwiICBbbmdDbGFzc109XCJhY3RpdmVEcm9wZG93bj09PSAnY2x1c3RlcnMnID8gJ3RleHQtYm9yZGVyLXByaWFtcnknIDogJ3RleHQtYm9yZGVyJ1wiIGNsYXNzPVwibXgtMlwiPnt7IHNlbGVjdGVkR3JvdXBzTGFiZWwxKCkgfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWNhdGVnb3J5LWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic2hvd0Ryb3Bkb3duKCdzdG9yZXMnKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIntcclxuICAgICdhY3RpdmUtaXRlbSc6IGFjdGl2ZURyb3Bkb3duID09PSAnc3RvcmVzJywgXHJcbiAgICAndGV4dC1pdGVtJzogYWN0aXZlRHJvcGRvd24gIT09ICdzdG9yZXMnXHJcbiAgfVwiID5TdG9yZXMgPHNwYW4gIFtuZ0NsYXNzXT1cImFjdGl2ZURyb3Bkb3duPT09ICdzdG9yZXMnID8gJ3RleHQtYm9yZGVyLXByaWFtcnknIDogJ3RleHQtYm9yZGVyJ1wiICpuZ0lmPVwic2VsZWN0ZWRTdG9yZXNMYWJlbDEoKVwiIGNsYXNzPVwibXgtMlwiPnt7IHNlbGVjdGVkU3RvcmVzTGFiZWwxKCkgfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRG93bnRpbWUgU2VjdGlvbiAtLT5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC00XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGwgdGV4dC1tdXRlZCBtYi0yXCI+RG93bnRpbWU8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBweS0xXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZFwiPkRvd250aW1lIHNlY3Rpb248L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBSaWdodCBTaWRlIC0gRHJvcGRvd24gQ29udGVudCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC03IHBzLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudC1hcmVhXCIgc3R5bGU9XCJtaW4taGVpZ2h0OiAyMDBweDtcIj5cclxuICAgICAgICAgIFxyXG5cclxuICAgICAgICAgIDwhLS0gUmVnaW9uIERyb3Bkb3duIENvbnRlbnQgLS0+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlRHJvcGRvd24gPT09ICdyZWdpb24nXCIgY2xhc3M9XCJkcm9wZG93bi1mdWxsLXZpZXdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItM1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBpZD1cInNlbGVjdEFsbExvY2F0aW9uc0Z1bGxcIiBcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsTG9jYXRpb25zU2VsZWN0ZWQoKVwiIFxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGxMb2NhdGlvbnMoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbExvY2F0aW9uc0Z1bGxcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWxpc3QgdGV4dC1ub3dyYXBcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDI1MHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1iLTNcIiAqbmdGb3I9XCJsZXQgbG9jYXRpb24gb2YgZmlsdGVyZWRMb2NhdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiJ2xvY2F0aW9uLWZ1bGwtJyArIGxvY2F0aW9uLmNpdHlcIiBcclxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJsb2NhdGlvbi5jaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpXCIgXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBweS0xXCIgW2Zvcl09XCInbG9jYXRpb24tZnVsbC0nICsgbG9jYXRpb24uY2l0eVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBsb2NhdGlvbi5jaXR5IH19XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gQ2x1c3RlcnMgRHJvcGRvd24gQ29udGVudCAtLT5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVEcm9wZG93biA9PT0gJ2NsdXN0ZXJzJ1wiIGNsYXNzPVwiZHJvcGRvd24tZnVsbC12aWV3XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1iLTNcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RBbGxHcm91cHNGdWxsXCIgXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbEdyb3Vwc1NlbGVjdGVkKClcIiBcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsR3JvdXBzKCRldmVudClcIiBcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzZWxlY3RBbGxHcm91cHNGdWxsXCI+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQWxsXHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1saXN0IHRleHQtbm93cmFwXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAyNTBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yXCIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGZpbHRlcmVkR3JvdXBzXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidncm91cC1mdWxsLScgKyBncm91cC5ncm91cE5hbWVcIiBcclxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJncm91cC5jaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZEdyb3VwcygpXCIgXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBweS0xXCIgW2Zvcl09XCInZ3JvdXAtZnVsbC0nICsgZ3JvdXAuZ3JvdXBOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGdyb3VwLmdyb3VwTmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIFN0b3JlcyBEcm9wZG93biBDb250ZW50IC0tPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZURyb3Bkb3duID09PSAnc3RvcmVzJ1wiIGNsYXNzPVwiZHJvcGRvd24tZnVsbC12aWV3XCI+XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItM1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBpZD1cInNlbGVjdEFsbFN0b3Jlc0Z1bGxcIiBcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsU3RvcmVzU2VsZWN0ZWQoKVwiIFxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGxTdG9yZXMoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbFN0b3Jlc0Z1bGxcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWxpc3QgdGV4dC1ub3dyYXBcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDI1MHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1iLTJcIiAqbmdGb3I9XCJsZXQgc3RvcmUgb2YgZmlsdGVyZWRTdG9yZXNcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiJ3N0b3JlLWZ1bGwtJyArIHN0b3JlLnN0b3JlSWRcIiBcclxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdG9yZS5jaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZFN0b3JlcygpXCIgXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBweS0xXCIgW2Zvcl09XCInc3RvcmUtZnVsbC0nICsgc3RvcmUuc3RvcmVJZFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzdG9yZS5zdG9yZU5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBEZWZhdWx0IFZpZXcgd2hlbiBubyBkcm9wZG93biBzZWxlY3RlZCAtLT5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhYWN0aXZlRHJvcGRvd25cIiBjbGFzcz1cInRleHQtY2VudGVyIHRleHQtbXV0ZWQgcHktNVwiPlxyXG4gICAgICAgICAgICA8ZGl2PlNlbGVjdCBhIGZpbHRlciBjYXRlZ29yeSB0byBzZWUgb3B0aW9uczwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gQWN0aW9uIEJ1dHRvbnMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHAtMyBib3JkZXItdG9wIG10LTNcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgdGV4dC1tdXRlZCBidG4tc20gcHMtMlwiIChjbGljayk9XCJSZXNldCgpXCI+UmVzZXQgRmlsdGVyczwvYnV0dG9uPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgYnRuLXNtIG1lLTJcIiAoY2xpY2spPVwiY2xvc2VEcm9wZG93bjEoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCIgKGNsaWNrKT1cIkFwcGx5KClcIj5BcHBseTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
779
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJheC13aXRob3V0ZGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hcHAtc2hhcmVkL3NyYy9saWIvbW9kdWxlcy9sYXlvdXQvdG9vbGJhci90cmF4LXdpdGhvdXRkYXRlL3RyYXgtd2l0aG91dGRhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYXBwLXNoYXJlZC9zcmMvbGliL21vZHVsZXMvbGF5b3V0L3Rvb2xiYXIvdHJheC13aXRob3V0ZGF0ZS90cmF4LXdpdGhvdXRkYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxHQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLGlCQUFpQixDQUFDOzs7Ozs7OztBQVV6QixNQUFNLE9BQU8sd0JBQXdCO0lBcUN6QjtJQUEwQjtJQUMzQjtJQUNDO0lBdENYLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDYixZQUFZLEdBQUcsQ0FBQyxDQUFjLEVBQUUsRUFBRTtRQUNoQyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFFRixpQkFBaUIsR0FBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQztRQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRSxDQUFDO0lBQ3pDLGVBQWUsR0FBUTtRQUNyQixNQUFNLEVBQUUsSUFB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WUFBWSxDQUFDLElBQVk7UUFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsOENBQThDO1FBQzlDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFFMUIseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxTQUFTLENBQUMsSUFBUyxFQUFDLENBQVk7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO3dHQWwxQlksd0JBQXdCOzRGQUF4Qix3QkFBd0IsK0hDakJyQyxrNFlBb1BNOzs0RkRuT08sd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjtzS0ErQ2hDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvdUIxQyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgT25Jbml0LFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcclxuaW1wb3J0IFwiZGF5anMvbG9jYWxlL2VuXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktZ2xvYmFsXCI7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10cmF4LXdpdGhvdXRkYXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHJheC13aXRob3V0ZGF0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3RyYXgtd2l0aG91dGRhdGUuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmF4V2l0aG91dGRhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gZGF5anMgPSBkYXlqcztcclxuICBpc0N1c3RvbURhdGUgPSAobTogZGF5anMuRGF5anMpID0+IHtcclxuICAgIGNvbnN0IGlzVmFsaWREYXRlID0gbSA+IHRoaXMuZGF5anMoKTtcclxuICAgIHJldHVybiBpc1ZhbGlkRGF0ZSA/IFwiaW52YWxpZC1kYXRlXCIgOiBmYWxzZTtcclxuICB9O1xyXG5cclxuICBzZWxlY3RlZERhdGVSYW5nZTogYW55ID0geyBzdGFydERhdGU6IGRheWpzKCkuc3VidHJhY3QoMzAsICdkYXlzJyksXHJcbiAgICBlbmREYXRlOiBkYXlqcygpLnN1YnRyYWN0KDEsIFwiZGF5c1wiKSx9O1xyXG4gIHNlbGVjdGVkRmlsdGVyczogYW55ID0ge1xyXG4gICAgY2xpZW50OiBudWxsLFxyXG4gICAgY2xpZW50TmFtZTogbnVsbCxcclxuICAgIGNsaWVudHM6IFtdLFxyXG4gICAgc3RvcmU6IG51bGwsXHJcbiAgICBzdG9yZXM6IFtdLFxyXG4gICAgZGF0ZTogbnVsbCxcclxuICAgIGdyb3VwOiBbXSxcclxuICAgIGxvY2F0aW9uOiBbXSxcclxuICB9O1xyXG4gIE9wZW5kcm9wZG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRyb3Bkb3duT3Blbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vICdsb2NhdGlvbicgb3IgJ2dyb3VwJ1xyXG4gIHNlYXJjaExvY2F0aW9uVGV4dDogc3RyaW5nID0gXCJcIjtcclxuICBzZWFyY2hHcm91cFRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgbG9jYXRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkTG9jYXRpb25zOiBhbnkgPSBbXTtcclxuICBncm91cHNEYXRhOiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkR3JvdXBzOiBhbnkgPSBbXTtcclxuICBmaWx0ZXJlZFN0b3JlczogYW55ID0gW107XHJcbiAgc3RvcmVzOmFueVtdID0gW11cclxuICBzZWFyY2hTdG9yZVRleHQ6c3RyaW5nID0gJyc7XHJcbiAgY2xpZW50TGlzdDphbnkgPSBbXVxyXG4gIHNlbGVjdGVkQ2xpZW50OmFueVxyXG4gIGxvY2F0aW9uTGFiZWw6IGFueVtdPVtdO1xyXG4gIGdyb3VwTGFiZWw6IGFueVtdPVtdO1xyXG4gIHVzZXJzOiBhbnk7XHJcbiAgdXJsOiBhbnk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGF1dGg6IEF1dGhTZXJ2aWNlLHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICkge31cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uQ2xpY2sgKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZighdGFyZ2V0LmNsb3Nlc3QoJy5kcm9wZG93bjInKSkge1xyXG4gICAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBjbG9zZURyb3Bkb3duMSgpe1xyXG4gICAgdGhpcy5PcGVuZHJvcGRvd24gPSBmYWxzZTtcclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVybCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIj9cIilbMF0uc3BsaXQoJy8nKTtcclxuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSBhcyBzdHJpbmcpO1xyXG4gICAgdGhpcy51c2VycyA9IHVzZXI7XHJcbiAgICB0aGlzLmdzPy5tYW5hZ2VSZWZyZXNoVHJpZ2dlcj8uc3Vic2NyaWJlKChlKSA9PiB7ICAgICAgXHJcbiAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgaWYgKHVzZXIudXNlclR5cGUgPT09ICd0YW5nbycpIHtcclxuICAgICAgICB0aGlzLmdldENsaWVudCgpO1xyXG4gICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgIGNvbnN0IHN0b3JlZEZpbHRlcnMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpO1xyXG4gICAgICAgICAgaWYgKHN0b3JlZEZpbHRlcnMpIHtcclxuICAgICAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnMgPSBKU09OLnBhcnNlKHN0b3JlZEZpbHRlcnMpO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IGhlYWRlckZpbHRlcnM/LnN0b3Jlcy5tYXAoKHN0b3JlOmFueSkgPT4gKHtcclxuICAgICAgICAgICAgLi4uc3RvcmUsXHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IHN0b3JlLmNoZWNrZWRcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodXNlci51c2VyVHlwZSA9PT0gJ3RhbmdvJykge1xyXG4gICAgICB0aGlzLmdldENsaWVudCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuICAgICAgdGhpcy5nZXRHcm91cHMoKTtcclxuICAgICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgY29uc3Qgc3RvcmVkRmlsdGVycyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIik7XHJcbiAgICBpZiAoc3RvcmVkRmlsdGVycykge1xyXG4gICAgICBjb25zdCBoZWFkZXJGaWx0ZXJzID0gSlNPTi5wYXJzZShzdG9yZWRGaWx0ZXJzKTtcclxuICBcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBzZWxlY3RlZEZpbHRlcnMgd2l0aCBkZWZhdWx0cyBvciBleGlzdGluZyB2YWx1ZXNcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMgPSB7XHJcbiAgICAgICAgY2xpZW50OiBoZWFkZXJGaWx0ZXJzLmNsaWVudCB8fCB0aGlzLnVzZXJzLmNsaWVudCxcclxuICAgICAgICBjbGllbnROYW1lOiBoZWFkZXJGaWx0ZXJzLmNsaWVudE5hbWUgfHwgJycsXHJcbiAgICAgICAgY2xpZW50czogaGVhZGVyRmlsdGVycy5jbGllbnRzIHx8IFtdLFxyXG4gICAgICAgIHN0b3JlOiBoZWFkZXJGaWx0ZXJzLnN0b3JlIHx8IG51bGwsXHJcbiAgICAgICAgZGF0ZTogaGVhZGVyRmlsdGVycy5kYXRlIHx8IHt9LFxyXG4gICAgICAgIHN0b3JlczogaGVhZGVyRmlsdGVycy5zdG9yZXMgfHwgW10sXHJcbiAgICAgICAgZ3JvdXA6IGhlYWRlckZpbHRlcnMuZ3JvdXAgfHwgW10sXHJcbiAgICAgICAgbG9jYXRpb246IGhlYWRlckZpbHRlcnMubG9jYXRpb24gfHwgW11cclxuICAgICAgfTtcclxuICBcclxuICAgICAgLy8gU3luYyBmaWx0ZXJlZCBkYXRhIHdpdGggc3RvcmVkIHNlbGVjdGlvbnNcclxuICAgICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IHRoaXMuc3luY1dpdGhMb2NhbFN0b3JhZ2UoaGVhZGVyRmlsdGVycy5sb2NhdGlvbik7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRHcm91cHMgPSB0aGlzLnN5bmNXaXRoTG9jYWxTdG9yYWdlKGhlYWRlckZpbHRlcnMuZ3JvdXApO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zeW5jV2l0aExvY2FsU3RvcmFnZShoZWFkZXJGaWx0ZXJzLnN0b3Jlcyk7XHJcbiAgICAgIC8vIEZvcm1hdCBkYXRlIHJhbmdlIGlmIGl0IGV4aXN0c1xyXG4gICAgICAvLyBFbWl0IGRhdGEgdmlhIHNlcnZpY2UgYW5kIHVwZGF0ZSBsb2NhbFN0b3JhZ2VcclxudGhpcy5lbWl0QW5kU3RvcmVGaWx0ZXJzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBJbml0aWFsaXplIGVtcHR5IHN0YXRlcyBpZiBubyBoZWFkZXIgZmlsdGVycyBhcmUgcHJlc2VudCBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgdGhpcy5yZXNldEZpbHRlcnMoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBzeW5jV2l0aExvY2FsU3RvcmFnZShpdGVtczogYW55W10pOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gaXRlbXNcclxuICAgICAgPyBpdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBjaGVja2VkOiBpdGVtLmNoZWNrZWQgPT09IHRydWVcclxuICAgICAgICB9KSlcclxuICAgICAgOiBbXTtcclxuICB9XHJcbiAgcHJpdmF0ZSBlbWl0QW5kU3RvcmVGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycyA9IHtcclxuICAgICAgY2xpZW50OiBudWxsLFxyXG4gICAgICBjbGllbnROYW1lOiAnJyxcclxuICAgICAgY2xpZW50czogW10sXHJcbiAgICAgIHN0b3JlOiBudWxsLFxyXG4gICAgICBkYXRlOiB7fSxcclxuICAgICAgc3RvcmVzOiBbXSxcclxuICAgICAgZ3JvdXA6IFtdLFxyXG4gICAgICBsb2NhdGlvbjogW11cclxuICAgIH07XHJcbiAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gW107XHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107XHJcbiAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gW107XHJcbiAgfVxyXG5nZXRDbGllbnQoKXtcclxuICB0aGlzLmF1dGguZ2V0Q2xpZW50cygpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAoZSkgPT4ge1xyXG4gICAgICBpZiAoZSkge1xyXG4gICAgICAgIHRoaXMuY2xpZW50TGlzdCA9IGUuZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoaGVhZGVyRmlsdGVycy5jbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2xpZW50TGlzdC5maW5kKChvYmo6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAob2JqLmNsaWVudElkID09PSBoZWFkZXJGaWx0ZXJzLmNsaWVudCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSBvYmo7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50ID0gaGVhZGVyRmlsdGVycy5jbGllbnQ7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnROYW1lID0gaGVhZGVyRmlsdGVycy5jbGllbnROYW1lO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50cyA9IGhlYWRlckZpbHRlcnMuY2xpZW50cztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlID0gaGVhZGVyRmlsdGVycy5zdG9yZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmRhdGUgPSBoZWFkZXJGaWx0ZXJzLmRhdGU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlcztcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gaGVhZGVyRmlsdGVycy5ncm91cDtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gaGVhZGVyRmlsdGVycy5sb2NhdGlvbjtcclxuICAgICAgICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBsb2FkZWQgYmVmb3JlIGZldGNoaW5nIHN0b3Jlc1xyXG4gdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgLy8gRmV0Y2ggc3RvcmVzIG9ubHkgYWZ0ZXIgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIHNldFxyXG4gIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0gdGhpcy5jbGllbnRMaXN0WzBdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9ICB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudElkO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudE5hbWUgPSB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudE5hbWVcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50cyA9IGhlYWRlckZpbHRlcnMuY2xpZW50cztcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmUgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5kYXRlID0gaGVhZGVyRmlsdGVycy5kYXRlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBoZWFkZXJGaWx0ZXJzLnN0b3JlcztcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSBoZWFkZXJGaWx0ZXJzLmdyb3VwO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbiA9IGhlYWRlckZpbHRlcnMubG9jYXRpb247XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICBcImhlYWRlci1maWx0ZXJzXCIsXHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykgXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAvLyBFbnN1cmUgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIGxvYWRlZCBiZWZvcmUgZmV0Y2hpbmcgc3RvcmVzXHJcbiB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gdGhpcy5nZXRHcm91cHMoKTtcclxuICAvLyBGZXRjaCBzdG9yZXMgb25seSBhZnRlciBsb2NhdGlvbnMgYW5kIGdyb3VwcyBhcmUgc2V0XHJcbiAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDbGllbnQgPSB0aGlzLmNsaWVudExpc3RbMF07XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9ICB0aGlzLnNlbGVjdGVkQ2xpZW50LmNsaWVudElkO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnROYW1lID0gdGhpcy5zZWxlY3RlZENsaWVudC5jbGllbnROYW1lXHJcbiAgICAgICAvLyBFbnN1cmUgbG9jYXRpb25zIGFuZCBncm91cHMgYXJlIGxvYWRlZCBiZWZvcmUgZmV0Y2hpbmcgc3RvcmVzXHJcbiB0aGlzLmdldExvY2F0aW9ucygpO1xyXG4gdGhpcy5nZXRHcm91cHMoKTtcclxuIC8vIEZldGNoIHN0b3JlcyBvbmx5IGFmdGVyIGxvY2F0aW9ucyBhbmQgZ3JvdXBzIGFyZSBzZXRcclxuIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgXCJoZWFkZXItZmlsdGVyc1wiLFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSBcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCI0XCIpXHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5vbkNsaWVudFNlbGVjdChldmVudDogYW55KTogdm9pZCB7XHJcbiAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCBjbGllbnRcclxuICB0aGlzLnNlbGVjdGVkQ2xpZW50ID0gZXZlbnQ7XHJcbiAgLy8gQ2xlYXIgcHJldmlvdXMgZmlsdGVyZWQgZGF0YSBhbmQgc2VsZWN0aW9uc1xyXG4gIHRoaXMuZmlsdGVyZWRHcm91cHMgPSBbXTtcclxuICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gW107XHJcbiAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucyA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IFtdO1xyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gW107XHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gPSBbXTtcclxuXHJcbiAgLy8gRmV0Y2ggaGVhZGVyIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcclxuICBjb25zdCBoZWFkZXJGaWx0ZXJzOiBhbnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGVhZGVyLWZpbHRlcnNcIikgfHwgXCJ7fVwiKTtcclxuICBcclxuICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIGZpbHRlcnMgd2l0aCB0aGUgbmV3IGNsaWVudFxyXG4gIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50SWQ7XHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuY2xpZW50TmFtZSA9IHRoaXMuc2VsZWN0ZWRDbGllbnQuY2xpZW50TmFtZTtcclxuICBcclxuICAvLyBSZW1vdmUgb2xkIHN0b3JlLCBncm91cCwgYW5kIGxvY2F0aW9uIGRhdGEgZnJvbSB0aGUgaGVhZGVyIGZpbHRlcnNcclxuICBkZWxldGUgaGVhZGVyRmlsdGVycy5zdG9yZXM7XHJcbiAgZGVsZXRlIGhlYWRlckZpbHRlcnMuZ3JvdXBzO1xyXG4gIGRlbGV0ZSBoZWFkZXJGaWx0ZXJzLmxvY2F0aW9uO1xyXG4gIFxyXG4gIC8vIEZldGNoIG5ldyBkYXRhIGJhc2VkIG9uIHRoZSBuZXcgY2xpZW50XHJcbiAgdGhpcy5nZXRMb2NhdGlvbnMoKTtcclxuICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgdGhpcy5nZXRHcm91cHMoKTtcclxuXHJcbiAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSB3aXRoIHRoZSBuZXcgY2xpZW50IHNlbGVjdGlvbiBhbmQgZW1wdHkgZmlsdGVyIGRhdGFcclxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4gIG9wZW5kcm9wZG93bihlOk1vdXNlRXZlbnQpIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9ICF0aGlzLk9wZW5kcm9wZG93bjtcclxuICB9XHJcbiAgZ2V0TG9jYXRpb25zKCk6IHZvaWQge1xyXG4gICAgLy8gY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIik7XHJcbiAgICBsZXQgb2JqID17XHJcbiAgICAgY2xpZW50SWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA/IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmNsaWVudCA6dGhpcy51c2Vycy5jbGllbnRJZCxcclxuICAgICBjaXR5OiBbXSxcclxuICAgICBncm91cDogW10sXHJcbiAgICB9XHJcbiAgICB0aGlzLmF1dGguZ2V0TG9jYXRpb24ob2JqKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgY2l0eUxpc3QgPSB0aGlzLnNlbGVjdGVkRmlsdGVycz8ubG9jYXRpb24/LmZpbHRlcigobG9jYXRpb246YW55KSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvYzphbnkpID0+IGxvYy5jaXR5KTtcclxuICAgICAgICAvLyBNYXAgdGhlIGZldGNoZWQgbG9jYXRpb25zIHdpdGggZGVmYXVsdCB1bmNoZWNrZWQgc3RhdGVcclxuICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IHJlcz8uZGF0YT8ubG9jYXRpb25EYXRhLm1hcCgoY2l0eTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgY2l0eTogY2l0eS5jaXR5LFxyXG4gICAgICAgICAgY2hlY2tlZDogY2l0eUxpc3Q/LmluY2x1ZGVzKGNpdHkuY2l0eSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgfSkpO1xyXG4gIFxyXG4gICAgICAgIC8vIFN5bmMgdGhlIGZldGNoZWQgbG9jYXRpb25zIHdpdGggYW55IHN0b3JlZCBjaGVja2VkIHZhbHVlcyBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24gJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbikpIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5tYXAobG9jYXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkTG9jYXRpb24gPSB0aGlzLnNlbGVjdGVkRmlsdGVycy5sb2NhdGlvbi5maW5kKChsb2M6IGFueSkgPT4gbG9jLmNpdHkgPT09IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlZExvY2F0aW9uID8geyAuLi5sb2NhdGlvbiwgY2hlY2tlZDogbWF0Y2hlZExvY2F0aW9uLmNoZWNrZWQgfSA6IGxvY2F0aW9uO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0KSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnMuZmlsdGVyKChsb2NhdGlvbjphbnkpID0+IGxvY2F0aW9uLmNpdHkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaExvY2F0aW9uVGV4dC50b0xvd2VyQ2FzZSgpKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRMb2NhdGlvbnMgPSB0aGlzLmxvY2F0aW9ucy5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLmdldFN0b3JlKCk7IC8vIEZldGNoIHN0b3JlcyBiYXNlZCBvbiBzZWxlY3RlZCBncm91cHNcclxuICAgICAgICAgIH0sMTAwMClcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBmZXRjaCBsb2NhdGlvbnNcIiwgZXJyKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuICBpc0FsbExvY2F0aW9uc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMuZXZlcnkoKGxvY2F0aW9uOmFueSkgPT4gbG9jYXRpb24uY2hlY2tlZCk7XHJcblxyXG4gIH1cclxuICBcclxuICBzZWxlY3RlZExvY2F0aW9uc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25MYWJlbCA9IHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0Lmxlbmd0aCA/IHRoaXMubG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpIDogIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcigobG9jYXRpb246YW55KSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvY2F0aW9uOmFueSkgPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gJydcclxuICAgICAgOiBzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGggPT09IDFcclxuICAgICAgPyBzZWxlY3RlZExvY2F0aW9uc1swXVxyXG4gICAgICA6IGAke3NlbGVjdGVkTG9jYXRpb25zLmxlbmd0aH0gbG9jYXRpb25zYDtcclxuICB9XHJcblxyXG4gIHJlbW92ZUxvY2F0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5SZXNldCgpO1xyXG4gIH1cclxuICBcclxuICBnZXRHcm91cHMoKTogdm9pZCB7ICAgIFxyXG4gICAgY29uc3QgY2l0eSA9IHRoaXMubG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZClcclxuICAgICAgLm1hcChsb2NhdGlvbiA9PiBsb2NhdGlvbi5jaXR5KTtcclxuICAgIGNvbnN0IG9iaiA9IHsgY2l0eSxjbGllbnRJZDp0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgPyB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgOnRoaXMudXNlcnMuY2xpZW50SWQsZ3JvdXA6W10gfTtcclxuICAgIHRoaXMuYXV0aC5nZXRHcm91cHMob2JqKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgY2hlY2tlZEdyb3VwID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/Lmdyb3VwPy5maWx0ZXIoKGdyb3VwOmFueSkgPT4gZ3JvdXAuY2hlY2tlZCkubWFwKChncm91cDphbnkpID0+IGdyb3VwLmdyb3VwTmFtZSk7XHJcbiAgICAgICAgY29uc3QgY29tYmluZWRHcm91cHMgPSByZXM/LmRhdGE/Lmdyb3VwRGF0YT8ubWFwKChncm91cE5hbWU6IGFueSkgPT4gKHtcclxuICAgICAgICAgIGdyb3VwTmFtZTogZ3JvdXBOYW1lLmdyb3VwTmFtZSxcclxuICAgICAgICAgIGNoZWNrZWQ6IGNoZWNrZWRHcm91cD8uaW5jbHVkZXMoZ3JvdXBOYW1lLmdyb3VwTmFtZSkgPyB0cnVlIDogZmFsc2UsXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuZ3JvdXBzRGF0YSA9IGNvbWJpbmVkR3JvdXBzO1xyXG4gICAgICAgIGlmKHRoaXMuc2VhcmNoR3JvdXBUZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IGNvbWJpbmVkR3JvdXBzLmZpbHRlcigoaXRlbTphbnkpID0+IGl0ZW0uZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hHcm91cFRleHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gY29tYmluZWRHcm91cHM7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIC8vIEF1dG8tZmV0Y2ggc3RvcmVzIHdoZW4gZ3JvdXBzIGFyZSBzZWxlY3RlZFxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBzID0gdGhpcy5ncm91cHNEYXRhLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmNoZWNrZWQpLm1hcCgoZ3JvdXApID0+IGdyb3VwLmdyb3VwTmFtZSk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcclxuICAgICAgICAgICAgdGhpcy5nZXRTdG9yZSgpOyAvLyBGZXRjaCBzdG9yZXMgYmFzZWQgb24gc2VsZWN0ZWQgZ3JvdXBzXHJcbiAgICAgICAgICB9LDEwMDApXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZmV0Y2ggZ3JvdXBzXCIsIGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZURyb3Bkb3duKHR5cGU6ICdsb2NhdGlvbicgfCAnZ3JvdXAnIHwgJ3N0b3JlJyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZHJvcGRvd25PcGVuID09PSB0eXBlKSB7XHJcbiAgICAgIC8vIElmIHRoZSBkcm9wZG93biBpcyBvcGVuLCBjbG9zZSBpdCBhbmQgYXZvaWQgcmVzZXR0aW5nIHRoZSBzZWxlY3RlZCB2YWx1ZXMgdW5uZWNlc3NhcmlseVxyXG4gICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBPcGVuIHRoZSBzcGVjaWZpYyBkcm9wZG93biBhbmQgaGFuZGxlIGRhdGEgZmV0Y2hpbmcgb25seSBpZiBuZWNlc3NhcnlcclxuICAgICAgdGhpcy5kcm9wZG93bk9wZW4gPSB0eXBlO1xyXG4gIFxyXG4gICAgICBpZiAodHlwZSA9PT0gJ2dyb3VwJykge1xyXG4gICAgICAgIC8vIEZldGNoIGdyb3VwcyBvbmx5IGlmIHRoZXJlIGFyZSBzZWxlY3RlZCBjaXRpZXMgYW5kIG5vIGFjdGl2ZSBzZWFyY2ggdGV4dFxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ2l0aWVzID0gdGhpcy5sb2NhdGlvbnNcclxuICAgICAgICAgIC5maWx0ZXIoKGxvY2F0aW9uKSA9PiBsb2NhdGlvbi5jaGVja2VkKVxyXG4gICAgICAgICAgLm1hcCgobG9jYXRpb24pID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gIFxyXG4gICAgICAgIC8vIEZldGNoIGdyb3VwcyBvbmx5IGlmIGxvY2F0aW9ucyBhcmUgc2VsZWN0ZWQsIG5vIHNlYXJjaCB0ZXh0IGV4aXN0cywgYW5kIGRyb3Bkb3duIGlzIG9wZW5lZFxyXG4gICAgICBpZiAodGhpcy5maWx0ZXJlZExvY2F0aW9ucy5sZW5ndGggPiAwIHx8IChzZWxlY3RlZENpdGllcy5sZW5ndGggPiAwICYmICF0aGlzLnNlYXJjaEdyb3VwVGV4dC50cmltKCkpKSB7XHJcbiAgICAgICAgdGhpcy5nZXRHcm91cHMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107IC8vIENsZWFyIGdyb3VwcyBpZiBubyBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgICAvLyBGZXRjaCBzdG9yZXMgb25seSBpZiBub3QgYWxyZWFkeSBmZXRjaGVkIGFuZCBubyBzZWFyY2ggdGV4dCBpcyBhY3RpdmVcclxuICAgICAgaWYgKCghdGhpcy5maWx0ZXJlZFN0b3JlcyB8fCB0aGlzLmZpbHRlcmVkU3RvcmVzLmxlbmd0aCA9PT0gMCkgJiYgIXRoaXMuc2VhcmNoU3RvcmVUZXh0LnRyaW0oKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgfSBcclxuICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgaGFuZGxlR3JvdXBEcm9wZG93bkNsaWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZHJvcGRvd25PcGVuID09PSAnZ3JvdXAnKSB7XHJcbiAgICAgIHRoaXMucmVzZXRTZWxlY3RlZEdyb3VwcygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50b2dnbGVEcm9wZG93bignZ3JvdXAnKTtcclxuICB9XHJcblxyXG4gIHJlc2V0U2VsZWN0ZWRHcm91cHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzLmZvckVhY2goKGdyb3VwOmFueSkgPT4gKGdyb3VwLmNoZWNrZWQgPSBmYWxzZSkpO1xyXG4gICAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSBcIlwiO1xyXG4gIH1cclxuICBzZWxlY3RlZEdyb3Vwc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZ3JvdXBMYWJlbCA9IHRoaXMuc2VhcmNoR3JvdXBUZXh0Lmxlbmd0aCA/IHRoaXMuZ3JvdXBzRGF0YS5maWx0ZXIoKGdyb3VwKSA9PiBncm91cC5jaGVja2VkKSA6IHRoaXMuZmlsdGVyZWRHcm91cHMuZmlsdGVyKChncm91cDphbnkpID0+IGdyb3VwLmNoZWNrZWQpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkR3JvdXBzLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/IFwiXCJcclxuICAgICAgOiBzZWxlY3RlZEdyb3Vwcy5sZW5ndGggPT09IDFcclxuICAgICAgPyBzZWxlY3RlZEdyb3Vwc1swXS5ncm91cE5hbWVcclxuICAgICAgOiBgJHtzZWxlY3RlZEdyb3Vwcy5sZW5ndGh9IENsdXN0ZXJzYDtcclxuICB9XHJcbiAgcmVtb3ZlR3JvdXAoKTogdm9pZCB7XHJcbiAgICB0aGlzLlJlc2V0KCk7XHJcbiAgIFxyXG4gIH1cclxuICBcclxuXHJcbiAgaXNBbGxHcm91cHNTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIFxyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRHcm91cHMubGVuZ3RoID8gdGhpcy5maWx0ZXJlZEdyb3Vwcy5ldmVyeSgoZ3JvdXA6YW55KSA9PiBncm91cC5jaGVja2VkKSA6IGZhbHNlO1xyXG4gIH1cclxuICAgICAgICBcclxuICBnZXRTdG9yZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNpdHkgPSB0aGlzLmxvY2F0aW9uc1xyXG4gICAgICAuZmlsdGVyKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAobG9jYXRpb24gPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgXHJcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzRGF0YVxyXG4gICAgICAuZmlsdGVyKGdyb3VwID0+IGdyb3VwLmNoZWNrZWQpXHJcbiAgICAgIC5tYXAoZ3JvdXAgPT4gZ3JvdXAuZ3JvdXBOYW1lKTtcclxuICBcclxuICAgIGNvbnN0IGRhdGEgPSB7IGNpdHksIGNsdXN0ZXJzOmdyb3VwLCBjbGllbnRJZDogdGhpcy51c2Vycy5jbGllbnRJZCA/IHRoaXMudXNlcnMuY2xpZW50SWQgOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5jbGllbnQgfTtcclxuICBcclxuICAgIHRoaXMuYXV0aC5nZXRIZWFkZXJ0cmF4U3RvcmVzKGRhdGEpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmKHJlcyAmJnJlcy5jb2RlID09PTIwMCl7XHJcbiAgICAgICAgdGhpcy5zdG9yZXMgPSByZXMuZGF0YS5zdG9yZXNEYXRhOyAgICAgIFxyXG4gICAgICAgIC8vIFJldHJpZXZlIGNoZWNrZWQgc3RvcmUgSURzIGZyb20gc2VsZWN0ZWRGaWx0ZXJzXHJcbiAgICAgICAgY29uc3QgY2hlY2tlZFN0b3JlSWRzID0gdGhpcy5zZWxlY3RlZEZpbHRlcnM/LnN0b3Jlc1xyXG4gICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMuZmlsdGVyKChzdG9yZTogYW55KSA9PiBzdG9yZS5jaGVja2VkKS5tYXAoKHN0b3JlOiBhbnkpID0+IHN0b3JlLnN0b3JlSWQpXHJcbiAgICAgICAgICA6IFtdO1xyXG5cclxuICAgICAgICB0aGlzLnN0b3Jlcy5mb3JFYWNoKHN0b3JlID0+IHtcclxuICAgICAgICAgIGlmIChjaGVja2VkU3RvcmVJZHMuaW5jbHVkZXMoc3RvcmUuc3RvcmVJZCkpIHtcclxuICAgICAgICAgICAgc3RvcmUuY2hlY2tlZCA9IHRydWU7IC8vIFN5bmMgdGhlIGNoZWNrZWQgc3RhdGUgd2l0aCBmdWxsIHN0b3JlIGxpc3RcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICBcclxuICAgICAgICAvLyBNYXAgdGhlIHN0b3JlcyBhbmQgcmV0YWluIHRoZSAnY2hlY2tlZCcgc3RhdHVzXHJcbiAgICAgICAgaWYodGhpcy5zZWFyY2hTdG9yZVRleHQubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXM/LmZpbHRlcihzdG9yZSA9PiBzdG9yZS5zdG9yZU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnNlYXJjaFN0b3JlVGV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnN0b3JlcztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRW5zdXJlIHNlbGVjdGVkRmlsdGVycyBpcyBpbiBzeW5jIHdpdGggZmlsdGVyZWRTdG9yZXNcclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyB8fCAhdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZXMuZm9yRWFjaChzdG9yZSA9PiB7XHJcbiAgICAgICAgICAgIHN0b3JlLmNoZWNrZWQgPSB0cnVlOyAvLyBTeW5jIHRoZSBjaGVja2VkIHN0YXRlIHdpdGggZnVsbCBzdG9yZSBsaXN0XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gTm8gcHJldmlvdXNseSBzZWxlY3RlZCBzdG9yZXMsIG1hcmsgYWxsIGFzIGNoZWNrZWRcclxuICAgICAgIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSB0aGlzLmZpbHRlcmVkU3RvcmVzLm1hcCgoc3RvcmU6YW55KSA9PiAoe1xyXG4gICAgICAgICAgICAuLi5zdG9yZSxcclxuICAgICAgICAgICAgY2hlY2tlZDogdHJ1ZVxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRGaWx0ZXJzIHRvIHJlZmxlY3QgY3VycmVudCBzdGF0ZSBvZiBzdG9yZXNcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IHRoaXMuZmlsdGVyZWRTdG9yZXMubWFwKChzdG9yZTphbnkpID0+ICh7XHJcbiAgICAgICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBzdG9yZS5jaGVja2VkXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2Ugd2l0aCB0aGUgbGF0ZXN0IHNlbGVjdGVkRmlsdGVyc1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdoZWFkZXItZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKSk7XHJcbiAgXHJcbiAgICAgICAgLy8gRW1pdCBkYXRhIHZpYSBzZXJ2aWNlXHJcbiAgICAgICAgLy8gdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5uZXh0KHRoaXMuc2VsZWN0ZWRGaWx0ZXJzKTtcclxuICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gdG8gcmVmbGVjdCBjaGFuZ2VzIGluIHRoZSBVSVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcmVzID1bXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXM9W107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9W107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5tYXAoKHN0b3JlOmFueSkgPT4gKHtcclxuICAgICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgICAgY2hlY2tlZDogZmFsc2VcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVzID1bXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXM9W107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9W107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5tYXAoKHN0b3JlOmFueSkgPT4gKHtcclxuICAgICAgICAgIC4uLnN0b3JlLFxyXG4gICAgICAgICAgY2hlY2tlZDogZmFsc2VcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGZldGNoIHN0b3Jlc1wiLCBlcnIpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG5cclxuICByZXNldFNlbGVjdGVkU3RvcmVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3Jlcy5mb3JFYWNoKChzdG9yZTphbnkpID0+IChzdG9yZS5jaGVja2VkID0gZmFsc2UpKTtcclxuICAgIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gXCJcIjtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVzTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkU3RvcmVzID0gdGhpcy5zZWFyY2hTdG9yZVRleHQubGVuZ3RoID8gdGhpcy5zdG9yZXMuZmlsdGVyKChzdG9yZSkgPT4gc3RvcmUuY2hlY2tlZCkgOiB0aGlzLmZpbHRlcmVkU3RvcmVzLmZpbHRlcigoc3RvcmU6YW55KSA9PiBzdG9yZS5jaGVja2VkKTtcclxuICAgIHJldHVybiBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDBcclxuICAgICAgPyBcIjAgU3RvcmVzXCJcclxuICAgICAgOiBzZWxlY3RlZFN0b3Jlcy5sZW5ndGggPT09IDFcclxuICAgICAgPyBzZWxlY3RlZFN0b3Jlc1swXS5zdG9yZU5hbWVcclxuICAgICAgOiBgJHtzZWxlY3RlZFN0b3Jlcy5sZW5ndGh9IFN0b3Jlc2A7XHJcbiAgfVxyXG5cclxuICBpc0FsbFN0b3Jlc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRTdG9yZXMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkU3RvcmVzLmV2ZXJ5KChzdG9yZTphbnkpID0+IHN0b3JlLmNoZWNrZWQpO1xyXG4gIH1cclxuLy8gTWV0aG9kIHRvIGhhbmRsZSBkcm9wZG93biBpdGVtIHNlbGVjdGlvblxyXG51cGRhdGVTZWxlY3RlZFN0b3JlcygpOiB2b2lkIHtcclxuICB0aGlzLmZpbHRlcmVkU3RvcmVzLmZvckVhY2goKHN0b3JlOmFueSkgPT4ge1xyXG4gICAgY29uc3QgZmlsdGVyZWRTdG9yZSA9IHRoaXMuc3RvcmVzLmZpbmRJbmRleChmU3RvcmUgPT4gZlN0b3JlLnN0b3JlSWQgPT09IHN0b3JlLnN0b3JlSWQpO1xyXG4gICAgaWYgKGZpbHRlcmVkU3RvcmUgIT0gLTEpIHtcclxuICAgICAgdGhpcy5zdG9yZXNbZmlsdGVyZWRTdG9yZV0uY2hlY2tlZCA9IHN0b3JlLmNoZWNrZWQ7IC8vIFN5bmMgdGhlIGNoZWNrZWQgc3RhdGUgd2l0aCBmdWxsIHN0b3JlIGxpc3RcclxuICAgIH1cclxuICB9KTsgIFxyXG4gIC8vIFVwZGF0ZSBzZWxlY3RlZEZpbHRlcnMgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RvcmUgc2VsZWN0aW9uXHJcbiAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuc3RvcmVzID0gdGhpcy5zdG9yZXMuZmlsdGVyKHN0b3JlID0+IHN0b3JlLmNoZWNrZWQpO1xyXG5cclxuICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIHdpdGggdGhlIGxhdGVzdCBzZWxlY3Rpb25cclxuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG5cclxuICAvLyBFbWl0IHVwZGF0ZWQgZmlsdGVycyB2aWEgc2VydmljZVxyXG4gIC8vIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcblxyXG4gIC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWNlc3NhcnlcclxuICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxufVxyXG4gIHRvZ2dsZVNlbGVjdEFsbExvY2F0aW9ucyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBpc0NoZWNrZWQgPSBldmVudC50YXJnZXQuY2hlY2tlZDtcclxuICAgIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb246YW55KSA9PiAobG9jYXRpb24uY2hlY2tlZCA9IGlzQ2hlY2tlZCkpO1xyXG4gICAgdGhpcy51cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsU3RvcmVzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcclxuICBcclxuICAgIC8vIEFwcGx5IHRoZSBzZWxlY3Rpb24gdG8gYm90aCBmaWx0ZXJlZCBhbmQgZnVsbCBsaXN0IG9mIHN0b3Jlc1xyXG4gICAgdGhpcy5maWx0ZXJlZFN0b3Jlcy5mb3JFYWNoKChzdG9yZTphbnkpID0+IHN0b3JlLmNoZWNrZWQgPSBjaGVja2VkKTtcclxuICAgIHRoaXMuc3RvcmVzLmZvckVhY2goc3RvcmUgPT4ge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZFN0b3JlID0gdGhpcy5maWx0ZXJlZFN0b3Jlcy5maW5kKChmU3RvcmU6YW55KSA9PiBmU3RvcmUuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk7XHJcbiAgICAgIGlmIChmaWx0ZXJlZFN0b3JlKSB7XHJcbiAgICAgICAgc3RvcmUuY2hlY2tlZCA9IGNoZWNrZWQ7IC8vIFN5bmMgdGhlIGNoZWNrZWQgc3RhdGUgd2l0aCBmdWxsIHN0b3JlIGxpc3RcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIHN0b3JlcyBhbmQgcGVyc2lzdCB0aGUgc2VsZWN0aW9uXHJcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkU3RvcmVzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZExvY2F0aW9ucygpOiB2b2lkIHtcclxuICAgIC8vIFdoZW4gbG9jYXRpb25zIGFyZSBzZWxlY3RlZCwgZmV0Y2ggdGhlIHJlbGF0ZWQgZ3JvdXBzXHJcbiAgICBjb25zdCBzZWxlY3RlZENpdGllcyA9IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcigobG9jYXRpb246YW55KSA9PiBsb2NhdGlvbi5jaGVja2VkKVxyXG4gICAgICAubWFwKChsb2NhdGlvbjphbnkpID0+IGxvY2F0aW9uLmNpdHkpO1xyXG4gICAgdGhpcy5maWx0ZXJlZExvY2F0aW9ucy5mb3JFYWNoKChsb2NhdGlvbjphbnkpID0+IHtcclxuICAgICAgbGV0IGZpbmRMb2NhdGlvbkluZGV4ID0gdGhpcy5sb2NhdGlvbnMuZmluZEluZGV4KChsb2M6YW55KSA9PiBsb2MuY2l0eSA9PSBsb2NhdGlvbi5jaXR5KTtcclxuICAgICAgaWYoZmluZExvY2F0aW9uSW5kZXggIT0gLTEpIHtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uc1tmaW5kTG9jYXRpb25JbmRleF0uY2hlY2tlZCA9IGxvY2F0aW9uLmNoZWNrZWQ7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAoc2VsZWN0ZWRDaXRpZXMubGVuZ3RoID4gMCB8fCAhc2VsZWN0ZWRDaXRpZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9W107XHJcbiAgICAgIHRoaXMuZ3JvdXBzRGF0YSA9W11cclxuICAgICAgdGhpcy5nZXRHcm91cHMoKTsgLy8gRmV0Y2ggZ3JvdXBzIGJhc2VkIG9uIHNlbGVjdGVkIGNpdGllc1xyXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgc2VsZWN0ZWQgZ3JvdXBzLCBmZXRjaCB0aGUgc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgICB0aGlzLmdldFN0b3JlKCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gdGhpcy5sb2NhdGlvbnM7XHJcbiAgICAgXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gW107IC8vIENsZWFyIGdyb3VwcyBpZiBubyBsb2NhdGlvbnMgYXJlIHNlbGVjdGVkXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gW107XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmdyb3VwID0gW107XHJcbiAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gW107IC8vIFJlc2V0IHN0b3JlcyBhcyB3ZWxsXHJcbiAgICB0aGlzLnNlYXJjaEdyb3VwVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5zZWFyY2hTdG9yZVRleHQgPSAnJztcclxuICAgIC8vIHRoaXMuT3BlbmRyb3Bkb3duID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWxlY3RBbGxHcm91cHMoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNDaGVja2VkID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgICB0aGlzLmZpbHRlcmVkR3JvdXBzLmZvckVhY2goKGdyb3VwOmFueSkgPT4gKGdyb3VwLmNoZWNrZWQgPSBpc0NoZWNrZWQpKTtcclxuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRHcm91cHMoKTtcclxuICAgIC8vIGlmICghaXNDaGVja2VkKSB7XHJcbiAgICAvLyAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9W107XHJcbiAgICAvLyAgICAvLyBJZiB0aGVyZSBhcmUgc2VsZWN0ZWQgZ3JvdXBzLCBmZXRjaCB0aGUgc3RvcmVzIGJhc2VkIG9uIHNlbGVjdGVkIGdyb3Vwc1xyXG4gICAgLy8gICAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gICAgLy8gIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlbGVjdGVkR3JvdXBzKCk6IHZvaWQge1xyXG4gICAgLy8gRmV0Y2ggdGhlIHJlbGV2YW50IHN0b3JlcyBhZnRlciBncm91cHMgYXJlIHNlbGVjdGVkXHJcbiAgICBjb25zdCBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZmlsdGVyZWRHcm91cHNcclxuICAgICAgLmZpbHRlcigoZ3JvdXA6YW55KSA9PiBncm91cC5jaGVja2VkKVxyXG4gICAgICAubWFwKChncm91cDphbnkpID0+IGdyb3VwLmdyb3VwTmFtZSk7XHJcblxyXG4gICAgdGhpcy5maWx0ZXJlZEdyb3Vwcy5mb3JFYWNoKChncm91cDphbnkpID0+IHtcclxuICAgICAgbGV0IGZpbmRHcm91cEluZGV4ID0gdGhpcy5ncm91cHNEYXRhLmZpbmRJbmRleCgoaXRlbTphbnkpID0+IGl0ZW0uZ3JvdXBOYW1lID09IGdyb3VwLmdyb3VwTmFtZSk7XHJcbiAgICAgIGlmKGZpbmRHcm91cEluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgdGhpcy5ncm91cHNEYXRhW2ZpbmRHcm91cEluZGV4XS5jaGVja2VkID0gZ3JvdXAuY2hlY2tlZDtcclxuICAgICAgfVxyXG4gICAgfSkgXHJcbiAgICBpZiAoc2VsZWN0ZWRHcm91cHMubGVuZ3RoID4gMCB8fCAhc2VsZWN0ZWRHcm91cHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9W107XHJcbiAgICAgIC8vIElmIHRoZXJlIGFyZSBzZWxlY3RlZCBncm91cHMsIGZldGNoIHRoZSBzdG9yZXMgYmFzZWQgb24gc2VsZWN0ZWQgZ3JvdXBzXHJcbiAgICAgIHRoaXMuZ2V0U3RvcmUoKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcnMuZ3JvdXAgPSB0aGlzLmdyb3Vwc0RhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBJZiBubyBncm91cHMgYXJlIHNlbGVjdGVkLCBjbGVhciB0aGUgc3RvcmVzIGxpc3RcclxuICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IFtdO1xyXG4gICAgICBcclxuICAgICAgLy8gQWxzbywgdXBkYXRlIGxvY2FsU3RvcmFnZSB0byByZWZsZWN0IHRoZSBjbGVhcmVkIHN0b3JlIHNlbGVjdGlvblxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSBbXTtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuICBcclxuICAgICAgLy8gRW1pdCBkYXRhIHZpYSBzZXJ2aWNlXHJcbiAgICAgIC8vIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBDbGVhciB0aGUgc2VhcmNoIHN0b3JlIHRleHQgd2hlbiBncm91cHMgYXJlIHVwZGF0ZWRcclxuICAgIHRoaXMuc2VhcmNoU3RvcmVUZXh0ID0gJyc7XHJcbiAgfVxyXG4gIFxyXG4gIFJlc2V0KCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKT0+e1xyXG4gICAgIC8vIENsZWFyIHNlbGVjdGVkIGdyb3Vwcywgc3RvcmVzLCBhbmQgbG9jYXRpb25zXHJcbiAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IFtdO1xyXG4gIHRoaXMuZmlsdGVyZWRTdG9yZXMgPSBbXTtcclxuICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gW107IC8vIFJlc2V0IGxvY2F0aW9ucyBhcyB3ZWxsXHJcbnRoaXMubG9jYXRpb25zID1bXTt0aGlzLmdyb3Vwc0RhdGEgPVtdOyB0aGlzLnN0b3JlcyA9W107XHJcbiAgLy8gQ2xlYXIgc2VhcmNoIGlucHV0IGZpZWxkc1xyXG4gIHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0ID0gXCJcIjtcclxuICB0aGlzLnNlYXJjaEdyb3VwVGV4dCA9IFwiXCI7XHJcbiAgdGhpcy5zZWFyY2hTdG9yZVRleHQgPSBcIlwiO1xyXG50aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPVtdO1xyXG50aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9W107XHJcbnRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID1bXTtcclxuXHJcbiBcclxuICAvLyBGZXRjaCBsb2NhdGlvbnMsIGdyb3VwcywgYW5kIHN0b3JlcyBhZ2FpblxyXG4gIHRoaXMuZ2V0TG9jYXRpb25zKCk7XHJcbiAgdGhpcy5nZXRTdG9yZSgpO1xyXG4gIHRoaXMuZ2V0R3JvdXBzKCk7XHJcbiAgLy8gUmVzZXQgdGhlIGZpbHRlcnMgaW4gc2VsZWN0ZWRGaWx0ZXJzXHJcblxyXG5cclxuICAvLyAvLyBPbmNlIHN0b3JlcyBhcmUgZmV0Y2hlZCwgbWFyayBhbGwgYXMgY2hlY2tlZFxyXG4gIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gIC8vICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IHRoaXMuc3RvcmVzLm1hcChzdG9yZSA9PiAoe1xyXG4gIC8vICAgICAuLi5zdG9yZSxcclxuICAvLyAgICAgY2hlY2tlZDogdHJ1ZSAgLy8gTWFyayBhbGwgc3RvcmVzIGFzIGNoZWNrZWRcclxuICAvLyAgIH0pKTtcclxuXHJcbiAgLy8gICAvLyBTeW5jIHNlbGVjdGVkRmlsdGVycyB3aXRoIHRoZSB1cGRhdGVkIHN0b3JlIHN0YXRlXHJcbiAgLy8gICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMgPSB0aGlzLmZpbHRlcmVkU3RvcmVzLm1hcChzdG9yZSA9PiAoe1xyXG4gIC8vICAgICAuLi5zdG9yZSxcclxuICAvLyAgICAgY2hlY2tlZDogdHJ1ZVxyXG4gIC8vICAgfSkpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2Ugd2l0aCB0aGUgbGF0ZXN0IHNlbGVjdGVkRmlsdGVyc1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlci1maWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEZpbHRlcnMpKTtcclxuIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxyXG4gICAgLy8gRW1pdCB0aGUgcmVzZXQgZmlsdGVycyB0byB1cGRhdGUgb3RoZXIgY29tcG9uZW50cyBpZiBuZWVkZWRcclxuICAgIC8vIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUubmV4dCh0aGlzLnNlbGVjdGVkRmlsdGVycyk7XHJcbiAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAvLyBBZGRpbmcgYSBzbGlnaHQgZGVsYXkgdG8gZW5zdXJlIHN0b3JlcyBhcmUgZmV0Y2hlZCBmaXJzdFxyXG4gXHJcbiAgXHJcbiAgICAvLyBDbG9zZSBkcm9wZG93biBhZnRlciByZXNldCBpZiBuZWNlc3NhcnlcclxuICAgIHRoaXMuT3BlbmRyb3Bkb3duID0gZmFsc2U7XHJcbiAgfSwxMDApXHJcbiAgfVxyXG4gIFxyXG4gIFxyXG4gIFxyXG4gIEFwcGx5KCk6IHZvaWQge1xyXG4gICAgLy8gQ2xvc2UgdGhlIGRyb3Bkb3duXHJcbiAgICB0aGlzLk9wZW5kcm9wZG93biA9IGZhbHNlO1xyXG4gIFxyXG4gICAgLy8gRmV0Y2ggZXhpc3RpbmcgZmlsdGVycyBmcm9tIGxvY2FsU3RvcmFnZVxyXG4gICAgY29uc3QgaGVhZGVyRmlsdGVyczogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwie31cIik7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZSA9ICBudWxsXHJcbiAgICAvLyBFbnN1cmUgY3VycmVudCBzZWxlY3Rpb25zIGFyZSByZWZsZWN0ZWRcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLmxvY2F0aW9uID0gdGhpcy5sb2NhdGlvbnM7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cCA9IHRoaXMuZ3JvdXBzRGF0YTtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3JlcyA9IGhlYWRlckZpbHRlcnMuc3RvcmVzID8gaGVhZGVyRmlsdGVycy5zdG9yZXMgOiB0aGlzLnN0b3JlcztcclxuICBcclxuICBcclxuICAgIC8vIFN0b3JlIHVwZGF0ZWQgZmlsdGVycyBiYWNrIGluIGxvY2FsU3RvcmFnZVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJoZWFkZXItZmlsdGVyc1wiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRmlsdGVycykpO1xyXG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXHJcbiAgICAvLyBFbWl0IHRoZSB1cGRhdGVkIGZpbHRlcnMgdmlhIHRoZSBzZXJ2aWNlXHJcbiAgICAvLyB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLm5leHQodGhpcy5zZWxlY3RlZEZpbHRlcnMpO1xyXG4gICAgLy8gVHJpZ2dlciByZWZyZXNoIGlmIG5lY2Vzc2FyeVxyXG4gICAgLy8gdGhpcy5ncy5tYW5hZ2VSZWZyZXNoVHJpZ2dlci5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG4gIFxyXG4gIGZpbHRlckxvY2F0aW9ucygpOiB2b2lkIHsgICAgXHJcbiAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hMb2NhdGlvblRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIFxyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgLy8gUHJlc2VydmUgdGhlIGNoZWNrZWQgc3RhdGUgZHVyaW5nIGZpbHRlcmluZ1xyXG4gICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnNcclxuICAgICAgICAubWFwKGxvY2F0aW9uID0+ICh7XHJcbiAgICAgICAgICAuLi5sb2NhdGlvbixcclxuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuZmlsdGVyZWRMb2NhdGlvbnMuZmluZCgobDphbnkpID0+IGwuY2l0eSA9PT0gbG9jYXRpb24uY2l0eSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9KSlcclxuICAgICAgICAuZmlsdGVyKGxvY2F0aW9uID0+XHJcbiAgICAgICAgICBsb2NhdGlvbj8uY2l0eT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXh0KVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjaGVja2VkIHN0YXRlIHdoZW4gc2VhcmNoIHRleHQgaXMgY2xlYXJlZFxyXG4gICAgICB0aGlzLmZpbHRlcmVkTG9jYXRpb25zID0gdGhpcy5sb2NhdGlvbnMubWFwKGxvY2F0aW9uID0+ICh7XHJcbiAgICAgICAgLi4ubG9jYXRpb24sXHJcbiAgICAgICAgY2hlY2tlZDogdGhpcy5zZWxlY3RlZEZpbHRlcnMubG9jYXRpb24uZmluZCgobDphbnkpID0+IGwuY2l0eSA9PT0gbG9jYXRpb24uY2l0eSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuXHJcbiAgZmlsdGVyR3JvdXBzKCk6IHZvaWQgeyAgXHJcbiAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hHcm91cFRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIFxyXG4gICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgLy8gUHJlc2VydmUgdGhlIGNoZWNrZWQgc3RhdGUgZHVyaW5nIGZpbHRlcmluZ1xyXG4gICAgICB0aGlzLmZpbHRlcmVkR3JvdXBzID0gdGhpcy5ncm91cHNEYXRhXHJcbiAgICAgICAgLm1hcChncm91cCA9PiAoe1xyXG4gICAgICAgICAgLi4uZ3JvdXAsXHJcbiAgICAgICAgICBjaGVja2VkOiB0aGlzLmZpbHRlcmVkR3JvdXBzLmZpbmQoKGc6YW55KSA9PiBnLmdyb3VwTmFtZSA9PT0gZ3JvdXAuZ3JvdXBOYW1lKT8uY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoZ3JvdXAgPT5cclxuICAgICAgICAgIGdyb3VwPy5ncm91cE5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGV4dClcclxuICAgICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgY2hlY2tlZCBzdGF0ZSB3aGVuIHNlYXJjaCB0ZXh0IGlzIGNsZWFyZWRcclxuICAgICAgdGhpcy5maWx0ZXJlZEdyb3VwcyA9IHRoaXMuZ3JvdXBzRGF0YS5tYXAoZ3JvdXAgPT4gKHtcclxuICAgICAgICAuLi5ncm91cCxcclxuICAgICAgICBjaGVja2VkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5ncm91cC5maW5kKChnOmFueSkgPT4gZy5ncm91cE5hbWUgPT09IGdyb3VwLmdyb3VwTmFtZSk/LmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBcclxuICBmaWx0ZXJTdG9yZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWFyY2hUZXh0ID0gdGhpcy5zZWFyY2hTdG9yZVRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIC8vIFByZXNlcnZlIGNoZWNrZWQgc3RhdGVzIGR1cmluZyBmaWx0ZXJpbmdcclxuICAgIGlmIChzZWFyY2hUZXh0KSB7XHJcbiAgICAgIC8vIEZpbHRlciBiYXNlZCBvbiBzZWFyY2ggdGV4dCB3aGlsZSBwcmVzZXJ2aW5nIGNoZWNrZWQgc3RhdGVcclxuICAgICAgdGhpcy5maWx0ZXJlZFN0b3JlcyA9IHRoaXMuc3RvcmVzXHJcbiAgICAgICAgLm1hcChzdG9yZSA9PiAoe1xyXG4gICAgICAgICAgLi4uc3RvcmUsXHJcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3RvcmUgaXMgYWxyZWFkeSBjaGVja2VkIGluIGZpbHRlcmVkU3RvcmVzLCBmYWxsYmFjayB0byBvcmlnaW5hbCBzdG9yZXMnIGNoZWNrZWQgc3RhdGVcclxuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJzLnN0b3Jlcy5maW5kKChzOiBhbnkpID0+IHMuc3RvcmVJZCA9PT0gc3RvcmUuc3RvcmVJZCk/LmNoZWNrZWQgfHwgc3RvcmUuY2hlY2tlZCB8fCBmYWxzZVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIoc3RvcmUgPT4gc3RvcmUuc3RvcmVOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGV4dCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gV2hlbiB0aGUgc2VhcmNoIHRleHQgaXMgY2xlYXJlZCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbGlzdCB3aXRoIHByZXNlcnZlZCBjaGVja2VkIHN0YXRlc1xyXG4gICAgICB0aGlzLmZpbHRlcmVkU3RvcmVzID0gdGhpcy5zdG9yZXMubWFwKHN0b3JlID0+ICh7XHJcbiAgICAgICAgLi4uc3RvcmUsXHJcbiAgICAgICAgLy8gUHJlc2VydmUgdGhlIGNoZWNrZWQgc3RhdGUgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGZpbHRlcnNcclxuICAgICAgICBjaGVja2VkOiB0aGlzLnNlbGVjdGVkRmlsdGVycy5zdG9yZXMuZmluZCgoczogYW55KSA9PiBzLnN0b3JlSWQgPT09IHN0b3JlLnN0b3JlSWQpPy5jaGVja2VkIHx8IHN0b3JlLmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBcclxuICAgXHJcbiAgY2xvc2VEcm9wZG93bigpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJvcGRvd25PcGVuID0gbnVsbDtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoXCJkb2N1bWVudDpjbGlja1wiLCBbXCIkZXZlbnRcIl0pXHJcbiAgY2xpY2tPdXRzaWRlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdChcclxuICAgICAgXCIuZHJvcGRvd24tY29udGFpbmVyXCJcclxuICAgICk7XHJcbiAgICBjb25zdCBjbGlja2Vkb3V0U2lkZSA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXHJcbiAgICAgIFwiLmRyb3Bkb3duMlwiXHJcbiAgICApO1xyXG4gICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xyXG4gICAgfVxyXG4gICAgaWYoIWNsaWNrZWRvdXRTaWRlKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bjEoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIHNlbGVjdGVkTG9jYXRpb25zTGFiZWwxKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzZWxlY3RlZExvY2F0aW9ucyA9IHRoaXMubG9jYXRpb25MYWJlbCA9IHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0Lmxlbmd0aCA/IHRoaXMubG9jYXRpb25zXHJcbiAgICAgIC5maWx0ZXIobG9jYXRpb24gPT4gbG9jYXRpb24uY2hlY2tlZCkubWFwKGxvY2F0aW9uID0+IGxvY2F0aW9uLmNpdHkpIDogIHRoaXMuZmlsdGVyZWRMb2NhdGlvbnNcclxuICAgICAgLmZpbHRlcigobG9jYXRpb246YW55KSA9PiBsb2NhdGlvbi5jaGVja2VkKS5tYXAoKGxvY2F0aW9uOmFueSkgPT4gbG9jYXRpb24uY2l0eSk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRMb2NhdGlvbnMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gJydcclxuICAgICAgOiBgJHtzZWxlY3RlZExvY2F0aW9ucy5sZW5ndGh9YDtcclxuICB9XHJcbiAgICAgICAgc2VsZWN0ZWRHcm91cHNMYWJlbDEoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBzID0gdGhpcy5ncm91cExhYmVsID0gdGhpcy5zZWFyY2hHcm91cFRleHQubGVuZ3RoID8gdGhpcy5ncm91cHNEYXRhLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmNoZWNrZWQpIDogdGhpcy5maWx0ZXJlZEdyb3Vwcy5maWx0ZXIoKGdyb3VwOmFueSkgPT4gZ3JvdXAuY2hlY2tlZCk7XHJcbiAgICByZXR1cm4gc2VsZWN0ZWRHcm91cHMubGVuZ3RoID09PSAwXHJcbiAgICAgID8gXCJcIlxyXG4gICAgICA6IGAke3NlbGVjdGVkR3JvdXBzLmxlbmd0aH1gO1xyXG4gIH1cclxuXHJcbiAgICBzZWxlY3RlZFN0b3Jlc0xhYmVsMSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRTdG9yZXMgPSB0aGlzLnNlYXJjaFN0b3JlVGV4dC5sZW5ndGggPyB0aGlzLnN0b3Jlcy5maWx0ZXIoKHN0b3JlKSA9PiBzdG9yZS5jaGVja2VkKSA6IHRoaXMuZmlsdGVyZWRTdG9yZXMuZmlsdGVyKChzdG9yZTphbnkpID0+IHN0b3JlLmNoZWNrZWQpO1xyXG4gICAgcmV0dXJuIHNlbGVjdGVkU3RvcmVzLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/IFwiMFwiXHJcbiAgICAgIDogYCR7c2VsZWN0ZWRTdG9yZXMubGVuZ3RofWA7XHJcbiAgfVxyXG4gIFxyXG4gIGdldFNlbGVjdGVkQ291bnQodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgIGNhc2UgJ2xvY2F0aW9uJzpcclxuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbnNMYWJlbDEoKTtcclxuICAgIGNhc2UgJ2dyb3VwJzpcclxuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRHcm91cHNMYWJlbDEoKTtcclxuICAgIGNhc2UgJ3N0b3JlJzpcclxuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTdG9yZXNMYWJlbDEoKTtcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiAnJztcclxuICB9XHJcbn1cclxuICBhY3RpdmVEcm9wZG93bjogc3RyaW5nID0gJyc7XHJcblxyXG4vLyBBZGQgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGNhdGVnb3J5IGNsaWNrc1xyXG5zaG93RHJvcGRvd24odHlwZTogc3RyaW5nKSB7XHJcbiAgdGhpcy5hY3RpdmVEcm9wZG93biA9IHR5cGU7XHJcbiAgLy8gUmVzZXQgc2VhcmNoIHRleHRzIHdoZW4gc3dpdGNoaW5nIGRyb3Bkb3duc1xyXG4gIHRoaXMuc2VhcmNoTG9jYXRpb25UZXh0ID0gJyc7XHJcbiAgdGhpcy5zZWFyY2hHcm91cFRleHQgPSAnJztcclxuICB0aGlzLnNlYXJjaFN0b3JlVGV4dCA9ICcnO1xyXG4gIFxyXG4gIC8vIFJlc2V0IGZpbHRlcmVkIGxpc3RzIHRvIHNob3cgYWxsIGl0ZW1zXHJcbiAgdGhpcy5maWx0ZXJMb2NhdGlvbnMoKTtcclxuICB0aGlzLmZpbHRlckdyb3VwcygpO1xyXG4gIHRoaXMuZmlsdGVyU3RvcmVzKCk7XHJcbn1cclxuc2hvd0NsaWNrKHR5cGU6IGFueSxlOk1vdXNlRXZlbnQpIHtcclxuICB0aGlzLm9wZW5kcm9wZG93bihlKVxyXG4gIHRoaXMuT3BlbmRyb3Bkb3duID0gdHJ1ZTtcclxuICB0aGlzLmFjdGl2ZURyb3Bkb3duID0gdHlwZTtcclxufVxyXG59XHJcbmludGVyZmFjZSBDaXR5IHtcclxuICBjaXR5OiBzdHJpbmc7XHJcbn1cclxuXHJcbmludGVyZmFjZSBMb2NhdGlvbiB7XHJcbiAgY2l0eTogQ2l0eTtcclxuICBjaGVja2VkOiBib29sZWFuO1xyXG59XHJcblxyXG5cclxuIiwiPGRpdiBjbGFzcz1cIm1lLTNcIj5cclxuICAgIDxsYWJlbCAqbmdJZj1cInNlbGVjdGVkTG9jYXRpb25zTGFiZWwoKVwiIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtbGlnaHQtZGVmYXVsdCBteC0yIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNob3dDbGljaygncmVnaW9uJywgJGV2ZW50KVwiPnt7c2VsZWN0ZWRMb2NhdGlvbnNMYWJlbCgpfX0gXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVMb2NhdGlvbigpXCI+PHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8bGFiZWwgKm5nSWY9XCJzZWxlY3RlZEdyb3Vwc0xhYmVsKClcIiAgY2xhc3M9XCJiYWRnZSBiYWRnZS1saWdodC1kZWZhdWx0IG14LTIgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic2hvd0NsaWNrKCdjbHVzdGVycycsICRldmVudClcIj57e3NlbGVjdGVkR3JvdXBzTGFiZWwoKX19IFxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicmVtb3ZlR3JvdXAoKVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICA8L2xhYmVsPlxyXG4gICAgPGxhYmVsICBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0LWRlZmF1bHQgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic2hvd0NsaWNrKCdzdG9yZXMnLCAkZXZlbnQpXCI+e3tzZWxlY3RlZFN0b3Jlc0xhYmVsKCl9fTwvbGFiZWw+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJ3cmFwcGVyIG1lLTNcIiAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy51c2VyVHlwZSA9PT0gJ3RhbmdvJ1wiPlxyXG48bGliLXNlbGVjdCBbaXRlbXNdPVwiY2xpZW50TGlzdFwiIFttdWx0aV09XCJmYWxzZVwiIFtzZWFyY2hGaWVsZF09XCInY2xpZW50TmFtZSdcIiBbZGlzYWJsZWRdPVwiZmFsc2VcIiBbaWRGaWVsZF09XCInY2xpZW50SWQnXCJcclxuKHNlbGVjdGVkKT1cIm9uQ2xpZW50U2VsZWN0KCRldmVudClcIiBbc2VsZWN0ZWRWYWx1ZXNdPVwiW3NlbGVjdGVkQ2xpZW50XVwiPjwvbGliLXNlbGVjdD5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib3BlbmRyb3Bkb3duKCRldmVudClcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBteC0yIHJvdW5kZWQtMyB0ZXh0LW5vd3JhcCBib3JkZXItdmFsXCI+XHJcbiAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAxOSAxN1wiIGZpbGw9XCJub25lXCI+XHJcbjxwYXRoIGQ9XCJNMTcuNTAyNiAwLjgzNTkzOEgwLjgzNTkzOEw3LjUwMjYgOC43MTkyN1YxNC4xNjkzTDEwLjgzNTkgMTUuODM1OVY4LjcxOTI3TDE3LjUwMjYgMC44MzU5MzhaXCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbjwvc3ZnPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RmlsdGVyPC9zcGFuPlxyXG4gIDwvYnV0dG9uPlxyXG4gIFxyXG4gIDxkaXYgKm5nSWY9XCJPcGVuZHJvcGRvd25cIiBjbGFzcz1cImNhcmQgZHJvcGRvd24yIHBvc2l0aW9uLWFic29sdXRlIHotMSBlbmQtMFwiIHN0eWxlPVwiei1pbmRleDogMSAhaW1wb3J0YW50OyBtaW4td2lkdGg6IDM1MHB4O1wiIChjbGlja091dHNpZGUpPVwiY2xvc2VEcm9wZG93bjEoKVwiPlxyXG4gICAgXHJcbiAgICA8IS0tIEhlYWRlciBTZWN0aW9uIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBweC0zIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHB0LTEgcHgtMCBib3JkZXItYm90dG9tIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0xXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdy0xMDBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTVcIj5cclxuICAgICAgPGg2IGNsYXNzPVwibWItMCBoZWFkZXItZmlsdGVyIHBzLTIgbXktNFwiPkZpbHRlciBieTwvaDY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTcgdGV4dC1tdXRlZCBtdC0yXCI+IFxyXG4gICAgICAgIDwhLS0gU2VhcmNoIGZyb20gMjAwMCBzdG9yZXMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVEcm9wZG93biA9PT0gJ3JlZ2lvbidcIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIG1iLTNcIiBcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCByZWdpb25cIiBcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaExvY2F0aW9uVGV4dFwiIFxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckxvY2F0aW9ucygpXCIgXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlRHJvcGRvd24gPT09ICdjbHVzdGVycydcIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtIG1iLTNcIiBcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBjbHVzdGVyc1wiIFxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoR3JvdXBUZXh0XCIgXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyR3JvdXBzKClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3RpdmVEcm9wZG93biA9PT0gJ3N0b3JlcydcIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gbWItM1wiIFxyXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RvcmVzXCIgXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFN0b3JlVGV4dFwiIFxyXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyU3RvcmVzKClcIiBcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBNYWluIENvbnRlbnQgQXJlYSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgPCEtLSBMZWZ0IFNpZGUgLSBGaWx0ZXIgQ2F0ZWdvcmllcyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC01IGJvcmRlci1lbmQgcGUtM1wiPlxyXG4gICAgICAgIDwhLS0gRmlsdGVyIFN0YXRzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItY2F0ZWdvcmllcyBweC0zIG15LTJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItY2F0ZWdvcnktaXRlbSAgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwic2hvd0Ryb3Bkb3duKCdyZWdpb24nKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIntcclxuICAgICdhY3RpdmUtaXRlbSc6IGFjdGl2ZURyb3Bkb3duID09PSAncmVnaW9uJywgXHJcbiAgICAndGV4dC1pdGVtJzogYWN0aXZlRHJvcGRvd24gIT09ICdyZWdpb24nXHJcbiAgfVwiPlJlZ2lvbiA8c3BhbiAqbmdJZj1cInNlbGVjdGVkTG9jYXRpb25zTGFiZWwxKClcIiAgW25nQ2xhc3NdPVwiYWN0aXZlRHJvcGRvd249PT0gJ3JlZ2lvbicgPyAndGV4dC1ib3JkZXItcHJpYW1yeScgOiAndGV4dC1ib3JkZXInXCIgY2xhc3M9XCJteC0yXCI+e3sgc2VsZWN0ZWRMb2NhdGlvbnNMYWJlbDEoKSB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZnctYm9sZFwiPjwvZGl2PiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1jYXRlZ29yeS1pdGVtIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNob3dEcm9wZG93bignY2x1c3RlcnMnKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIntcclxuICAgICdhY3RpdmUtaXRlbSc6IGFjdGl2ZURyb3Bkb3duID09PSAnY2x1c3RlcnMnLCBcclxuICAgICd0ZXh0LWl0ZW0nOiBhY3RpdmVEcm9wZG93biAhPT0gJ2NsdXN0ZXJzJ1xyXG4gIH1cIj5DbHVzdGVycyA8c3BhbiAqbmdJZj1cInNlbGVjdGVkR3JvdXBzTGFiZWwxKClcIiAgW25nQ2xhc3NdPVwiYWN0aXZlRHJvcGRvd249PT0gJ2NsdXN0ZXJzJyA/ICd0ZXh0LWJvcmRlci1wcmlhbXJ5JyA6ICd0ZXh0LWJvcmRlcidcIiBjbGFzcz1cIm14LTJcIj57eyBzZWxlY3RlZEdyb3Vwc0xhYmVsMSgpIH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1jYXRlZ29yeS1pdGVtIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNob3dEcm9wZG93bignc3RvcmVzJylcIj5cclxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7XHJcbiAgICAnYWN0aXZlLWl0ZW0nOiBhY3RpdmVEcm9wZG93biA9PT0gJ3N0b3JlcycsIFxyXG4gICAgJ3RleHQtaXRlbSc6IGFjdGl2ZURyb3Bkb3duICE9PSAnc3RvcmVzJ1xyXG4gIH1cIiA+U3RvcmVzIDxzcGFuICBbbmdDbGFzc109XCJhY3RpdmVEcm9wZG93bj09PSAnc3RvcmVzJyA/ICd0ZXh0LWJvcmRlci1wcmlhbXJ5JyA6ICd0ZXh0LWJvcmRlcidcIiAqbmdJZj1cInNlbGVjdGVkU3RvcmVzTGFiZWwxKClcIiBjbGFzcz1cIm14LTJcIj57eyBzZWxlY3RlZFN0b3Jlc0xhYmVsMSgpIH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIERvd250aW1lIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwibXQtNFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWQgbWItMlwiPkRvd250aW1lPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHktMVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj5Eb3dudGltZSBzZWN0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gUmlnaHQgU2lkZSAtIERyb3Bkb3duIENvbnRlbnQgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNyBwcy0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnQtYXJlYVwiIHN0eWxlPVwibWluLWhlaWdodDogMjAwcHg7XCI+XHJcbiAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgICAgICAgICA8IS0tIFJlZ2lvbiBEcm9wZG93biBDb250ZW50IC0tPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZURyb3Bkb3duID09PSAncmVnaW9uJ1wiIGNsYXNzPVwiZHJvcGRvd24tZnVsbC12aWV3XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZExvY2F0aW9ucz8ubGVuZ3RoXCIgY2xhc3M9XCJmb3JtLWNoZWNrIG1iLTNcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiIFxyXG4gICAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RBbGxMb2NhdGlvbnNGdWxsXCIgXHJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0FsbExvY2F0aW9uc1NlbGVjdGVkKClcIiBcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsTG9jYXRpb25zKCRldmVudClcIiBcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzZWxlY3RBbGxMb2NhdGlvbnNGdWxsXCI+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQWxsXHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRMb2NhdGlvbnM/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG10LTIwIG1iLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG10LTIwIGNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1ub2RhdGEtdGFibGVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbGlzdCB0ZXh0LW5vd3JhcFwiIHN0eWxlPVwibWF4LWhlaWdodDogMjUwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItM1wiICpuZ0Zvcj1cImxldCBsb2NhdGlvbiBvZiBmaWx0ZXJlZExvY2F0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiBcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCInbG9jYXRpb24tZnVsbC0nICsgbG9jYXRpb24uY2l0eVwiIFxyXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImxvY2F0aW9uLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkTG9jYXRpb25zKClcIiBcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHB5LTFcIiBbZm9yXT1cIidsb2NhdGlvbi1mdWxsLScgKyBsb2NhdGlvbi5jaXR5XCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGxvY2F0aW9uLmNpdHkgfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBDbHVzdGVycyBEcm9wZG93biBDb250ZW50IC0tPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZURyb3Bkb3duID09PSAnY2x1c3RlcnMnXCIgY2xhc3M9XCJkcm9wZG93bi1mdWxsLXZpZXdcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcmVkR3JvdXBzPy5sZW5ndGhcIiBjbGFzcz1cImZvcm0tY2hlY2sgbWItM1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBpZD1cInNlbGVjdEFsbEdyb3Vwc0Z1bGxcIiBcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsR3JvdXBzU2VsZWN0ZWQoKVwiIFxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGxHcm91cHMoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbEdyb3Vwc0Z1bGxcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRHcm91cHM/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbXQtMjAgbWItNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgbXQtMjAgY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLW5vZGF0YS10YWJsZVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1saXN0IHRleHQtbm93cmFwXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAyNTBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0yXCIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGZpbHRlcmVkR3JvdXBzXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cIidncm91cC1mdWxsLScgKyBncm91cC5ncm91cE5hbWVcIiBcclxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJncm91cC5jaGVja2VkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZEdyb3VwcygpXCIgXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBweS0xXCIgW2Zvcl09XCInZ3JvdXAtZnVsbC0nICsgZ3JvdXAuZ3JvdXBOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGdyb3VwLmdyb3VwTmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIFN0b3JlcyBEcm9wZG93biBDb250ZW50IC0tPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZURyb3Bkb3duID09PSAnc3RvcmVzJ1wiIGNsYXNzPVwiZHJvcGRvd24tZnVsbC12aWV3XCI+XHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcmVkU3RvcmVzPy5sZW5ndGhcIiBjbGFzcz1cImZvcm0tY2hlY2sgbWItM1wiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICBpZD1cInNlbGVjdEFsbFN0b3Jlc0Z1bGxcIiBcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzQWxsU3RvcmVzU2VsZWN0ZWQoKVwiIFxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGxTdG9yZXMoJGV2ZW50KVwiIFxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNlbGVjdEFsbFN0b3Jlc0Z1bGxcIj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdCBBbGxcclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRTdG9yZXM/Lmxlbmd0aFwiID5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIG10LTIwIG1iLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIG10LTIwIGNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1ub2RhdGEtdGFibGVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhLXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbGlzdCB0ZXh0LW5vd3JhcFwiIHN0eWxlPVwibWF4LWhlaWdodDogMjUwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItMlwiICpuZ0Zvcj1cImxldCBzdG9yZSBvZiBmaWx0ZXJlZFN0b3Jlc1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgXHJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCInc3RvcmUtZnVsbC0nICsgc3RvcmUuc3RvcmVJZFwiIFxyXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0b3JlLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkU3RvcmVzKClcIiBcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIHB5LTFcIiBbZm9yXT1cIidzdG9yZS1mdWxsLScgKyBzdG9yZS5zdG9yZUlkXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHN0b3JlLnN0b3JlTmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gRGVmYXVsdCBWaWV3IHdoZW4gbm8gZHJvcGRvd24gc2VsZWN0ZWQgLS0+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWFjdGl2ZURyb3Bkb3duXCIgY2xhc3M9XCJ0ZXh0LWNlbnRlciB0ZXh0LW11dGVkIHB5LTVcIj5cclxuICAgICAgICAgICAgPGRpdj5TZWxlY3QgYSBmaWx0ZXIgY2F0ZWdvcnkgdG8gc2VlIG9wdGlvbnM8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBwLTMgYm9yZGVyLXRvcCBtdC0zXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IHRleHQtbXV0ZWQgYnRuLXNtIHBzLTJcIiAoY2xpY2spPVwiUmVzZXQoKVwiPlJlc2V0IEZpbHRlcnM8L2J1dHRvbj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIGJ0bi1zbSBtZS0yXCIgKGNsaWNrKT1cImNsb3NlRHJvcGRvd24xKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiIChjbGljayk9XCJBcHBseSgpXCI+QXBwbHk8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19