tango-app-ui-store-builder 1.0.95 → 1.0.96

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/esm2022/lib/components/collection-update-ai/components/store-select/store-select.component.mjs +23 -4
  2. package/esm2022/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.mjs +141 -14
  3. package/esm2022/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.mjs +13 -3
  4. package/esm2022/lib/components/collection-update-ai/models/find-replace.model.mjs +1 -1
  5. package/esm2022/lib/components/collection-update-ai/services/data.service.mjs +5 -1
  6. package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +70 -46
  7. package/esm2022/lib/components/manage-store-plano/verification-feedback/verification-feedback.component.mjs +3 -3
  8. package/esm2022/lib/components/onboard-store-plano/create-planogram/create-planogram.component.mjs +4 -6
  9. package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +70 -12
  10. package/esm2022/lib/components/onboard-store-plano/utils/axis-compaction.mjs +56 -55
  11. package/esm2022/lib/components/plano-tools/allow-edit/allow-edit.component.mjs +1 -1
  12. package/esm2022/lib/components/plano-tools/delete-task/delete-task.component.mjs +1 -1
  13. package/esm2022/lib/components/plano-tools/modify-fixture-numbers/modify-fixture-numbers.component.mjs +156 -0
  14. package/esm2022/lib/components/plano-tools/plano-data-export/plano-data-export.component.mjs +1 -1
  15. package/esm2022/lib/components/plano-tools/store-exports/store-exports.component.mjs +1 -1
  16. package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +3 -3
  17. package/esm2022/lib/services/store-builder.service.mjs +16 -4
  18. package/esm2022/lib/tango-store-builder-routing.module.mjs +6 -1
  19. package/esm2022/lib/tango-store-builder.module.mjs +4 -4
  20. package/fesm2022/tango-app-ui-store-builder.mjs +552 -320
  21. package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
  22. package/lib/components/collection-update-ai/components/store-select/store-select.component.d.ts +2 -1
  23. package/lib/components/collection-update-ai/find-replace-layout/prepare-template/prepare-template.component.d.ts +18 -0
  24. package/lib/components/collection-update-ai/find-replace-table/find-replace-table.component.d.ts +1 -0
  25. package/lib/components/collection-update-ai/models/find-replace.model.d.ts +12 -0
  26. package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +0 -5
  27. package/lib/components/plano-tools/modify-fixture-numbers/modify-fixture-numbers.component.d.ts +49 -0
  28. package/lib/services/store-builder.service.d.ts +12 -1
  29. package/lib/tango-store-builder.module.d.ts +15 -15
  30. package/package.json +1 -1
  31. package/esm2022/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.mjs +0 -180
  32. package/lib/components/manage-store-plano/zone-verification-feedback/zone-verification-feedback.component.d.ts +0 -48
