tango-app-ui-store-builder 1.0.34 → 1.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/create-fixture/create-fixture.component.mjs +3 -3
- package/esm2022/lib/components/create-vm/create-vm.component.mjs +3 -3
- package/esm2022/lib/components/fixture-overview-panel/fixture-overview-panel.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/fixture-template.component.mjs +2 -2
- package/esm2022/lib/components/fixture-template/template-assign-stores/template-assign-stores.component.mjs +2 -2
- package/esm2022/lib/components/fixture-template/template-basic-details/template-basic-details.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-details/template-details.component.mjs +2 -2
- package/esm2022/lib/components/fixture-template/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/fixture-template/template-summary/template-summary.component.mjs +2 -2
- package/esm2022/lib/components/fixture-template/template-vms/template-vms.component.mjs +2 -2
- package/esm2022/lib/components/fixture-template-table/fixture-template-table.component.mjs +2 -2
- package/esm2022/lib/components/manage-plano/popups/create-planogram/create-planogram.component.mjs +198 -29
- package/esm2022/lib/components/manage-plano/rollout-table/rollout-table.component.mjs +2 -2
- package/esm2022/lib/components/manage-plano/verification-table/verification-table.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/manage-store-plano-feedback/manage-store-plano-feedback.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +29 -11
- package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/publish-rollout-popup/publish-rollout-popup.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/rollout-feedback/rollout-feedback.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/store-task-revoke/store-task-revoke.component.mjs +2 -2
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/template-products/template-products.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/verification-feedback/editable-fixture/editable-fixture.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/verification-feedback/fixture/fixture.component.mjs +3 -3
- package/esm2022/lib/components/plano-library/fixture-library/fixture-library.component.mjs +2 -2
- package/esm2022/lib/components/plano-library/plano-library.component.mjs +2 -2
- package/esm2022/lib/components/plano-library/product-library/product-library.component.mjs +2 -2
- package/esm2022/lib/components/plano-library/vm-library/vm-library.component.mjs +2 -2
- package/esm2022/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.mjs +61 -18
- package/esm2022/lib/components/planogram/merch-compliance/merch-compliance.component.mjs +37 -43
- package/esm2022/lib/components/planogram/merch-compliance/zone-products/zone-products.component.mjs +2 -2
- package/esm2022/lib/components/planogram/plano-details-parent/plano-details-parent.component.mjs +7 -26
- package/esm2022/lib/components/planogram/plano-overview/fixture-overview/fixture-overview.component.mjs +2 -2
- package/esm2022/lib/components/planogram/plano-table/plano-table.component.mjs +2 -2
- package/esm2022/lib/components/store-plano/store-plano.component.mjs +2 -2
- package/esm2022/lib/functions/plano.function.mjs +50 -18
- package/esm2022/lib/services/store-builder.service.mjs +117 -108
- package/esm2022/lib/tango-store-builder.module.mjs +7 -3
- package/fesm2022/tango-app-ui-store-builder.mjs +559 -310
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/manage-plano/popups/create-planogram/create-planogram.component.d.ts +11 -5
- package/lib/components/manage-store-plano/manage-store-plano.component.d.ts +4 -1
- package/lib/components/planogram/merch-compliance/fixture-products/fixture-products.component.d.ts +4 -2
- package/lib/functions/plano.function.d.ts +3 -1
- package/lib/services/store-builder.service.d.ts +8 -4
- package/lib/tango-store-builder.module.d.ts +2 -1
- package/package.json +1 -1
|
@@ -464,10 +464,10 @@ export class CreateFixtureComponent {
|
|
|
464
464
|
this.destroy$.complete();
|
|
465
465
|
}
|
|
466
466
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.FormBuilder }, { token: i3.StoreBuilderService }, { token: i4.ToastService }, { token: i1.Router }, { token: i5.NgbModal }, { token: i6.PageInfoService }, { token: i6.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
467
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, isStandalone: true, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\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=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2\r\n class=\"m-0 ellipsis\"\r\n style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\"\r\n >\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div\r\n *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\"\r\n >\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{width:590px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: TimeAgoPipe, name: "timeAgo" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
467
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CreateFixtureComponent, isStandalone: true, selector: "lib-create-fixture", ngImport: i0, template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\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=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2\r\n class=\"m-0 ellipsis\"\r\n style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\"\r\n >\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div\r\n *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\"\r\n >\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{width:590px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"], dependencies: [{ kind: "component", type: CounterInputComponent, selector: "counter-input", inputs: ["step", "placeholder", "max"], outputs: ["onIncrement", "onDecrement"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i7.DatePipe, name: "date" }, { kind: "pipe", type: TimeAgoPipe, name: "timeAgo" }, { kind: "ngmodule", type: NgbAccordionModule }, { kind: "directive", type: i5.NgbAccordionButton, selector: "button[ngbAccordionButton]" }, { kind: "directive", type: i5.NgbAccordionDirective, selector: "[ngbAccordion]", inputs: ["animation", "closeOthers", "destroyOnHide"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordion"] }, { kind: "directive", type: i5.NgbAccordionItem, selector: "[ngbAccordionItem]", inputs: ["ngbAccordionItem", "destroyOnHide", "disabled", "collapsed"], outputs: ["show", "shown", "hide", "hidden"], exportAs: ["ngbAccordionItem"] }, { kind: "directive", type: i5.NgbAccordionHeader, selector: "[ngbAccordionHeader]" }, { kind: "directive", type: i5.NgbAccordionBody, selector: "[ngbAccordionBody]" }, { kind: "directive", type: i5.NgbAccordionCollapse, selector: "[ngbAccordionCollapse]", exportAs: ["ngbAccordionCollapse"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
468
468
|
}
|
|
469
469
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreateFixtureComponent, decorators: [{
|
|
470
470
|
type: Component,
|
|
471
|
-
args: [{ selector: 'lib-create-fixture', standalone: true, imports: [CounterInputComponent, NgbTooltip, FormsModule, ReactiveFormsModule, CommonModule, TimeAgoPipe, NgbAccordionModule, ReactiveSelectComponent, RouterLink], template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\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=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2\r\n class=\"m-0 ellipsis\"\r\n style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\"\r\n >\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div\r\n *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\"\r\n >\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{width:590px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
|
|
471
|
+
args: [{ selector: 'lib-create-fixture', standalone: true, imports: [CounterInputComponent, NgbTooltip, FormsModule, ReactiveFormsModule, CommonModule, TimeAgoPipe, NgbAccordionModule, ReactiveSelectComponent, RouterLink], template: "<section id=\"build-fixture\" *ngIf=\"!isPageLoading\">\r\n <!-- Header section -->\r\n <div class=\"header\">\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <button type=\"button\" class=\"btn btn-outline p-3\" routerLink=\"/manage/planogram/library/fixtures\">\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=\"M15.8334 9.99984H4.16675M4.16675 9.99984L10.0001 15.8332M4.16675 9.99984L10.0001 4.1665\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <h2\r\n class=\"m-0 ellipsis\"\r\n style=\"max-width: calc(100vw - 860px)\"\r\n [ngbTooltip]=\"fixtureDetails.fixtureCategory + ' - ' + fixtureDetails.fixtureWidth?.value + 'ft'\"\r\n >\r\n {{ fixtureDetails.fixtureCategory }} - {{ fixtureDetails.fixtureWidth?.value }}\r\n {{ fixtureDetails.fixtureWidth?.unit || \"ft\" }}\r\n </h2>\r\n <div class=\"badge draft\">{{ fixtureDetails.status | titlecase }}</div>\r\n </div>\r\n <div class=\"d-flex align-items-center justify-contents-center gap-5\">\r\n <p class=\"m-0 text-nowrap\" *ngIf=\"fixtureDetails?.updatedAt\" [ngbTooltip]=\"fixtureDetails.updatedAt | date : 'medium'\">\r\n Last update: {{ fixtureDetails.updatedAt | timeAgo }}\r\n </p>\r\n <div *ngIf=\"!isEditMode\">\r\n <button type=\"button\" class=\"btn btn-outline d-flex align-items-center gap-3\" (click)=\"onClickEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_1322_5325)\">\r\n <path\r\n d=\"M14.1667 2.49993C14.3856 2.28106 14.6455 2.10744 14.9314 1.98899C15.2174 1.87054 15.5239 1.80957 15.8334 1.80957C16.1429 1.80957 16.4494 1.87054 16.7354 1.98899C17.0214 2.10744 17.2812 2.28106 17.5001 2.49993C17.719 2.7188 17.8926 2.97863 18.011 3.2646C18.1295 3.55057 18.1904 3.85706 18.1904 4.16659C18.1904 4.47612 18.1295 4.78262 18.011 5.06859C17.8926 5.35455 17.719 5.61439 17.5001 5.83326L6.25008 17.0833L1.66675 18.3333L2.91675 13.7499L14.1667 2.49993Z\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_1322_5325\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"isEditMode\" class=\"d-flex gap-5 justify-content-center align-items-center\">\r\n <button type=\"button\" class=\"btn btn-outline text-nowrap\" (click)=\"onSubmit('draft')\">Save as draft</button>\r\n <button type=\"button\" class=\"btn btn-primary text-nowrap\" (click)=\"onSubmit('complete')\">Complete</button>\r\n </div>\r\n\r\n <div class=\"dropdown\" *ngIf=\"fixtureDetails?._id\">\r\n <button class=\"btn btn-outline p-3\" type=\"button\" data-bs-toggle=\"dropdown\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M11 12C11 12.5523 11.4477 13 12 13C12.5523 13 13 12.5523 13 12C13 11.4477 12.5523 11 12 11C11.4477 11 11 11.4477 11 12Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 19C11 19.5523 11.4477 20 12 20C12.5523 20 13 19.5523 13 19C13 18.4477 12.5523 18 12 18C11.4477 18 11 18.4477 11 19Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M11 5C11 5.55228 11.4477 6 12 6C12.5523 6 13 5.55228 13 5C13 4.44772 12.5523 4 12 4C11.4477 4 11 4.44772 11 5Z\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item cursor-pointer\" (click)=\"onDuplicate()\" *ngIf=\"!isEditMode\">Duplicate</a></li>\r\n <li>\r\n <a class=\"dropdown-item cursor-pointer text-danger\" (click)=\"onDelete()\"> Delete </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'wall'\">\r\n <!-- Wall Fixture Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>Configure your fixture details here</p>\r\n <form [formGroup]=\"wallFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n wallFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"wallFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.width')?.touched &&\r\n wallFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall height (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n wallFixtureForm.get('basicDetails.length')?.touched &&\r\n wallFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Header Section -->\r\n <div ngbAccordionItem=\"header\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isHeaderEnabled\"\r\n (change)=\"toggleSection('header'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n [disabled]=\"!isEditMode\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>HEADER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"header\" [class.disabled]=\"!isHeaderEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.header?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('header.height')?.touched && wallFixtureForm.get('header.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('header.height')?.hasError('min')\">\r\n Header height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Section -->\r\n <div ngbAccordionItem=\"body\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isBodyEnabled\"\r\n (change)=\"toggleSection('body'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>BODY</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"body\" [class.disabled]=\"!isBodyEnabled\">\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of shelves</label>\r\n <div class=\"counter-container\" [class.disable-counter]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>{{ shelfArray.length }}</span>\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addShelf(); wallFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"shelfArray.length < 1 && isEditMode\">\r\n At least one shelf is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"shelfArray?.length\">\r\n <div formArrayName=\"shelf\">\r\n <div *ngFor=\"let shelf of shelfArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Shelf {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removeShelf(i); wallFixtureForm.markAsDirty()\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <lib-reactive-select\r\n [idField]=\"'value'\"\r\n [nameField]=\"'label'\"\r\n [data]=\"shelfTypes\"\r\n formControlName=\"type\"\r\n >\r\n </lib-reactive-select>\r\n\r\n <ng-container *ngIf=\"shelf.get('type')?.value === 'tray'\">\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"shelf.get('noOfRows')?.touched && shelf.get('noOfRows')?.errors\">\r\n <small *ngIf=\"shelf.get('noOfRows')?.hasError('min')\" class=\"text-danger\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"shelf.get('productCapacity')?.touched && shelf.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"shelf.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Section -->\r\n <div ngbAccordionItem=\"footer\">\r\n <div class=\"d-flex justify-content-between align-items-center checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n [disabled]=\"!isEditMode\"\r\n [checked]=\"isFooterEnabled\"\r\n (change)=\"toggleSection('footer'); wallFixtureForm.markAsDirty()\"\r\n class=\"form-check-input ms-4\"\r\n />\r\n <h2 ngbAccordionHeader class=\"flex-grow-1\">\r\n <button ngbAccordionButton>FOOTER</button>\r\n </h2>\r\n </div>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"footer\" [class.disabled]=\"!isFooterEnabled\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Height (\" + (fixtureDetails.footer?.height?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"height\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"wallFixtureForm.get('footer.height')?.touched && wallFixtureForm.get('footer.height')?.invalid\"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"wallFixtureForm.get('footer.height')?.hasError('min')\">\r\n Footer height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Wall Fixture Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div\r\n *ngIf=\"isBodyEnabled || isHeaderEnabled || isFooterEnabled; else emptyFixture\"\r\n class=\"d-flex justify-content-center w-100\"\r\n >\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"wallFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n\r\n <div class=\"wall-viewport\">\r\n <!-- Header Preview -->\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: wallFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n </div>\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isHeaderEnabled\">\r\n <div class=\"wrapper\">\r\n <div class=\"header-block\"></div>\r\n </div>\r\n <div class=\"header-info\">\r\n <p>HEADER</p>\r\n </div>\r\n </div>\r\n\r\n <!-- Body Preview -->\r\n <div class=\"body-block\" *ngIf=\"isBodyEnabled && shelfArray.length > 0\">\r\n <div class=\"d-flex w-100 gap-5\" *ngFor=\"let item of shelfArray.controls; let i = index\">\r\n @if(item.get('type')?.value ==='shelf'){\r\n <div class=\"block shelf\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n <div class=\"body-info\">\r\n <p>\r\n SHELF {{ i + 1 }} <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value }}</b>\r\n </p>\r\n </div>\r\n }@else {\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"tray mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n <div class=\"body-info\">\r\n SHELF {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Preview -->\r\n <div class=\"d-flex w-100 gap-5\" *ngIf=\"isFooterEnabled\">\r\n <div class=\"wrapper footer-block\">\r\n <div class=\"row m-0 h-100 gap-3 w-100\">\r\n <div class=\"col sub-footer\"></div>\r\n <div class=\"col sub-footer\"></div>\r\n </div>\r\n </div>\r\n <div class=\"footer-info\">\r\n <p>FOOTER</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-template #emptyFixture>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Preview requires header, footer, or body block enabled.</div>\r\n <div class=\"nodatasubtext\">Please enable either the header, footer, or body to view the preview..</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ shelfArray.length }}</h3>\r\n <p>No of Shelves</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ wallFixtureForm.get(\"basicDetails.width\")?.value }} x {{ wallFixtureForm.get(\"basicDetails.length\")?.value }} feet\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor type fixture creation -->\r\n <div class=\"row gap-4 builder\" *ngIf=\"fixtureDetails.fixtureType === 'floor'\">\r\n <!-- Floor Panel Form -->\r\n <div class=\"cols col\">\r\n <div>\r\n <h2>Fixture Details</h2>\r\n <p>The settings are pre-configured and cannot be edited</p>\r\n <form [formGroup]=\"floorFixtureForm\">\r\n <div ngbAccordion #accordion=\"ngbAccordion\">\r\n <!-- Basic Details -->\r\n <div ngbAccordionItem=\"details\" [collapsed]=\"false\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>BASIC DETAILS</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"form-section\" formGroupName=\"basicDetails\">\r\n <div class=\"form-group\">\r\n <label for=\"fixtureCategory\" class=\"form-label mb-1\">Fixture name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"fixtureCategory\" formControlName=\"fixtureCategory\" />\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.touched &&\r\n floorFixtureForm.get('basicDetails.fixtureCategory')?.invalid\r\n \"\r\n >\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('required')\"\r\n >\r\n Fixture name is required.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('whitespace')\"\r\n >\r\n Fixture name cannot be only whitespace.\r\n </small>\r\n <small\r\n class=\"text-danger\"\r\n *ngIf=\"floorFixtureForm.get('basicDetails.fixtureCategory')?.hasError('trimSpaces')\"\r\n >\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall width (\" + (fixtureDetails.fixtureWidth?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"width\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.width')?.touched &&\r\n floorFixtureForm.get('basicDetails.width')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.width')?.hasError('min')\">\r\n Overall width cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n <div class=\"mb-4\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>{{ \"Overall length (\" + (fixtureDetails.fixtureLength?.unit || \"ft\") + \")\" }}</label>\r\n <counter-input style=\"width: 40%\" formControlName=\"length\" [step]=\"0.5\" placeholder=\"0\"></counter-input>\r\n </div>\r\n <ng-container\r\n *ngIf=\"\r\n floorFixtureForm.get('basicDetails.length')?.touched &&\r\n floorFixtureForm.get('basicDetails.length')?.invalid\r\n \"\r\n >\r\n <small class=\"text-danger\" *ngIf=\"floorFixtureForm.get('basicDetails.length')?.hasError('min')\">\r\n Overall height cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Panel Section -->\r\n <div ngbAccordionItem=\"panel\">\r\n <h2 ngbAccordionHeader>\r\n <button ngbAccordionButton>PANEL</button>\r\n </h2>\r\n <div ngbAccordionCollapse>\r\n <div ngbAccordionBody>\r\n <ng-template>\r\n <div class=\"mb-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of panels</label>\r\n <div class=\"counter-container\" [class.disabled-click]=\"!isEditMode\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M3.76294 7H11.9296\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <span>{{ panelArray.length }}</span>\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"addPanel(); floorFixtureForm.markAsDirty()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <small class=\"text-danger\" *ngIf=\"panelArray.length < 1 && isEditMode\">\r\n At least one panel is required.\r\n </small>\r\n </div>\r\n\r\n <div *ngIf=\"panelArray?.length\">\r\n <div formArrayName=\"panel\">\r\n <div *ngFor=\"let panel of panelArray?.controls; let i = index\" [formGroupName]=\"i\" class=\"array-group\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-3\">\r\n <h6 class=\"shelf-title\">Panel {{ i + 1 }}</h6>\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"removePanel(i)\"\r\n class=\"cursor-pointer\"\r\n [class.disabled-click]=\"!isEditMode\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"#98A2B3\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"\">\r\n <input type=\"text\" class=\"form-control\" id=\"panelName\" formControlName=\"panelName\" />\r\n <ng-container *ngIf=\"panel.get('panelName')?.touched && panel.get('panelName')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('required')\">\r\n Panel name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('whitespace')\">\r\n Panel name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"panel.get('panelName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>No of rows</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"noOfRows\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n\r\n <ng-container *ngIf=\"panel.get('noOfRows')?.touched && panel.get('noOfRows')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('noOfRows')?.hasError('min')\">\r\n Must be at least 1 row.\r\n </small>\r\n </ng-container>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <label>Product capacity for each row</label>\r\n <counter-input\r\n style=\"width: 40%\"\r\n formControlName=\"productCapacity\"\r\n [step]=\"1\"\r\n placeholder=\"0\"\r\n ></counter-input>\r\n </div>\r\n <ng-container *ngIf=\"panel.get('productCapacity')?.touched && panel.get('productCapacity')?.errors\">\r\n <small class=\"text-danger\" *ngIf=\"panel.get('productCapacity')?.hasError('min')\">\r\n Product capacity cannot be zero.\r\n </small>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- Floor Panel Preview -->\r\n <div class=\"cols col-8\">\r\n <div style=\"height: calc(75vh - 120px); overflow-y: auto\">\r\n <div *ngIf=\"panelArray.controls.length; else noPanel\" class=\"floor-panel-viewport w-100\">\r\n <div class=\"d-flex flex-column align-items-start\">\r\n <div *ngFor=\"let item of panelArray.controls; let i = index\" class=\"d-flex gap-5\">\r\n <div class=\"vertical-dimension\">\r\n <div class=\"arrow up\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"floorFixtureForm.get('basicDetails.length')?.value as length\">\r\n {{ length }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </span>\r\n </div>\r\n <div class=\"arrow down\"></div>\r\n </div>\r\n <div class=\"wrapper\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n dimensionArrows;\r\n context: {\r\n value: floorFixtureForm.get('basicDetails.width')?.value\r\n }\r\n \"\r\n ></ng-container>\r\n <div class=\"block\">\r\n <div *ngFor=\"let product of [].constructor(item.get('noOfRows')?.value)\" class=\"panel mb-3\">\r\n <div *ngFor=\"let product of [].constructor(item.get('productCapacity')?.value)\" class=\"product\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"panel-info\">\r\n PANEL {{ i + 1 }}\r\n <b class=\"ms-3\">Products: {{ item.get(\"productCapacity\")?.value * (item.get(\"noOfRows\")?.value ?? 1) }}</b>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex flex-column align-items-center gap-5 mt-5\" style=\"margin-left: 24px\">\r\n <svg width=\"464\" height=\"14\" viewBox=\"0 0 530 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M522.653 0.292893C522.263 -0.0976315 521.63 -0.0976314 521.239 0.292893L514.875 6.65685C514.485 7.04738 514.485 7.68054 514.875 8.07107C515.266 8.46159 515.899 8.46159 516.289 8.07107L521.946 2.41421L527.603 8.07107C527.994 8.46159 528.627 8.46159 529.017 8.07107C529.408 7.68054 529.408 7.04738 529.017 6.65685L522.653 0.292893ZM522.946 14L522.946 1L520.946 1L520.946 14L522.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M394.153 0.292893C393.763 -0.0976315 393.13 -0.0976314 392.739 0.292893L386.375 6.65685C385.985 7.04738 385.985 7.68054 386.375 8.07107C386.766 8.46159 387.399 8.46159 387.789 8.07107L393.446 2.41421L399.103 8.07107C399.494 8.46159 400.127 8.46159 400.517 8.07107C400.908 7.68054 400.908 7.04738 400.517 6.65685L394.153 0.292893ZM394.446 14L394.446 1L392.446 1L392.446 14L394.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M265.653 0.292893C265.263 -0.0976315 264.63 -0.0976314 264.239 0.292893L257.875 6.65685C257.485 7.04738 257.485 7.68054 257.875 8.07107C258.266 8.46159 258.899 8.46159 259.289 8.07107L264.946 2.41421L270.603 8.07107C270.994 8.46159 271.627 8.46159 272.017 8.07107C272.408 7.68054 272.408 7.04738 272.017 6.65685L265.653 0.292893ZM265.946 14L265.946 1L263.946 1L263.946 14L265.946 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M137.153 0.292893C136.763 -0.0976315 136.13 -0.0976314 135.739 0.292893L129.375 6.65685C128.985 7.04738 128.985 7.68054 129.375 8.07107C129.766 8.46159 130.399 8.46159 130.789 8.07107L136.446 2.41421L142.103 8.07107C142.494 8.46159 143.127 8.46159 143.517 8.07107C143.908 7.68054 143.908 7.04738 143.517 6.65685L137.153 0.292893ZM137.446 14L137.446 1L135.446 1L135.446 14L137.446 14Z\"\r\n fill=\"#475467\"\r\n />\r\n <path\r\n d=\"M8.6534 0.292893C8.26287 -0.0976315 7.62971 -0.0976314 7.23918 0.292893L0.875221 6.65685C0.484697 7.04738 0.484697 7.68054 0.875221 8.07107C1.26575 8.46159 1.89891 8.46159 2.28943 8.07107L7.94629 2.41421L13.6031 8.07107C13.9937 8.46159 14.6268 8.46159 15.0174 8.07107C15.4079 7.68054 15.4079 7.04738 15.0174 6.65685L8.6534 0.292893ZM8.94629 14L8.94629 1L6.94629 1L6.94629 14L8.94629 14Z\"\r\n fill=\"#475467\"\r\n />\r\n </svg>\r\n\r\n <svg width=\"57\" height=\"43\" viewBox=\"0 0 57 43\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0.439697 31.8087C0.439697 26.864 4.4482 22.8555 9.39294 22.8555H47.4681C52.423 22.8555 56.4397 26.8722 56.4397 31.827C56.4397 37.3255 51.5373 41.4994 46.0765 40.8571C33.6318 39.3935 23.7267 39.3206 10.8186 40.8376C5.35542 41.4796 0.439697 37.3095 0.439697 31.8087Z\"\r\n fill=\"#1D2939\"\r\n />\r\n <circle cx=\"28.4408\" cy=\"16.5714\" r=\"15.0714\" fill=\"#1D2939\" stroke=\"white\" stroke-width=\"3\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #noPanel>\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column h-100\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\" />\r\n <div class=\"nodatamaintext mt-3\">Add a panel to see your preview.</div>\r\n <div class=\"nodatasubtext\">To see your preview, please add at least one panel.</div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Info Cards -->\r\n <div class=\"d-flex w-100 gap-2\">\r\n <div class=\"col info-card\">\r\n <h3>{{ panelArray.length }}</h3>\r\n <p>No of Panels</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ totalProductCapacity }}</h3>\r\n <p>Product Capacity</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>{{ fixtureDetails.fixtureType | titlecase }} fixture</h3>\r\n <p>Type</p>\r\n </div>\r\n <div class=\"col info-card\">\r\n <h3>\r\n {{ floorFixtureForm.get(\"basicDetails.width\")?.value }} x {{ floorFixtureForm.get(\"basicDetails.length\")?.value }}\r\n {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}\r\n </h3>\r\n <p>Overall Dimension</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<section id=\"build-fixture-skeleton\" *ngIf=\"isPageLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<!-- Common dimension arrows -->\r\n<ng-template #dimensionArrows let-label=\"label\" let-value=\"value\">\r\n <div class=\"horizontal-dimension\">\r\n <div class=\"arrow left\"></div>\r\n <div class=\"line\">\r\n <span *ngIf=\"value\">{{ value }} {{ fixtureDetails.fixtureLength?.unit || \"ft\" }}</span>\r\n </div>\r\n <div class=\"arrow right\"></div>\r\n </div>\r\n</ng-template>\r\n", styles: [".header{background:#fff;padding:12px;border-radius:12px;display:flex;align-items:center;justify-content:space-between}.btn{padding:.775rem 1.5rem!important;font-size:1.1rem!important}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;padding:2px 8px;border-radius:16px}.badge.inactive{background:#f2f4f7!important;color:#344054!important}.builder{height:75vh}.builder .cols{background:#fff;border-radius:12px;padding:24px 24px 12px;max-height:75vh;overflow-y:auto}.shelf-container{border-radius:8px;background:var(--Gray-50, #f9fafb);padding:8px 16px;margin-bottom:12px}.counter-container{display:flex;align-items:center;justify-content:center;border-radius:8px;background-color:#fff;padding:10px;border:.49px solid #d0d5dd}.counter-container span{margin:0 18px;font-weight:500;font-size:14px;text-align:center;vertical-align:middle;width:18px}.disable-counter{color:var(--bs-gray-500)!important;background-color:var(--bs-gray-200)!important;border-color:var(--bs-gray-300)!important;pointer-events:none;opacity:1}.disabled-click{pointer-events:none;opacity:.85}.wall-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;width:345px;text-align:center}.wall-viewport .wrapper{width:100%;max-width:345px}.wall-viewport .header-info,.wall-viewport .footer-info,.wall-viewport .body-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;display:flex;align-items:center;justify-content:center;justify-content:start;padding:12px;gap:4px}.wall-viewport .header-info p,.wall-viewport .footer-info p,.wall-viewport .body-info p{margin:0}.wall-viewport .header-info{margin-top:40px}.wall-viewport .sub-footer{border:1px solid #98a2b3;height:100%}.wall-viewport .header-block,.wall-viewport .footer-block{border:1px solid #98a2b3;height:95px;padding:8px;background-color:#f2f4f7;width:100%;display:flex;justify-content:center;align-items:center}.wall-viewport .header-block p,.wall-viewport .footer-block p{color:var(--Gray-600, #475467);font-size:18px;font-weight:600;white-space:normal;word-wrap:break-word;margin:0;background-color:#f2f4f7}.wall-viewport .body-block{width:100%}.wall-viewport .body-block .block{border:1px solid #98a2b3;padding:10px;width:100%;max-width:345px;overflow-x:auto;min-height:52px}.wall-viewport .body-block .tray,.wall-viewport .body-block .shelf{display:flex;gap:4px}.wall-viewport .body-block .tray .product,.wall-viewport .body-block .shelf .product{border:1px solid rgba(152,162,179,.2901960784);min-width:50px}.wall-viewport .body-block .tray .product{min-height:20px}.wall-viewport .body-block .shelf .product{min-height:30px}.wall-viewport .body-block .hide-product{border-color:transparent!important}.wall-viewport .body-block .hide-scroll{overflow-x:hidden!important}.horizontal-dimension{display:flex;align-items:center;justify-content:center;height:30px;position:relative}.horizontal-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.horizontal-dimension .arrow.left{transform:rotate(180deg);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .arrow.right{transform:rotate(0);background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.horizontal-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;height:1px}.horizontal-dimension .line span{position:absolute;top:-12px;color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:0 4px}.vertical-dimension{display:flex;flex-direction:column;align-items:center;width:30px;position:relative}.vertical-dimension .arrow{width:12px;height:12px;background-size:contain;background-repeat:no-repeat;background-position:center}.vertical-dimension .arrow.up{transform:rotate(-90deg);margin-top:20px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .arrow.down{transform:rotate(90deg);margin-bottom:26px;background-image:url(\"data:image/svg+xml,%3Csvg fill='%23EAECF0' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 330 330'%3E%3Cpath d='M250.606,154.389l-150-149.996c-5.857-5.858-15.355-5.858-21.213,0.001c-5.857,5.858-5.857,15.355,0.001,21.213l139.393,139.39L79.393,304.394c-5.857,5.858-5.857,15.355,0.001,21.213C82.322,328.536,86.161,330,90,330s7.678-1.464,10.607-4.394l149.999-150.004c2.814-2.813,4.394-6.628,4.394-10.606C255,161.018,253.42,157.202,250.606,154.389z'/%3E%3C/svg%3E\")}.vertical-dimension .line{flex:1;background-color:#eaecf0;position:relative;display:flex;align-items:center;justify-content:center;width:1px}.vertical-dimension .line span{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);color:#667085;font-weight:500;font-size:14px;background-color:#fff;padding:2px 4px}.info-card{padding:12px;background:#fff;border:1px solid #d0d5dd;border-radius:8px;box-shadow:0 1px 2px #1018280f,0 1px 3px #1018281a}.info-card h3{font-weight:600;font-size:18px;line-height:28px;vertical-align:middle}.info-card p{font-weight:500;font-size:14px;line-height:20px;color:#667085;margin:0}.checkbox input[type=checkbox]{width:16px!important;height:16px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-600, #d0d5dd)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:#fff}.checkbox input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00a3ff)!important;background-color:var(--primary-50, #eaf8ff)}.checkbox input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00a3ff;border-right:2px solid #00a3ff;display:inline-block;width:.5em;padding-left:3px;padding-top:10px;padding-right:0}.nav-pills{display:inline-flex;gap:4px}.nav-pills .nav-item .nav-link{border-radius:0;color:#667085;font-size:14px;font-weight:500;padding:8px 16px;border:none}.nav-pills .nav-item .nav-link:hover{background-color:#00000005}.nav-pills .nav-item .nav-link.active{background-color:#eaf8ff;color:#009bf3;border-bottom:3px solid #009bf3}.content-wrapper{background:#fff;border-radius:12px;min-height:calc(100vh - 400px);height:100%;padding:16px 24px;display:flex;flex-direction:column}.loader .shimmer{height:150px}.filter-tab{border:1px solid rgb(234,236,240);background:#fff;box-shadow:0 1px 2px #1018280d;border-radius:8px;padding:18px;transition:all ease .2s}.filter-tab:hover{cursor:pointer}.filter-tab.selected{background:#f6fcff;border:1px solid rgb(107,202,255);box-shadow:0 1px 2px #1018280d}.filter-tab h3{color:#000;font-size:20px;font-weight:600;line-height:30px;margin:0}.filter-tab p{color:var(--Gray-500, #667085);font-size:14px;font-weight:500;line-height:20px;margin:0}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext[_ngcontent-ng-c2141490359]{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.table-responsive{min-height:calc(100vh - 495px)}.download-link{color:var(--Primary-800, #008edf);font-size:14px;font-weight:500;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;cursor:pointer}h3.card-title{color:#101828;font-size:18px;font-weight:600;line-height:28px}p.card-tagline{color:#101828;font-size:14px;font-weight:500;line-height:20px}p.card-description{color:#344054;font-size:14px;font-weight:400;line-height:20px}#list-view .thumbnail{height:40px;width:40px;background:#f2f4f7;margin-right:12px;border-radius:8px}#list-view td{vertical-align:middle}#grid-view .card{box-shadow:0 4px 10px #0000000d;border:1px solid rgb(223,225,231);background:#fff;border-radius:12px;padding:12px;height:100%;transition:all .2s ease}#grid-view .card:hover{cursor:pointer;box-shadow:0 10px 10px #0001;transition:all .2s ease}#grid-view .card-img{margin-bottom:12px;background:#d0d5dd;height:200px;border-radius:6px}#grid-view .card-action{position:absolute;top:20px;right:20px}#grid-view .card-tagline{color:#475467;font-weight:500;font-size:14px;line-height:20px}.badge{font-weight:500;font-size:12px;line-height:18px;text-align:center;color:#027a48;background:#ecfdf3}.badge.active{color:#027a48;background:#ecfdf3}.badge.inactive{background:#f2f4f7;color:#344054}.badge.draft{color:#009bf3;background:#eaf8ff}.badge.cluster{background:#f2f4f7;color:#344054}.badge.published{background:#ecfdf3;color:#027a48}.badge.yet-to-publish{background:#f8f9fc;color:#363f72}.indicator{border-radius:16px;padding:2px 8px;display:flex;justify-content:center;align-items:center;white-space:nowrap;width:fit-content;text-align:center;font-size:14px;font-weight:500}.indicator.short{height:14px!important;width:14px!important;border-radius:50%!important;padding:0!important}.indicator.yetToComplete{background:#f2f4f7;color:#667085}.indicator.yetToComplete path{fill:#667085}.indicator.yetToAssign{background:#eaecf5;color:#344054}.indicator.yetToAssign path{fill:#344054}.indicator.taskAssigned{background:#e0eaff;color:#7a5af8}.indicator.taskAssigned path{fill:#7a5af8}.indicator.reviewPending{background:#fef0c7;color:#f79009}.indicator.reviewPending path{fill:#f79009}.indicator.flagged{background:var(--Error-50, #fef3f2);color:var(--Error-700, #b42318)}.indicator.completed{background:#d1fadf;color:#12b76a}.indicator.completed path{fill:#12b76a}.toggle-button{width:40px;height:40px;display:flex;justify-content:center;align-items:center;border-radius:8px;background:#fff;border:.89px solid rgb(208,213,221);box-shadow:0 .89px 1.78px #1018280d;transition:all ease .3s}.toggle-button:hover{cursor:pointer}.toggle-button.selected{transition:all ease .3s;background:#eaf8ff;box-shadow:0 0 0 3.56px #d5effe!important;border:.89px solid rgb(234,248,255)}.disabled-click{pointer-events:none;cursor:not-allowed!important;opacity:.6}.ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);pointer-events:none;color:#888;display:flex;align-items:center;height:1.5rem}.clear-search{position:absolute;right:14px;top:50%;transform:translateY(-50%);background:none;border:none;padding:0;cursor:pointer;display:flex;align-items:center;height:1.5rem;width:1.5rem}#build-fixture .builder{margin:16px 0 0}#build-fixture .accordion-item,#build-fixture .accordion-button,#build-fixture .accordion-button:not(.collapsed){background-color:#f9fafb!important}#build-fixture .accordion-button{padding:18px 10px}#build-fixture .accordion-item{margin-bottom:16px}#build-fixture .accordion-body{padding:0 16px 16px}#build-fixture .array-group{padding:12px;background-color:#fff;border-radius:8px;margin-bottom:24px}#build-fixture .form-section.disabled{opacity:.5;pointer-events:none}#build-fixture .wall-viewport{width:590px;align-items:start}#build-fixture .wall-viewport .body-block{width:100%}#build-fixture .wall-viewport .header-info{margin-top:0}#build-fixture .floor-panel-viewport{display:flex;align-items:center;justify-content:center;flex-direction:column;margin-bottom:30px;gap:12px}#build-fixture .floor-panel-viewport .wrapper{width:454px}#build-fixture .floor-panel-viewport .block{border:1px solid #98a2b3;padding:16px;width:100%;overflow-x:auto}#build-fixture .floor-panel-viewport .block>.panel:last-child{margin-bottom:0!important}#build-fixture .floor-panel-viewport .panel{display:flex;gap:12px}#build-fixture .floor-panel-viewport .panel .product{border:1px solid #98a2b3;min-width:60px;min-height:30px}#build-fixture .floor-panel-viewport .panel-info{width:100%;border:2px solid #f2f4f7;border-bottom:4px solid #ffffff;background:#f2f4f7;max-width:230px;padding:12px;display:flex;align-items:center;margin-top:30px;gap:4px}#build-fixture .floor-panel-viewport .panel-info p{margin:0}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.up{margin-top:26px}#build-fixture .floor-panel-viewport .vertical-dimension .arrow.down{margin-bottom:0}#build-fixture .disable-counter svg>path{stroke:var(--bs-gray-500)!important}\n"] }]
|
|
472
472
|
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.FormBuilder }, { type: i3.StoreBuilderService }, { type: i4.ToastService }, { type: i1.Router }, { type: i5.NgbModal }, { type: i6.PageInfoService }, { type: i6.GlobalStateService }] });
|
|
473
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFxQyxVQUFVLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakgsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQVksVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzNHLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBQ2hILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQzFHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBRXBHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRTNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7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QUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQTdlVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiw4RUM1Qm5DLDYvNkNBKzJCQSw2cWFEcjFCWSxxQkFBcUIsMklBQUUsVUFBVSwwVEFBRSxXQUFXLDJwQkFBRSxtQkFBbUIsNmhCQUFFLFlBQVksa2hCQUFFLFdBQVcsK0NBQUUsa0JBQWtCLDYxQkFBRSx1QkFBdUIseU5BQUUsVUFBVTs7NEZBRXRKLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FHbEIsSUFBSSxXQUNQLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE5nYkFjY29yZGlvbk1vZHVsZSwgTmdiTW9kYWwsIE5nYlRvb2x0aXAgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmlyc3RWYWx1ZUZyb20sIG1hcCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRml4dHVyZUxpYnJhcnlEZXRhaWxzLCBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLWxpYnJhcnkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGxhbm8tZ2VuZXJhbC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBDb21wbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9jb21wbGV0ZS1jb25maXJtYXRpb24vY29tcGxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9kZWxldGUtY29uZmlybWF0aW9uL2RlbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXhpdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9leGl0LWNvbmZpcm1hdGlvbi9leGl0LWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDYW5FeGl0R3VhcmQgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZXhpdC5ndWFyZCc7XHJcbmltcG9ydCB7IENhbm5vdFBlcmZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9wb3B1cHMvY2Fubm90LXBlcmZvcm0vY2Fubm90LXBlcmZvcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgVGltZUFnb1BpcGUgfSBmcm9tICcuLi8uLi9waXBlcy90aW1lLWFnby5waXBlJztcclxuaW1wb3J0IHsgQ291bnRlcklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vY291bnRlci1pbnB1dC9jb3VudGVyLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJlYWN0aXZlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBnZW5lcmFsVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNyZWF0ZS1maXh0dXJlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9jcmVhdGUtZml4dHVyZS5jb21wb25lbnQuc2NzcycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ291bnRlcklucHV0Q29tcG9uZW50LCBOZ2JUb29sdGlwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBUaW1lQWdvUGlwZSwgTmdiQWNjb3JkaW9uTW9kdWxlLCBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCwgUm91dGVyTGlua11cclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZUZpeHR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ2FuRXhpdEd1YXJkIHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICB3YWxsRml4dHVyZUZvcm06IEZvcm1Hcm91cDtcclxuICBmbG9vckZpeHR1cmVGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBmaXh0dXJlRGV0YWlsczogRml4dHVyZUxpYnJhcnlEZXRhaWxzID0ge307XHJcbiAgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc0hlYWRlckVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRm9vdGVyRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNCb2R5RW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNhbkdvQmFjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICByZWFkb25seSBzaGVsZlR5cGVzOiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiAnU2hlbGYnLCB2YWx1ZTogJ3NoZWxmJyB9LFxyXG4gICAgeyBsYWJlbDogJ1RyYXknLCB2YWx1ZTogJ3RyYXknIH1cclxuICBdO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbmdiTW9kYWw6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCA9IHBhcmFtc1snZml4dHVyZUlkJ10gPz8gJyc7XHJcblxyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gcGFyYW1zWydpc0VkaXQnXSA9PSAndHJ1ZSc7XHJcblxyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCkge1xyXG4gICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlcyddKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnRJZCgpO1xyXG5cclxuICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHBhcmFtcyA9PiBwYXJhbXNbJ2ZpeHR1cmVJZCddKSwgZmlsdGVyKGlkID0+ICEhaWQpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICAgKS5zdWJzY3JpYmUoYXN5bmMgaWQgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMoaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFpbHMgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGRldGFpbHMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uZGV0YWlsc1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW5Hb0JhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBmZXRjaCBmaXh0dXJlIGRldGFpbHNcIik7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmlzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiQ3JlYXRlIEZpeHR1cmVcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAgeyB0aXRsZTogXCJQbGFub2dyYW1cIiwgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtc1wiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiTGlicmFyeVwiLCBwYXRoOiBcIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogXCJcIiwgcGF0aDogXCJcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbGllbnRJZCgpIHtcclxuXHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgLy8gU3Vic2NyaXB0aW9uIHdpbGwgYmUgY2FuY2VsbGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxyXG4gICAgICBkZWJvdW5jZVRpbWUoMjAwKSwgLy8gVG8gYXZvaWQgaW1tZWRpYXRlIGZyZXF1ZW50IGNhbGxzLiBcclxuICAgICAgZmlsdGVyKGRhdGEgPT4gISFkYXRhKSwgLy8gRmlsdGVyaW5nIG51bGwvdW5kZWZpbmVkLlxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIC8vIEVtaXR0aW5nIG9ubHkgZGlmZmVyZW50IHZhbHVlcy4gKElnbm9yZXMgc2FtZSBjbGllbnRJZCkuXHJcbiAgICApLnN1YnNjcmliZShhc3luYyAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnd2FsbCcpIHtcclxuICAgICAgdGhpcy5pbml0V2FsbEZpeHR1cmVGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKCdoZWFkZXInKVxyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbignZm9vdGVyJylcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbignYm9keScpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG5cclxuICAgICAgdGhpcy5pc0hlYWRlckVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzQm9keUVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNGb290ZXJFbmFibGVkID0gdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCA/PyBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZvcm0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnID8gdGhpcy53YWxsRml4dHVyZUZvcm0gOiB0aGlzLmZsb29yRml4dHVyZUZvcm1cclxuICB9XHJcblxyXG4gIGdldCBzaGVsZkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy53YWxsRml4dHVyZUZvcm0uZ2V0KCdib2R5LnNoZWxmJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhbmVsQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRml4dHVyZUZvcm0uZ2V0KCdwYW5lbCcpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFByb2R1Y3RDYXBhY2l0eSgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnID8gdGhpcy5zaGVsZkFycmF5IDogdGhpcy5wYW5lbEFycmF5O1xyXG5cclxuICAgIHJldHVybiBmb3JtQXJyYXkuY29udHJvbHMucmVkdWNlKCh0b3RhbCwgaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBjb3VudCA9IGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUgfHwgMDtcclxuICAgICAgY29uc3QgaXNUcmF5ID0gaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09ICd0cmF5JztcclxuICAgICAgY29uc3Qgcm93cyA9IGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSB8fCAxO1xyXG5cclxuICAgICAgLy8gSWYgdGhlIGZpeHR1cmUgaXMgYSBmbG9vciBwYW5lbCBvciB0cmF5LCB3ZSBuZWVkIHRvIG11bHRpcGx5IHRoZSBwcm9kdWN0IGNhcGFjaXR5IGJ5IHRoZSBudW1iZXIgb2Ygcm93c1xyXG4gICAgICByZXR1cm4gdG90YWwgKyAoaXNUcmF5IHx8IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICdmbG9vcicgPyBjb3VudCAqIHJvd3MgOiBjb3VudCk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGluaXRXYWxsRml4dHVyZUZvcm0oKSB7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBiYXNpY0RldGFpbHM6IHRoaXMuZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCksXHJcbiAgICAgIGhlYWRlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uaGVhZGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMCxdXHJcbiAgICAgIH0pLFxyXG4gICAgICBib2R5OiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBzaGVsZjogdGhpcy5mYi5hcnJheShbXSlcclxuICAgICAgfSksXHJcbiAgICAgIGZvb3RlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZm9vdGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMCxdXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKHMgPT4gdGhpcy5hZGRTaGVsZihzKSlcclxuXHJcbiAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5zaGVsZkNvbmZpZz8ubGVuZ3RoID09PSAwICYmICF0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSkge1xyXG4gICAgICB0aGlzLmFkZFNoZWxmKClcclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBpbml0Rmxvb3JQYW5lbEZpeHR1cmVGb3JtKCkge1xyXG4gICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJhc2ljRGV0YWlsczogdGhpcy5nZXRCYXNpY0RldGFpbHNGb3JtR3JvdXAoKSxcclxuICAgICAgcGFuZWw6IHRoaXMuZmIuYXJyYXkoW10pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKHMgPT4gdGhpcy5hZGRQYW5lbChzKSlcclxuXHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlQ2F0ZWdvcnk6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlQ2F0ZWdvcnkgfHwgJ1VudGl0bGVkJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGdlbmVyYWxWYWxpZGF0b3IoKV1dLFxyXG4gICAgICB3aWR0aDogW3RoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWUgPz8gNiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDAuNSldXSxcclxuICAgICAgbGVuZ3RoOiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgPz8gMTIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwLjUpXV1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRTaGVsZihzaGVsZj86IEZpeHR1cmVMaWJyYXJ5U2hlbGZDb25maWcpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3NoZWxmPy5zaGVsZlR5cGUgfHwgJ3NoZWxmJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW3NoZWxmPy5wcm9kdWN0UGVyU2hlbGYgPz8gNiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXHJcbiAgICAgIG5vT2ZSb3dzOiBbc2hlbGY/LnRyYXlSb3dzID8/IDFdXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cCk7XHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucHVzaChzaGVsZkdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vICB3ZSBuZWVkIHRvIHNldHVwIGEgbGlzdGVuZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHNoZWxmIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBub09mUm93cyBmaWVsZFxyXG4gIHNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBzaGVsZkdyb3VwLmdldCgndHlwZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHR5cGUgPT4ge1xyXG4gICAgICBjb25zdCBub09mUm93c0NvbnRyb2wgPSBzaGVsZkdyb3VwLmdldCgnbm9PZlJvd3MnKTtcclxuICAgICAgaWYgKHR5cGUgPT09ICd0cmF5Jykge1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldKTtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbHVlKDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgfVxyXG4gICAgICBub09mUm93c0NvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gSWYgaW5kZXggaXMgbm90IGdpdmVuLCBsYXN0IHNoZWxmIHNob3VsZCBiZSByZW1vdmVkXHJcbiAgcmVtb3ZlU2hlbGYoaW5kZXg6IG51bWJlciA9IHRoaXMuc2hlbGZBcnJheS5jb250cm9scy5sZW5ndGggLSAxKSB7XHJcbiAgICBpZiAodGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PSAxKSByZXR1cm47XHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgYWRkUGFuZWwocGFuZWw/OiBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnKSB7XHJcbiAgICBjb25zdCBwYW5lbEdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHBhbmVsTmFtZTogW3BhbmVsPy5sYWJlbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGdlbmVyYWxWYWxpZGF0b3IoKV1dLFxyXG4gICAgICBwcm9kdWN0Q2FwYWNpdHk6IFtwYW5lbD8ucHJvZHVjdFBlclNoZWxmID8/IDYsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwKV1dLFxyXG4gICAgICBub09mUm93czogW3BhbmVsPy50cmF5Um93cyA/PyA1LCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldXVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5wYW5lbEFycmF5LnB1c2gocGFuZWxHcm91cCk7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBpbmRleCBpcyBub3QgZ2l2ZW4sIGxhc3QgcGFuZWwgc2hvdWxkIGJlIHJlbW92ZWRcclxuICByZW1vdmVQYW5lbChpbmRleDogbnVtYmVyID0gdGhpcy5wYW5lbEFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDEpIHtcclxuICAgIGlmICh0aGlzLnBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoID09IDEpIHJldHVybjtcclxuICAgIHRoaXMucGFuZWxBcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWN0aW9uKHNlY3Rpb246ICdoZWFkZXInIHwgJ2JvZHknIHwgJ2Zvb3RlcicpIHtcclxuICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oc2VjdGlvbik7XHJcbiAgICB0aGlzLnRvZ2dsZVNlY3Rpb25DaGVja0JveChzZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb25Gb3JtKHNlY3Rpb246ICdoZWFkZXInIHwgJ2JvZHknIHwgJ2Zvb3RlcicpIHtcclxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuICAgIGNvbnN0IGdyb3VwID0gZm9ybS5nZXQoc2VjdGlvbik7XHJcbiAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgZ3JvdXAuZW5hYmxlZCA/IGdyb3VwLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pIDogZ3JvdXAuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb25DaGVja0JveChzZWN0aW9uOiAnaGVhZGVyJyB8ICdib2R5JyB8ICdmb290ZXInKSB7XHJcbiAgICBzd2l0Y2ggKHNlY3Rpb24pIHtcclxuICAgICAgY2FzZSAnaGVhZGVyJzpcclxuICAgICAgICB0aGlzLmlzSGVhZGVyRW5hYmxlZCA9ICF0aGlzLmlzSGVhZGVyRW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnYm9keSc6XHJcbiAgICAgICAgdGhpcy5pc0JvZHlFbmFibGVkID0gIXRoaXMuaXNCb2R5RW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZm9vdGVyJzpcclxuICAgICAgICB0aGlzLmlzRm9vdGVyRW5hYmxlZCA9ICF0aGlzLmlzRm9vdGVyRW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1hcEZvcm1Ub0FwaShmb3JtOiBGb3JtR3JvdXAsIHN0YXR1czogc3RyaW5nKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm0udmFsdWU7XHJcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnd2FsbCcgPyB0aGlzLnNoZWxmQXJyYXkgOiB0aGlzLnBhbmVsQXJyYXk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgXCJzdGF0dXNcIjogc3RhdHVzLFxyXG4gICAgICBcImNsaWVudElkXCI6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIFwiZml4dHVyZUNhdGVnb3J5XCI6IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5LFxyXG4gICAgICBcImZpeHR1cmVDYXBhY2l0eVwiOiB0aGlzLnRvdGFsUHJvZHVjdENhcGFjaXR5LFxyXG4gICAgICBcImZpeHR1cmVMZW5ndGhcIjoge1xyXG4gICAgICAgIFwidmFsdWVcIjogZm9ybVZhbHVlLmJhc2ljRGV0YWlscy5sZW5ndGgsXHJcbiAgICAgICAgXCJ1bml0XCI6IFwiZnRcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImZpeHR1cmVXaWR0aFwiOiB7XHJcbiAgICAgICAgXCJ2YWx1ZVwiOiBmb3JtVmFsdWUuYmFzaWNEZXRhaWxzLndpZHRoLFxyXG4gICAgICAgIFwidW5pdFwiOiBcImZ0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJoZWFkZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdoZWFkZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJmb290ZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdmb290ZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJpc0JvZHlFbmFibGVkXCI6ICFmb3JtLmdldCgnYm9keScpPy5kaXNhYmxlZCxcclxuICAgICAgXCJzaGVsZkNvbmZpZ1wiOiBmb3JtQXJyYXkuY29udHJvbHMubWFwKChlLCBpKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNoZWxmTnVtYmVyOiBpICsgMSxcclxuICAgICAgICAgIHNoZWxmVHlwZTogZT8udmFsdWU/LnR5cGUgPz8gJ3RyYXknLFxyXG4gICAgICAgICAgcHJvZHVjdFBlclNoZWxmOiBlLnZhbHVlLnByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgICAgIHRyYXlSb3dzOiBlPy52YWx1ZT8ubm9PZlJvd3MgPz8gMSxcclxuICAgICAgICAgIGxhYmVsOiBlPy52YWx1ZT8ucGFuZWxOYW1lID8/ICcnXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU3VibWl0KHN0YXR1czogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtKCk7XHJcblxyXG4gICAgICBpZiAoZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiRm9ybSBpcyBpbnZhbGlkXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgaWYgKCFhd2FpdCB0aGlzLmNvbmZpcm1Db21wbGV0aW9uKCkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRoaXMubWFwRm9ybVRvQXBpKGZvcm0sIHN0YXR1cyk7XHJcblxyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVGaXh0dXJlTGlicmFyeSh0cmFuc2Zvcm1lZERhdGEsIHRoaXMuZml4dHVyZURldGFpbHM/Ll9pZCEpKTtcclxuXHJcbiAgICAgIGlmIChyZXMgJiYgcmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXMnXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiKTtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IHVwZGF0ZUZpeHR1cmVMaWJyYXJ5IGVycjpcIiwgZXJyKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVGaXh0dXJlTGlicmFyeSh0cmFuc2Zvcm1lZERhdGEsIHRoaXMuZml4dHVyZURldGFpbHM/Ll9pZCEpLnN1YnNjcmliZSh7XHJcbiAgICAvLyAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgLy8gICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAvLyAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgIC8vICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzJ10pO1xyXG4gICAgLy8gICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgLy8gICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiKTtcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpO1xyXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSlcclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5EZWFjdGl2YXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuY2FuR29CYWNrKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKGZvcm0uZGlydHkpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtRXhpdCgpO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm9uU3VibWl0KCdkcmFmdCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyBjb25maXJtRXhpdCgpOiBQcm9taXNlPGJvb2xlYW4gfCBudWxsPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihFeGl0Q29uZmlybWF0aW9uQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29uZmlybUNvbXBsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihDb21wbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSB9KTtcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gJ0NvbXBsZXRlIGZpeHR1cmUnO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSAnRml4dHVyZSBpcyBub3cgcmVhZHkgYW5kIGF2YWlsYWJsZSB0byBjcmVhdGUgYXMgdGVtcGxhdGUuJztcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLm5vdGUgPSAnWW91IGNhblxcJ3QgZWRpdCBpdCBvbmNlIGFzc2lnbmVkIHRvIHRoZSB0ZW1wbGF0ZS4nO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09ICdvaycpO1xyXG4gIH1cclxuXHJcbiAgb25EdXBsaWNhdGUoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZHVwbGljYXRlRml4dHVyZUxpYnJhcnkoe1xyXG4gICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZURldGFpbHMuX2lkXHJcbiAgICB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2NyZWF0ZS1saWJyYXJ5LWZpeHR1cmUnXSwgeyBxdWVyeVBhcmFtczogeyBmaXh0dXJlSWQ6IHJlcz8uZGF0YT8uaWQgfSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8ICdGYWlsZWQgdG8gZHVwbGljYXRlIEZpeHR1cmUnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZHVwbGljYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtRGVsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9ICdEZWxldGUgZml4dHVyZSc7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZml4dHVyZSA/JztcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25EZWxldGUoKSB7XHJcbiAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkKSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKENhbm5vdFBlcmZvcm1Db21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gYENhbuKAmXQgZGVsZXRlIGZpeHR1cmUhYDtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSBgU2luY2UgdGhpcyBmaXh0dXJlIGlzIGxpdmUgaW4gXCIke3RoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZH0gdGVtcGxhdGVzLFwiIGRlbGV0aW5nIGlzIG5vdCBhbGxvd2VkLmA7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpIHJldHVybjtcclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5kZWxldGVGaXh0dXJlTGlicmFyeSh7IGZpeHR1cmVJZDogdGhpcy5maXh0dXJlRGV0YWlscy5faWQgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBkZWxldGUgRml4dHVyZScpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycilcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tFZGl0KCkge1xyXG4gICAgaWYgKHRoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZCkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihDYW5ub3RQZXJmb3JtQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9IGBDYW7igJl0IGVkaXQgZml4dHVyZSFgO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBTaW5jZSB0aGlzIGZpeHR1cmUgaXMgbGl2ZSBpbiBcIiR7dGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkfSB0ZW1wbGF0ZXMsXCIgZWRpdGluZyBpcyBub3QgYWxsb3dlZC5gO1xyXG4gICAgICByZXR1cm5cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gdHJ1ZTtcclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybSgnaGVhZGVyJylcclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybSgnZm9vdGVyJylcclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5pc0JvZHlFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKCdib2R5JylcclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xyXG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxyXG4gICAgICByZXBsYWNlVXJsOiB0cnVlLFxyXG4gICAgICBxdWVyeVBhcmFtczogeyBpc0VkaXQ6IHRydWUgfSxcclxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn0iLCI8c2VjdGlvbiBpZD1cImJ1aWxkLWZpeHR1cmVcIiAqbmdJZj1cIiFpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPCEtLSBIZWFkZXIgc2VjdGlvbiAtLT5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnRzLWNlbnRlciBnYXAtNVwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBwLTNcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgZD1cIk0xNS44MzM0IDkuOTk5ODRINC4xNjY3NU00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSAxNS44MzMyTTQuMTY2NzUgOS45OTk4NEwxMC4wMDAxIDQuMTY2NVwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8aDJcclxuICAgICAgICBjbGFzcz1cIm0tMCBlbGxpcHNpc1wiXHJcbiAgICAgICAgc3R5bGU9XCJtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSA4NjBweClcIlxyXG4gICAgICAgIFtuZ2JUb29sdGlwXT1cImZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSArICcgLSAnICsgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy52YWx1ZSArICdmdCdcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5IH19IC0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy52YWx1ZSB9fVxyXG4gICAgICAgIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgPC9oMj5cclxuICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGRyYWZ0XCI+e3sgZml4dHVyZURldGFpbHMuc3RhdHVzIHwgdGl0bGVjYXNlIH19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudHMtY2VudGVyIGdhcC01XCI+XHJcbiAgICAgIDxwIGNsYXNzPVwibS0wIHRleHQtbm93cmFwXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscz8udXBkYXRlZEF0XCIgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgZGF0ZSA6ICdtZWRpdW0nXCI+XHJcbiAgICAgICAgTGFzdCB1cGRhdGU6IHt7IGZpeHR1cmVEZXRhaWxzLnVwZGF0ZWRBdCB8IHRpbWVBZ28gfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzEzMjJfNTMyNSlcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xMzIyXzUzMjVcIj5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICBFZGl0XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImlzRWRpdE1vZGVcIiBjbGFzcz1cImQtZmxleCBnYXAtNSBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtbm93cmFwXCIgKGNsaWNrKT1cIm9uU3VibWl0KCdkcmFmdCcpXCI+U2F2ZSBhcyBkcmFmdDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtbm93cmFwXCIgKGNsaWNrKT1cIm9uU3VibWl0KCdjb21wbGV0ZScpXCI+Q29tcGxldGU8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIiAqbmdJZj1cImZpeHR1cmVEZXRhaWxzPy5faWRcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHAtM1wiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTExIDEyQzExIDEyLjU1MjMgMTEuNDQ3NyAxMyAxMiAxM0MxMi41NTIzIDEzIDEzIDEyLjU1MjMgMTMgMTJDMTMgMTEuNDQ3NyAxMi41NTIzIDExIDEyIDExQzExLjQ0NzcgMTEgMTEgMTEuNDQ3NyAxMSAxMlpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTExIDE5QzExIDE5LjU1MjMgMTEuNDQ3NyAyMCAxMiAyMEMxMi41NTIzIDIwIDEzIDE5LjU1MjMgMTMgMTlDMTMgMTguNDQ3NyAxMi41NTIzIDE4IDEyIDE4QzExLjQ0NzcgMTggMTEgMTguNDQ3NyAxMSAxOVpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTExIDVDMTEgNS41NTIyOCAxMS40NDc3IDYgMTIgNkMxMi41NTIzIDYgMTMgNS41NTIyOCAxMyA1QzEzIDQuNDQ3NzIgMTIuNTUyMyA0IDEyIDRDMTEuNDQ3NyA0IDExIDQuNDQ3NzIgMTEgNVpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKClcIiAqbmdJZj1cIiFpc0VkaXRNb2RlXCI+RHVwbGljYXRlPC9hPjwvbGk+XHJcbiAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlciB0ZXh0LWRhbmdlclwiIChjbGljayk9XCJvbkRlbGV0ZSgpXCI+IERlbGV0ZSA8L2E+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gV2FsbCB0eXBlIGZpeHR1cmUgY3JlYXRpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICA8IS0tIFdhbGwgRml4dHVyZSBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgICAgPHA+Q29uZmlndXJlIHlvdXIgZml4dHVyZSBkZXRhaWxzIGhlcmU8L3A+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ3YWxsRml4dHVyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgPCEtLSBCYXNpYyBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5CQVNJQyBERVRBSUxTPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJiYXNpY0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgd2lkdGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgd2lkdGggY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBoZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNIZWFkZXJFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdoZWFkZXInKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkhFQURFUjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJoZWFkZXJcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzSGVhZGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJIZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaGVpZ2h0Py51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiIFtzdGVwXT1cIjAuNVwiIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8udG91Y2hlZCAmJiB3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/LmludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnaGVhZGVyLmhlaWdodCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiYm9keVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNCb2R5RW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignYm9keScpOyB3YWxsRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy00XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+Qk9EWTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJib2R5XCIgW2NsYXNzLmRpc2FibGVkXT1cIiFpc0JvZHlFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHNoZWx2ZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlLWNvdW50ZXJdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTUgMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2hlbGYoKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2hlbGZBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMTUzODkgMi45MTY1VjExLjA4MzJNMy4wNzA1NiA2Ljk5OTg0SDExLjIzNzJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNoZWxmQXJyYXkubGVuZ3RoIDwgMSAmJiBpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHNoZWxmIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNoZWxmQXJyYXk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNoZWxmIG9mIHNoZWxmQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiYXJyYXktZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TaGVsZiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTaGVsZihpKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5OEEyQjNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJzaGVsZlR5cGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNoZWxmLmdldCgndHlwZScpPy52YWx1ZSA9PT0gJ3RyYXknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInNoZWxmLmdldCgnbm9PZlJvd3MnKT8uaGFzRXJyb3IoJ21pbicpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2FwYWNpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy50b3VjaGVkICYmIHNoZWxmLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2hlbGYuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBGb290ZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0Zvb3RlckVuYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlY3Rpb24oJ2Zvb3RlcicpOyB3YWxsRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy00XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+Rk9PVEVSPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImZvb3RlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNGb290ZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIkhlaWdodCAoXCIgKyAoZml4dHVyZURldGFpbHMuZm9vdGVyPy5oZWlnaHQ/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVpZ2h0XCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy50b3VjaGVkICYmIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8uaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdmb290ZXIuaGVpZ2h0Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEZvb3RlciBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFdhbGwgRml4dHVyZSBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJpc0JvZHlFbmFibGVkIHx8IGlzSGVhZGVyRW5hYmxlZCB8fCBpc0Zvb3RlckVuYWJsZWQ7IGVsc2UgZW1wdHlGaXh0dXJlXCJcclxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGVuZ3RoIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgZGltZW5zaW9uQXJyb3dzO1xyXG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzSGVhZGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWJsb2NrXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5IRUFERVI8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBCb2R5IFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWJsb2NrXCIgKm5nSWY9XCJpc0JvZHlFbmFibGVkICYmIHNoZWxmQXJyYXkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzaGVsZkFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICBAaWYoaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09J3NoZWxmJyl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2sgc2hlbGZcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgIFNIRUxGIHt7IGkgKyAxIH19IDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgfX08L2I+XHJcbiAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgU0hFTEYge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJtcy0zXCI+UHJvZHVjdHM6IHt7IGl0ZW0uZ2V0KFwicHJvZHVjdENhcGFjaXR5XCIpPy52YWx1ZSAqIChpdGVtLmdldChcIm5vT2ZSb3dzXCIpPy52YWx1ZSA/PyAxKSB9fTwvYj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyIGZvb3Rlci1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgaC0xMDAgZ2FwLTMgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzdWItZm9vdGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc3ViLWZvb3RlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5GT09URVI8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUZpeHR1cmU+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtbiBoLTEwMFwiPlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YW1haW50ZXh0IG10LTNcIj5QcmV2aWV3IHJlcXVpcmVzIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IGJsb2NrIGVuYWJsZWQuPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFzdWJ0ZXh0XCI+UGxlYXNlIGVuYWJsZSBlaXRoZXIgdGhlIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IHRvIHZpZXcgdGhlIHByZXZpZXcuLjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEluZm8gQ2FyZHMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IHNoZWxmQXJyYXkubGVuZ3RoIH19PC9oMz5cclxuICAgICAgICAgIDxwPk5vIG9mIFNoZWx2ZXM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIik/LnZhbHVlIH19IHgge3sgd2FsbEZpeHR1cmVGb3JtLmdldChcImJhc2ljRGV0YWlscy5sZW5ndGhcIik/LnZhbHVlIH19IGZlZXRcclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBGbG9vciB0eXBlIGZpeHR1cmUgY3JlYXRpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ2Zsb29yJ1wiPlxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgICAgPHA+VGhlIHNldHRpbmdzIGFyZSBwcmUtY29uZmlndXJlZCBhbmQgY2Fubm90IGJlIGVkaXRlZDwvcD5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZsb29yRml4dHVyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgPCEtLSBCYXNpYyBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5CQVNJQyBERVRBSUxTPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJiYXNpY0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAoZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCB3aWR0aCBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgbGVuZ3RoIChcIiArIChmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFBhbmVsIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPlBBTkVMPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHBhbmVsczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhbmVsKCk7IGZsb29yRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjc2Mjk0IDdIMTEuOTI5NlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhbmVsQXJyYXkubGVuZ3RoIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNSAxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWxBcnJheS5sZW5ndGggPCAxICYmIGlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhbmVsIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwicGFuZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcGFuZWwgb2YgcGFuZWxBcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+UGFuZWwge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhbmVsKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjOThBMkIzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBhbmVsTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInBhbmVsTmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZWwgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lbCBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgcGFuZWwuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ25vT2ZSb3dzJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlByb2R1Y3QgY2FwYWNpdHkgZm9yIGVhY2ggcm93PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoOyBlbHNlIG5vUGFuZWxcIiBjbGFzcz1cImZsb29yLXBhbmVsLXZpZXdwb3J0IHctMTAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFuZWxBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGdhcC01XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGxlbmd0aCB9fSB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgnbm9PZlJvd3MnKT8udmFsdWUpXCIgY2xhc3M9XCJwYW5lbCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUEFORUwge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTUgbXQtNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI0cHhcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDY0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDUzMCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk01MjIuNjUzIDAuMjkyODkzQzUyMi4yNjMgLTAuMDk3NjMxNSA1MjEuNjMgLTAuMDk3NjMxNCA1MjEuMjM5IDAuMjkyODkzTDUxNC44NzUgNi42NTY4NUM1MTQuNDg1IDcuMDQ3MzggNTE0LjQ4NSA3LjY4MDU0IDUxNC44NzUgOC4wNzEwN0M1MTUuMjY2IDguNDYxNTkgNTE1Ljg5OSA4LjQ2MTU5IDUxNi4yODkgOC4wNzEwN0w1MjEuOTQ2IDIuNDE0MjFMNTI3LjYwMyA4LjA3MTA3QzUyNy45OTQgOC40NjE1OSA1MjguNjI3IDguNDYxNTkgNTI5LjAxNyA4LjA3MTA3QzUyOS40MDggNy42ODA1NCA1MjkuNDA4IDcuMDQ3MzggNTI5LjAxNyA2LjY1Njg1TDUyMi42NTMgMC4yOTI4OTNaTTUyMi45NDYgMTRMNTIyLjk0NiAxTDUyMC45NDYgMUw1MjAuOTQ2IDE0TDUyMi45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMzk0LjE1MyAwLjI5Mjg5M0MzOTMuNzYzIC0wLjA5NzYzMTUgMzkzLjEzIC0wLjA5NzYzMTQgMzkyLjczOSAwLjI5Mjg5M0wzODYuMzc1IDYuNjU2ODVDMzg1Ljk4NSA3LjA0NzM4IDM4NS45ODUgNy42ODA1NCAzODYuMzc1IDguMDcxMDdDMzg2Ljc2NiA4LjQ2MTU5IDM4Ny4zOTkgOC40NjE1OSAzODcuNzg5IDguMDcxMDdMMzkzLjQ0NiAyLjQxNDIxTDM5OS4xMDMgOC4wNzEwN0MzOTkuNDk0IDguNDYxNTkgNDAwLjEyNyA4LjQ2MTU5IDQwMC41MTcgOC4wNzEwN0M0MDAuOTA4IDcuNjgwNTQgNDAwLjkwOCA3LjA0NzM4IDQwMC41MTcgNi42NTY4NUwzOTQuMTUzIDAuMjkyODkzWk0zOTQuNDQ2IDE0TDM5NC40NDYgMUwzOTIuNDQ2IDFMMzkyLjQ0NiAxNEwzOTQuNDQ2IDE0WlwiXHJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICBkPVwiTTI2NS42NTMgMC4yOTI4OTNDMjY1LjI2MyAtMC4wOTc2MzE1IDI2NC42MyAtMC4wOTc2MzE0IDI2NC4yMzkgMC4yOTI4OTNMMjU3Ljg3NSA2LjY1Njg1QzI1Ny40ODUgNy4wNDczOCAyNTcuNDg1IDcuNjgwNTQgMjU3Ljg3NSA4LjA3MTA3QzI1OC4yNjYgOC40NjE1OSAyNTguODk5IDguNDYxNTkgMjU5LjI4OSA4LjA3MTA3TDI2NC45NDYgMi40MTQyMUwyNzAuNjAzIDguMDcxMDdDMjcwLjk5NCA4LjQ2MTU5IDI3MS42MjcgOC40NjE1OSAyNzIuMDE3IDguMDcxMDdDMjcyLjQwOCA3LjY4MDU0IDI3Mi40MDggNy4wNDczOCAyNzIuMDE3IDYuNjU2ODVMMjY1LjY1MyAwLjI5Mjg5M1pNMjY1Ljk0NiAxNEwyNjUuOTQ2IDFMMjYzLjk0NiAxTDI2My45NDYgMTRMMjY1Ljk0NiAxNFpcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMzcuMTUzIDAuMjkyODkzQzEzNi43NjMgLTAuMDk3NjMxNSAxMzYuMTMgLTAuMDk3NjMxNCAxMzUuNzM5IDAuMjkyODkzTDEyOS4zNzUgNi42NTY4NUMxMjguOTg1IDcuMDQ3MzggMTI4Ljk4NSA3LjY4MDU0IDEyOS4zNzUgOC4wNzEwN0MxMjkuNzY2IDguNDYxNTkgMTMwLjM5OSA4LjQ2MTU5IDEzMC43ODkgOC4wNzEwN0wxMzYuNDQ2IDIuNDE0MjFMMTQyLjEwMyA4LjA3MTA3QzE0Mi40OTQgOC40NjE1OSAxNDMuMTI3IDguNDYxNTkgMTQzLjUxNyA4LjA3MTA3QzE0My45MDggNy42ODA1NCAxNDMuOTA4IDcuMDQ3MzggMTQzLjUxNyA2LjY1Njg1TDEzNy4xNTMgMC4yOTI4OTNaTTEzNy40NDYgMTRMMTM3LjQ0NiAxTDEzNS40NDYgMUwxMzUuNDQ2IDE0TDEzNy40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNOC42NTM0IDAuMjkyODkzQzguMjYyODcgLTAuMDk3NjMxNSA3LjYyOTcxIC0wLjA5NzYzMTQgNy4yMzkxOCAwLjI5Mjg5M0wwLjg3NTIyMSA2LjY1Njg1QzAuNDg0Njk3IDcuMDQ3MzggMC40ODQ2OTcgNy42ODA1NCAwLjg3NTIyMSA4LjA3MTA3QzEuMjY1NzUgOC40NjE1OSAxLjg5ODkxIDguNDYxNTkgMi4yODk0MyA4LjA3MTA3TDcuOTQ2MjkgMi40MTQyMUwxMy42MDMxIDguMDcxMDdDMTMuOTkzNyA4LjQ2MTU5IDE0LjYyNjggOC40NjE1OSAxNS4wMTc0IDguMDcxMDdDMTUuNDA3OSA3LjY4MDU0IDE1LjQwNzkgNy4wNDczOCAxNS4wMTc0IDYuNjU2ODVMOC42NTM0IDAuMjkyODkzWk04Ljk0NjI5IDE0TDguOTQ2MjkgMUw2Ljk0NjI5IDFMNi45NDYyOSAxNEw4Ljk0NjI5IDE0WlwiXHJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1N1wiIGhlaWdodD1cIjQzXCIgdmlld0JveD1cIjAgMCA1NyA0M1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0wLjQzOTY5NyAzMS44MDg3QzAuNDM5Njk3IDI2Ljg2NCA0LjQ0ODIgMjIuODU1NSA5LjM5Mjk0IDIyLjg1NTVINDcuNDY4MUM1Mi40MjMgMjIuODU1NSA1Ni40Mzk3IDI2Ljg3MjIgNTYuNDM5NyAzMS44MjdDNTYuNDM5NyAzNy4zMjU1IDUxLjUzNzMgNDEuNDk5NCA0Ni4wNzY1IDQwLjg1NzFDMzMuNjMxOCAzOS4zOTM1IDIzLjcyNjcgMzkuMzIwNiAxMC44MTg2IDQwLjgzNzZDNS4zNTU0MiA0MS40Nzk2IDAuNDM5Njk3IDM3LjMwOTUgMC40Mzk2OTcgMzEuODA4N1pcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI4LjQ0MDhcIiBjeT1cIjE2LjU3MTRcIiByPVwiMTUuMDcxNFwiIGZpbGw9XCIjMUQyOTM5XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1BhbmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+QWRkIGEgcGFuZWwgdG8gc2VlIHlvdXIgcHJldmlldy48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UbyBzZWUgeW91ciBwcmV2aWV3LCBwbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBwYW5lbC48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBQYW5lbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4IHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLmxlbmd0aFwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlLXNrZWxldG9uXCIgKm5nSWY9XCJpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjwhLS0gQ29tbW9uIGRpbWVuc2lvbiBhcnJvd3MgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGltZW5zaW9uQXJyb3dzIGxldC1sYWJlbD1cImxhYmVsXCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8ZGl2IGNsYXNzPVwiaG9yaXpvbnRhbC1kaW1lbnNpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBsZWZ0XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInZhbHVlXCI+e3sgdmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyByaWdodFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
|
|
473
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tc3RvcmUtYnVpbGRlci9zcmMvbGliL2NvbXBvbmVudHMvY3JlYXRlLWZpeHR1cmUvY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFxQyxVQUFVLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakgsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQVksVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEYsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSzNHLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBQ2hILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQzFHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBRXBHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRTNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7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QUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQTdlVSxzQkFBc0I7NEZBQXRCLHNCQUFzQiw4RUM1Qm5DLDYvNkNBKzJCQSxrdmFEcjFCWSxxQkFBcUIsMklBQUUsVUFBVSwwVEFBRSxXQUFXLDJwQkFBRSxtQkFBbUIsNmhCQUFFLFlBQVksa2hCQUFFLFdBQVcsK0NBQUUsa0JBQWtCLDYxQkFBRSx1QkFBdUIseU5BQUUsVUFBVTs7NEZBRXRKLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxvQkFBb0IsY0FHbEIsSUFBSSxXQUNQLENBQUMscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUFycmF5LCBWYWxpZGF0b3JzLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE5nYkFjY29yZGlvbk1vZHVsZSwgTmdiTW9kYWwsIE5nYlRvb2x0aXAgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmlyc3RWYWx1ZUZyb20sIG1hcCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmUtYnVpbGRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRml4dHVyZUxpYnJhcnlEZXRhaWxzLCBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maXh0dXJlLWxpYnJhcnkuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgRHJvcGRvd25JRiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGxhbm8tZ2VuZXJhbC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBDb21wbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9jb21wbGV0ZS1jb25maXJtYXRpb24vY29tcGxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9kZWxldGUtY29uZmlybWF0aW9uL2RlbGV0ZS1jb25maXJtYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgRXhpdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BvcHVwcy9leGl0LWNvbmZpcm1hdGlvbi9leGl0LWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDYW5FeGl0R3VhcmQgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZXhpdC5ndWFyZCc7XHJcbmltcG9ydCB7IENhbm5vdFBlcmZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9wb3B1cHMvY2Fubm90LXBlcmZvcm0vY2Fubm90LXBlcmZvcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlLCBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgVGltZUFnb1BpcGUgfSBmcm9tICcuLi8uLi9waXBlcy90aW1lLWFnby5waXBlJztcclxuaW1wb3J0IHsgQ291bnRlcklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vY291bnRlci1pbnB1dC9jb3VudGVyLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJlYWN0aXZlU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBnZW5lcmFsVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWNyZWF0ZS1maXh0dXJlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLWZpeHR1cmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9jcmVhdGUtZml4dHVyZS5jb21wb25lbnQuc2NzcycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ291bnRlcklucHV0Q29tcG9uZW50LCBOZ2JUb29sdGlwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgQ29tbW9uTW9kdWxlLCBUaW1lQWdvUGlwZSwgTmdiQWNjb3JkaW9uTW9kdWxlLCBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCwgUm91dGVyTGlua11cclxufSlcclxuZXhwb3J0IGNsYXNzIENyZWF0ZUZpeHR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ2FuRXhpdEd1YXJkIHtcclxuICBjbGllbnRJZDogc3RyaW5nO1xyXG5cclxuICB3YWxsRml4dHVyZUZvcm06IEZvcm1Hcm91cDtcclxuICBmbG9vckZpeHR1cmVGb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gIGlzUGFnZUxvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBmaXh0dXJlRGV0YWlsczogRml4dHVyZUxpYnJhcnlEZXRhaWxzID0ge307XHJcbiAgaXNFZGl0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBpc0hlYWRlckVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzRm9vdGVyRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNCb2R5RW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIGNhbkdvQmFjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICByZWFkb25seSBzaGVsZlR5cGVzOiBEcm9wZG93bklGW10gPSBbXHJcbiAgICB7IGxhYmVsOiAnU2hlbGYnLCB2YWx1ZTogJ3NoZWxmJyB9LFxyXG4gICAgeyBsYWJlbDogJ1RyYXknLCB2YWx1ZTogJ3RyYXknIH1cclxuICBdO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzdG9yZUJ1aWxkZXJTZXJ2aWNlOiBTdG9yZUJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgbmdiTW9kYWw6IE5nYk1vZGFsLFxyXG4gICAgcHJpdmF0ZSBwYWdlSW5mbzogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xyXG4gICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCA9IHBhcmFtc1snZml4dHVyZUlkJ10gPz8gJyc7XHJcblxyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gcGFyYW1zWydpc0VkaXQnXSA9PSAndHJ1ZSc7XHJcblxyXG4gICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLl9pZCkge1xyXG4gICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlcyddKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRDbGllbnRJZCgpO1xyXG5cclxuICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXNcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKHBhcmFtcyA9PiBwYXJhbXNbJ2ZpeHR1cmVJZCddKSwgZmlsdGVyKGlkID0+ICEhaWQpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcclxuICAgICAgKS5zdWJzY3JpYmUoYXN5bmMgaWQgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5nZXRGaXh0dXJlTGlicmFyeURldGFpbHMoaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGRldGFpbHMgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgaWYgKGRldGFpbHMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzID0ge1xyXG4gICAgICAgICAgICAgICAgLi4uZGV0YWlsc1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc1BhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW5Hb0JhY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBmZXRjaCBmaXh0dXJlIGRldGFpbHNcIik7XHJcbiAgICAgICAgICAgIHRoaXMuaXNQYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmlzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiQ3JlYXRlIEZpeHR1cmVcIik7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldEJyZWFkY3J1bWJzKFtcclxuICAgICAgeyB0aXRsZTogXCJQbGFub2dyYW1cIiwgcGF0aDogXCIvbWFuYWdlL3BsYW5vZ3JhbS9tYW5hZ2UtcGxhbm9ncmFtc1wiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxyXG4gICAgICB7IHRpdGxlOiBcIlwiLCBwYXRoOiBcIlwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiTGlicmFyeVwiLCBwYXRoOiBcIi9tYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXNcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogXCJcIiwgcGF0aDogXCJcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbGllbnRJZCgpIHtcclxuXHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgLy8gU3Vic2NyaXB0aW9uIHdpbGwgYmUgY2FuY2VsbGVkIG9uIGNvbXBvbmVudCBkZXN0cm95LlxyXG4gICAgICBkZWJvdW5jZVRpbWUoMjAwKSwgLy8gVG8gYXZvaWQgaW1tZWRpYXRlIGZyZXF1ZW50IGNhbGxzLiBcclxuICAgICAgZmlsdGVyKGRhdGEgPT4gISFkYXRhKSwgLy8gRmlsdGVyaW5nIG51bGwvdW5kZWZpbmVkLlxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpIC8vIEVtaXR0aW5nIG9ubHkgZGlmZmVyZW50IHZhbHVlcy4gKElnbm9yZXMgc2FtZSBjbGllbnRJZCkuXHJcbiAgICApLnN1YnNjcmliZShhc3luYyAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChkYXRhPy5jbGllbnQpIHtcclxuICAgICAgICB0aGlzLmNsaWVudElkID0gZGF0YT8uY2xpZW50O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBoZWFkZXJEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBoZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnd2FsbCcpIHtcclxuICAgICAgdGhpcy5pbml0V2FsbEZpeHR1cmVGb3JtKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRGbG9vclBhbmVsRml4dHVyZUZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlKSB7XHJcbiAgICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uKCdoZWFkZXInKVxyXG4gICAgICBpZiAoIXRoaXMuZml4dHVyZURldGFpbHMuZm9vdGVyPy5pc0VuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbignZm9vdGVyJylcclxuICAgICAgaWYgKCF0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQpIHRoaXMudG9nZ2xlU2VjdGlvbignYm9keScpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndhbGxGaXh0dXJlRm9ybT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSlcclxuICAgICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KVxyXG5cclxuICAgICAgdGhpcy5pc0hlYWRlckVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaXNFbmFibGVkID8/IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzQm9keUVuYWJsZWQgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmlzQm9keUVuYWJsZWQgPz8gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNGb290ZXJFbmFibGVkID0gdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCA/PyBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZvcm0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnID8gdGhpcy53YWxsRml4dHVyZUZvcm0gOiB0aGlzLmZsb29yRml4dHVyZUZvcm1cclxuICB9XHJcblxyXG4gIGdldCBzaGVsZkFycmF5KCk6IEZvcm1BcnJheSB7XHJcbiAgICByZXR1cm4gdGhpcy53YWxsRml4dHVyZUZvcm0uZ2V0KCdib2R5LnNoZWxmJykgYXMgRm9ybUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhbmVsQXJyYXkoKTogRm9ybUFycmF5IHtcclxuICAgIHJldHVybiB0aGlzLmZsb29yRml4dHVyZUZvcm0uZ2V0KCdwYW5lbCcpIGFzIEZvcm1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFByb2R1Y3RDYXBhY2l0eSgpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnID8gdGhpcy5zaGVsZkFycmF5IDogdGhpcy5wYW5lbEFycmF5O1xyXG5cclxuICAgIHJldHVybiBmb3JtQXJyYXkuY29udHJvbHMucmVkdWNlKCh0b3RhbCwgaXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBjb3VudCA9IGl0ZW0uZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udmFsdWUgfHwgMDtcclxuICAgICAgY29uc3QgaXNUcmF5ID0gaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09ICd0cmF5JztcclxuICAgICAgY29uc3Qgcm93cyA9IGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSB8fCAxO1xyXG5cclxuICAgICAgLy8gSWYgdGhlIGZpeHR1cmUgaXMgYSBmbG9vciBwYW5lbCBvciB0cmF5LCB3ZSBuZWVkIHRvIG11bHRpcGx5IHRoZSBwcm9kdWN0IGNhcGFjaXR5IGJ5IHRoZSBudW1iZXIgb2Ygcm93c1xyXG4gICAgICByZXR1cm4gdG90YWwgKyAoaXNUcmF5IHx8IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgPT09ICdmbG9vcicgPyBjb3VudCAqIHJvd3MgOiBjb3VudCk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGluaXRXYWxsRml4dHVyZUZvcm0oKSB7XHJcbiAgICB0aGlzLndhbGxGaXh0dXJlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBiYXNpY0RldGFpbHM6IHRoaXMuZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCksXHJcbiAgICAgIGhlYWRlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uaGVhZGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMCxdXHJcbiAgICAgIH0pLFxyXG4gICAgICBib2R5OiB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICBzaGVsZjogdGhpcy5mYi5hcnJheShbXSlcclxuICAgICAgfSksXHJcbiAgICAgIGZvb3RlcjogdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgaGVpZ2h0OiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZm9vdGVyPy5oZWlnaHQ/LnZhbHVlID8/IDMwMCxdXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKHMgPT4gdGhpcy5hZGRTaGVsZihzKSlcclxuXHJcbiAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5zaGVsZkNvbmZpZz8ubGVuZ3RoID09PSAwICYmICF0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSkge1xyXG4gICAgICB0aGlzLmFkZFNoZWxmKClcclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy53YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aCkge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBpbml0Rmxvb3JQYW5lbEZpeHR1cmVGb3JtKCkge1xyXG4gICAgdGhpcy5mbG9vckZpeHR1cmVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGJhc2ljRGV0YWlsczogdGhpcy5nZXRCYXNpY0RldGFpbHNGb3JtR3JvdXAoKSxcclxuICAgICAgcGFuZWw6IHRoaXMuZmIuYXJyYXkoW10pXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnNoZWxmQ29uZmlnPy5mb3JFYWNoKHMgPT4gdGhpcy5hZGRQYW5lbChzKSlcclxuXHJcbiAgICB0aGlzLmZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5ID0gdmFsdWU7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy5maXh0dXJlV2lkdGgpIHtcclxuICAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aC52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0QmFzaWNEZXRhaWxzRm9ybUdyb3VwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBmaXh0dXJlQ2F0ZWdvcnk6IFt0aGlzLmZpeHR1cmVEZXRhaWxzPy5maXh0dXJlQ2F0ZWdvcnkgfHwgJ1VudGl0bGVkJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGdlbmVyYWxWYWxpZGF0b3IoKV1dLFxyXG4gICAgICB3aWR0aDogW3RoaXMuZml4dHVyZURldGFpbHM/LmZpeHR1cmVXaWR0aD8udmFsdWUgPz8gNiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDAuNSldXSxcclxuICAgICAgbGVuZ3RoOiBbdGhpcy5maXh0dXJlRGV0YWlscz8uZml4dHVyZUxlbmd0aD8udmFsdWUgPz8gMTIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwLjUpXV1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhZGRTaGVsZihzaGVsZj86IEZpeHR1cmVMaWJyYXJ5U2hlbGZDb25maWcpIHtcclxuICAgIGNvbnN0IHNoZWxmR3JvdXAgPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgdHlwZTogW3NoZWxmPy5zaGVsZlR5cGUgfHwgJ3NoZWxmJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHByb2R1Y3RDYXBhY2l0eTogW3NoZWxmPy5wcm9kdWN0UGVyU2hlbGYgPz8gNiwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDApXV0sXHJcbiAgICAgIG5vT2ZSb3dzOiBbc2hlbGY/LnRyYXlSb3dzID8/IDFdXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cCk7XHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucHVzaChzaGVsZkdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vICB3ZSBuZWVkIHRvIHNldHVwIGEgbGlzdGVuZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHNoZWxmIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBub09mUm93cyBmaWVsZFxyXG4gIHNldHVwU2hlbGZUeXBlTGlzdGVuZXIoc2hlbGZHcm91cDogRm9ybUdyb3VwKSB7XHJcbiAgICBzaGVsZkdyb3VwLmdldCgndHlwZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHR5cGUgPT4ge1xyXG4gICAgICBjb25zdCBub09mUm93c0NvbnRyb2wgPSBzaGVsZkdyb3VwLmdldCgnbm9PZlJvd3MnKTtcclxuICAgICAgaWYgKHR5cGUgPT09ICd0cmF5Jykge1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldKTtcclxuICAgICAgICBub09mUm93c0NvbnRyb2w/LnNldFZhbHVlKDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vT2ZSb3dzQ29udHJvbD8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgbm9PZlJvd3NDb250cm9sPy5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgfVxyXG4gICAgICBub09mUm93c0NvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gSWYgaW5kZXggaXMgbm90IGdpdmVuLCBsYXN0IHNoZWxmIHNob3VsZCBiZSByZW1vdmVkXHJcbiAgcmVtb3ZlU2hlbGYoaW5kZXg6IG51bWJlciA9IHRoaXMuc2hlbGZBcnJheS5jb250cm9scy5sZW5ndGggLSAxKSB7XHJcbiAgICBpZiAodGhpcy5zaGVsZkFycmF5LmNvbnRyb2xzLmxlbmd0aCA9PSAxKSByZXR1cm47XHJcbiAgICB0aGlzLnNoZWxmQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgYWRkUGFuZWwocGFuZWw/OiBGaXh0dXJlTGlicmFyeVNoZWxmQ29uZmlnKSB7XHJcbiAgICBjb25zdCBwYW5lbEdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHBhbmVsTmFtZTogW3BhbmVsPy5sYWJlbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGdlbmVyYWxWYWxpZGF0b3IoKV1dLFxyXG4gICAgICBwcm9kdWN0Q2FwYWNpdHk6IFtwYW5lbD8ucHJvZHVjdFBlclNoZWxmID8/IDYsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigwKV1dLFxyXG4gICAgICBub09mUm93czogW3BhbmVsPy50cmF5Um93cyA/PyA1LCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldXVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5wYW5lbEFycmF5LnB1c2gocGFuZWxHcm91cCk7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBpbmRleCBpcyBub3QgZ2l2ZW4sIGxhc3QgcGFuZWwgc2hvdWxkIGJlIHJlbW92ZWRcclxuICByZW1vdmVQYW5lbChpbmRleDogbnVtYmVyID0gdGhpcy5wYW5lbEFycmF5LmNvbnRyb2xzLmxlbmd0aCAtIDEpIHtcclxuICAgIGlmICh0aGlzLnBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoID09IDEpIHJldHVybjtcclxuICAgIHRoaXMucGFuZWxBcnJheS5yZW1vdmVBdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWN0aW9uKHNlY3Rpb246ICdoZWFkZXInIHwgJ2JvZHknIHwgJ2Zvb3RlcicpIHtcclxuICAgIHRoaXMudG9nZ2xlU2VjdGlvbkZvcm0oc2VjdGlvbik7XHJcbiAgICB0aGlzLnRvZ2dsZVNlY3Rpb25DaGVja0JveChzZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb25Gb3JtKHNlY3Rpb246ICdoZWFkZXInIHwgJ2JvZHknIHwgJ2Zvb3RlcicpIHtcclxuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmdldEZvcm0oKTtcclxuICAgIGNvbnN0IGdyb3VwID0gZm9ybS5nZXQoc2VjdGlvbik7XHJcbiAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgZ3JvdXAuZW5hYmxlZCA/IGdyb3VwLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pIDogZ3JvdXAuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZVNlY3Rpb25DaGVja0JveChzZWN0aW9uOiAnaGVhZGVyJyB8ICdib2R5JyB8ICdmb290ZXInKSB7XHJcbiAgICBzd2l0Y2ggKHNlY3Rpb24pIHtcclxuICAgICAgY2FzZSAnaGVhZGVyJzpcclxuICAgICAgICB0aGlzLmlzSGVhZGVyRW5hYmxlZCA9ICF0aGlzLmlzSGVhZGVyRW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnYm9keSc6XHJcbiAgICAgICAgdGhpcy5pc0JvZHlFbmFibGVkID0gIXRoaXMuaXNCb2R5RW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZm9vdGVyJzpcclxuICAgICAgICB0aGlzLmlzRm9vdGVyRW5hYmxlZCA9ICF0aGlzLmlzRm9vdGVyRW5hYmxlZDtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1hcEZvcm1Ub0FwaShmb3JtOiBGb3JtR3JvdXAsIHN0YXR1czogc3RyaW5nKTogYW55IHtcclxuICAgIGNvbnN0IGZvcm1WYWx1ZSA9IGZvcm0udmFsdWU7XHJcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZpeHR1cmVEZXRhaWxzLmZpeHR1cmVUeXBlID09PSAnd2FsbCcgPyB0aGlzLnNoZWxmQXJyYXkgOiB0aGlzLnBhbmVsQXJyYXk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgXCJzdGF0dXNcIjogc3RhdHVzLFxyXG4gICAgICBcImNsaWVudElkXCI6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIFwiZml4dHVyZUNhdGVnb3J5XCI6IHRoaXMuZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5LFxyXG4gICAgICBcImZpeHR1cmVDYXBhY2l0eVwiOiB0aGlzLnRvdGFsUHJvZHVjdENhcGFjaXR5LFxyXG4gICAgICBcImZpeHR1cmVMZW5ndGhcIjoge1xyXG4gICAgICAgIFwidmFsdWVcIjogZm9ybVZhbHVlLmJhc2ljRGV0YWlscy5sZW5ndGgsXHJcbiAgICAgICAgXCJ1bml0XCI6IFwiZnRcIlxyXG4gICAgICB9LFxyXG4gICAgICBcImZpeHR1cmVXaWR0aFwiOiB7XHJcbiAgICAgICAgXCJ2YWx1ZVwiOiBmb3JtVmFsdWUuYmFzaWNEZXRhaWxzLndpZHRoLFxyXG4gICAgICAgIFwidW5pdFwiOiBcImZ0XCJcclxuICAgICAgfSxcclxuICAgICAgXCJoZWFkZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdoZWFkZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJmb290ZXJcIjoge1xyXG4gICAgICAgIFwiaGVpZ2h0XCI6IHtcclxuICAgICAgICAgIFwidmFsdWVcIjogZm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8udmFsdWUsXHJcbiAgICAgICAgICBcInVuaXRcIjogXCJtbVwiXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcImxhYmVsXCI6IFwiXCIsXHJcbiAgICAgICAgXCJpc0VuYWJsZWRcIjogIWZvcm0uZ2V0KCdmb290ZXInKT8uZGlzYWJsZWRcclxuICAgICAgfSxcclxuICAgICAgXCJpc0JvZHlFbmFibGVkXCI6ICFmb3JtLmdldCgnYm9keScpPy5kaXNhYmxlZCxcclxuICAgICAgXCJzaGVsZkNvbmZpZ1wiOiBmb3JtQXJyYXkuY29udHJvbHMubWFwKChlLCBpKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHNoZWxmTnVtYmVyOiBpICsgMSxcclxuICAgICAgICAgIHNoZWxmVHlwZTogZT8udmFsdWU/LnR5cGUgPz8gJ3RyYXknLFxyXG4gICAgICAgICAgcHJvZHVjdFBlclNoZWxmOiBlLnZhbHVlLnByb2R1Y3RDYXBhY2l0eSxcclxuICAgICAgICAgIHRyYXlSb3dzOiBlPy52YWx1ZT8ubm9PZlJvd3MgPz8gMSxcclxuICAgICAgICAgIGxhYmVsOiBlPy52YWx1ZT8ucGFuZWxOYW1lID8/ICcnXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU3VibWl0KHN0YXR1czogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtKCk7XHJcblxyXG4gICAgICBpZiAoZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgICAgZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KFwiRm9ybSBpcyBpbnZhbGlkXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHN0YXR1cyA9PT0gJ2NvbXBsZXRlJykgaWYgKCFhd2FpdCB0aGlzLmNvbmZpcm1Db21wbGV0aW9uKCkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRoaXMubWFwRm9ybVRvQXBpKGZvcm0sIHN0YXR1cyk7XHJcblxyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVGaXh0dXJlTGlicmFyeSh0cmFuc2Zvcm1lZERhdGEsIHRoaXMuZml4dHVyZURldGFpbHM/Ll9pZCEpKTtcclxuXHJcbiAgICAgIGlmIChyZXMgJiYgcmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgIHRoaXMuZml4dHVyZURldGFpbHMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydtYW5hZ2UvcGxhbm9ncmFtL2xpYnJhcnkvZml4dHVyZXMnXSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiKTtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IHVwZGF0ZUZpeHR1cmVMaWJyYXJ5IGVycjpcIiwgZXJyKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS51cGRhdGVGaXh0dXJlTGlicmFyeSh0cmFuc2Zvcm1lZERhdGEsIHRoaXMuZml4dHVyZURldGFpbHM/Ll9pZCEpLnN1YnNjcmliZSh7XHJcbiAgICAvLyAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgLy8gICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAvLyAgICAgICB0aGlzLmZpeHR1cmVEZXRhaWxzLnN0YXR1cyA9IHN0YXR1cztcclxuICAgIC8vICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzJ10pO1xyXG4gICAgLy8gICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgLy8gICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5lcnJvciA/PyBcIkZhaWxlZCB0byBzYXZlIEZpeHR1cmUgZGV0YWlsc1wiKTtcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhcIkBAIH4gdXBkYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpO1xyXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSlcclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYW5EZWFjdGl2YXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuY2FuR29CYWNrKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBmb3JtID0gdGhpcy5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKGZvcm0uZGlydHkpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25maXJtRXhpdCgpO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm9uU3VibWl0KCdkcmFmdCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyBjb25maXJtRXhpdCgpOiBQcm9taXNlPGJvb2xlYW4gfCBudWxsPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihFeGl0Q29uZmlybWF0aW9uQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29uZmlybUNvbXBsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihDb21wbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSB9KTtcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gJ0NvbXBsZXRlIGZpeHR1cmUnO1xyXG4gICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSAnRml4dHVyZSBpcyBub3cgcmVhZHkgYW5kIGF2YWlsYWJsZSB0byBjcmVhdGUgYXMgdGVtcGxhdGUuJztcclxuICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLm5vdGUgPSAnWW91IGNhblxcJ3QgZWRpdCBpdCBvbmNlIGFzc2lnbmVkIHRvIHRoZSB0ZW1wbGF0ZS4nO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCBtb2RlbFJlZi5yZXN1bHQudGhlbjxib29sZWFuPigocmVzdWx0KSA9PiByZXN1bHQgPT09ICdvaycpO1xyXG4gIH1cclxuXHJcbiAgb25EdXBsaWNhdGUoKSB7XHJcbiAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZHVwbGljYXRlRml4dHVyZUxpYnJhcnkoe1xyXG4gICAgICBmaXh0dXJlSWQ6IHRoaXMuZml4dHVyZURldGFpbHMuX2lkXHJcbiAgICB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5zdGF0dXMgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QocmVzLmRhdGEubWVzc2FnZSk7XHJcbiAgICAgICAgICB0aGlzLmNhbkdvQmFjayA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvcGxhbm9ncmFtL2NyZWF0ZS1saWJyYXJ5LWZpeHR1cmUnXSwgeyBxdWVyeVBhcmFtczogeyBmaXh0dXJlSWQ6IHJlcz8uZGF0YT8uaWQgfSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8ICdGYWlsZWQgdG8gZHVwbGljYXRlIEZpeHR1cmUnKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZHVwbGljYXRlRml4dHVyZUxpYnJhcnkgZXJyOlwiLCBlcnIpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyBjb25maXJtRGVsZXRpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihEZWxldGVDb25maXJtYXRpb25Db21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9ICdEZWxldGUgZml4dHVyZSc7XHJcbiAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgZml4dHVyZSA/JztcclxuXHJcbiAgICByZXR1cm4gYXdhaXQgbW9kZWxSZWYucmVzdWx0LnRoZW48Ym9vbGVhbj4oKHJlc3VsdCkgPT4gcmVzdWx0ID09PSAnb2snKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25EZWxldGUoKSB7XHJcbiAgICBpZiAodGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkKSB7XHJcbiAgICAgIGNvbnN0IG1vZGVsUmVmID0gdGhpcy5uZ2JNb2RhbC5vcGVuKENhbm5vdFBlcmZvcm1Db21wb25lbnQsIHsgY2VudGVyZWQ6IHRydWUgfSk7XHJcbiAgICAgIG1vZGVsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRpdGxlID0gYENhbuKAmXQgZGVsZXRlIGZpeHR1cmUhYDtcclxuICAgICAgbW9kZWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGVzY3JpcHRpb24gPSBgU2luY2UgdGhpcyBmaXh0dXJlIGlzIGxpdmUgaW4gXCIke3RoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZH0gdGVtcGxhdGVzLFwiIGRlbGV0aW5nIGlzIG5vdCBhbGxvd2VkLmA7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoIWF3YWl0IHRoaXMuY29uZmlybURlbGV0aW9uKCkpIHJldHVybjtcclxuICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5kZWxldGVGaXh0dXJlTGlicmFyeSh7IGZpeHR1cmVJZDogdGhpcy5maXh0dXJlRGV0YWlscy5faWQgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcz8uc3RhdHVzID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHJlcy5tZXNzYWdlKTtcclxuICAgICAgICAgIHRoaXMuY2FuR29CYWNrID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnbWFuYWdlL3BsYW5vZ3JhbS9saWJyYXJ5L2ZpeHR1cmVzJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgJ0ZhaWxlZCB0byBkZWxldGUgRml4dHVyZScpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBkZWxldGVGaXh0dXJlTGlicmFyeSBlcnI6XCIsIGVycilcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG9uQ2xpY2tFZGl0KCkge1xyXG4gICAgaWYgKHRoaXMuZml4dHVyZURldGFpbHMudGVtcGxhdGVJZCkge1xyXG4gICAgICBjb25zdCBtb2RlbFJlZiA9IHRoaXMubmdiTW9kYWwub3BlbihDYW5ub3RQZXJmb3JtQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlIH0pO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS50aXRsZSA9IGBDYW7igJl0IGVkaXQgZml4dHVyZSFgO1xyXG4gICAgICBtb2RlbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9IGBTaW5jZSB0aGlzIGZpeHR1cmUgaXMgbGl2ZSBpbiBcIiR7dGhpcy5maXh0dXJlRGV0YWlscy50ZW1wbGF0ZUlkfSB0ZW1wbGF0ZXMsXCIgZWRpdGluZyBpcyBub3QgYWxsb3dlZC5gO1xyXG4gICAgICByZXR1cm5cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5pc0VkaXRNb2RlID0gdHJ1ZTtcclxuICAgIHRoaXMuZmxvb3JGaXh0dXJlRm9ybT8uZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIHRoaXMud2FsbEZpeHR1cmVGb3JtPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5oZWFkZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybSgnaGVhZGVyJylcclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5mb290ZXI/LmlzRW5hYmxlZCkgdGhpcy50b2dnbGVTZWN0aW9uRm9ybSgnZm9vdGVyJylcclxuICAgIGlmICghdGhpcy5maXh0dXJlRGV0YWlscy5pc0JvZHlFbmFibGVkKSB0aGlzLnRvZ2dsZVNlY3Rpb25Gb3JtKCdib2R5JylcclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xyXG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxyXG4gICAgICByZXBsYWNlVXJsOiB0cnVlLFxyXG4gICAgICBxdWVyeVBhcmFtczogeyBpc0VkaXQ6IHRydWUgfSxcclxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbn0iLCI8c2VjdGlvbiBpZD1cImJ1aWxkLWZpeHR1cmVcIiAqbmdJZj1cIiFpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPCEtLSBIZWFkZXIgc2VjdGlvbiAtLT5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnRzLWNlbnRlciBnYXAtNVwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBwLTNcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS9wbGFub2dyYW0vbGlicmFyeS9maXh0dXJlc1wiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgZD1cIk0xNS44MzM0IDkuOTk5ODRINC4xNjY3NU00LjE2Njc1IDkuOTk5ODRMMTAuMDAwMSAxNS44MzMyTTQuMTY2NzUgOS45OTk4NEwxMC4wMDAxIDQuMTY2NVwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIlxyXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8aDJcclxuICAgICAgICBjbGFzcz1cIm0tMCBlbGxpcHNpc1wiXHJcbiAgICAgICAgc3R5bGU9XCJtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSA4NjBweClcIlxyXG4gICAgICAgIFtuZ2JUb29sdGlwXT1cImZpeHR1cmVEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeSArICcgLSAnICsgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy52YWx1ZSArICdmdCdcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUNhdGVnb3J5IH19IC0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy52YWx1ZSB9fVxyXG4gICAgICAgIHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgPC9oMj5cclxuICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGRyYWZ0XCI+e3sgZml4dHVyZURldGFpbHMuc3RhdHVzIHwgdGl0bGVjYXNlIH19PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudHMtY2VudGVyIGdhcC01XCI+XHJcbiAgICAgIDxwIGNsYXNzPVwibS0wIHRleHQtbm93cmFwXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscz8udXBkYXRlZEF0XCIgW25nYlRvb2x0aXBdPVwiZml4dHVyZURldGFpbHMudXBkYXRlZEF0IHwgZGF0ZSA6ICdtZWRpdW0nXCI+XHJcbiAgICAgICAgTGFzdCB1cGRhdGU6IHt7IGZpeHR1cmVEZXRhaWxzLnVwZGF0ZWRBdCB8IHRpbWVBZ28gfX1cclxuICAgICAgPC9wPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCIgKGNsaWNrKT1cIm9uQ2xpY2tFZGl0KClcIj5cclxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwXzEzMjJfNTMyNSlcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNC4xNjY3IDIuNDk5OTNDMTQuMzg1NiAyLjI4MTA2IDE0LjY0NTUgMi4xMDc0NCAxNC45MzE0IDEuOTg4OTlDMTUuMjE3NCAxLjg3MDU0IDE1LjUyMzkgMS44MDk1NyAxNS44MzM0IDEuODA5NTdDMTYuMTQyOSAxLjgwOTU3IDE2LjQ0OTQgMS44NzA1NCAxNi43MzU0IDEuOTg4OTlDMTcuMDIxNCAyLjEwNzQ0IDE3LjI4MTIgMi4yODEwNiAxNy41MDAxIDIuNDk5OTNDMTcuNzE5IDIuNzE4OCAxNy44OTI2IDIuOTc4NjMgMTguMDExIDMuMjY0NkMxOC4xMjk1IDMuNTUwNTcgMTguMTkwNCAzLjg1NzA2IDE4LjE5MDQgNC4xNjY1OUMxOC4xOTA0IDQuNDc2MTIgMTguMTI5NSA0Ljc4MjYyIDE4LjAxMSA1LjA2ODU5QzE3Ljg5MjYgNS4zNTQ1NSAxNy43MTkgNS42MTQzOSAxNy41MDAxIDUuODMzMjZMNi4yNTAwOCAxNy4wODMzTDEuNjY2NzUgMTguMzMzM0wyLjkxNjc1IDEzLjc0OTlMMTQuMTY2NyAyLjQ5OTkzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF8xMzIyXzUzMjVcIj5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICBFZGl0XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImlzRWRpdE1vZGVcIiBjbGFzcz1cImQtZmxleCBnYXAtNSBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHRleHQtbm93cmFwXCIgKGNsaWNrKT1cIm9uU3VibWl0KCdkcmFmdCcpXCI+U2F2ZSBhcyBkcmFmdDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtbm93cmFwXCIgKGNsaWNrKT1cIm9uU3VibWl0KCdjb21wbGV0ZScpXCI+Q29tcGxldGU8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIiAqbmdJZj1cImZpeHR1cmVEZXRhaWxzPy5faWRcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHAtM1wiIHR5cGU9XCJidXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTExIDEyQzExIDEyLjU1MjMgMTEuNDQ3NyAxMyAxMiAxM0MxMi41NTIzIDEzIDEzIDEyLjU1MjMgMTMgMTJDMTMgMTEuNDQ3NyAxMi41NTIzIDExIDEyIDExQzExLjQ0NzcgMTEgMTEgMTEuNDQ3NyAxMSAxMlpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTExIDE5QzExIDE5LjU1MjMgMTEuNDQ3NyAyMCAxMiAyMEMxMi41NTIzIDIwIDEzIDE5LjU1MjMgMTMgMTlDMTMgMTguNDQ3NyAxMi41NTIzIDE4IDEyIDE4QzExLjQ0NzcgMTggMTEgMTguNDQ3NyAxMSAxOVpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTExIDVDMTEgNS41NTIyOCAxMS40NDc3IDYgMTIgNkMxMi41NTIzIDYgMTMgNS41NTIyOCAxMyA1QzEzIDQuNDQ3NzIgMTIuNTUyMyA0IDEyIDRDMTEuNDQ3NyA0IDExIDQuNDQ3NzIgMTEgNVpcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cIm9uRHVwbGljYXRlKClcIiAqbmdJZj1cIiFpc0VkaXRNb2RlXCI+RHVwbGljYXRlPC9hPjwvbGk+XHJcbiAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlciB0ZXh0LWRhbmdlclwiIChjbGljayk9XCJvbkRlbGV0ZSgpXCI+IERlbGV0ZSA8L2E+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gV2FsbCB0eXBlIGZpeHR1cmUgY3JlYXRpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ3dhbGwnXCI+XHJcbiAgICA8IS0tIFdhbGwgRml4dHVyZSBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgICAgPHA+Q29uZmlndXJlIHlvdXIgZml4dHVyZSBkZXRhaWxzIGhlcmU8L3A+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJ3YWxsRml4dHVyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgPCEtLSBCYXNpYyBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5CQVNJQyBERVRBSUxTPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJiYXNpY0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmZpeHR1cmVDYXRlZ29yeScpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4dHVyZSBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgd2lkdGggKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVXaWR0aD8udW5pdCB8fCBcImZ0XCIpICsgXCIpXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgd2lkdGggY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCBoZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y291bnRlci1pbnB1dCBzdHlsZT1cIndpZHRoOiA0MCVcIiBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5sZW5ndGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbEZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNIZWFkZXJFbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVTZWN0aW9uKCdoZWFkZXInKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXMtNFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlciBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPkhFQURFUjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJoZWFkZXJcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzSGVhZGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgXCJIZWlnaHQgKFwiICsgKGZpeHR1cmVEZXRhaWxzLmhlYWRlcj8uaGVpZ2h0Py51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0IHN0eWxlPVwid2lkdGg6IDQwJVwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiIFtzdGVwXT1cIjAuNVwiIHBsYWNlaG9sZGVyPVwiMFwiPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIndhbGxGaXh0dXJlRm9ybS5nZXQoJ2hlYWRlci5oZWlnaHQnKT8udG91Y2hlZCAmJiB3YWxsRml4dHVyZUZvcm0uZ2V0KCdoZWFkZXIuaGVpZ2h0Jyk/LmludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnaGVhZGVyLmhlaWdodCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEJvZHkgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiYm9keVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0VkaXRNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNCb2R5RW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlU2VjdGlvbignYm9keScpOyB3YWxsRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy00XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+Qk9EWTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJib2R5XCIgW2NsYXNzLmRpc2FibGVkXT1cIiFpc0JvZHlFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHNoZWx2ZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlLWNvdW50ZXJdPVwiIWlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTUgMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlU2hlbGYoKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43NjI5NCA3SDExLjkyOTZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgc2hlbGZBcnJheS5sZW5ndGggfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFNoZWxmKCk7IHdhbGxGaXh0dXJlRm9ybS5tYXJrQXNEaXJ0eSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuMTUzODkgMi45MTY1VjExLjA4MzJNMy4wNzA1NiA2Ljk5OTg0SDExLjIzNzJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInNoZWxmQXJyYXkubGVuZ3RoIDwgMSAmJiBpc0VkaXRNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHNoZWxmIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNoZWxmQXJyYXk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJzaGVsZlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNoZWxmIG9mIHNoZWxmQXJyYXk/LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIGNsYXNzPVwiYXJyYXktZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwic2hlbGYtdGl0bGVcIj5TaGVsZiB7eyBpICsgMSB9fTwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTaGVsZihpKTsgd2FsbEZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5OEEyQjNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJzaGVsZlR5cGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNoZWxmLmdldCgndHlwZScpPy52YWx1ZSA9PT0gJ3RyYXknXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgc2hlbGYuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cInNoZWxmLmdldCgnbm9PZlJvd3MnKT8uaGFzRXJyb3IoJ21pbicpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Qcm9kdWN0IGNhcGFjaXR5IGZvciBlYWNoIHJvdzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwcm9kdWN0Q2FwYWNpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaGVsZi5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy50b3VjaGVkICYmIHNoZWxmLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LmVycm9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwic2hlbGYuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8uaGFzRXJyb3IoJ21pbicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBGb290ZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25JdGVtPVwiZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRWRpdE1vZGVcIlxyXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0Zvb3RlckVuYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlY3Rpb24oJ2Zvb3RlcicpOyB3YWxsRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy00XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8aDIgbmdiQWNjb3JkaW9uSGVhZGVyIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JBY2NvcmRpb25CdXR0b24+Rk9PVEVSPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uQ29sbGFwc2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkJvZHk+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCIgZm9ybUdyb3VwTmFtZT1cImZvb3RlclwiIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNGb290ZXJFbmFibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIkhlaWdodCAoXCIgKyAoZml4dHVyZURldGFpbHMuZm9vdGVyPy5oZWlnaHQ/LnVuaXQgfHwgXCJmdFwiKSArIFwiKVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwiaGVpZ2h0XCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwid2FsbEZpeHR1cmVGb3JtLmdldCgnZm9vdGVyLmhlaWdodCcpPy50b3VjaGVkICYmIHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Zvb3Rlci5oZWlnaHQnKT8uaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdmb290ZXIuaGVpZ2h0Jyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEZvb3RlciBoZWlnaHQgY2Fubm90IGJlIHplcm8uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFdhbGwgRml4dHVyZSBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJpc0JvZHlFbmFibGVkIHx8IGlzSGVhZGVyRW5hYmxlZCB8fCBpc0Zvb3RlckVuYWJsZWQ7IGVsc2UgZW1wdHlGaXh0dXJlXCJcclxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdy0xMDBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1kaW1lbnNpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ3YWxsRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbGVuZ3RoIH19IHt7IGZpeHR1cmVEZXRhaWxzLmZpeHR1cmVMZW5ndGg/LnVuaXQgfHwgXCJmdFwiIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IGRvd25cIj48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWxsLXZpZXdwb3J0XCI+XHJcbiAgICAgICAgICAgIDwhLS0gSGVhZGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgZGltZW5zaW9uQXJyb3dzO1xyXG4gICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHdhbGxGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzSGVhZGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWJsb2NrXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5IRUFERVI8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBCb2R5IFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWJsb2NrXCIgKm5nSWY9XCJpc0JvZHlFbmFibGVkICYmIHNoZWxmQXJyYXkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzaGVsZkFycmF5LmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICBAaWYoaXRlbS5nZXQoJ3R5cGUnKT8udmFsdWUgPT09J3NoZWxmJyl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2sgc2hlbGZcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICAgICAgIFNIRUxGIHt7IGkgKyAxIH19IDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgfX08L2I+XHJcbiAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwcm9kdWN0IG9mIFtdLmNvbnN0cnVjdG9yKGl0ZW0uZ2V0KCdub09mUm93cycpPy52YWx1ZSlcIiBjbGFzcz1cInRyYXkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgW10uY29uc3RydWN0b3IoaXRlbS5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy52YWx1ZSlcIiBjbGFzcz1cInByb2R1Y3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib2R5LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgU0hFTEYge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgICAgPGIgY2xhc3M9XCJtcy0zXCI+UHJvZHVjdHM6IHt7IGl0ZW0uZ2V0KFwicHJvZHVjdENhcGFjaXR5XCIpPy52YWx1ZSAqIChpdGVtLmdldChcIm5vT2ZSb3dzXCIpPy52YWx1ZSA/PyAxKSB9fTwvYj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRm9vdGVyIFByZXZpZXcgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTVcIiAqbmdJZj1cImlzRm9vdGVyRW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyIGZvb3Rlci1ibG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTAgaC0xMDAgZ2FwLTMgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzdWItZm9vdGVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgc3ViLWZvb3RlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8cD5GT09URVI8L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eUZpeHR1cmU+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtbiBoLTEwMFwiPlxyXG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YW1haW50ZXh0IG10LTNcIj5QcmV2aWV3IHJlcXVpcmVzIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IGJsb2NrIGVuYWJsZWQuPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFzdWJ0ZXh0XCI+UGxlYXNlIGVuYWJsZSBlaXRoZXIgdGhlIGhlYWRlciwgZm9vdGVyLCBvciBib2R5IHRvIHZpZXcgdGhlIHByZXZpZXcuLjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIEluZm8gQ2FyZHMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgZ2FwLTJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sIGluZm8tY2FyZFwiPlxyXG4gICAgICAgICAgPGgzPnt7IHNoZWxmQXJyYXkubGVuZ3RoIH19PC9oMz5cclxuICAgICAgICAgIDxwPk5vIG9mIFNoZWx2ZXM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IHdhbGxGaXh0dXJlRm9ybS5nZXQoXCJiYXNpY0RldGFpbHMud2lkdGhcIik/LnZhbHVlIH19IHgge3sgd2FsbEZpeHR1cmVGb3JtLmdldChcImJhc2ljRGV0YWlscy5sZW5ndGhcIik/LnZhbHVlIH19IGZlZXRcclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBGbG9vciB0eXBlIGZpeHR1cmUgY3JlYXRpb24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBnYXAtNCBidWlsZGVyXCIgKm5nSWY9XCJmaXh0dXJlRGV0YWlscy5maXh0dXJlVHlwZSA9PT0gJ2Zsb29yJ1wiPlxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBGb3JtIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGgyPkZpeHR1cmUgRGV0YWlsczwvaDI+XHJcbiAgICAgICAgPHA+VGhlIHNldHRpbmdzIGFyZSBwcmUtY29uZmlndXJlZCBhbmQgY2Fubm90IGJlIGVkaXRlZDwvcD5cclxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZsb29yRml4dHVyZUZvcm1cIj5cclxuICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uICNhY2NvcmRpb249XCJuZ2JBY2NvcmRpb25cIj5cclxuICAgICAgICAgICAgPCEtLSBCYXNpYyBEZXRhaWxzIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkl0ZW09XCJkZXRhaWxzXCIgW2NvbGxhcHNlZF09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgIDxoMiBuZ2JBY2NvcmRpb25IZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG5nYkFjY29yZGlvbkJ1dHRvbj5CQVNJQyBERVRBSUxTPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiIGZvcm1Hcm91cE5hbWU9XCJiYXNpY0RldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkZpeHR1cmUgbmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJmaXh0dXJlQ2F0ZWdvcnlcIiBmb3JtQ29udHJvbE5hbWU9XCJmaXh0dXJlQ2F0ZWdvcnlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/LmludmFsaWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMuZml4dHVyZUNhdGVnb3J5Jyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeHR1cmUgbmFtZSBjYW5ub3QgYmUgb25seSB3aGl0ZXNwYWNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy5maXh0dXJlQ2F0ZWdvcnknKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7IFwiT3ZlcmFsbCB3aWR0aCAoXCIgKyAoZml4dHVyZURldGFpbHMuZml4dHVyZVdpZHRoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIiBbc3RlcF09XCIwLjVcIiBwbGFjZWhvbGRlcj1cIjBcIj48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udG91Y2hlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JGaXh0dXJlRm9ybS5nZXQoJ2Jhc2ljRGV0YWlscy53aWR0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLndpZHRoJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCB3aWR0aCBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyBcIk92ZXJhbGwgbGVuZ3RoIChcIiArIChmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIikgKyBcIilcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXQgc3R5bGU9XCJ3aWR0aDogNDAlXCIgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCIgW3N0ZXBdPVwiMC41XCIgcGxhY2Vob2xkZXI9XCIwXCI+PC9jb3VudGVyLWlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy50b3VjaGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5pbnZhbGlkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJmbG9vckZpeHR1cmVGb3JtLmdldCgnYmFzaWNEZXRhaWxzLmxlbmd0aCcpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJhbGwgaGVpZ2h0IGNhbm5vdCBiZSB6ZXJvLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFBhbmVsIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgbmdiQWNjb3JkaW9uSXRlbT1cInBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgPGgyIG5nYkFjY29yZGlvbkhlYWRlcj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbmdiQWNjb3JkaW9uQnV0dG9uPlBBTkVMPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICA8ZGl2IG5nYkFjY29yZGlvbkNvbGxhcHNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JBY2NvcmRpb25Cb2R5PlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHBhbmVsczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWNvbnRhaW5lclwiIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1IDE0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhbmVsKCk7IGZsb29yRml4dHVyZUZvcm0ubWFya0FzRGlydHkoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjc2Mjk0IDdIMTEuOTI5NlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBhbmVsQXJyYXkubGVuZ3RoIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNSAxNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRQYW5lbCgpOyBmbG9vckZpeHR1cmVGb3JtLm1hcmtBc0RpcnR5KClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy4xNTM4OSAyLjkxNjVWMTEuMDgzMk0zLjA3MDU2IDYuOTk5ODRIMTEuMjM3MlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwicGFuZWxBcnJheS5sZW5ndGggPCAxICYmIGlzRWRpdE1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhbmVsIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXk/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwicGFuZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcGFuZWwgb2YgcGFuZWxBcnJheT8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgY2xhc3M9XCJhcnJheS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cInNoZWxmLXRpdGxlXCI+UGFuZWwge3sgaSArIDEgfX08L2g2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVBhbmVsKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jbGlja109XCIhaXNFZGl0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCA2TDYgMThNNiA2TDE4IDE4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjOThBMkIzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBhbmVsTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInBhbmVsTmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdwYW5lbE5hbWUnKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZWwgbmFtZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cInBhbmVsLmdldCgncGFuZWxOYW1lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lbCBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3BhbmVsTmFtZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vIG9mIHJvd3M8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvdW50ZXItaW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibm9PZlJvd3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RlcF09XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2NvdW50ZXItaW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYW5lbC5nZXQoJ25vT2ZSb3dzJyk/LnRvdWNoZWQgJiYgcGFuZWwuZ2V0KCdub09mUm93cycpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ25vT2ZSb3dzJyk/Lmhhc0Vycm9yKCdtaW4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGF0IGxlYXN0IDEgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlByb2R1Y3QgY2FwYWNpdHkgZm9yIGVhY2ggcm93PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3VudGVyLWlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByb2R1Y3RDYXBhY2l0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvY291bnRlci1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFuZWwuZ2V0KCdwcm9kdWN0Q2FwYWNpdHknKT8udG91Y2hlZCAmJiBwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5lcnJvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJwYW5lbC5nZXQoJ3Byb2R1Y3RDYXBhY2l0eScpPy5oYXNFcnJvcignbWluJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdCBjYXBhY2l0eSBjYW5ub3QgYmUgemVyby5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGbG9vciBQYW5lbCBQcmV2aWV3IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHMgY29sLThcIj5cclxuICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogY2FsYyg3NXZoIC0gMTIwcHgpOyBvdmVyZmxvdy15OiBhdXRvXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInBhbmVsQXJyYXkuY29udHJvbHMubGVuZ3RoOyBlbHNlIG5vUGFuZWxcIiBjbGFzcz1cImZsb29yLXBhbmVsLXZpZXdwb3J0IHctMTAwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFuZWxBcnJheS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGdhcC01XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWRpbWVuc2lvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycm93IHVwXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMubGVuZ3RoJyk/LnZhbHVlIGFzIGxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGxlbmd0aCB9fSB7eyBmaXh0dXJlRGV0YWlscy5maXh0dXJlTGVuZ3RoPy51bml0IHx8IFwiZnRcIiB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBkb3duXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25BcnJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZsb29yRml4dHVyZUZvcm0uZ2V0KCdiYXNpY0RldGFpbHMud2lkdGgnKT8udmFsdWVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgnbm9PZlJvd3MnKT8udmFsdWUpXCIgY2xhc3M9XCJwYW5lbCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBbXS5jb25zdHJ1Y3RvcihpdGVtLmdldCgncHJvZHVjdENhcGFjaXR5Jyk/LnZhbHVlKVwiIGNsYXNzPVwicHJvZHVjdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUEFORUwge3sgaSArIDEgfX1cclxuICAgICAgICAgICAgICAgIDxiIGNsYXNzPVwibXMtM1wiPlByb2R1Y3RzOiB7eyBpdGVtLmdldChcInByb2R1Y3RDYXBhY2l0eVwiKT8udmFsdWUgKiAoaXRlbS5nZXQoXCJub09mUm93c1wiKT8udmFsdWUgPz8gMSkgfX08L2I+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTUgbXQtNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI0cHhcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNDY0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDUzMCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk01MjIuNjUzIDAuMjkyODkzQzUyMi4yNjMgLTAuMDk3NjMxNSA1MjEuNjMgLTAuMDk3NjMxNCA1MjEuMjM5IDAuMjkyODkzTDUxNC44NzUgNi42NTY4NUM1MTQuNDg1IDcuMDQ3MzggNTE0LjQ4NSA3LjY4MDU0IDUxNC44NzUgOC4wNzEwN0M1MTUuMjY2IDguNDYxNTkgNTE1Ljg5OSA4LjQ2MTU5IDUxNi4yODkgOC4wNzEwN0w1MjEuOTQ2IDIuNDE0MjFMNTI3LjYwMyA4LjA3MTA3QzUyNy45OTQgOC40NjE1OSA1MjguNjI3IDguNDYxNTkgNTI5LjAxNyA4LjA3MTA3QzUyOS40MDggNy42ODA1NCA1MjkuNDA4IDcuMDQ3MzggNTI5LjAxNyA2LjY1Njg1TDUyMi42NTMgMC4yOTI4OTNaTTUyMi45NDYgMTRMNTIyLjk0NiAxTDUyMC45NDYgMUw1MjAuOTQ2IDE0TDUyMi45NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMzk0LjE1MyAwLjI5Mjg5M0MzOTMuNzYzIC0wLjA5NzYzMTUgMzkzLjEzIC0wLjA5NzYzMTQgMzkyLjczOSAwLjI5Mjg5M0wzODYuMzc1IDYuNjU2ODVDMzg1Ljk4NSA3LjA0NzM4IDM4NS45ODUgNy42ODA1NCAzODYuMzc1IDguMDcxMDdDMzg2Ljc2NiA4LjQ2MTU5IDM4Ny4zOTkgOC40NjE1OSAzODcuNzg5IDguMDcxMDdMMzkzLjQ0NiAyLjQxNDIxTDM5OS4xMDMgOC4wNzEwN0MzOTkuNDk0IDguNDYxNTkgNDAwLjEyNyA4LjQ2MTU5IDQwMC41MTcgOC4wNzEwN0M0MDAuOTA4IDcuNjgwNTQgNDAwLjkwOCA3LjA0NzM4IDQwMC41MTcgNi42NTY4NUwzOTQuMTUzIDAuMjkyODkzWk0zOTQuNDQ2IDE0TDM5NC40NDYgMUwzOTIuNDQ2IDFMMzkyLjQ0NiAxNEwzOTQuNDQ2IDE0WlwiXHJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICBkPVwiTTI2NS42NTMgMC4yOTI4OTNDMjY1LjI2MyAtMC4wOTc2MzE1IDI2NC42MyAtMC4wOTc2MzE0IDI2NC4yMzkgMC4yOTI4OTNMMjU3Ljg3NSA2LjY1Njg1QzI1Ny40ODUgNy4wNDczOCAyNTcuNDg1IDcuNjgwNTQgMjU3Ljg3NSA4LjA3MTA3QzI1OC4yNjYgOC40NjE1OSAyNTguODk5IDguNDYxNTkgMjU5LjI4OSA4LjA3MTA3TDI2NC45NDYgMi40MTQyMUwyNzAuNjAzIDguMDcxMDdDMjcwLjk5NCA4LjQ2MTU5IDI3MS42MjcgOC40NjE1OSAyNzIuMDE3IDguMDcxMDdDMjcyLjQwOCA3LjY4MDU0IDI3Mi40MDggNy4wNDczOCAyNzIuMDE3IDYuNjU2ODVMMjY1LjY1MyAwLjI5Mjg5M1pNMjY1Ljk0NiAxNEwyNjUuOTQ2IDFMMjYzLjk0NiAxTDI2My45NDYgMTRMMjY1Ljk0NiAxNFpcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzQ3NTQ2N1wiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0xMzcuMTUzIDAuMjkyODkzQzEzNi43NjMgLTAuMDk3NjMxNSAxMzYuMTMgLTAuMDk3NjMxNCAxMzUuNzM5IDAuMjkyODkzTDEyOS4zNzUgNi42NTY4NUMxMjguOTg1IDcuMDQ3MzggMTI4Ljk4NSA3LjY4MDU0IDEyOS4zNzUgOC4wNzEwN0MxMjkuNzY2IDguNDYxNTkgMTMwLjM5OSA4LjQ2MTU5IDEzMC43ODkgOC4wNzEwN0wxMzYuNDQ2IDIuNDE0MjFMMTQyLjEwMyA4LjA3MTA3QzE0Mi40OTQgOC40NjE1OSAxNDMuMTI3IDguNDYxNTkgMTQzLjUxNyA4LjA3MTA3QzE0My45MDggNy42ODA1NCAxNDMuOTA4IDcuMDQ3MzggMTQzLjUxNyA2LjY1Njg1TDEzNy4xNTMgMC4yOTI4OTNaTTEzNy40NDYgMTRMMTM3LjQ0NiAxTDEzNS40NDYgMUwxMzUuNDQ2IDE0TDEzNy40NDYgMTRaXCJcclxuICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0NzU0NjdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNOC42NTM0IDAuMjkyODkzQzguMjYyODcgLTAuMDk3NjMxNSA3LjYyOTcxIC0wLjA5NzYzMTQgNy4yMzkxOCAwLjI5Mjg5M0wwLjg3NTIyMSA2LjY1Njg1QzAuNDg0Njk3IDcuMDQ3MzggMC40ODQ2OTcgNy42ODA1NCAwLjg3NTIyMSA4LjA3MTA3QzEuMjY1NzUgOC40NjE1OSAxLjg5ODkxIDguNDYxNTkgMi4yODk0MyA4LjA3MTA3TDcuOTQ2MjkgMi40MTQyMUwxMy42MDMxIDguMDcxMDdDMTMuOTkzNyA4LjQ2MTU5IDE0LjYyNjggOC40NjE1OSAxNS4wMTc0IDguMDcxMDdDMTUuNDA3OSA3LjY4MDU0IDE1LjQwNzkgNy4wNDczOCAxNS4wMTc0IDYuNjU2ODVMOC42NTM0IDAuMjkyODkzWk04Ljk0NjI5IDE0TDguOTQ2MjkgMUw2Ljk0NjI5IDFMNi45NDYyOSAxNEw4Ljk0NjI5IDE0WlwiXHJcbiAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNDc1NDY3XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1N1wiIGhlaWdodD1cIjQzXCIgdmlld0JveD1cIjAgMCA1NyA0M1wiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgZD1cIk0wLjQzOTY5NyAzMS44MDg3QzAuNDM5Njk3IDI2Ljg2NCA0LjQ0ODIgMjIuODU1NSA5LjM5Mjk0IDIyLjg1NTVINDcuNDY4MUM1Mi40MjMgMjIuODU1NSA1Ni40Mzk3IDI2Ljg3MjIgNTYuNDM5NyAzMS44MjdDNTYuNDM5NyAzNy4zMjU1IDUxLjUzNzMgNDEuNDk5NCA0Ni4wNzY1IDQwLjg1NzFDMzMuNjMxOCAzOS4zOTM1IDIzLjcyNjcgMzkuMzIwNiAxMC44MTg2IDQwLjgzNzZDNS4zNTU0MiA0MS40Nzk2IDAuNDM5Njk3IDM3LjMwOTUgMC40Mzk2OTcgMzEuODA4N1pcIlxyXG4gICAgICAgICAgICAgICAgICBmaWxsPVwiIzFEMjkzOVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjI4LjQ0MDhcIiBjeT1cIjE2LjU3MTRcIiByPVwiMTUuMDcxNFwiIGZpbGw9XCIjMUQyOTM5XCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIzXCIgLz5cclxuICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub1BhbmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW4gaC0xMDBcIj5cclxuICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmNcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFtYWludGV4dCBtdC0zXCI+QWRkIGEgcGFuZWwgdG8gc2VlIHlvdXIgcHJldmlldy48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGF0YXN1YnRleHRcIj5UbyBzZWUgeW91ciBwcmV2aWV3LCBwbGVhc2UgYWRkIGF0IGxlYXN0IG9uZSBwYW5lbC48L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBJbmZvIENhcmRzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGdhcC0yXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyBwYW5lbEFycmF5Lmxlbmd0aCB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5ObyBvZiBQYW5lbHM8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBpbmZvLWNhcmRcIj5cclxuICAgICAgICAgIDxoMz57eyB0b3RhbFByb2R1Y3RDYXBhY2l0eSB9fTwvaDM+XHJcbiAgICAgICAgICA8cD5Qcm9kdWN0IENhcGFjaXR5PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+e3sgZml4dHVyZURldGFpbHMuZml4dHVyZVR5cGUgfCB0aXRsZWNhc2UgfX0gZml4dHVyZTwvaDM+XHJcbiAgICAgICAgICA8cD5UeXBlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgaW5mby1jYXJkXCI+XHJcbiAgICAgICAgICA8aDM+XHJcbiAgICAgICAgICAgIHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLndpZHRoXCIpPy52YWx1ZSB9fSB4IHt7IGZsb29yRml4dHVyZUZvcm0uZ2V0KFwiYmFzaWNEZXRhaWxzLmxlbmd0aFwiKT8udmFsdWUgfX1cclxuICAgICAgICAgICAge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX1cclxuICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICA8cD5PdmVyYWxsIERpbWVuc2lvbjwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG5cclxuPHNlY3Rpb24gaWQ9XCJidWlsZC1maXh0dXJlLXNrZWxldG9uXCIgKm5nSWY9XCJpc1BhZ2VMb2FkaW5nXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuXHJcbjwhLS0gQ29tbW9uIGRpbWVuc2lvbiBhcnJvd3MgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZGltZW5zaW9uQXJyb3dzIGxldC1sYWJlbD1cImxhYmVsXCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cclxuICA8ZGl2IGNsYXNzPVwiaG9yaXpvbnRhbC1kaW1lbnNpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyBsZWZ0XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibGluZVwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInZhbHVlXCI+e3sgdmFsdWUgfX0ge3sgZml4dHVyZURldGFpbHMuZml4dHVyZUxlbmd0aD8udW5pdCB8fCBcImZ0XCIgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcnJvdyByaWdodFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
|