tango-app-ui-store-builder 1.0.30 → 1.0.32

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.
@@ -1,5 +1,5 @@
1
1
  import { Component, Input } from "@angular/core";
2
- import { FormsModule, ReactiveFormsModule } from "@angular/forms";
2
+ import { FormsModule, ReactiveFormsModule, } from "@angular/forms";
3
3
  import { ReactiveSelectComponent } from "../../../reactive-select/reactive-select.component";
4
4
  import { firstValueFrom } from "rxjs";
5
5
  import { FileUploadComponent } from "../../../file-upload/file-upload.component";
@@ -9,10 +9,13 @@ import * as i1 from "@ng-bootstrap/ng-bootstrap";
9
9
  import * as i2 from "../../../../services/store-builder.service";
10
10
  import * as i3 from "tango-app-ui-shared";
11
11
  import * as i4 from "@angular/forms";
12
+ import * as i5 from "@angular/router";
12
13
  export class CreatePlanogramComponent {
13
14
  activeModal;
14
15
  storeBuilderService;
15
16
  toastService;
17
+ fb;
18
+ router;
16
19
  clientId;
17
20
  selectedStore;
18
21
  selectedFloor;
@@ -25,17 +28,31 @@ export class CreatePlanogramComponent {
25
28
  ];
26
29
  selectedStoreFloors = [];
27
30
  isLayoutExist = false;
28
- isProcessing = false;
31
+ isCADProcessing = false;
29
32
  isCreateStoreMode = false;
30
- constructor(activeModal, storeBuilderService, toastService) {
33
+ createStoreForm;
34
+ storeTypeList = [
35
+ { label: "High Street", value: "HighStreet" },
36
+ { label: "Mall", value: "mall" },
37
+ { label: "Kiosk", value: "kiosk" },
38
+ ];
39
+ businessTypeList = [
40
+ { label: "COCO", value: "coco" },
41
+ { label: "COFO", value: "cofo" },
42
+ { label: "FOFO", value: "fofo" },
43
+ { label: "FOCO", value: "foco" },
44
+ ];
45
+ constructor(activeModal, storeBuilderService, toastService, fb, router) {
31
46
  this.activeModal = activeModal;
32
47
  this.storeBuilderService = storeBuilderService;
33
48
  this.toastService = toastService;
49
+ this.fb = fb;
50
+ this.router = router;
34
51
  }
35
52
  async ngOnInit() {
36
53
  await this.getStoreList();
37
54
  }
38
- get isValidToCreate() {
55
+ get isValidToCreatePlano() {
39
56
  return this.selectedStore && this.selectedFloor && this.selectedFile;
40
57
  }
41
58
  async getStoreList() {
@@ -70,11 +87,11 @@ export class CreatePlanogramComponent {
70
87
  onFileChange(file) {
71
88
  this.selectedFile = file;
72
89
  }
73
- async onCreate() {
74
- if (!this.isValidToCreate)
90
+ async onCreateLayoutPlano() {
91
+ if (!this.isValidToCreatePlano)
75
92
  return;
76
93
  try {
77
- this.isProcessing = true;
94
+ this.isCADProcessing = true;
78
95
  const planoRes = await firstValueFrom(this.storeBuilderService.createPlanoFromCAD(this.selectedFile, this.selectedStore, this.selectedFloor));
79
96
  if (!planoRes?.data)
80
97
  return;
@@ -85,17 +102,37 @@ export class CreatePlanogramComponent {
85
102
  console.log("@@ ~ onCreate [ERR]:", error);
86
103
  }
87
104
  finally {
88
- this.isProcessing = false;
105
+ this.isCADProcessing = false;
89
106
  }
90
107
  }
91
- onClickCreateStore() {
92
- this.isCreateStoreMode = true;
108
+ async onCreateStore() {
109
+ // console.log("@@ ~ this.createStoreForm:", this.createStoreForm.value);
110
+ }
111
+ addNewStore() {
112
+ // this.isCreateStoreMode = true;
113
+ // this.createStoreForm = this.fb.group({
114
+ // storeName: ["", Validators.required],
115
+ // businessType: ["", Validators.required],
116
+ // storeType: ["", Validators.required],
117
+ // address: ["", Validators.required],
118
+ // country: ["", Validators.required],
119
+ // state: ["", Validators.required],
120
+ // city: ["", Validators.required],
121
+ // zipCode: ["", Validators.required],
122
+ // });
123
+ const urlTree = this.router.createUrlTree(["/manage/stores/add-single-store"]);
124
+ const url = this.router.serializeUrl(urlTree);
125
+ window.open(url, "_blank");
93
126
  }
94
127
  onCancel() {
95
128
  this.activeModal.dismiss();
96
129
  }
97
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.StoreBuilderService }, { token: i3.ToastService }], target: i0.ɵɵFactoryTarget.Component });
98
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CreatePlanogramComponent, isStandalone: true, selector: "app-create-planogram", inputs: { clientId: "clientId" }, ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"onClickCreateStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isProcessing\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n\r\n </div>\r\n\r\n <div class=\"modal-actions\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreate || isProcessing\" (click)=\"onCreate()\">\r\n <span *ngIf=\"!isProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
130
+ onBack() {
131
+ this.createStoreForm = null;
132
+ this.isCreateStoreMode = false;
133
+ }
134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.StoreBuilderService }, { token: i3.ToastService }, { token: i4.FormBuilder }, { token: i5.Router }], target: i0.ɵɵFactoryTarget.Component });
135
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreatePlanogramComponent, isStandalone: true, selector: "app-create-planogram", inputs: { clientId: "clientId" }, ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name\" />\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\"></div>\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"zipCode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"zipCode\" formControlName=\"zipCode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('zipCode')?.touched && createStoreForm.get('zipCode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('zipCode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isCADProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isCADProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isCADProcessing\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n Create\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isCADProcessing\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isCADProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isCADProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
99
136
  }