@@ -7,6 +7,7 @@ import * as i2 from "@angular/forms";
7
7
  export class StoreSelectComponent {
8
8
  options = [];
9
9
  initialSelected = [];
10
+ singleSelect = false;
10
11
  selectedChange = new EventEmitter();
11
12
  inputWrapper;
12
13
  selectedItems = new Set();
@@ -97,10 +98,14 @@ export class StoreSelectComponent {
97
98
  // Split by comma and newline, then process each value
98
99
  const values = value.split(/[,\n\r]+/).map(v => v.trim()).filter(v => v.length > 0);
99
100
  let hasChanges = false;
100
- values.forEach(val => {
101
+ const valuesToProcess = this.singleSelect ? values.slice(0, 1) : values;
102
+ valuesToProcess.forEach(val => {
101
103
  // Find matching option by label (case-insensitive)
102
104
  const matchedOption = this.options.find(opt => opt.label.toLowerCase() === val.toLowerCase());
103
105
  if (matchedOption && !this.selectedItems.has(matchedOption.id)) {
106
+ if (this.singleSelect) {
107
+ this.selectedItems.clear();
108
+ }
104
109
  this.selectedItems.add(matchedOption.id);
105
110
  hasChanges = true;
106
111
  }
@@ -124,6 +129,18 @@ export class StoreSelectComponent {
124
129
  this.isDropdownOpen = true;
125
130
  }
126
131
  toggleSelection(option) {
132
+ if (this.singleSelect) {
133
+ if (this.selectedItems.has(option.id)) {
134
+ this.selectedItems.delete(option.id);
135
+ }
136
+ else {
137
+ this.selectedItems.clear();
138
+ this.selectedItems.add(option.id);
139
+ }
140
+ this.isDropdownOpen = false;
141
+ this.selectedChange.emit(this.selectedOptions);
142
+ return;
143
+ }
127
144
  if (this.selectedItems.has(option.id)) {
128
145
  this.selectedItems.delete(option.id);
129
146
  }
@@ -143,15 +160,17 @@ export class StoreSelectComponent {
143
160
  event.stopPropagation();
144
161
  }
145
162
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
146
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StoreSelectComponent, isStandalone: true, selector: "lib-store-select", inputs: { options: "options", initialSelected: "initialSelected" }, outputs: { selectedChange: "selectedChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "inputWrapper", first: true, predicate: ["inputWrapper"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"input-wrapper\" #inputWrapper>\r\n <div class=\"form-control custom-input d-flex align-items-center gap-2 flex-wrap\" \r\n (click)=\"onInputClick()\">\r\n <span *ngFor=\"let option of selectedOptions\" \r\n class=\"store-badge\"\r\n (click)=\"removeChip(option, $event)\">\r\n <span class=\"badge-text\">{{ option.label }}</span>\r\n <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>\r\n </span>\r\n <textarea \r\n class=\"input-text\"\r\n rows=\"1\"\r\n [value]=\"inputText\"\r\n (input)=\"onInputChange($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (focus)=\"onInputFocus()\"\r\n placeholder=\"Type and press Enter\"\r\n autocomplete=\"off\"></textarea>\r\n </div>\r\n <div class=\"dropdown-menu-custom\" \r\n *ngIf=\"isDropdownOpen && options.length > 0\"\r\n (click)=\"onDropdownClick($event)\">\r\n <div class=\"dropdown-item-custom select-all-item\"\r\n (click)=\"toggleSelectAll()\">\r\n <div class=\"custom-checkbox\">\r\n <div class=\"checkbox-box\" [class.checked]=\"isAllSelected\" [class.indeterminate]=\"isIndeterminate\">\r\n <svg *ngIf=\"isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg *ngIf=\"isIndeterminate && !isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M2 6H10\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n <span class=\"dropdown-item-text\">Select All</span>\r\n </div>\r\n <div class=\"w-100 search-input-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <input \r\n type=\"text\" \r\n [(ngModel)]=\"searchText\"\r\n (input)=\"onSearchChange()\"\r\n placeholder=\"Search\"\r\n autocomplete=\"off\">\r\n <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <hr class=\"dropdown-divider\">\r\n <div *ngFor=\"let option of filteredOptions\" \r\n class=\"dropdown-item-custom\"\r\n (click)=\"toggleSelection(option)\">\r\n <div class=\"custom-checkbox\">\r\n <div class=\"checkbox-box\" [class.checked]=\"isSelected(option.id)\">\r\n <svg *ngIf=\"isSelected(option.id)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n <span class=\"dropdown-item-text\">{{ option.label }}</span>\r\n </div>\r\n </div>\r\n</div>", styles: [".input-wrapper{position:relative;width:100%}:host{display:block;flex:1;min-width:0}.custom-input{background:#fff;border:1px solid #d0d5dd;border-radius:8px;padding:6px 10px;min-height:44px;max-height:160px;box-shadow:0 1px 2px #1018280d;display:flex;align-items:flex-start;overflow-y:auto;overflow-x:hidden}.custom-input:focus,.custom-input:focus-within{outline:none;box-shadow:0 1px 2px #1018280d}.store-badge{background-color:#f2f4f7;border-radius:16px;padding:2px 6px 2px 8px;display:inline-flex;align-items:center;gap:4px;flex-shrink:0;cursor:pointer;transition:background-color .2s ease}.store-badge:hover{background-color:#e4e7ec}.badge-text{font-size:12px;font-weight:500;line-height:18px;color:#344054}.input-text{font-size:14px;font-weight:400;line-height:20px;color:#1d2939;border:none;outline:none;background:transparent;flex:1;min-width:120px;padding:0}.input-text:focus{outline:none;box-shadow:none}.input-text::placeholder{color:#98a2b3}.dropdown-menu-custom{position:absolute;background:#fff;border:1px solid #f2f4f7;border-radius:8px;width:100%;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;margin-top:8px;top:100%;left:0;z-index:1000;max-height:300px;overflow-y:auto;overflow-x:hidden}.dropdown-menu-custom::-webkit-scrollbar,.custom-input::-webkit-scrollbar{width:6px}.dropdown-menu-custom::-webkit-scrollbar-track,.custom-input::-webkit-scrollbar-track{background:#f9fafb;border-radius:4px}.dropdown-menu-custom::-webkit-scrollbar-thumb,.custom-input::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.dropdown-menu-custom::-webkit-scrollbar-thumb:hover,.custom-input::-webkit-scrollbar-thumb:hover{background:#98a2b3}.dropdown-item-custom{display:flex;align-items:center;gap:12px;padding:10px 16px;cursor:pointer;transition:background-color .2s ease}.dropdown-item-custom:hover{background-color:#f9fafb}.select-all-item{font-weight:600;border-bottom:1px solid #f2f4f7;margin-bottom:4px}.dropdown-item-text{font-size:14px;font-weight:500;line-height:20px;color:#344054}.custom-checkbox{display:flex;align-items:center;justify-content:center}.checkbox-box{width:16px;height:16px;background:#fff;border:1px solid #d0d5dd;border-radius:4px;display:flex;align-items:center;justify-content:center}.checkbox-box.checked,.checkbox-box.indeterminate{background-color:#eaf8ff;border-color:#00a3ff}.dropdown-divider{background-color:#f2f4f7;height:1px;margin:0;opacity:1}.dropdown-menu-custom .search-input-wrapper{padding:8px 10px;background-color:#fff;border-top-right-radius:8px;border-top-left-radius:8px;border-top:1px solid rgba(16,24,40,.08);border-right:1px solid rgba(16,24,40,.08);border-left:1px solid rgba(16,24,40,.08);position:relative}.dropdown-menu-custom .search-input-wrapper input{width:100%;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d;padding:10px 14px 10px 30px;outline:none;font-family:Inter;font-size:14px;font-weight:500;line-height:20px;color:var(--Gray-700, #344054)}.dropdown-menu-custom .search-input-wrapper input::placeholder{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.dropdown-menu-custom .search-input-wrapper input:focus{border-color:var(--Gray-400, #98A2B3)}.dropdown-menu-custom .search-input-wrapper .search-icon{position:absolute;left:20px;top:20px;pointer-events:none}@media (max-width: 767px){.btn-apply{width:100%;margin-top:0}.dropdown-menu-custom{position:absolute;margin-top:8px;width:100%;left:0}}@media (max-width: 575px){.custom-input{flex-direction:column;align-items:flex-start}.store-badge{margin-bottom:4px}}.gap-2{gap:.5rem!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
163
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StoreSelectComponent, isStandalone: true, selector: "lib-store-select", inputs: { options: "options", initialSelected: "initialSelected", singleSelect: "singleSelect" }, outputs: { selectedChange: "selectedChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "inputWrapper", first: true, predicate: ["inputWrapper"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"input-wrapper\" #inputWrapper>\r\n <div class=\"form-control custom-input d-flex align-items-center gap-2 flex-wrap\" \r\n (click)=\"onInputClick()\">\r\n <span *ngFor=\"let option of selectedOptions\" \r\n class=\"store-badge\"\r\n (click)=\"removeChip(option, $event)\">\r\n <span class=\"badge-text\">{{ option.label }}</span>\r\n <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>\r\n </span>\r\n <textarea \r\n class=\"input-text\"\r\n rows=\"1\"\r\n [value]=\"inputText\"\r\n (input)=\"onInputChange($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (focus)=\"onInputFocus()\"\r\n placeholder=\"Type and press Enter\"\r\n autocomplete=\"off\"></textarea>\r\n </div>\r\n <div class=\"dropdown-menu-custom\" \r\n *ngIf=\"isDropdownOpen && options.length > 0\"\r\n (click)=\"onDropdownClick($event)\">\r\n <div class=\"dropdown-item-custom select-all-item\"\r\n *ngIf=\"!singleSelect\"\r\n (click)=\"toggleSelectAll()\">\r\n <div class=\"custom-checkbox\">\r\n <div class=\"checkbox-box\" [class.checked]=\"isAllSelected\" [class.indeterminate]=\"isIndeterminate\">\r\n <svg *ngIf=\"isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg *ngIf=\"isIndeterminate && !isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M2 6H10\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n <span class=\"dropdown-item-text\">Select All</span>\r\n </div>\r\n <div class=\"w-100 search-input-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <input \r\n type=\"text\" \r\n [(ngModel)]=\"searchText\"\r\n (input)=\"onSearchChange()\"\r\n placeholder=\"Search\"\r\n autocomplete=\"off\">\r\n <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <hr class=\"dropdown-divider\">\r\n <div *ngFor=\"let option of filteredOptions\" \r\n class=\"dropdown-item-custom\"\r\n (click)=\"toggleSelection(option)\">\r\n <div class=\"custom-checkbox\">\r\n <div class=\"checkbox-box\" [class.checked]=\"isSelected(option.id)\">\r\n <svg *ngIf=\"isSelected(option.id)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n <span class=\"dropdown-item-text\">{{ option.label }}</span>\r\n </div>\r\n </div>\r\n</div>", styles: [".input-wrapper{position:relative;width:100%}:host{display:block;flex:1;min-width:0}.custom-input{background:#fff;border:1px solid #d0d5dd;border-radius:8px;padding:6px 10px;min-height:44px;max-height:160px;box-shadow:0 1px 2px #1018280d;display:flex;align-items:flex-start;overflow-y:auto;overflow-x:hidden}.custom-input:focus,.custom-input:focus-within{outline:none;box-shadow:0 1px 2px #1018280d}.store-badge{background-color:#f2f4f7;border-radius:16px;padding:2px 6px 2px 8px;display:inline-flex;align-items:center;gap:4px;flex-shrink:0;cursor:pointer;transition:background-color .2s ease}.store-badge:hover{background-color:#e4e7ec}.badge-text{font-size:12px;font-weight:500;line-height:18px;color:#344054}.input-text{font-size:14px;font-weight:400;line-height:20px;color:#1d2939;border:none;outline:none;background:transparent;flex:1;min-width:120px;padding:0}.input-text:focus{outline:none;box-shadow:none}.input-text::placeholder{color:#98a2b3}.dropdown-menu-custom{position:absolute;background:#fff;border:1px solid #f2f4f7;border-radius:8px;width:100%;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;margin-top:8px;top:100%;left:0;z-index:1000;max-height:300px;overflow-y:auto;overflow-x:hidden}.dropdown-menu-custom::-webkit-scrollbar,.custom-input::-webkit-scrollbar{width:6px}.dropdown-menu-custom::-webkit-scrollbar-track,.custom-input::-webkit-scrollbar-track{background:#f9fafb;border-radius:4px}.dropdown-menu-custom::-webkit-scrollbar-thumb,.custom-input::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.dropdown-menu-custom::-webkit-scrollbar-thumb:hover,.custom-input::-webkit-scrollbar-thumb:hover{background:#98a2b3}.dropdown-item-custom{display:flex;align-items:center;gap:12px;padding:10px 16px;cursor:pointer;transition:background-color .2s ease}.dropdown-item-custom:hover{background-color:#f9fafb}.select-all-item{font-weight:600;border-bottom:1px solid #f2f4f7;margin-bottom:4px}.dropdown-item-text{font-size:14px;font-weight:500;line-height:20px;color:#344054}.custom-checkbox{display:flex;align-items:center;justify-content:center}.checkbox-box{width:16px;height:16px;background:#fff;border:1px solid #d0d5dd;border-radius:4px;display:flex;align-items:center;justify-content:center}.checkbox-box.checked,.checkbox-box.indeterminate{background-color:#eaf8ff;border-color:#00a3ff}.dropdown-divider{background-color:#f2f4f7;height:1px;margin:0;opacity:1}.dropdown-menu-custom .search-input-wrapper{padding:8px 10px;background-color:#fff;border-top-right-radius:8px;border-top-left-radius:8px;border-top:1px solid rgba(16,24,40,.08);border-right:1px solid rgba(16,24,40,.08);border-left:1px solid rgba(16,24,40,.08);position:relative}.dropdown-menu-custom .search-input-wrapper input{width:100%;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d;padding:10px 14px 10px 30px;outline:none;font-family:Inter;font-size:14px;font-weight:500;line-height:20px;color:var(--Gray-700, #344054)}.dropdown-menu-custom .search-input-wrapper input::placeholder{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.dropdown-menu-custom .search-input-wrapper input:focus{border-color:var(--Gray-400, #98A2B3)}.dropdown-menu-custom .search-input-wrapper .search-icon{position:absolute;left:20px;top:20px;pointer-events:none}@media (max-width: 767px){.btn-apply{width:100%;margin-top:0}.dropdown-menu-custom{position:absolute;margin-top:8px;width:100%;left:0}}@media (max-width: 575px){.custom-input{flex-direction:column;align-items:flex-start}.store-badge{margin-bottom:4px}}.gap-2{gap:.5rem!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
147
164
  }
148
165
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StoreSelectComponent, decorators: [{
149
166
  type: Component,
150
- args: [{ selector: 'lib-store-select', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"input-wrapper\" #inputWrapper>\r\n <div class=\"form-control custom-input d-flex align-items-center gap-2 flex-wrap\" \r\n (click)=\"onInputClick()\">\r\n <span *ngFor=\"let option of selectedOptions\" \r\n class=\"store-badge\"\r\n (click)=\"removeChip(option, $event)\">\r\n <span class=\"badge-text\">{{ option.label }}</span>\r\n <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>\r\n </span>\r\n <textarea \r\n class=\"input-text\"\r\n rows=\"1\"\r\n [value]=\"inputText\"\r\n (input)=\"onInputChange($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (focus)=\"onInputFocus()\"\r\n placeholder=\"Type and press Enter\"\r\n autocomplete=\"off\"></textarea>\r\n </div>\r\n <div class=\"dropdown-menu-custom\" \r\n *ngIf=\"isDropdownOpen && options.length > 0\"\r\n (click)=\"onDropdownClick($event)\">\r\n <div class=\"dropdown-item-custom select-all-item\"\r\n (click)=\"toggleSelectAll()\">\r\n <div class=\"custom-checkbox\">\r\n <div class=\"checkbox-box\" [class.checked]=\"isAllSelected\" [class.indeterminate]=\"isIndeterminate\">\r\n <svg *ngIf=\"isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg *ngIf=\"isIndeterminate && !isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M2 6H10\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n <span class=\"dropdown-item-text\">Select All</span>\r\n </div>\r\n <div class=\"w-100 search-input-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <input \r\n type=\"text\" \r\n [(ngModel)]=\"searchText\"\r\n (input)=\"onSearchChange()\"\r\n placeholder=\"Search\"\r\n autocomplete=\"off\">\r\n <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <hr class=\"dropdown-divider\">\r\n <div *ngFor=\"let option of filteredOptions\" \r\n class=\"dropdown-item-custom\"\r\n (click)=\"toggleSelection(option)\">\r\n <div class=\"custom-checkbox\">\r\n <div class=\"checkbox-box\" [class.checked]=\"isSelected(option.id)\">\r\n <svg *ngIf=\"isSelected(option.id)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n <span class=\"dropdown-item-text\">{{ option.label }}</span>\r\n </div>\r\n </div>\r\n</div>", styles: [".input-wrapper{position:relative;width:100%}:host{display:block;flex:1;min-width:0}.custom-input{background:#fff;border:1px solid #d0d5dd;border-radius:8px;padding:6px 10px;min-height:44px;max-height:160px;box-shadow:0 1px 2px #1018280d;display:flex;align-items:flex-start;overflow-y:auto;overflow-x:hidden}.custom-input:focus,.custom-input:focus-within{outline:none;box-shadow:0 1px 2px #1018280d}.store-badge{background-color:#f2f4f7;border-radius:16px;padding:2px 6px 2px 8px;display:inline-flex;align-items:center;gap:4px;flex-shrink:0;cursor:pointer;transition:background-color .2s ease}.store-badge:hover{background-color:#e4e7ec}.badge-text{font-size:12px;font-weight:500;line-height:18px;color:#344054}.input-text{font-size:14px;font-weight:400;line-height:20px;color:#1d2939;border:none;outline:none;background:transparent;flex:1;min-width:120px;padding:0}.input-text:focus{outline:none;box-shadow:none}.input-text::placeholder{color:#98a2b3}.dropdown-menu-custom{position:absolute;background:#fff;border:1px solid #f2f4f7;border-radius:8px;width:100%;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;margin-top:8px;top:100%;left:0;z-index:1000;max-height:300px;overflow-y:auto;overflow-x:hidden}.dropdown-menu-custom::-webkit-scrollbar,.custom-input::-webkit-scrollbar{width:6px}.dropdown-menu-custom::-webkit-scrollbar-track,.custom-input::-webkit-scrollbar-track{background:#f9fafb;border-radius:4px}.dropdown-menu-custom::-webkit-scrollbar-thumb,.custom-input::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.dropdown-menu-custom::-webkit-scrollbar-thumb:hover,.custom-input::-webkit-scrollbar-thumb:hover{background:#98a2b3}.dropdown-item-custom{display:flex;align-items:center;gap:12px;padding:10px 16px;cursor:pointer;transition:background-color .2s ease}.dropdown-item-custom:hover{background-color:#f9fafb}.select-all-item{font-weight:600;border-bottom:1px solid #f2f4f7;margin-bottom:4px}.dropdown-item-text{font-size:14px;font-weight:500;line-height:20px;color:#344054}.custom-checkbox{display:flex;align-items:center;justify-content:center}.checkbox-box{width:16px;height:16px;background:#fff;border:1px solid #d0d5dd;border-radius:4px;display:flex;align-items:center;justify-content:center}.checkbox-box.checked,.checkbox-box.indeterminate{background-color:#eaf8ff;border-color:#00a3ff}.dropdown-divider{background-color:#f2f4f7;height:1px;margin:0;opacity:1}.dropdown-menu-custom .search-input-wrapper{padding:8px 10px;background-color:#fff;border-top-right-radius:8px;border-top-left-radius:8px;border-top:1px solid rgba(16,24,40,.08);border-right:1px solid rgba(16,24,40,.08);border-left:1px solid rgba(16,24,40,.08);position:relative}.dropdown-menu-custom .search-input-wrapper input{width:100%;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d;padding:10px 14px 10px 30px;outline:none;font-family:Inter;font-size:14px;font-weight:500;line-height:20px;color:var(--Gray-700, #344054)}.dropdown-menu-custom .search-input-wrapper input::placeholder{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.dropdown-menu-custom .search-input-wrapper input:focus{border-color:var(--Gray-400, #98A2B3)}.dropdown-menu-custom .search-input-wrapper .search-icon{position:absolute;left:20px;top:20px;pointer-events:none}@media (max-width: 767px){.btn-apply{width:100%;margin-top:0}.dropdown-menu-custom{position:absolute;margin-top:8px;width:100%;left:0}}@media (max-width: 575px){.custom-input{flex-direction:column;align-items:flex-start}.store-badge{margin-bottom:4px}}.gap-2{gap:.5rem!important}\n"] }]
167
+ args: [{ selector: 'lib-store-select', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"input-wrapper\" #inputWrapper>\r\n <div class=\"form-control custom-input d-flex align-items-center gap-2 flex-wrap\" \r\n (click)=\"onInputClick()\">\r\n <span *ngFor=\"let option of selectedOptions\" \r\n class=\"store-badge\"\r\n (click)=\"removeChip(option, $event)\">\r\n <span class=\"badge-text\">{{ option.label }}</span>\r\n <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>\r\n </span>\r\n <textarea \r\n class=\"input-text\"\r\n rows=\"1\"\r\n [value]=\"inputText\"\r\n (input)=\"onInputChange($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (focus)=\"onInputFocus()\"\r\n placeholder=\"Type and press Enter\"\r\n autocomplete=\"off\"></textarea>\r\n </div>\r\n <div class=\"dropdown-menu-custom\" \r\n *ngIf=\"isDropdownOpen && options.length > 0\"\r\n (click)=\"onDropdownClick($event)\">\r\n <div class=\"dropdown-item-custom select-all-item\"\r\n *ngIf=\"!singleSelect\"\r\n (click)=\"toggleSelectAll()\">\r\n <div class=\"custom-checkbox\">\r\n <div class=\"checkbox-box\" [class.checked]=\"isAllSelected\" [class.indeterminate]=\"isIndeterminate\">\r\n <svg *ngIf=\"isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n <svg *ngIf=\"isIndeterminate && !isAllSelected\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M2 6H10\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n <span class=\"dropdown-item-text\">Select All</span>\r\n </div>\r\n <div class=\"w-100 search-input-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <input \r\n type=\"text\" \r\n [(ngModel)]=\"searchText\"\r\n (input)=\"onSearchChange()\"\r\n placeholder=\"Search\"\r\n autocomplete=\"off\">\r\n <svg class=\"search-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"17\" viewBox=\"0 0 16 17\" fill=\"none\">\r\n <path d=\"M14 14.5L11.1 11.6M12.6667 7.83333C12.6667 10.7789 10.2789 13.1667 7.33333 13.1667C4.38781 13.1667 2 10.7789 2 7.83333C2 4.88781 4.38781 2.5 7.33333 2.5C10.2789 2.5 12.6667 4.88781 12.6667 7.83333Z\" stroke=\"#667085\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <hr class=\"dropdown-divider\">\r\n <div *ngFor=\"let option of filteredOptions\" \r\n class=\"dropdown-item-custom\"\r\n (click)=\"toggleSelection(option)\">\r\n <div class=\"custom-checkbox\">\r\n <div class=\"checkbox-box\" [class.checked]=\"isSelected(option.id)\">\r\n <svg *ngIf=\"isSelected(option.id)\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"#00A3FF\" stroke-width=\"1.6666\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n <span class=\"dropdown-item-text\">{{ option.label }}</span>\r\n </div>\r\n </div>\r\n</div>", styles: [".input-wrapper{position:relative;width:100%}:host{display:block;flex:1;min-width:0}.custom-input{background:#fff;border:1px solid #d0d5dd;border-radius:8px;padding:6px 10px;min-height:44px;max-height:160px;box-shadow:0 1px 2px #1018280d;display:flex;align-items:flex-start;overflow-y:auto;overflow-x:hidden}.custom-input:focus,.custom-input:focus-within{outline:none;box-shadow:0 1px 2px #1018280d}.store-badge{background-color:#f2f4f7;border-radius:16px;padding:2px 6px 2px 8px;display:inline-flex;align-items:center;gap:4px;flex-shrink:0;cursor:pointer;transition:background-color .2s ease}.store-badge:hover{background-color:#e4e7ec}.badge-text{font-size:12px;font-weight:500;line-height:18px;color:#344054}.input-text{font-size:14px;font-weight:400;line-height:20px;color:#1d2939;border:none;outline:none;background:transparent;flex:1;min-width:120px;padding:0}.input-text:focus{outline:none;box-shadow:none}.input-text::placeholder{color:#98a2b3}.dropdown-menu-custom{position:absolute;background:#fff;border:1px solid #f2f4f7;border-radius:8px;width:100%;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808;margin-top:8px;top:100%;left:0;z-index:1000;max-height:300px;overflow-y:auto;overflow-x:hidden}.dropdown-menu-custom::-webkit-scrollbar,.custom-input::-webkit-scrollbar{width:6px}.dropdown-menu-custom::-webkit-scrollbar-track,.custom-input::-webkit-scrollbar-track{background:#f9fafb;border-radius:4px}.dropdown-menu-custom::-webkit-scrollbar-thumb,.custom-input::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.dropdown-menu-custom::-webkit-scrollbar-thumb:hover,.custom-input::-webkit-scrollbar-thumb:hover{background:#98a2b3}.dropdown-item-custom{display:flex;align-items:center;gap:12px;padding:10px 16px;cursor:pointer;transition:background-color .2s ease}.dropdown-item-custom:hover{background-color:#f9fafb}.select-all-item{font-weight:600;border-bottom:1px solid #f2f4f7;margin-bottom:4px}.dropdown-item-text{font-size:14px;font-weight:500;line-height:20px;color:#344054}.custom-checkbox{display:flex;align-items:center;justify-content:center}.checkbox-box{width:16px;height:16px;background:#fff;border:1px solid #d0d5dd;border-radius:4px;display:flex;align-items:center;justify-content:center}.checkbox-box.checked,.checkbox-box.indeterminate{background-color:#eaf8ff;border-color:#00a3ff}.dropdown-divider{background-color:#f2f4f7;height:1px;margin:0;opacity:1}.dropdown-menu-custom .search-input-wrapper{padding:8px 10px;background-color:#fff;border-top-right-radius:8px;border-top-left-radius:8px;border-top:1px solid rgba(16,24,40,.08);border-right:1px solid rgba(16,24,40,.08);border-left:1px solid rgba(16,24,40,.08);position:relative}.dropdown-menu-custom .search-input-wrapper input{width:100%;border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);box-shadow:0 1px 2px #1018280d;padding:10px 14px 10px 30px;outline:none;font-family:Inter;font-size:14px;font-weight:500;line-height:20px;color:var(--Gray-700, #344054)}.dropdown-menu-custom .search-input-wrapper input::placeholder{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-weight:500;line-height:20px}.dropdown-menu-custom .search-input-wrapper input:focus{border-color:var(--Gray-400, #98A2B3)}.dropdown-menu-custom .search-input-wrapper .search-icon{position:absolute;left:20px;top:20px;pointer-events:none}@media (max-width: 767px){.btn-apply{width:100%;margin-top:0}.dropdown-menu-custom{position:absolute;margin-top:8px;width:100%;left:0}}@media (max-width: 575px){.custom-input{flex-direction:column;align-items:flex-start}.store-badge{margin-bottom:4px}}.gap-2{gap:.5rem!important}\n"] }]
151
168
  }], propDecorators: { options: [{
152
169
  type: Input
153
170
  }], initialSelected: [{
154
171
  type: Input
172
+ }], singleSelect: [{
173
+ type: Input
155
174
  }], selectedChange: [{
156
175
  type: Output
157
176
  }], inputWrapper: [{
@@ -161,4 +180,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
161
180
  type: HostListener,
162
181
  args: ['document:click', ['$event']]
163
182
  }] } });
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2NvbGxlY3Rpb24tdXBkYXRlLWFpL2NvbXBvbmVudHMvc3RvcmUtc2VsZWN0L3N0b3JlLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL3N0b3JlLXNlbGVjdC9zdG9yZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsWUFBWSxFQUFjLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5SSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBYzdDLE1BQU0sT0FBTyxvQkFBb0I7SUFDdEIsT0FBTyxHQUFrQixFQUFFLENBQUM7SUFDNUIsZUFBZSxHQUFrQixFQUFFLENBQUM7SUFDbkMsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO0lBQ2YsWUFBWSxDQUFjO0lBRXhFLGFBQWEsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN2QyxTQUFTLEdBQVcsRUFBRSxDQUFDO0lBQ3ZCLGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUV4QixRQUFRO1FBQ04sbURBQW1EO1FBQ25ELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxXQUFXLENBQUMsT0FB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QUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQUN1QyxZQUFZO3NCQUF6RCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBd0M1QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdG9yZU9wdGlvbiB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1zdG9yZS1zZWxlY3QnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdG9yZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9zdG9yZS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdG9yZVNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBvcHRpb25zOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgQElucHV0KCkgaW5pdGlhbFNlbGVjdGVkOiBTdG9yZU9wdGlvbltdID0gW107XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTdG9yZU9wdGlvbltdPigpO1xyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0V3JhcHBlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBpbnB1dFdyYXBwZXIhOiBFbGVtZW50UmVmO1xyXG5cclxuICBzZWxlY3RlZEl0ZW1zOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcclxuICBpbnB1dFRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIGlzRHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VhcmNoVGV4dDogc3RyaW5nID0gJyc7XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGFueSBwcmUtc2VsZWN0ZWQgaXRlbXMgaWYgbmVlZGVkXHJcbiAgICB0aGlzLnNldEluaXRpYWxTZWxlY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlc1snaW5pdGlhbFNlbGVjdGVkJ10gfHwgY2hhbmdlc1snb3B0aW9ucyddKSB7XHJcbiAgICAgIHRoaXMuc2V0SW5pdGlhbFNlbGVjdGlvbnMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEluaXRpYWxTZWxlY3Rpb25zKCkge1xyXG4gICAgLy8gQ2xlYXIgc2VsZWN0aW9ucyBmaXJzdFxyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmNsZWFyKCk7XHJcbiAgICBcclxuICAgIC8vIE9ubHkgc2V0IGluaXRpYWwgc2VsZWN0aW9ucyBpZiBib3RoIG9wdGlvbnMgYW5kIGluaXRpYWxTZWxlY3RlZCBhcmUgYXZhaWxhYmxlIGFuZCBub3QgZW1wdHlcclxuICAgIGlmICh0aGlzLmluaXRpYWxTZWxlY3RlZCAmJiB0aGlzLmluaXRpYWxTZWxlY3RlZC5sZW5ndGggPiAwICYmIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmluaXRpYWxTZWxlY3RlZC5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgLy8gTWF0Y2ggYnkgaWQgZmlyc3QsIHRoZW4gYnkgbGFiZWxcclxuICAgICAgICBjb25zdCBtYXRjaGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXHJcbiAgICAgICAgICBvcHQgPT4gb3B0LmlkID09PSBvcHRpb24uaWQgfHwgb3B0LmxhYmVsID09PSBvcHRpb24ubGFiZWxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChtYXRjaGVkT3B0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuYWRkKG1hdGNoZWRPcHRpb24uaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFsd2F5cyBlbWl0IHRoZSBzZWxlY3RlZCBvcHRpb25zIChldmVuIGlmIGVtcHR5KSB0byBub3RpZnkgcGFyZW50IG9mIGNoYW5nZXNcclxuICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5pbnB1dFdyYXBwZXIgJiYgIXRoaXMuaW5wdXRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRPcHRpb25zKCk6IFN0b3JlT3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IHRoaXMuc2VsZWN0ZWRJdGVtcy5oYXMob3B0aW9uLmlkKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwICYmIFxyXG4gICAgICAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zLmV2ZXJ5KG9wdGlvbiA9PiB0aGlzLnNlbGVjdGVkSXRlbXMuaGFzKG9wdGlvbi5pZCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzSW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGZpbHRlcmVkU2VsZWN0ZWRDb3VudCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5oYXMob3B0aW9uLmlkKVxyXG4gICAgKS5sZW5ndGg7XHJcbiAgICByZXR1cm4gZmlsdGVyZWRTZWxlY3RlZENvdW50ID4gMCAmJiBmaWx0ZXJlZFNlbGVjdGVkQ291bnQgPCB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRPcHRpb25zKCk6IFN0b3JlT3B0aW9uW10ge1xyXG4gICAgaWYgKCF0aGlzLnNlYXJjaFRleHQgfHwgdGhpcy5zZWFyY2hUZXh0LnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucztcclxuICAgIH1cclxuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKS50cmltKCk7XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcihvcHRpb24gPT4gXHJcbiAgICAgIG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaXNTZWxlY3RlZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zLmhhcyhpZCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWxlY3RBbGwoKSB7XHJcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKSB7XHJcbiAgICAgIC8vIERlc2VsZWN0IGFsbCBmaWx0ZXJlZCBvcHRpb25zXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZGVsZXRlKG9wdGlvbi5pZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gU2VsZWN0IGFsbCBmaWx0ZXJlZCBvcHRpb25zXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuYWRkKG9wdGlvbi5pZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoQ2hhbmdlKCkge1xyXG4gICAgLy8gU2VhcmNoIGlzIGhhbmRsZWQgYnkgdGhlIGZpbHRlcmVkT3B0aW9ucyBnZXR0ZXJcclxuICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhZGRpdGlvbmFsIGxvZ2ljIGlmIG5lZWRlZFxyXG4gIH1cclxuXHJcbiAgb25JbnB1dENoYW5nZShldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG4gICAgdGhpcy5pbnB1dFRleHQgPSB0YXJnZXQudmFsdWU7XHJcbiAgfVxyXG5cclxuICBvbktleURvd24oZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCBrZXlib2FyZEV2ZW50ID0gZXZlbnQgYXMgS2V5Ym9hcmRFdmVudDtcclxuICAgIGlmIChrZXlib2FyZEV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICBrZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGtleWJvYXJkRXZlbnQudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0LnZhbHVlLnRyaW0oKTtcclxuXHJcbiAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgLy8gU3BsaXQgYnkgY29tbWEgYW5kIG5ld2xpbmUsIHRoZW4gcHJvY2VzcyBlYWNoIHZhbHVlXHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWUuc3BsaXQoL1ssXFxuXFxyXSsvKS5tYXAodiA9PiB2LnRyaW0oKSkuZmlsdGVyKHYgPT4gdi5sZW5ndGggPiAwKTtcclxuICAgICAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAvLyBGaW5kIG1hdGNoaW5nIG9wdGlvbiBieSBsYWJlbCAoY2FzZS1pbnNlbnNpdGl2ZSlcclxuICAgICAgICAgIGNvbnN0IG1hdGNoZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChcclxuICAgICAgICAgICAgb3B0ID0+IG9wdC5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSB2YWwudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYgKG1hdGNoZWRPcHRpb24gJiYgIXRoaXMuc2VsZWN0ZWRJdGVtcy5oYXMobWF0Y2hlZE9wdGlvbi5pZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmFkZChtYXRjaGVkT3B0aW9uLmlkKTtcclxuICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIE9ubHkgZW1pdCBpZiB0aGVyZSB3ZXJlIGNoYW5nZXNcclxuICAgICAgICBpZiAoaGFzQ2hhbmdlcykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRPcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENsZWFyIGlucHV0IGFmdGVyIHByb2Nlc3NpbmdcclxuICAgICAgICB0aGlzLmlucHV0VGV4dCA9ICcnO1xyXG4gICAgICAgIHRhcmdldC52YWx1ZSA9ICcnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbklucHV0Q2xpY2soKSB7XHJcbiAgICAvLyBPcGVuIGRyb3Bkb3duIG9uIGlucHV0IGNsaWNrXHJcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uSW5wdXRGb2N1cygpIHtcclxuICAgIC8vIE9wZW4gZHJvcGRvd24gb24gZm9jdXNcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0aW9uKG9wdGlvbjogU3RvcmVPcHRpb24pIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbXMuaGFzKG9wdGlvbi5pZCkpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmRlbGV0ZShvcHRpb24uaWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmFkZChvcHRpb24uaWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRPcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUNoaXAob3B0aW9uOiBTdG9yZU9wdGlvbiwgZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZGVsZXRlKG9wdGlvbi5pZCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgb25Ecm9wZG93bkNsaWNrKGV2ZW50OiBFdmVudCkge1xyXG4gICAgLy8gUHJldmVudCBjbGljayBmcm9tIGJ1YmJsaW5nIHRvIGRvY3VtZW50XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIiAjaW5wdXRXcmFwcGVyPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tY29udHJvbCBjdXN0b20taW5wdXQgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBmbGV4LXdyYXBcIiBcclxuICAgICAgICAgKGNsaWNrKT1cIm9uSW5wdXRDbGljaygpXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzZWxlY3RlZE9wdGlvbnNcIiBcclxuICAgICAgICAgICAgICBjbGFzcz1cInN0b3JlLWJhZGdlXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ2hpcChvcHRpb24sICRldmVudClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZS10ZXh0XCI+e3sgb3B0aW9uLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDNMMyA5TTMgM0w5IDlcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHRleHRhcmVhIFxyXG4gICAgICAgICAgICBjbGFzcz1cImlucHV0LXRleHRcIlxyXG4gICAgICAgICAgICByb3dzPVwiMVwiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpbnB1dFRleHRcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25JbnB1dEZvY3VzKClcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgYW5kIHByZXNzIEVudGVyXCJcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCI+PC90ZXh0YXJlYT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUtY3VzdG9tXCIgXHJcbiAgICAgICAgICpuZ0lmPVwiaXNEcm9wZG93bk9wZW4gJiYgb3B0aW9ucy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgKGNsaWNrKT1cIm9uRHJvcGRvd25DbGljaygkZXZlbnQpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0tY3VzdG9tIHNlbGVjdC1hbGwtaXRlbVwiXHJcbiAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VsZWN0QWxsKClcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LWJveFwiIFtjbGFzcy5jaGVja2VkXT1cImlzQWxsU2VsZWN0ZWRcIiBbY2xhc3MuaW5kZXRlcm1pbmF0ZV09XCJpc0luZGV0ZXJtaW5hdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNBbGxTZWxlY3RlZFwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDNMNC41IDguNUwyIDZcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc0luZGV0ZXJtaW5hdGUgJiYgIWlzQWxsU2VsZWN0ZWRcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yIDZIMTBcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkcm9wZG93bi1pdGVtLXRleHRcIj5TZWxlY3QgQWxsPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBzZWFyY2gtaW5wdXQtd3JhcHBlclwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hDaGFuZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiXHJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInNlYXJjaC1pY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMTYgMTdcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAxNC41TDExLjEgMTEuNk0xMi42NjY3IDcuODMzMzNDMTIuNjY2NyAxMC43Nzg5IDEwLjI3ODkgMTMuMTY2NyA3LjMzMzMzIDEzLjE2NjdDNC4zODc4MSAxMy4xNjY3IDIgMTAuNzc4OSAyIDcuODMzMzNDMiA0Ljg4NzgxIDQuMzg3ODEgMi41IDcuMzMzMzMgMi41QzEwLjI3ODkgMi41IDEyLjY2NjcgNC44ODc4MSAxMi42NjY3IDcuODMzMzNaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGhyIGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnNcIiBcclxuICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbS1jdXN0b21cIlxyXG4gICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihvcHRpb24pXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveC1ib3hcIiBbY2xhc3MuY2hlY2tlZF09XCJpc1NlbGVjdGVkKG9wdGlvbi5pZClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNTZWxlY3RlZChvcHRpb24uaWQpXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24taXRlbS10ZXh0XCI+e3sgb3B0aW9uLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLXN0b3JlLWJ1aWxkZXIvc3JjL2xpYi9jb21wb25lbnRzL2NvbGxlY3Rpb24tdXBkYXRlLWFpL2NvbXBvbmVudHMvc3RvcmUtc2VsZWN0L3N0b3JlLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9jb2xsZWN0aW9uLXVwZGF0ZS1haS9jb21wb25lbnRzL3N0b3JlLXNlbGVjdC9zdG9yZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBb0MsWUFBWSxFQUFjLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5SSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBYzdDLE1BQU0sT0FBTyxvQkFBb0I7SUFDdEIsT0FBTyxHQUFrQixFQUFFLENBQUM7SUFDNUIsZUFBZSxHQUFrQixFQUFFLENBQUM7SUFDcEMsWUFBWSxHQUFZLEtBQUssQ0FBQztJQUM3QixjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7SUFDZixZQUFZLENBQWM7SUFFeEUsYUFBYSxHQUFnQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3ZDLFNBQVMsR0FBVyxFQUFFLENBQUM7SUFDdkIsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxVQUFVLEdBQVcsRUFBRSxDQUFDO0lBRXhCLFFBQVE7UUFDTixtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFD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QUMsQ0FBQztTQUN0QzthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxVQUFVLENBQUMsTUFBbUIsRUFBRSxLQUFZO1FBQzFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVk7UUFDMUIsMENBQTBDO1FBQzFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxQixDQUFDO3dHQTNMVSxvQkFBb0I7NEZBQXBCLG9CQUFvQixzYUNoQmpDLDR4SEFnRU0sa29IRHBETSxZQUFZLCtQQUFFLFdBQVc7OzRGQUl4QixvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBQ2hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUM7OEJBSzNCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDdUMsWUFBWTtzQkFBekQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQXdDNUMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVPcHRpb24ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItc3RvcmUtc2VsZWN0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3RvcmUtc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vc3RvcmUtc2VsZWN0LmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RvcmVTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgb3B0aW9uczogU3RvcmVPcHRpb25bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGluaXRpYWxTZWxlY3RlZDogU3RvcmVPcHRpb25bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHNpbmdsZVNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U3RvcmVPcHRpb25bXT4oKTtcclxuICBAVmlld0NoaWxkKCdpbnB1dFdyYXBwZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgaW5wdXRXcmFwcGVyITogRWxlbWVudFJlZjtcclxuXHJcbiAgc2VsZWN0ZWRJdGVtczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XHJcbiAgaW5wdXRUZXh0OiBzdHJpbmcgPSAnJztcclxuICBpc0Ryb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlYXJjaFRleHQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIEluaXRpYWxpemUgd2l0aCBhbnkgcHJlLXNlbGVjdGVkIGl0ZW1zIGlmIG5lZWRlZFxyXG4gICAgdGhpcy5zZXRJbml0aWFsU2VsZWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2luaXRpYWxTZWxlY3RlZCddIHx8IGNoYW5nZXNbJ29wdGlvbnMnXSkge1xyXG4gICAgICB0aGlzLnNldEluaXRpYWxTZWxlY3Rpb25zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRJbml0aWFsU2VsZWN0aW9ucygpIHtcclxuICAgIC8vIENsZWFyIHNlbGVjdGlvbnMgZmlyc3RcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5jbGVhcigpO1xyXG4gICAgXHJcbiAgICAvLyBPbmx5IHNldCBpbml0aWFsIHNlbGVjdGlvbnMgaWYgYm90aCBvcHRpb25zIGFuZCBpbml0aWFsU2VsZWN0ZWQgYXJlIGF2YWlsYWJsZSBhbmQgbm90IGVtcHR5XHJcbiAgICBpZiAodGhpcy5pbml0aWFsU2VsZWN0ZWQgJiYgdGhpcy5pbml0aWFsU2VsZWN0ZWQubGVuZ3RoID4gMCAmJiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5pbml0aWFsU2VsZWN0ZWQuZm9yRWFjaChvcHRpb24gPT4ge1xyXG4gICAgICAgIC8vIE1hdGNoIGJ5IGlkIGZpcnN0LCB0aGVuIGJ5IGxhYmVsXHJcbiAgICAgICAgY29uc3QgbWF0Y2hlZE9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKFxyXG4gICAgICAgICAgb3B0ID0+IG9wdC5pZCA9PT0gb3B0aW9uLmlkIHx8IG9wdC5sYWJlbCA9PT0gb3B0aW9uLmxhYmVsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAobWF0Y2hlZE9wdGlvbikge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmFkZChtYXRjaGVkT3B0aW9uLmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBBbHdheXMgZW1pdCB0aGUgc2VsZWN0ZWQgb3B0aW9ucyAoZXZlbiBpZiBlbXB0eSkgdG8gbm90aWZ5IHBhcmVudCBvZiBjaGFuZ2VzXHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuaW5wdXRXcmFwcGVyICYmICF0aGlzLmlucHV0V3JhcHBlci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGVkT3B0aW9ucygpOiBTdG9yZU9wdGlvbltdIHtcclxuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiB0aGlzLnNlbGVjdGVkSXRlbXMuaGFzKG9wdGlvbi5pZCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoID4gMCAmJiBcclxuICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucy5ldmVyeShvcHRpb24gPT4gdGhpcy5zZWxlY3RlZEl0ZW1zLmhhcyhvcHRpb24uaWQpKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBmaWx0ZXJlZFNlbGVjdGVkQ291bnQgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IFxyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuaGFzKG9wdGlvbi5pZClcclxuICAgICkubGVuZ3RoO1xyXG4gICAgcmV0dXJuIGZpbHRlcmVkU2VsZWN0ZWRDb3VudCA+IDAgJiYgZmlsdGVyZWRTZWxlY3RlZENvdW50IDwgdGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkT3B0aW9ucygpOiBTdG9yZU9wdGlvbltdIHtcclxuICAgIGlmICghdGhpcy5zZWFyY2hUZXh0IHx8IHRoaXMuc2VhcmNoVGV4dC50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xyXG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IFxyXG4gICAgICBvcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGlzU2VsZWN0ZWQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcy5oYXMoaWQpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0QWxsKCkge1xyXG4gICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCkge1xyXG4gICAgICAvLyBEZXNlbGVjdCBhbGwgZmlsdGVyZWQgb3B0aW9uc1xyXG4gICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmRlbGV0ZShvcHRpb24uaWQpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFNlbGVjdCBhbGwgZmlsdGVyZWQgb3B0aW9uc1xyXG4gICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmFkZChvcHRpb24uaWQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaENoYW5nZSgpIHtcclxuICAgIC8vIFNlYXJjaCBpcyBoYW5kbGVkIGJ5IHRoZSBmaWx0ZXJlZE9wdGlvbnMgZ2V0dGVyXHJcbiAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgYWRkaXRpb25hbCBsb2dpYyBpZiBuZWVkZWRcclxuICB9XHJcblxyXG4gIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIHRoaXMuaW5wdXRUZXh0ID0gdGFyZ2V0LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgb25LZXlEb3duKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3Qga2V5Ym9hcmRFdmVudCA9IGV2ZW50IGFzIEtleWJvYXJkRXZlbnQ7XHJcbiAgICBpZiAoa2V5Ym9hcmRFdmVudC5rZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAga2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBrZXlib2FyZEV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHRhcmdldC52YWx1ZS50cmltKCk7XHJcblxyXG4gICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIC8vIFNwbGl0IGJ5IGNvbW1hIGFuZCBuZXdsaW5lLCB0aGVuIHByb2Nlc3MgZWFjaCB2YWx1ZVxyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlLnNwbGl0KC9bLFxcblxccl0rLykubWFwKHYgPT4gdi50cmltKCkpLmZpbHRlcih2ID0+IHYubGVuZ3RoID4gMCk7XHJcbiAgICAgICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgdmFsdWVzVG9Qcm9jZXNzID0gdGhpcy5zaW5nbGVTZWxlY3QgPyB2YWx1ZXMuc2xpY2UoMCwgMSkgOiB2YWx1ZXM7XHJcblxyXG4gICAgICAgIHZhbHVlc1RvUHJvY2Vzcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAvLyBGaW5kIG1hdGNoaW5nIG9wdGlvbiBieSBsYWJlbCAoY2FzZS1pbnNlbnNpdGl2ZSlcclxuICAgICAgICAgIGNvbnN0IG1hdGNoZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChcclxuICAgICAgICAgICAgb3B0ID0+IG9wdC5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSB2YWwudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBpZiAobWF0Y2hlZE9wdGlvbiAmJiAhdGhpcy5zZWxlY3RlZEl0ZW1zLmhhcyhtYXRjaGVkT3B0aW9uLmlkKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaW5nbGVTZWxlY3QpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuY2xlYXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuYWRkKG1hdGNoZWRPcHRpb24uaWQpO1xyXG4gICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gT25seSBlbWl0IGlmIHRoZXJlIHdlcmUgY2hhbmdlc1xyXG4gICAgICAgIGlmIChoYXNDaGFuZ2VzKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZE9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2xlYXIgaW5wdXQgYWZ0ZXIgcHJvY2Vzc2luZ1xyXG4gICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gJyc7XHJcbiAgICAgICAgdGFyZ2V0LnZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uSW5wdXRDbGljaygpIHtcclxuICAgIC8vIE9wZW4gZHJvcGRvd24gb24gaW5wdXQgY2xpY2tcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dEZvY3VzKCkge1xyXG4gICAgLy8gT3BlbiBkcm9wZG93biBvbiBmb2N1c1xyXG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWxlY3Rpb24ob3B0aW9uOiBTdG9yZU9wdGlvbikge1xyXG4gICAgaWYgKHRoaXMuc2luZ2xlU2VsZWN0KSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbXMuaGFzKG9wdGlvbi5pZCkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZGVsZXRlKG9wdGlvbi5pZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmFkZChvcHRpb24uaWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRPcHRpb25zKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcy5oYXMob3B0aW9uLmlkKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZGVsZXRlKG9wdGlvbi5pZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuYWRkKG9wdGlvbi5pZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZE9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ2hpcChvcHRpb246IFN0b3JlT3B0aW9uLCBldmVudDogRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5kZWxldGUob3B0aW9uLmlkKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBvbkRyb3Bkb3duQ2xpY2soZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAvLyBQcmV2ZW50IGNsaWNrIGZyb20gYnViYmxpbmcgdG8gZG9jdW1lbnRcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiICNpbnB1dFdyYXBwZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sIGN1c3RvbS1pbnB1dCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGZsZXgtd3JhcFwiIFxyXG4gICAgICAgICAoY2xpY2spPVwib25JbnB1dENsaWNrKClcIj5cclxuICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGVkT3B0aW9uc1wiIFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic3RvcmUtYmFkZ2VcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDaGlwKG9wdGlvbiwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlLXRleHRcIj57eyBvcHRpb24ubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkgM0wzIDlNMyAzTDkgOVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8dGV4dGFyZWEgXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtdGV4dFwiXHJcbiAgICAgICAgICAgIHJvd3M9XCIxXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cImlucHV0VGV4dFwiXHJcbiAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBhbmQgcHJlc3MgRW50ZXJcIlxyXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIj48L3RleHRhcmVhPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudS1jdXN0b21cIiBcclxuICAgICAgICAgKm5nSWY9XCJpc0Ryb3Bkb3duT3BlbiAmJiBvcHRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAoY2xpY2spPVwib25Ecm9wZG93bkNsaWNrKCRldmVudClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taXRlbS1jdXN0b20gc2VsZWN0LWFsbC1pdGVtXCJcclxuICAgICAgICAgICAgICpuZ0lmPVwiIXNpbmdsZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2VsZWN0QWxsKClcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LWJveFwiIFtjbGFzcy5jaGVja2VkXT1cImlzQWxsU2VsZWN0ZWRcIiBbY2xhc3MuaW5kZXRlcm1pbmF0ZV09XCJpc0luZGV0ZXJtaW5hdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNBbGxTZWxlY3RlZFwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDNMNC41IDguNUwyIDZcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc0luZGV0ZXJtaW5hdGUgJiYgIWlzQWxsU2VsZWN0ZWRcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yIDZIMTBcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkcm9wZG93bi1pdGVtLXRleHRcIj5TZWxlY3QgQWxsPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBzZWFyY2gtaW5wdXQtd3JhcHBlclwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgPGlucHV0IFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hDaGFuZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiXHJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInNlYXJjaC1pY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMTYgMTdcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAxNC41TDExLjEgMTEuNk0xMi42NjY3IDcuODMzMzNDMTIuNjY2NyAxMC43Nzg5IDEwLjI3ODkgMTMuMTY2NyA3LjMzMzMzIDEzLjE2NjdDNC4zODc4MSAxMy4xNjY3IDIgMTAuNzc4OSAyIDcuODMzMzNDMiA0Ljg4NzgxIDQuMzg3ODEgMi41IDcuMzMzMzMgMi41QzEwLjI3ODkgMi41IDEyLjY2NjcgNC44ODc4MSAxMi42NjY3IDcuODMzMzNaXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGhyIGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnNcIiBcclxuICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbS1jdXN0b21cIlxyXG4gICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdGlvbihvcHRpb24pXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveC1ib3hcIiBbY2xhc3MuY2hlY2tlZF09XCJpc1NlbGVjdGVkKG9wdGlvbi5pZClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNTZWxlY3RlZChvcHRpb24uaWQpXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24taXRlbS10ZXh0XCI+e3sgb3B0aW9uLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==