100
137
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, decorators: [{
101
138
  type: Component,
@@ -105,8 +142,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
105
142
  ReactiveSelectComponent,
106
143
  FileUploadComponent,
107
144
  NgIf,
108
- ], template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"onClickCreateStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isProcessing\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n\r\n </div>\r\n\r\n <div class=\"modal-actions\">\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreate || isProcessing\" (click)=\"onCreate()\">\r\n <span *ngIf=\"!isProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
109
- }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.StoreBuilderService }, { type: i3.ToastService }], propDecorators: { clientId: [{
145
+ ], template: "<div class=\"modal-wrapper\">\r\n <h3 class=\"mb-4\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name\" />\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\"></div>\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"zipCode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"zipCode\" formControlName=\"zipCode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('zipCode')?.touched && createStoreForm.get('zipCode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('zipCode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isCADProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isCADProcessing\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <file-upload [disabled]=\"isCADProcessing\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n Create\r\n </button>\r\n }@else {\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isCADProcessing\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isCADProcessing\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isCADProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>", styles: [".modal-wrapper{padding:24px}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
146
+ }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.StoreBuilderService }, { type: i3.ToastService }, { type: i4.FormBuilder }, { type: i5.Router }], propDecorators: { clientId: [{
110
147
  type: Input
111
148
  }] } });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFN0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7OztBQWdCdkMsTUFBTSxPQUFPLHdCQUF3QjtJQTJCekI7SUFDQTtJQUNBO0lBNUJELFFBQVEsQ0FBUztJQUMxQixhQUFhLENBQVM7SUFDdEIsYUFBYSxDQUFTO0lBQ3RCLFlBQVksR0FBZ0IsSUFBSSxDQUFDO0lBRWpDLFNBQVMsR0FHSCxFQUFFLENBQUM7SUFFVCxTQUFTLEdBR0g7UUFDSixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUM5QixFQUFFLEtBQUssRUFBRSxT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RSxPQUFPO1lBRTVCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN4QztRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUM3QixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksd0NBQXdDLENBQ3hFLENBQUM7WUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzVDO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7d0dBaEhVLHdCQUF3Qjs0RkFBeEIsd0JBQXdCLGtIQ3ZCckMseXhGQTRDTSxzbkNENUJGLFdBQVcsOFZBQ1gsbUJBQW1CLCtCQUNuQix1QkFBdUIseU5BQ3ZCLG1CQUFtQix1R0FDbkIsSUFBSTs7NEZBR0ssd0JBQXdCO2tCQWJwQyxTQUFTOytCQUNFLHNCQUFzQixjQUdwQixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQixJQUFJO3FCQUNMO2dKQUdRLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi8uLi9yZWFjdGl2ZS1zZWxlY3QvcmVhY3RpdmUtc2VsZWN0LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vZmlsZS11cGxvYWQvZmlsZS11cGxvYWQuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IE5nSWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktc2hhcmVkXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtY3JlYXRlLXBsYW5vZ3JhbVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBGaWxlVXBsb2FkQ29tcG9uZW50LFxyXG4gICAgTmdJZixcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlUGxhbm9ncmFtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkU3RvcmU6IHN0cmluZztcclxuICBzZWxlY3RlZEZsb29yOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0b3JlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW107XHJcblxyXG4gIGZsb29yTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBudW1iZXI7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJGbG9vciAxXCIsIHZhbHVlOiAxIH0sXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDJcIiwgdmFsdWU6IDIgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgM1wiLCB2YWx1ZTogMyB9LFxyXG4gIF07XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVGbG9vcnM6IGFueSA9IFtdO1xyXG5cclxuICBpc0xheW91dEV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNQcm9jZXNzaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDcmVhdGVTdG9yZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcclxuICAgIHByaXZhdGUgc3RvcmVCdWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5nZXRTdG9yZUxpc3QoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1ZhbGlkVG9DcmVhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFN0b3JlICYmIHRoaXMuc2VsZWN0ZWRGbG9vciAmJiB0aGlzLnNlbGVjdGVkRmlsZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFN0b3JlTGlzdCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldEFsbFN0b3Jlcyh0aGlzLmNsaWVudElkKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnN0b3JlTGlzdCA9IHN0b3Jlcz8uZGF0YT8ubWFwKChzOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4geyBsYWJlbDogcy5zdG9yZU5hbWUsIHZhbHVlOiBzLnN0b3JlSWQgfTtcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3RvcmVMaXN0IFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblN0b3JlQ2hhbmdlKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmxvb3JzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0U3RvcmVGbG9vcnNMaXN0KHRoaXMuc2VsZWN0ZWRTdG9yZSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlRmxvb3JzID0gZmxvb3JzPy5kYXRhID8/IFtdO1xyXG4gICAgICB0aGlzLm9uRmxvb3JDaGFuZ2UoKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBnZXRTdG9yZUxpc3QgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRmxvb3JDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZsb29yKSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycy5zb21lKFxyXG4gICAgICAgIChmOiBhbnkpID0+IGYuZmxvb3JOdW1iZXIgPT09IHRoaXMuc2VsZWN0ZWRGbG9vclxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0xheW91dEV4aXN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZpbGVDaGFuZ2UoZmlsZTogRmlsZSB8IG51bGwpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gZmlsZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ3JlYXRlKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRUb0NyZWF0ZSkgcmV0dXJuO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgIGNvbnN0IHBsYW5vUmVzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuY3JlYXRlUGxhbm9Gcm9tQ0FEKFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUhLFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlLFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29yXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFwbGFub1Jlcz8uZGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZShwbGFub1Jlcz8uZGF0YSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgZXJyb3I/LmVycm9yPy5lcnJvcj8uZXJyTXNnID8/IFwiRmFpbGVkIHRvIGV4dHJhY3QgcGxhbm8gZnJvbSBDQUQgZmlsZS5cIlxyXG4gICAgICApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25DcmVhdGUgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNsaWNrQ3JlYXRlU3RvcmUoKSB7XHJcbiAgICB0aGlzLmlzQ3JlYXRlU3RvcmVNb2RlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5hY3RpdmVNb2RhbC5kaXNtaXNzKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJtb2RhbC13cmFwcGVyXCI+XHJcbiAgPGgzIGNsYXNzPVwibWItNFwiPkNyZWF0ZSBzdG9yZSBsYXlvdXQvcGxhbiBmcm9tIENBRDwvaDM+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW3NlYXJjaF09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFN0b3JlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgW2RhdGFdPVwic3RvcmVMaXN0XCIgW2xhYmVsXT1cIidTZWxlY3Qgc3RvcmUnXCIgW2FjdGlvbl09XCJ0cnVlXCIgKGFjdGlvbkNsaWNrKT1cIm9uQ2xpY2tDcmVhdGVTdG9yZSgpXCJcclxuICAgICAgICBbYWN0aW9uTGFiZWxdPVwiJ0NyZWF0ZSBuZXcgc3RvcmUnXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TdG9yZUNoYW5nZSgpXCIgW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZ1wiPlxyXG4gICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmxvb3JcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZmxvb3JMaXN0XCJcclxuICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBmbG9vcidcIiAobmdNb2RlbENoYW5nZSk9XCJvbkZsb29yQ2hhbmdlKClcIiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCI+XHJcbiAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJsYXlvdXQtZXhpc3Qtd3JhcHBlclwiIFtjbGFzcy5zaG93XT1cImlzTGF5b3V0RXhpc3RcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtZXhpc3Qtd2FybmluZyBtYi00XCI+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgIDxwYXRoXHJcbiAgICAgICAgICBkPVwiTTkuOTk5NjUgNi42NjY2N1YxME05Ljk5OTY1IDEzLjMzMzNIMTAuMDA4TTguNTc0NjUgMi4zODMzNEwxLjUxNjMyIDE0LjE2NjdDMS4zNzA3OSAxNC40MTg3IDEuMjkzNzkgMTQuNzA0NCAxLjI5Mjk4IDE0Ljk5NTRDMS4yOTIxNiAxNS4yODY1IDEuMzY3NTYgMTUuNTcyNiAxLjUxMTY3IDE1LjgyNTRDMS42NTU3OSAxNi4wNzgzIDEuODYzNTkgMTYuMjg5IDIuMTE0NDEgMTYuNDM2NkMyLjM2NTIzIDE2LjU4NDEgMi42NTAzMiAxNi42NjM1IDIuOTQxMzIgMTYuNjY2N0gxNy4wNThDMTcuMzQ5IDE2LjY2MzUgMTcuNjM0MSAxNi41ODQxIDE3Ljg4NDkgMTYuNDM2NkMxOC4xMzU3IDE2LjI4OSAxOC4zNDM1IDE2LjA3ODMgMTguNDg3NiAxNS44MjU0QzE4LjYzMTcgMTUuNTcyNiAxOC43MDcxIDE1LjI4NjUgMTguNzA2MyAxNC45OTU0QzE4LjcwNTUgMTQuNzA0NCAxOC42Mjg1IDE0LjQxODcgMTguNDgzIDE0LjE2NjdMMTEuNDI0NyAyLjM4MzM0QzExLjI3NjEgMi4xMzg0MyAxMS4wNjY5IDEuOTM1OTQgMTAuODE3MyAxLjc5NTQxQzEwLjU2NzcgMS42NTQ4OCAxMC4yODYxIDEuNTgxMDUgOS45OTk2NSAxLjU4MTA1QzkuNzEzMjEgMS41ODEwNSA5LjQzMTU5IDEuNjU0ODggOS4xODE5OSAxLjc5NTQxQzguOTMyMzggMS45MzU5NCA4LjcyMzIxIDIuMTM4NDMgOC41NzQ2NSAyLjM4MzM0WlwiXHJcbiAgICAgICAgICBzdHJva2U9XCIjRjA0NDM4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgVGhpcyBzdG9yZSBhbHJlYWR5IGhhcyBhIEZsb29yIHt7c2VsZWN0ZWRGbG9vcn19IHBsYW5vZ3JhbS4gT3ZlcndyaXRlIGl0PyBUaGlzIGNhbuKAmXQgYmUgdW5kb25lLlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICA8ZmlsZS11cGxvYWQgW2Rpc2FibGVkXT1cImlzUHJvY2Vzc2luZ1wiIChmaWxlQ2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCI+PC9maWxlLXVwbG9hZD5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1hY3Rpb25zXCI+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiIWlzVmFsaWRUb0NyZWF0ZSB8fCBpc1Byb2Nlc3NpbmdcIiAoY2xpY2spPVwib25DcmVhdGUoKVwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIiFpc1Byb2Nlc3NpbmdcIj5cclxuICAgICAgICB7e2lzTGF5b3V0RXhpc3QgPyAgJ092ZXJ3cml0ZScgOiAnQ3JlYXRlJ319XHJcbiAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgIDxzdmcgKm5nSWY9XCJpc1Byb2Nlc3NpbmdcIiBjbGFzcz1cInNwaW5uZXJcIiB2aWV3Qm94PVwiMCAwIDUwIDUwXCI+XHJcbiAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9tYW5hZ2UtcGxhbm8vcG9wdXBzL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBRUwsV0FBVyxFQUNYLG1CQUFtQixHQUVwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBRTdGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDakYsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7O0FBaUJ2QyxNQUFNLE9BQU8sd0JBQXdCO0lBK0N6QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBbERELFFBQVEsQ0FBUztJQUMxQixhQUFhLENBQVM7SUFDdEIsYUFBYSxDQUFTO0lBQ3RCLFlBQVksR0FBZ0IsSUFBSSxDQUFDO0lBRWpDLFNBQVMsR0FHSCxFQUFFLENBQUM7SUFFVCxTQUFTLEdBR0g7UUFDSixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUM5QixFQUFF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Q3pDLDBDQUEwQztRQUMxQyw2Q0FBNkM7UUFDN0MsMENBQTBDO1FBQzFDLHdDQUF3QztRQUN4Qyx3Q0FBd0M7UUFDeEMsc0NBQXNDO1FBQ3RDLHFDQUFxQztRQUNyQyx3Q0FBd0M7UUFDeEMsTUFBTTtRQUVOLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQzt3R0E5SlUsd0JBQXdCOzRGQUF4Qix3QkFBd0Isa0hDN0JyQyxpalBBZ0lNLHNuQ0QxR0YsV0FBVyxtM0JBQ1gsbUJBQW1CLGdWQUNuQix1QkFBdUIseU5BQ3ZCLG1CQUFtQix1R0FDbkIsSUFBSTs7NEZBR0ssd0JBQXdCO2tCQWJwQyxTQUFTOytCQUNFLHNCQUFzQixjQUdwQixJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxtQkFBbUI7d0JBQ25CLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQixJQUFJO3FCQUNMOytMQUdRLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1zTW9kdWxlLFxyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBOZ0lmIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtY3JlYXRlLXBsYW5vZ3JhbVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBGaWxlVXBsb2FkQ29tcG9uZW50LFxyXG4gICAgTmdJZixcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlUGxhbm9ncmFtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkU3RvcmU6IHN0cmluZztcclxuICBzZWxlY3RlZEZsb29yOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0b3JlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW107XHJcblxyXG4gIGZsb29yTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBudW1iZXI7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJGbG9vciAxXCIsIHZhbHVlOiAxIH0sXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDJcIiwgdmFsdWU6IDIgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgM1wiLCB2YWx1ZTogMyB9LFxyXG4gIF07XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVGbG9vcnM6IGFueSA9IFtdO1xyXG5cclxuICBpc0xheW91dEV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDQURQcm9jZXNzaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNDcmVhdGVTdG9yZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY3JlYXRlU3RvcmVGb3JtOiBhbnk7XHJcbiAgc3RvcmVUeXBlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJIaWdoIFN0cmVldFwiLCB2YWx1ZTogXCJIaWdoU3RyZWV0XCIgfSxcclxuICAgIHsgbGFiZWw6IFwiTWFsbFwiLCB2YWx1ZTogXCJtYWxsXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiS2lvc2tcIiwgdmFsdWU6IFwia2lvc2tcIiB9LFxyXG4gIF07XHJcblxyXG4gIGJ1c2luZXNzVHlwZUxpc3Q6IHtcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6IFwiQ09DT1wiLCB2YWx1ZTogXCJjb2NvXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiQ09GT1wiLCB2YWx1ZTogXCJjb2ZvXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRk9GT1wiLCB2YWx1ZTogXCJmb2ZvXCIgfSxcclxuICAgIHsgbGFiZWw6IFwiRk9DT1wiLCB2YWx1ZTogXCJmb2NvXCIgfSxcclxuICBdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6Um91dGVyLFxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmdldFN0b3JlTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVmFsaWRUb0NyZWF0ZVBsYW5vKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTdG9yZSAmJiB0aGlzLnNlbGVjdGVkRmxvb3IgJiYgdGhpcy5zZWxlY3RlZEZpbGU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTdG9yZUxpc3QoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzdG9yZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRBbGxTdG9yZXModGhpcy5jbGllbnRJZClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdG9yZUxpc3QgPSBzdG9yZXM/LmRhdGE/Lm1hcCgoczogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgbGFiZWw6IHMuc3RvcmVOYW1lLCB2YWx1ZTogcy5zdG9yZUlkIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGdldFN0b3JlTGlzdCBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdG9yZUNoYW5nZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZsb29yczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldFN0b3JlRmxvb3JzTGlzdCh0aGlzLnNlbGVjdGVkU3RvcmUpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycyA9IGZsb29ycz8uZGF0YSA/PyBbXTtcclxuICAgICAgdGhpcy5vbkZsb29yQ2hhbmdlKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3RvcmVMaXN0IFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZsb29yQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGbG9vcikge1xyXG4gICAgICB0aGlzLmlzTGF5b3V0RXhpc3QgPSB0aGlzLnNlbGVjdGVkU3RvcmVGbG9vcnMuc29tZShcclxuICAgICAgICAoZjogYW55KSA9PiBmLmZsb29yTnVtYmVyID09PSB0aGlzLnNlbGVjdGVkRmxvb3JcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GaWxlQ2hhbmdlKGZpbGU6IEZpbGUgfCBudWxsKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmlsZSA9IGZpbGU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNyZWF0ZUxheW91dFBsYW5vKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRUb0NyZWF0ZVBsYW5vKSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5pc0NBRFByb2Nlc3NpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgY29uc3QgcGxhbm9SZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5jcmVhdGVQbGFub0Zyb21DQUQoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZSEsXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3JcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoIXBsYW5vUmVzPy5kYXRhKSByZXR1cm47XHJcblxyXG4gICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKHBsYW5vUmVzPy5kYXRhKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnJvcj8uZXJyb3I/LmVycm9yPy5lcnJNc2cgPz8gXCJGYWlsZWQgdG8gZXh0cmFjdCBwbGFubyBmcm9tIENBRCBmaWxlLlwiXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBvbkNyZWF0ZSBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0NBRFByb2Nlc3NpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ3JlYXRlU3RvcmUoKSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIkBAIH4gdGhpcy5jcmVhdGVTdG9yZUZvcm06XCIsIHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIGFkZE5ld1N0b3JlKCkge1xyXG4gICAgLy8gdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IHRydWU7XHJcbiAgICAvLyB0aGlzLmNyZWF0ZVN0b3JlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgLy8gICBzdG9yZU5hbWU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIC8vICAgYnVzaW5lc3NUeXBlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAvLyAgIHN0b3JlVHlwZTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgLy8gICBhZGRyZXNzOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAvLyAgIGNvdW50cnk6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIC8vICAgc3RhdGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIC8vICAgY2l0eTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgLy8gICB6aXBDb2RlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbXCIvbWFuYWdlL3N0b3Jlcy9hZGQtc2luZ2xlLXN0b3JlXCJdKTtcclxuXHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwodXJsVHJlZSk7XHJcbiAgICB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIpO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmRpc21pc3MoKTtcclxuICB9XHJcblxyXG4gIG9uQmFjaygpe1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0gPSBudWxsO1xyXG4gICAgdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibW9kYWwtd3JhcHBlclwiPlxyXG4gIDxoMyBjbGFzcz1cIm1iLTRcIj5DcmVhdGUgc3RvcmUgbGF5b3V0L3BsYW4gZnJvbSBDQUQ8L2gzPlxyXG4gIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNyZWF0ZVN0b3JlRm9ybVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInN0b3JlTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+U3RvcmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RvcmVOYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RvcmVOYW1lXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIHN0b3JlIG5hbWVcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBTdG9yZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImJ1c2luZXNzVHlwZUxpc3RcIlxyXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBidXNpbmVzcyB0eXBlJ1wiIGZvcm1Db250cm9sTmFtZT1cImJ1c2luZXNzVHlwZVwiPlxyXG4gICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic3RvcmVUeXBlTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IHN0b3JlIHR5cGUnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RvcmVUeXBlXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwiYWRkcmVzc1wiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+QWRkcmVzczwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiYWRkcmVzc1wiIGZvcm1Db250cm9sTmFtZT1cImFkZHJlc3NcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhbmQgZW50ZXIgYWRkcmVzc1wiIC8+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnYWRkcmVzcycpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2FkZHJlc3MnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnYWRkcmVzcycpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIEFkZHJlc3MgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50cnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNvdW50cnlcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb3VudHJ5XCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnY291bnRyeScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlN0YXRlPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXRlXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBTdGF0ZVwiIC8+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIFN0YXRlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjaXR5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5DaXR5IC8gVG93bjwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY2l0eVwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIENpdHkgLyBUb3duXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjaXR5Jyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnY2l0eScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjaXR5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQ2l0eSAvIFRvd24gaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInppcENvZGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBpbiAvIFppcCBDb2RlPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJ6aXBDb2RlXCIgZm9ybUNvbnRyb2xOYW1lPVwiemlwQ29kZVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIC8gWmlwIENvZGVcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3ppcENvZGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCd6aXBDb2RlJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3ppcENvZGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBQaW4gLyBaaXAgQ29kZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuICB9XHJcbiAgQGVsc2Uge1xyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtzZWFyY2hdPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRTdG9yZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgW2RhdGFdPVwic3RvcmVMaXN0XCIgW2xhYmVsXT1cIidTZWxlY3Qgc3RvcmUnXCIgW2FjdGlvbl09XCJ0cnVlXCIgKGFjdGlvbkNsaWNrKT1cImFkZE5ld1N0b3JlKClcIlxyXG4gICAgICAgICAgW2FjdGlvbkxhYmVsXT1cIidDcmVhdGUgbmV3IHN0b3JlJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVDaGFuZ2UoKVwiIFtkaXNhYmxlZF09XCJpc0NBRFByb2Nlc3NpbmdcIj5cclxuICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmxvb3JcIiBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiZmxvb3JMaXN0XCJcclxuICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRmxvb3JDaGFuZ2UoKVwiIFtkaXNhYmxlZF09XCJpc0NBRFByb2Nlc3NpbmdcIj5cclxuICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWV4aXN0LXdyYXBwZXJcIiBbY2xhc3Muc2hvd109XCJpc0xheW91dEV4aXN0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtZXhpc3Qtd2FybmluZyBtYi00XCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTkuOTk5NjUgNi42NjY2N1YxME05Ljk5OTY1IDEzLjMzMzNIMTAuMDA4TTguNTc0NjUgMi4zODMzNEwxLjUxNjMyIDE0LjE2NjdDMS4zNzA3OSAxNC40MTg3IDEuMjkzNzkgMTQuNzA0NCAxLjI5Mjk4IDE0Ljk5NTRDMS4yOTIxNiAxNS4yODY1IDEuMzY3NTYgMTUuNTcyNiAxLjUxMTY3IDE1LjgyNTRDMS42NTU3OSAxNi4wNzgzIDEuODYzNTkgMTYuMjg5IDIuMTE0NDEgMTYuNDM2NkMyLjM2NTIzIDE2LjU4NDEgMi42NTAzMiAxNi42NjM1IDIuOTQxMzIgMTYuNjY2N0gxNy4wNThDMTcuMzQ5IDE2LjY2MzUgMTcuNjM0MSAxNi41ODQxIDE3Ljg4NDkgMTYuNDM2NkMxOC4xMzU3IDE2LjI4OSAxOC4zNDM1IDE2LjA3ODMgMTguNDg3NiAxNS44MjU0QzE4LjYzMTcgMTUuNTcyNiAxOC43MDcxIDE1LjI4NjUgMTguNzA2MyAxNC45OTU0QzE4LjcwNTUgMTQuNzA0NCAxOC42Mjg1IDE0LjQxODcgMTguNDgzIDE0LjE2NjdMMTEuNDI0NyAyLjM4MzM0QzExLjI3NjEgMi4xMzg0MyAxMS4wNjY5IDEuOTM1OTQgMTAuODE3MyAxLjc5NTQxQzEwLjU2NzcgMS42NTQ4OCAxMC4yODYxIDEuNTgxMDUgOS45OTk2NSAxLjU4MTA1QzkuNzEzMjEgMS41ODEwNSA5LjQzMTU5IDEuNjU0ODggOS4xODE5OSAxLjc5NTQxQzguOTMyMzggMS45MzU5NCA4LjcyMzIxIDIuMTM4NDMgOC41NzQ2NSAyLjM4MzM0WlwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiNGMDQ0MzhcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgVGhpcyBzdG9yZSBhbHJlYWR5IGhhcyBhIEZsb29yIHt7c2VsZWN0ZWRGbG9vcn19IHBsYW5vZ3JhbS4gT3ZlcndyaXRlIGl0PyBUaGlzIGNhbuKAmXQgYmUgdW5kb25lLlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgIDxmaWxlLXVwbG9hZCBbZGlzYWJsZWRdPVwiaXNDQURQcm9jZXNzaW5nXCIgKGZpbGVDaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIj48L2ZpbGUtdXBsb2FkPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYWN0aW9uc1wiPlxyXG4gICAgQGlmKGlzQ3JlYXRlU3RvcmVNb2RlKXtcclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgbWUtYXV0b1wiIChjbGljayk9XCJvbkJhY2soKVwiPkJhY2s8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiY3JlYXRlU3RvcmVGb3JtLmludmFsaWRcIiAoY2xpY2spPVwib25DcmVhdGVTdG9yZSgpXCI+XHJcbiAgICAgICAgQ3JlYXRlXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgfUBlbHNlIHtcclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiIWlzVmFsaWRUb0NyZWF0ZVBsYW5vIHx8IGlzQ0FEUHJvY2Vzc2luZ1wiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlTGF5b3V0UGxhbm8oKVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQ0FEUHJvY2Vzc2luZ1wiPlxyXG4gICAgICAgICAge3tpc0xheW91dEV4aXN0ID8gICdPdmVyd3JpdGUnIDogJ0NyZWF0ZSd9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHN2ZyAqbmdJZj1cImlzQ0FEUHJvY2Vzc2luZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==